This class creates tracks the state of the buffers used by various VideoOutput derived classes. More...
#include <videobuffers.h>
This class creates tracks the state of the buffers used by various VideoOutput derived classes.
The states available for a buffer are: available, limbo, used, process, and displayed.
The two most important states are available and used. Used is implemented as a FIFO, and is used to buffer frames ready for display. A decoder may decode frames out of order but must add them to the used queue in order. The available buffers are buffers that are ready to be used by the decoder.
Generally a buffer leaves the available state via GetNextFreeFrame(bool,bool,BufferType) and enters the limbo state. It then leaves the limbo state via ReleaseFrame(VideoFrame*) and enters the used state. Then it leaves the used state via DoneDisplayingFrame() and enters the available state.
At any point, DiscardFrame(VideoFrame*) can be called to remove the frame from the current state and add it to the available list.
However, there are two additional states available, these are currently used by VideoOutputXv for XvMC support. These are the process and displayed state. The process state simply indicates that the frame has been picked up in the VideoOutput::ProcessFrame() call, but VideoOutput::Show() has not yet used the frame. This is needed because a frame other than a used frame is being held by VideoOutput and we don't want to lose it if the stream is reset. The displayed state indicates that DoneDisplayingFrame() has been called for the frame, but it cannot yet be added to available because it is still being displayed. VideoOutputXv calls DiscardFrame(VideoFrame*) on the frames no longer being displayed at the end of the next DoneDisplayingFrame(), finally adding them to available.
The only method that returns with a lock held on the VideoBuffers object itself, preventing anyone else from using the VideoBuffers class, inluding to unlocking frames, is the begin_lock(BufferType). This method is to be used with extreme caution, in particular one should not attempt to acquire any locks before end_lock() is called.
There are also frame inheritence tracking functions, these are used by VideoOutputXv to avoid throwing away displayed frames too early. See videoout_xv.cpp for their use.
released = used + finished + displayed + pause total = available + limbo + released released_and_in_use_by_decoder = decode
available - frames not in use by decoder or display limbo - frames in use by decoder but not released for display decode - frames in use by decoder and released for display used - frames released for display but not displayed or paused displayed - frames displayed but still used as a reference frame pause - frames used for pause finished - frames that are finished displaying but still in use by decoder
NOTE: All queues are mutually exclusive except "decode" which tracks frames that have been released but still in use by the decoder. If a frame has finished being processed/displayed but is still in use by the decoder (in the decode queue) then it is placed in the finished queue until the decoder is no longer using it (not in the decode queue).
Definition at line 61 of file videobuffers.h.
| VideoBuffers::VideoBuffers | ( | ) |
Definition at line 121 of file videobuffers.cpp.
| VideoBuffers::~VideoBuffers | ( | ) | [virtual] |
Definition at line 129 of file videobuffers.cpp.
| void VideoBuffers::Init | ( | uint | numdecode, | |
| bool | extra_for_pause, | |||
| uint | need_free, | |||
| uint | needprebuffer_normal, | |||
| uint | needprebuffer_small, | |||
| uint | keepprebuffer | |||
| ) |
Definition at line 155 of file videobuffers.cpp.
Referenced by VideoOutputOpenGLVAAPI::CreateBuffers(), VideoOutputOpenGL::CreateBuffers(), VideoOutputD3D::CreateBuffers(), VideoOutputQuartz::Init(), VideoOutputNull::Init(), VideoOutputVDPAU::InitBuffers(), VideoOutputNullVDPAU::InitBuffers(), VideoOutputNullVAAPI::InitBuffers(), VideoOutputNullVDPAU::InitShadowBuffers(), and VideoOutputXv::InitVideoBuffers().
| bool VideoBuffers::CreateBuffers | ( | VideoFrameType | type, | |
| int | width, | |||
| int | height, | |||
| vector< unsigned char * > | bufs, | |||
| vector< YUVInfo > | yuvinfo | |||
| ) |
Definition at line 711 of file videobuffers.cpp.
Referenced by VideoOutputXv::CreateBuffers(), VideoOutputOpenGL::CreateBuffers(), CreateBuffers(), VideoOutputQuartz::CreateQuartzBuffers(), VideoOutputNull::Init(), VideoOutputVDPAU::InitBuffers(), VideoOutputNullVAAPI::InitBuffers(), VideoOutputD3D::InitBuffers(), VideoOutputNullVDPAU::InitShadowBuffers(), and VideoOutputNull::InputChanged().
| bool VideoBuffers::CreateBuffers | ( | VideoFrameType | type, | |
| int | width, | |||
| int | height | |||
| ) |
Definition at line 704 of file videobuffers.cpp.
| void VideoBuffers::DeleteBuffers | ( | void | ) |
Definition at line 784 of file videobuffers.cpp.
Referenced by VideoOutputXv::DeleteBuffers(), VideoOutputVDPAU::DeleteBuffers(), VideoOutputNullVDPAU::DeleteBuffers(), VideoOutputNullVAAPI::DeleteBuffers(), VideoOutputQuartz::DeleteQuartzBuffers(), VideoOutputNullVDPAU::DeleteShadowBuffers(), VideoOutputOpenGL::DestroyCPUResources(), VideoOutputNull::InputChanged(), VideoOutputD3D::TearDown(), ~VideoBuffers(), and VideoOutputNull::~VideoOutputNull().
| void VideoBuffers::Reset | ( | void | ) |
Resets the class so that Init may be called again.
Definition at line 197 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::DeleteBuffers(), VideoOutputNullVDPAU::DeleteBuffers(), VideoOutputNullVAAPI::DeleteBuffers(), VideoOutputNullVDPAU::DeleteShadowBuffers(), VideoOutputOpenGL::DestroyCPUResources(), Init(), and VideoOutputD3D::TearDown().
| void VideoBuffers::DiscardFrames | ( | bool | next_frame_keyframe | ) |
Mark all used frames as ready to be reused, this is for seek.
Definition at line 612 of file videobuffers.cpp.
Referenced by VideoOutput::DiscardFrames(), VideoOutputXv::DiscardFrames(), VideoOutputVDPAU::DiscardFrames(), VideoOutputNullVDPAU::DiscardFrames(), GetNextFreeFrame(), and VideoOutputD3D::TearDown().
| void VideoBuffers::ClearAfterSeek | ( | void | ) |
Definition at line 676 of file videobuffers.cpp.
Referenced by VideoOutput::ClearAfterSeek().
| void VideoBuffers::SetPrebuffering | ( | bool | normal | ) |
Sets prebuffering state to normal, or small.
Definition at line 227 of file videobuffers.cpp.
Referenced by VideoOutput::SetPrebuffering().
| VideoFrame * VideoBuffers::GetNextFreeFrame | ( | BufferType | enqueue_to = kVideoBuffer_limbo |
) |
Definition at line 269 of file videobuffers.cpp.
Referenced by VideoOutput::GetNextFreeFrame().
| void VideoBuffers::ReleaseFrame | ( | VideoFrame * | frame | ) |
Frame is ready to be for filtering or OSD application.
Removes frame from limbo and adds it to used queue.
| frame | Frame to move to used. |
Definition at line 306 of file videobuffers.cpp.
Referenced by VideoOutput::ReleaseFrame().
| void VideoBuffers::DeLimboFrame | ( | VideoFrame * | frame | ) |
If the frame is still in the limbo state it is added to the available queue.
| frame | Frame to move to used. |
Definition at line 321 of file videobuffers.cpp.
Referenced by VideoOutput::DeLimboFrame().
| void VideoBuffers::StartDisplayingFrame | ( | void | ) |
Sets rpos to index of videoframe at head of used queue.
Definition at line 341 of file videobuffers.cpp.
Referenced by VideoOutput::StartDisplayingFrame().
| void VideoBuffers::DoneDisplayingFrame | ( | VideoFrame * | frame | ) |
Removes frame from used queue and adds it to the available list.
Definition at line 351 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::DiscardFrame(), VideoOutputNullVDPAU::DiscardFrame(), and VideoOutput::DoneDisplayingFrame().
| void VideoBuffers::DiscardFrame | ( | VideoFrame * | frame | ) |
Frame is ready to be reused by decoder.
Add frame to available list, remove from any other list.
Definition at line 378 of file videobuffers.cpp.
Referenced by VideoOutput::DiscardFrame(), VideoOutputXv::DiscardFrame(), VideoOutputNullVAAPI::DiscardFrame(), and DiscardFrames().
| VideoFrame* VideoBuffers::at | ( | uint | i | ) | [inline] |
Definition at line 90 of file videobuffers.h.
Referenced by AddBuffer(), Clear(), ClearAfterSeek(), VideoOutputNullVDPAU::DiscardFrame(), VideoOutputNullVAAPI::DiscardFrame(), DiscardFrames(), VideoOutputNullVDPAU::DoneDisplayingFrame(), VideoOutputNullVAAPI::DoneDisplayingFrame(), VideoOutputNullVDPAU::GetLastDecodedFrame(), VideoOutputNullVAAPI::GetLastDecodedFrame(), GetLastDecodedFrame(), VideoOutputNullVDPAU::GetLastShownFrame(), VideoOutputNullVAAPI::GetLastShownFrame(), GetLastShownFrame(), Init(), VideoOutputNullVDPAU::ReleaseFrame(), and VideoOutputNullVAAPI::ReleaseFrame().
| VideoFrame * VideoBuffers::dequeue | ( | BufferType | type | ) |
Definition at line 432 of file videobuffers.cpp.
Referenced by requeue().
| VideoFrame * VideoBuffers::head | ( | BufferType | type | ) |
Definition at line 444 of file videobuffers.cpp.
Referenced by GetScratchFrame(), SetLastShownFrameToScratch(), VideoOutputXv::UpdatePauseFrame(), VideoOutputVDPAU::UpdatePauseFrame(), VideoOutputQuartz::UpdatePauseFrame(), VideoOutputOpenGLVAAPI::UpdatePauseFrame(), VideoOutputOpenGL::UpdatePauseFrame(), VideoOutputNull::UpdatePauseFrame(), and VideoOutputD3D::UpdatePauseFrame().
| VideoFrame * VideoBuffers::tail | ( | BufferType | type | ) |
Definition at line 459 of file videobuffers.cpp.
| void VideoBuffers::requeue | ( | BufferType | dst, | |
| BufferType | src, | |||
| int | num = 1 | |||
| ) |
Definition at line 514 of file videobuffers.cpp.
| void VideoBuffers::enqueue | ( | BufferType | type, | |
| VideoFrame * | frame | |||
| ) |
Definition at line 474 of file videobuffers.cpp.
Referenced by AddBuffer(), DoneDisplayingFrame(), Init(), requeue(), and safeEnqueue().
| void VideoBuffers::safeEnqueue | ( | BufferType | dst, | |
| VideoFrame * | frame | |||
| ) |
Definition at line 527 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::CheckFrameStates(), VideoOutputNullVDPAU::CheckFrameStates(), DeLimboFrame(), VideoOutputVDPAU::DiscardFrame(), DiscardFrame(), and GetNextFreeFrameInternal().
| void VideoBuffers::remove | ( | BufferType | type, | |
| VideoFrame * | frame | |||
| ) |
Definition at line 491 of file videobuffers.cpp.
| frame_queue_t::iterator VideoBuffers::begin_lock | ( | BufferType | type | ) |
Definition at line 538 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::CheckFrameStates(), VideoOutputNullVDPAU::CheckFrameStates(), VideoOutputXv::UpdatePauseFrame(), VideoOutputVDPAU::UpdatePauseFrame(), VideoOutputOpenGLVAAPI::UpdatePauseFrame(), and VideoOutputNull::UpdatePauseFrame().
| frame_queue_t::iterator VideoBuffers::end | ( | BufferType | type | ) |
Definition at line 548 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::CheckFrameStates(), and VideoOutputNullVDPAU::CheckFrameStates().
| void VideoBuffers::end_lock | ( | ) | [inline] |
| uint VideoBuffers::size | ( | BufferType | type | ) | const |
Definition at line 562 of file videobuffers.cpp.
Referenced by CreateBuffers(), EnoughDecodedFrames(), EnoughFreeFrames(), EnoughPrebufferedFrames(), FreeVideoFrames(), requeue(), VideoOutputXv::UpdatePauseFrame(), VideoOutputVDPAU::UpdatePauseFrame(), VideoOutputOpenGLVAAPI::UpdatePauseFrame(), VideoOutputNull::UpdatePauseFrame(), and ValidVideoFrames().
| bool VideoBuffers::contains | ( | BufferType | type, | |
| VideoFrame * | frame | |||
| ) | const |
Definition at line 573 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::CheckFrameStates(), VideoOutputNullVDPAU::CheckFrameStates(), VideoOutputVDPAU::DoneDisplayingFrame(), and VideoOutputNullVDPAU::DoneDisplayingFrame().
| VideoFrame * VideoBuffers::GetScratchFrame | ( | void | ) |
Definition at line 584 of file videobuffers.cpp.
Referenced by VideoOutputXv::CreatePauseFrame(), VideoOutputOpenGL::CreatePauseFrame(), VideoOutputNull::CreatePauseFrame(), VideoOutputD3D::CreatePauseFrame(), VideoOutputQuartz::CreateQuartzBuffers(), VideoOutputOpenGL::PrepareFrame(), VideoOutputNull::PrepareFrame(), VideoOutputD3D::PrepareFrame(), VideoOutputXv::PrepareFrameMem(), VideoOutputXv::PrepareFrameXv(), VideoOutputXv::ProcessFrame(), VideoOutputQuartz::ProcessFrame(), VideoOutputOpenGL::ProcessFrame(), VideoOutputD3D::ProcessFrame(), VideoOutputXv::UpdatePauseFrame(), VideoOutputQuartz::UpdatePauseFrame(), VideoOutputOpenGL::UpdatePauseFrame(), VideoOutputNull::UpdatePauseFrame(), and VideoOutputD3D::UpdatePauseFrame().
| VideoFrame* VideoBuffers::GetLastDecodedFrame | ( | void | ) | [inline] |
Definition at line 105 of file videobuffers.h.
Referenced by VideoOutput::GetLastDecodedFrame(), VideoOutputNullVDPAU::GetLastDecodedFrame(), and VideoOutputNullVAAPI::GetLastDecodedFrame().
| VideoFrame* VideoBuffers::GetLastShownFrame | ( | void | ) | [inline] |
Definition at line 106 of file videobuffers.h.
Referenced by VideoOutput::GetLastShownFrame(), VideoOutputNullVDPAU::GetLastShownFrame(), and VideoOutputNullVAAPI::GetLastShownFrame().
| void VideoBuffers::SetLastShownFrameToScratch | ( | void | ) |
Definition at line 595 of file videobuffers.cpp.
Referenced by VideoOutputOpenGL::PrepareFrame(), and VideoOutputXv::PrepareFrameXv().
| uint VideoBuffers::ValidVideoFrames | ( | void | ) | const [inline] |
Definition at line 109 of file videobuffers.h.
Referenced by VideoOutput::ValidVideoFrames().
| uint VideoBuffers::FreeVideoFrames | ( | void | ) | const [inline] |
Definition at line 110 of file videobuffers.h.
Referenced by VideoOutput::FreeVideoFrames().
| bool VideoBuffers::EnoughFreeFrames | ( | void | ) | const [inline] |
Definition at line 111 of file videobuffers.h.
Referenced by VideoOutput::EnoughFreeFrames().
| bool VideoBuffers::EnoughDecodedFrames | ( | void | ) | const [inline] |
Definition at line 113 of file videobuffers.h.
Referenced by VideoOutput::EnoughDecodedFrames().
| bool VideoBuffers::EnoughPrebufferedFrames | ( | void | ) | const [inline] |
Definition at line 115 of file videobuffers.h.
Referenced by VideoOutput::EnoughPrebufferedFrames().
| const VideoFrame* VideoBuffers::at | ( | uint | i | ) | const [inline] |
Definition at line 118 of file videobuffers.h.
| const VideoFrame* VideoBuffers::GetLastDecodedFrame | ( | void | ) | const [inline] |
Definition at line 119 of file videobuffers.h.
| const VideoFrame* VideoBuffers::GetLastShownFrame | ( | void | ) | const [inline] |
Definition at line 120 of file videobuffers.h.
| uint VideoBuffers::Size | ( | void | ) | const [inline] |
Definition at line 121 of file videobuffers.h.
Referenced by AddBuffer(), VideoOutputNullVDPAU::BufferSizeCheck(), Clear(), ClearAfterSeek(), CreateBuffer(), VideoOutputXv::CreateBuffers(), CreateBuffers(), DeleteBuffers(), VideoOutputNullVDPAU::DiscardFrame(), VideoOutputNullVAAPI::DiscardFrame(), DiscardFrames(), VideoOutputNullVDPAU::DoneDisplayingFrame(), VideoOutputNullVAAPI::DoneDisplayingFrame(), VideoOutputVDPAU::DrawSlice(), VideoOutputNullVDPAU::DrawSlice(), VideoOutputNullVDPAU::GetLastDecodedFrame(), VideoOutputNullVAAPI::GetLastDecodedFrame(), VideoOutputNullVDPAU::GetLastShownFrame(), VideoOutputNullVAAPI::GetLastShownFrame(), GetStatus(), VideoOutputNullVDPAU::InitShadowBuffers(), VideoOutputNullVDPAU::ReleaseFrame(), and VideoOutputNullVAAPI::ReleaseFrame().
| void VideoBuffers::Clear | ( | uint | i | ) |
Definition at line 853 of file videobuffers.cpp.
Referenced by VideoOutputNull::InputChanged().
| void VideoBuffers::Clear | ( | void | ) |
Definition at line 858 of file videobuffers.cpp.
Referenced by CreateBuffers().
| bool VideoBuffers::CreateBuffer | ( | int | width, | |
| int | height, | |||
| uint | num, | |||
| void * | data, | |||
| VideoFrameType | fmt | |||
| ) |
Definition at line 753 of file videobuffers.cpp.
Referenced by VideoOutputOpenGLVAAPI::CreateVAAPIContext(), VideoOutputVDPAU::InitBuffers(), VideoOutputNullVDPAU::InitBuffers(), VideoOutputNullVAAPI::InitBuffers(), and VideoOutputD3D::InitBuffers().
| uint VideoBuffers::AddBuffer | ( | int | width, | |
| int | height, | |||
| void * | data, | |||
| VideoFrameType | fmt | |||
| ) |
Definition at line 765 of file videobuffers.cpp.
Referenced by VideoOutputVDPAU::DrawSlice(), and VideoOutputNullVDPAU::DrawSlice().
| QString VideoBuffers::GetStatus | ( | int | n = -1 |
) | const |
Definition at line 804 of file videobuffers.cpp.
Referenced by VideoOutputXv::DiscardFrames(), VideoOutputVDPAU::DiscardFrames(), VideoOutputNullVDPAU::DiscardFrames(), DiscardFrames(), VideoOutput::GetFrameStatus(), GetNextFreeFrameInternal(), VideoOutputXv::UpdatePauseFrame(), and VideoOutputVDPAU::UpdatePauseFrame().
| frame_queue_t * VideoBuffers::queue | ( | BufferType | type | ) | [private] |
Definition at line 384 of file videobuffers.cpp.
Referenced by begin_lock(), contains(), dequeue(), end(), enqueue(), head(), size(), and tail().
| const frame_queue_t * VideoBuffers::queue | ( | BufferType | type | ) | const [private] |
Definition at line 408 of file videobuffers.cpp.
| VideoFrame * VideoBuffers::GetNextFreeFrameInternal | ( | BufferType | enqueue_to | ) | [private] |
Definition at line 234 of file videobuffers.cpp.
Referenced by GetNextFreeFrame().
frame_queue_t VideoBuffers::available [private] |
Definition at line 137 of file videobuffers.h.
Referenced by begin_lock(), ClearAfterSeek(), DiscardFrames(), end(), GetNextFreeFrameInternal(), GetStatus(), queue(), remove(), and Reset().
frame_queue_t VideoBuffers::used [private] |
Definition at line 137 of file videobuffers.h.
Referenced by ClearAfterSeek(), DiscardFrames(), DoneDisplayingFrame(), GetNextFreeFrameInternal(), GetStatus(), queue(), ReleaseFrame(), remove(), Reset(), and StartDisplayingFrame().
frame_queue_t VideoBuffers::limbo [private] |
Definition at line 137 of file videobuffers.h.
Referenced by DeLimboFrame(), DiscardFrames(), GetStatus(), queue(), ReleaseFrame(), remove(), and Reset().
frame_queue_t VideoBuffers::pause [private] |
Definition at line 137 of file videobuffers.h.
Referenced by DiscardFrames(), GetStatus(), queue(), remove(), Reset(), and SetLastShownFrameToScratch().
frame_queue_t VideoBuffers::displayed [private] |
Definition at line 137 of file videobuffers.h.
Referenced by DiscardFrames(), GetStatus(), queue(), remove(), and Reset().
frame_queue_t VideoBuffers::decode [private] |
Definition at line 137 of file videobuffers.h.
Referenced by DeLimboFrame(), DiscardFrames(), DoneDisplayingFrame(), GetNextFreeFrameInternal(), GetStatus(), queue(), ReleaseFrame(), remove(), and Reset().
frame_queue_t VideoBuffers::finished [private] |
Definition at line 137 of file videobuffers.h.
Referenced by DiscardFrames(), DoneDisplayingFrame(), GetStatus(), queue(), remove(), and Reset().
vbuffer_map_t VideoBuffers::vbufferMap [private] |
Definition at line 138 of file videobuffers.h.
Referenced by AddBuffer(), ClearAfterSeek(), Init(), ReleaseFrame(), Reset(), SetLastShownFrameToScratch(), and StartDisplayingFrame().
frame_vector_t VideoBuffers::buffers [private] |
Definition at line 139 of file videobuffers.h.
uchar_vector_t VideoBuffers::allocated_arrays [private] |
Definition at line 140 of file videobuffers.h.
Referenced by CreateBuffers(), and DeleteBuffers().
uint VideoBuffers::needfreeframes [private] |
Definition at line 142 of file videobuffers.h.
Referenced by EnoughFreeFrames(), and Init().
uint VideoBuffers::needprebufferframes [private] |
Definition at line 143 of file videobuffers.h.
Referenced by EnoughDecodedFrames(), Init(), and SetPrebuffering().
uint VideoBuffers::needprebufferframes_normal [private] |
Definition at line 144 of file videobuffers.h.
Referenced by Init(), and SetPrebuffering().
uint VideoBuffers::needprebufferframes_small [private] |
Definition at line 145 of file videobuffers.h.
Referenced by Init(), and SetPrebuffering().
uint VideoBuffers::keepprebufferframes [private] |
Definition at line 145 of file videobuffers.h.
Referenced by EnoughPrebufferedFrames(), and Init().
bool VideoBuffers::createdpauseframe [private] |
Definition at line 147 of file videobuffers.h.
Referenced by GetScratchFrame(), Init(), and SetLastShownFrameToScratch().
uint VideoBuffers::rpos [private] |
Definition at line 149 of file videobuffers.h.
Referenced by ClearAfterSeek(), GetLastShownFrame(), SetLastShownFrameToScratch(), and StartDisplayingFrame().
uint VideoBuffers::vpos [private] |
Definition at line 150 of file videobuffers.h.
Referenced by ClearAfterSeek(), GetLastDecodedFrame(), and ReleaseFrame().
QMutex VideoBuffers::global_lock [mutable, private] |
Definition at line 152 of file videobuffers.h.
Referenced by AddBuffer(), begin_lock(), ClearAfterSeek(), contains(), DeLimboFrame(), dequeue(), DiscardFrame(), DiscardFrames(), DoneDisplayingFrame(), end(), end_lock(), enqueue(), GetNextFreeFrameInternal(), GetScratchFrame(), GetStatus(), head(), Init(), queue(), ReleaseFrame(), remove(), requeue(), Reset(), safeEnqueue(), SetPrebuffering(), size(), StartDisplayingFrame(), and tail().
1.6.3