Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/mythtv/libs/libmythtv/videobuffers.cpp b/mythtv/libs/libmythtv/videobuffers.cpp
- index f84e4fb..7d05bab 100644
- --- a/mythtv/libs/libmythtv/videobuffers.cpp
- +++ b/mythtv/libs/libmythtv/videobuffers.cpp
- @@ -193,6 +193,7 @@ void VideoBuffers::Reset()
- available.clear();
- used.clear();
- limbo.clear();
- + done.clear();
- pause.clear();
- displayed.clear();
- vbufferMap.clear();
- @@ -231,6 +232,13 @@ VideoFrame *VideoBuffers::GetNextFreeFrameInternal(BufferType enqueue_to)
- frame = available.dequeue();
- }
- + if (used.contains(frame))
- + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in used queue").arg((long long)frame));
- + if (limbo.contains(frame))
- + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in limbo queue").arg((long long)frame));
- + if (decode.contains(frame))
- + VERBOSE(VB_IMPORTANT, QString("ERROR: frame %1 in decode queue").arg((long long)frame));
- +
- if (frame)
- safeEnqueue(enqueue_to, frame);
- @@ -285,7 +293,7 @@ void VideoBuffers::ReleaseFrame(VideoFrame *frame)
- QMutexLocker locker(&global_lock);
- vpos = vbufferMap[frame];
- - limbo.remove(frame);
- +// limbo.remove(frame);
- decode.enqueue(frame);
- used.enqueue(frame);
- }
- @@ -301,7 +309,6 @@ void VideoBuffers::DeLimboFrame(VideoFrame *frame)
- if (limbo.contains(frame))
- {
- limbo.remove(frame);
- - available.enqueue(frame);
- }
- // BEGIN HACK HACK HACK, see trac ticket #4159
- @@ -333,7 +340,18 @@ void VideoBuffers::DoneDisplayingFrame(VideoFrame *frame)
- if(used.contains(frame))
- {
- remove(kVideoBuffer_used, frame);
- - enqueue(kVideoBuffer_avail, frame);
- + }
- + enqueue(kVideoBuffer_done, frame);
- + frame_queue_t ula(done);
- + frame_queue_t::iterator it = ula.begin();
- + // check if any done frames are out of limbo and can be made available again
- + for (; it != ula.end(); ++it)
- + {
- + if (!limbo.contains(*it))
- + {
- + remove(kVideoBuffer_done, *it);
- + enqueue(kVideoBuffer_avail, *it);
- + }
- }
- }
- @@ -366,6 +384,8 @@ frame_queue_t *VideoBuffers::queue(BufferType type)
- q = &pause;
- else if (type == kVideoBuffer_decode)
- q = &decode;
- + else if (type == kVideoBuffer_done)
- + q = &done;
- return q;
- }
- @@ -388,6 +408,8 @@ const frame_queue_t *VideoBuffers::queue(BufferType type) const
- q = &pause;
- else if (type == kVideoBuffer_decode)
- q = &decode;
- + else if (type == kVideoBuffer_done)
- + q = &done;
- return q;
- }
- @@ -470,6 +492,8 @@ void VideoBuffers::remove(BufferType type, VideoFrame *frame)
- pause.remove(frame);
- if ((type & kVideoBuffer_decode) == kVideoBuffer_decode)
- decode.remove(frame);
- + if ((type & kVideoBuffer_done) == kVideoBuffer_done)
- + done.remove(frame);
- }
- void VideoBuffers::requeue(BufferType dst, BufferType src, int num)
- diff --git a/mythtv/libs/libmythtv/videobuffers.h b/mythtv/libs/libmythtv/videobuffers.h
- index 1e396c0..7bc4988 100644
- --- a/mythtv/libs/libmythtv/videobuffers.h
- +++ b/mythtv/libs/libmythtv/videobuffers.h
- @@ -41,7 +41,8 @@ enum BufferType
- kVideoBuffer_pause = 0x00000008,
- kVideoBuffer_displayed = 0x00000010,
- kVideoBuffer_decode = 0x00000020,
- - kVideoBuffer_all = 0x0000001F,
- + kVideoBuffer_done = 0x00000040,
- + kVideoBuffer_all = 0x0000001D,
- };
- class YUVInfo
- @@ -133,7 +134,7 @@ class VideoBuffers
- const frame_queue_t *queue(BufferType type) const;
- VideoFrame *GetNextFreeFrameInternal(BufferType enqueue_to);
- - frame_queue_t available, used, limbo, pause, displayed, decode;
- + frame_queue_t available, used, limbo, pause, displayed, decode, done;
- vbuffer_map_t vbufferMap; // videobuffers to buffer's index
- frame_vector_t buffers;
- uchar_vector_t allocated_structs; // for DeleteBuffers
- diff --git a/mythtv/libs/libmythtv/videoout_vdpau.cpp b/mythtv/libs/libmythtv/videoout_vdpau.cpp
- index 050ab2d..9ca0151 100644
- --- a/mythtv/libs/libmythtv/videoout_vdpau.cpp
- +++ b/mythtv/libs/libmythtv/videoout_vdpau.cpp
- @@ -913,7 +913,7 @@ void VideoOutputVDPAU::DiscardFrame(VideoFrame *frame)
- vbuffers.safeEnqueue(kVideoBuffer_displayed, frame);
- else
- {
- - vbuffers.DiscardFrame(frame);
- + vbuffers.DoneDisplayingFrame(frame);
- }
- m_lock.unlock();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement