bool VideoOutputOpenGLVAAPI::CreateBuffers(void) { QMutexLocker locker(&gl_context_lock); if (codec_is_vaapi(video_codec_id)) { vbuffers.Init(24, true, 2, 1, 4, 1); return true; } return VideoOutputOpenGL::CreateBuffers(); }
bool VideoOutputOpenGLVAAPI::Init(int width, int height, float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { bool ok = VideoOutputOpenGL::Init(width, height, aspect, winid, win_rect, codec_id); if (ok && codec_is_vaapi(video_codec_id)) return CreateVAAPIContext(window.GetActualVideoDim()); return ok; }
QStringList VideoOutputOpenGLVAAPI::GetAllowedRenderers( MythCodecID myth_codec_id, const QSize &video_dim) { (void) video_dim; QStringList list; if ((codec_is_std(myth_codec_id) || (codec_is_vaapi(myth_codec_id))) && !getenv("NO_VAAPI")) { list += "openglvaapi"; } return list; }
bool VideoOutputOpenGLVAAPI::Init(const QSize &video_dim_buf, const QSize &video_dim_disp, float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { bool ok = VideoOutputOpenGL::Init(video_dim_buf, video_dim_disp, aspect, winid, win_rect, codec_id); if (ok && codec_is_vaapi(video_codec_id)) return CreateVAAPIContext(window.GetActualVideoDim()); return ok; }
void VideoOutputOpenGLVAAPI::ProcessFrame(VideoFrame *frame, OSD *osd, FilterChain *filterList, const PIPMap &pipPlayers, FrameScanType scan) { QMutexLocker locker(&gl_context_lock); VideoOutputOpenGL::ProcessFrame(frame, osd, filterList, pipPlayers, scan); if (codec_is_vaapi(video_codec_id) && m_ctx && gl_videochain) { gl_context->makeCurrent(); m_ctx->CopySurfaceToTexture(frame ? frame->buf : m_pauseBuffer, gl_videochain->GetInputTexture(), gl_videochain->GetTextureType(), scan); gl_videochain->SetInputUpdated(); gl_context->doneCurrent(); } }
MythCodecID VideoOutputOpenGLVAAPI::GetBestSupportedCodec( uint width, uint height, const QString &decoder, uint stream_type, bool no_acceleration, PixelFormat &pix_fmt) { QSize size(width, height); bool use_cpu = no_acceleration; PixelFormat fmt = PIX_FMT_YUV420P; MythCodecID test_cid = (MythCodecID)(kCodec_MPEG1_VAAPI + (stream_type - 1)); if (codec_is_vaapi(test_cid) && decoder == "vaapi" && !getenv("NO_VAAPI")) use_cpu |= !VAAPIContext::IsFormatAccelerated(size, test_cid, fmt); else use_cpu = true; if (use_cpu) return (MythCodecID)(kCodec_MPEG1 + (stream_type - 1)); pix_fmt = fmt; return test_cid; }
bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &video_dim_buf, const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, bool &aspect_only) { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(%1,%2,%3) %4->%5") .arg(video_dim_disp.width()).arg(video_dim_disp.height()) .arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); if (!codec_is_vaapi(av_codec_id)) return VideoOutputOpenGL::InputChanged(video_dim_buf, video_dim_disp, aspect, av_codec_id, codec_private, aspect_only); QMutexLocker locker(&gl_context_lock); bool wasembedding = window.IsEmbedding(); QRect oldrect; if (wasembedding) { oldrect = window.GetEmbeddingRect(); StopEmbedding(); } bool cid_changed = (video_codec_id != av_codec_id); bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) { if (asp_changed) { aspect_only = true; VideoAspectRatioChanged(aspect); MoveResize(); if (wasembedding) EmbedInWidget(oldrect); } return true; } if (gCoreContext->IsUIThread()) TearDown(); else DestroyCPUResources(); QRect disp = window.GetDisplayVisibleRect(); if (Init(video_dim_buf, video_dim_disp, aspect, gl_parent_win, disp, av_codec_id)) { if (wasembedding) EmbedInWidget(oldrect); if (gCoreContext->IsUIThread()) BestDeint(); return true; } LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to re-initialise video output."); errorState = kError_Unknown; return false; }