bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &input_size, 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(input_size.width()).arg(input_size.height()).arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); if (!codec_is_vaapi(av_codec_id)) return VideoOutputOpenGL::InputChanged(input_size, 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 = input_size != 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(input_size.width(), input_size.height(), 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; }
void VideoOutputOpenGL::TearDown(void) { gl_context_lock.lock(); DestroyCPUResources(); DestroyVideoResources(); DestroyGPUResources(); gl_context_lock.unlock(); }
bool VideoOutputOpenGL::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))); QMutexLocker locker(&gl_context_lock); // Ensure we don't lose embedding through program changes. This duplicates // code in VideoOutput::Init but we need start here otherwise the embedding // is lost during window re-initialistion. bool wasembedding = window.IsEmbedding(); QRect oldrect; if (wasembedding) { oldrect = window.GetEmbeddingRect(); StopEmbedding(); } if (!codec_is_std(av_codec_id) && !codec_is_mediacodec(av_codec_id) && !codec_is_vaapi2(av_codec_id)) { LOG(VB_GENERAL, LOG_ERR, LOC + "New video codec is not supported."); errorState = kError_Unknown; return false; } 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; }