Skip to content

Commit

Permalink
VAAPI: Implement proper pause frame handling.
Browse files Browse the repository at this point in the history
Refs #8593
  • Loading branch information
Mark Kendall committed Jun 21, 2011
1 parent 0ffe5bb commit e468ec9
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
2 changes: 1 addition & 1 deletion mythtv/libs/libmythtv/videoout_opengl.h
Expand Up @@ -27,7 +27,7 @@ class VideoOutputOpenGL : public VideoOutput
virtual bool InputChanged(const QSize &input_size, float aspect,
MythCodecID av_codec_id, void *codec_private,
bool &aspect_only);
void UpdatePauseFrame(void);
virtual void UpdatePauseFrame(void);
void DrawUnusedRects(bool) { }
void Zoom(ZoomDirection direction);
void MoveResize(void);
Expand Down
27 changes: 24 additions & 3 deletions mythtv/libs/libmythtv/videoout_openglvaapi.cpp
Expand Up @@ -26,7 +26,7 @@ void VideoOutputOpenGLVAAPI::GetRenderOptions(render_opts &opts)
}

VideoOutputOpenGLVAAPI::VideoOutputOpenGLVAAPI()
: VideoOutputOpenGL(), m_ctx(NULL)
: VideoOutputOpenGL(), m_ctx(NULL), m_pauseBuffer(NULL)
{
}

Expand Down Expand Up @@ -229,6 +229,27 @@ int VideoOutputOpenGLVAAPI::SetPictureAttribute(PictureAttribute attribute,
return VideoOutput::SetPictureAttribute(attribute, val);
}

void VideoOutputOpenGLVAAPI::UpdatePauseFrame(void)
{
if (codec_is_std(video_codec_id))
{
VideoOutputOpenGLVAAPI::UpdatePauseFrame();
return;
}

vbuffers.begin_lock(kVideoBuffer_used);
if (vbuffers.size(kVideoBuffer_used))
{
VideoFrame *frame = vbuffers.head(kVideoBuffer_used);
m_pauseBuffer = frame->buf;
}
else
VERBOSE(VB_PLAYBACK, LOC +
QString("WARNING: Could not update pause frame - no used frames."));

vbuffers.end_lock();
}

void VideoOutputOpenGLVAAPI::ProcessFrame(VideoFrame *frame, OSD *osd,
FilterChain *filterList,
const PIPMap &pipPlayers,
Expand All @@ -237,10 +258,10 @@ void VideoOutputOpenGLVAAPI::ProcessFrame(VideoFrame *frame, OSD *osd,
QMutexLocker locker(&gl_context_lock);
VideoOutputOpenGL::ProcessFrame(frame, osd, filterList, pipPlayers, scan);

if (codec_is_vaapi(video_codec_id) && m_ctx && gl_videochain && frame)
if (codec_is_vaapi(video_codec_id) && m_ctx && gl_videochain)
{
gl_context->makeCurrent();
m_ctx->CopySurfaceToTexture(frame->buf,
m_ctx->CopySurfaceToTexture(frame ? frame->buf : m_pauseBuffer,
gl_videochain->GetInputTexture(),
gl_videochain->GetTextureType(), scan);
gl_videochain->SetInputUpdated();
Expand Down
2 changes: 2 additions & 0 deletions mythtv/libs/libmythtv/videoout_openglvaapi.h
Expand Up @@ -25,6 +25,7 @@ class VideoOutputOpenGLVAAPI : public VideoOutputOpenGL
bool InputChanged(const QSize &input_size, float aspect,
MythCodecID av_codec_id, void *codec_private,
bool &aspect_only);
virtual void UpdatePauseFrame(void);
void ProcessFrame(VideoFrame *frame, OSD *osd,
FilterChain *filterList,
const PIPMap &pipPlayers,
Expand All @@ -44,6 +45,7 @@ class VideoOutputOpenGLVAAPI : public VideoOutputOpenGL

private:
VAAPIContext *m_ctx;
void *m_pauseBuffer;
};
#endif // VIDEOOUTPUTOPENGLVAAPI_H

0 comments on commit e468ec9

Please sign in to comment.