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; }
/** * \fn VideoOutWindow::ToggleAspectOverride(AspectOverrideMode) * \brief Enforce different aspect ration than detected, * then calls VideoAspectRatioChanged(float) * to apply them. * \sa Zoom(ZoomDirection), ToggleAdjustFill(AdjustFillMode) */ void VideoOutWindow::ToggleAspectOverride(AspectOverrideMode aspectMode) { if (pip_state > kPIPOff) { aspectMode = kAspect_Off; return; } if (aspectMode == kAspect_Toggle) { aspectMode = (AspectOverrideMode) ((int) (aspectoverride + 1) % kAspect_END); } aspectoverride = aspectMode; VideoAspectRatioChanged(video_aspect); }
bool VideoOutWindow::Init(const QSize &new_video_dim_buf, const QSize &new_video_dim_disp, float new_video_aspect, const QRect &new_display_visible_rect, AspectOverrideMode new_aspectoverride, AdjustFillMode new_adjustfill) { display_visible_rect = db_use_gui_size ? new_display_visible_rect : screen_geom; int pbp_width = display_visible_rect.width() / 2; if (pip_state == kPBPLeft || pip_state == kPBPRight) display_visible_rect.setWidth(pbp_width); if (pip_state == kPBPRight) display_visible_rect.moveLeft(pbp_width); video_dim_act = new_video_dim_disp; video_disp_dim = new_video_dim_disp; video_dim = new_video_dim_buf; video_rect = QRect(display_visible_rect.topLeft(), video_disp_dim); if (pip_state > kPIPOff) { aspectoverride = kAspect_Off; adjustfill = kAdjustFill_Off; } else { aspectoverride = new_aspectoverride; adjustfill = new_adjustfill; } // apply aspect ratio and letterbox mode VideoAspectRatioChanged(new_video_aspect); embedding = false; return true; }
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; }
bool VideoOutputOpenGL::InputChanged(const QSize &input_size, float aspect, MythCodecID av_codec_id, void *codec_private, bool &aspect_only) { VERBOSE(VB_PLAYBACK, 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))); 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)) { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("New video codec is not supported.")); errorState = kError_Unknown; return false; } if (input_size == window.GetActualVideoDim()) { aspect_only = video_codec_id == av_codec_id; if (window.GetVideoAspect() != aspect) { VideoAspectRatioChanged(aspect); MoveResize(); if (wasembedding) EmbedInWidget(oldrect); } return true; } TearDown(); QRect disp = window.GetDisplayVisibleRect(); if (Init(input_size.width(), input_size.height(), aspect, gl_parent_win, disp, av_codec_id)) { if (wasembedding) EmbedInWidget(oldrect); BestDeint(); return true; } VERBOSE(VB_IMPORTANT, LOC_ERR + QString("Failed to re-initialise video output.")); errorState = kError_Unknown; return false; }