From 0a4e3e423d6604252aeb31f849085a00f9f4b2e9 Mon Sep 17 00:00:00 2001 From: Jim Stichnoth Date: Tue, 5 Mar 2013 08:54:47 -0800 Subject: [PATCH] Fixes #11358. Use dimension and cropping information from the video. This helps avoid hard-coding of 1088->1080 truncation and manual rounding up to a multiple of 16. There are still many instances in the code base, but this is progress. Cropping in the horizontal dimension is not yet implemented. There is still some funny business with slightly changing aspect ratios that needs further investigation. --- mythtv/libs/libmythtv/filtermanager.cpp | 38 --------- mythtv/libs/libmythtv/mythplayer.cpp | 4 +- mythtv/libs/libmythtv/videoout_d3d.cpp | 23 ++++-- mythtv/libs/libmythtv/videoout_d3d.h | 7 +- mythtv/libs/libmythtv/videoout_null.cpp | 22 ++++-- mythtv/libs/libmythtv/videoout_null.h | 7 +- mythtv/libs/libmythtv/videoout_nullvaapi.cpp | 17 ++-- mythtv/libs/libmythtv/videoout_nullvaapi.h | 7 +- mythtv/libs/libmythtv/videoout_nullvdpau.cpp | 17 ++-- mythtv/libs/libmythtv/videoout_nullvdpau.h | 7 +- mythtv/libs/libmythtv/videoout_opengl.cpp | 19 +++-- mythtv/libs/libmythtv/videoout_opengl.h | 8 +- .../libs/libmythtv/videoout_openglvaapi.cpp | 21 +++-- mythtv/libs/libmythtv/videoout_openglvaapi.h | 8 +- mythtv/libs/libmythtv/videoout_quartz.cpp | 23 ++++-- mythtv/libs/libmythtv/videoout_quartz.h | 7 +- mythtv/libs/libmythtv/videoout_vdpau.cpp | 20 +++-- mythtv/libs/libmythtv/videoout_vdpau.h | 7 +- mythtv/libs/libmythtv/videoout_xv.cpp | 23 ++++-- mythtv/libs/libmythtv/videoout_xv.h | 7 +- mythtv/libs/libmythtv/videooutbase.cpp | 78 +++++++++++++++---- mythtv/libs/libmythtv/videooutbase.h | 11 ++- mythtv/libs/libmythtv/videooutwindow.cpp | 29 +++---- mythtv/libs/libmythtv/videooutwindow.h | 6 +- 24 files changed, 257 insertions(+), 159 deletions(-) diff --git a/mythtv/libs/libmythtv/filtermanager.cpp b/mythtv/libs/libmythtv/filtermanager.cpp index 8bb819daebd..f02fc7426fb 100644 --- a/mythtv/libs/libmythtv/filtermanager.cpp +++ b/mythtv/libs/libmythtv/filtermanager.cpp @@ -53,49 +53,11 @@ FilterChain::~FilterChain() filters.clear(); } -// Applies a crop filter, modifed from filter_crop.c, to crop the -// bottom 8 lines of a 1088-line frame, which often contains garbage. -static void crop1088(VideoFrame *frame) -{ - if (frame->height != 1088) - return; - if (frame->width != 1920 && frame->width != 1440) - return; - if (frame->pitches[1] != frame->pitches[2]) - return; - // assume input and output formats are FMT_YV12 - uint64_t *ybuf = (uint64_t*) (frame->buf + frame->offsets[0]); - uint64_t *ubuf = (uint64_t*) (frame->buf + frame->offsets[1]); - uint64_t *vbuf = (uint64_t*) (frame->buf + frame->offsets[2]); - const uint64_t Y_black = 0x0000000000000000LL; // 8 bytes - const uint64_t UV_black = 0x8080808080808080LL; // 8 bytes - int y; - int sz = (frame->pitches[0] * frame->height) >> 3; // div 8 bytes - // Luma bottom - y = ((frame->height >> 4) - 1) * frame->pitches[0] << 1; - y = (y + sz) / 2; - for (; y < sz; y++) - { - ybuf[y] = Y_black; - } - // Chroma bottom - sz = (frame->pitches[1] * (frame->height >> 1)) >> 3; // div 8 bytes - y = ((frame->height >> 4) - 1) * frame->pitches[1]; - y = (y + sz) / 2; - for (; y < sz; y++) - { - ubuf[y] = UV_black; - vbuf[y] = UV_black; - } -} - void FilterChain::ProcessFrame(VideoFrame *frame, FrameScanType scan) { if (!frame) return; - crop1088(frame); - vector::iterator it = filters.begin(); for (; it != filters.end(); ++it) (*it)->filter(*it, frame, kScan_Intr2ndField == scan); diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp index 873c7396f9c..5a09ddf7490 100644 --- a/mythtv/libs/libmythtv/mythplayer.cpp +++ b/mythtv/libs/libmythtv/mythplayer.cpp @@ -484,7 +484,7 @@ bool MythPlayer::InitVideo(void) decoder->GetCodecDecoderName(), decoder->GetVideoCodecID(), decoder->GetVideoCodecPrivate(), - pipState, video_disp_dim, video_aspect, + pipState, video_dim, video_disp_dim, video_aspect, parentWidget, embedRect, video_frame_rate, (uint)playerFlags); @@ -588,7 +588,7 @@ void MythPlayer::ReinitVideo(void) videoOutput->SetVideoFrameRate(video_frame_rate); float aspect = (forced_video_aspect > 0) ? forced_video_aspect : video_aspect; - if (!videoOutput->InputChanged(video_disp_dim, aspect, + if (!videoOutput->InputChanged(video_dim, video_disp_dim, aspect, decoder->GetVideoCodecID(), decoder->GetVideoCodecPrivate(), aspect_only)) diff --git a/mythtv/libs/libmythtv/videoout_d3d.cpp b/mythtv/libs/libmythtv/videoout_d3d.cpp index 64d8d1efa16..4266bde30c5 100644 --- a/mythtv/libs/libmythtv/videoout_d3d.cpp +++ b/mythtv/libs/libmythtv/videoout_d3d.cpp @@ -131,7 +131,8 @@ void VideoOutputD3D::WindowResized(const QSize &new_size) */ } -bool VideoOutputD3D::InputChanged(const QSize &input_size, +bool VideoOutputD3D::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -145,12 +146,12 @@ bool VideoOutputD3D::InputChanged(const QSize &input_size, QString("InputChanged from %1: %2x%3 aspect %4 to %5: %6x%7 aspect %9") .arg(toString(video_codec_id)).arg(cursize.width()) .arg(cursize.height()).arg(window.GetVideoAspect()) - .arg(toString(av_codec_id)).arg(input_size.width()) - .arg(input_size.height()).arg(aspect)); + .arg(toString(av_codec_id)).arg(video_dim_disp.width()) + .arg(video_dim_disp.height()).arg(aspect)); bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != cursize; + bool res_changed = video_dim_disp != cursize; bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) @@ -166,7 +167,7 @@ bool VideoOutputD3D::InputChanged(const QSize &input_size, TearDown(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, m_hWnd, disp, av_codec_id)) { BestDeint(); @@ -199,7 +200,9 @@ bool VideoOutputD3D::SetupContext() return true; } -bool VideoOutputD3D::Init(int width, int height, float aspect, WId winid, +bool VideoOutputD3D::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect,MythCodecID codec_id) { MythPainter *painter = GetMythPainter(); @@ -210,7 +213,8 @@ bool VideoOutputD3D::Init(int width, int height, float aspect, WId winid, m_hWnd = winid; window.SetAllowPreviewEPG(true); - VideoOutput::Init(width, height, aspect, winid, win_rect, codec_id); + VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Init with codec: %1") .arg(toString(codec_id))); @@ -218,7 +222,8 @@ bool VideoOutputD3D::Init(int width, int height, float aspect, WId winid, bool success = true; success &= SetupContext(); - InitDisplayMeasurements(width, height, false); + InitDisplayMeasurements(video_dim_disp.width(), video_dim_disp.height(), + false); if (codec_is_dxva2(video_codec_id)) { @@ -540,6 +545,8 @@ void VideoOutputD3D::ProcessFrame(VideoFrame *frame, OSD *osd, pauseframe = true; } + CropToDisplay(frame); + if (frame) dummy = frame->dummy; bool deint_proc = m_deinterlacing && (m_deintFilter != NULL) && diff --git a/mythtv/libs/libmythtv/videoout_d3d.h b/mythtv/libs/libmythtv/videoout_d3d.h index aea9ec65dcc..f8e16ad45db 100644 --- a/mythtv/libs/libmythtv/videoout_d3d.h +++ b/mythtv/libs/libmythtv/videoout_d3d.h @@ -19,7 +19,9 @@ class VideoOutputD3D : public VideoOutput VideoOutputD3D(); ~VideoOutputD3D(); - bool Init(int width, int height, float aspect, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); void PrepareFrame(VideoFrame *buffer, FrameScanType, OSD *osd); void ProcessFrame(VideoFrame *frame, OSD *osd, @@ -28,7 +30,8 @@ class VideoOutputD3D : public VideoOutput FrameScanType scan); void Show(FrameScanType ); void WindowResized(const QSize &new_size); - bool InputChanged(const QSize &input_size, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_null.cpp b/mythtv/libs/libmythtv/videoout_null.cpp index 1839273feba..eee155de9ad 100644 --- a/mythtv/libs/libmythtv/videoout_null.cpp +++ b/mythtv/libs/libmythtv/videoout_null.cpp @@ -76,7 +76,8 @@ void VideoOutputNull::CreatePauseFrame(void) clear(&av_pause_frame); } -bool VideoOutputNull::InputChanged(const QSize &input_size, +bool VideoOutputNull::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -84,8 +85,8 @@ bool VideoOutputNull::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, QString("InputChanged(WxH = %1x%2, aspect = %3)") - .arg(input_size.width()) - .arg(input_size.height()).arg(aspect)); + .arg(video_dim_disp.width()) + .arg(video_dim_disp.height()).arg(aspect)); if (!codec_is_std(av_codec_id)) { @@ -97,14 +98,15 @@ bool VideoOutputNull::InputChanged(const QSize &input_size, QMutexLocker locker(&global_lock); - if (input_size == window.GetActualVideoDim()) + if (video_dim_disp == window.GetActualVideoDim()) { vbuffers.Clear(); MoveResize(); return true; } - VideoOutput::InputChanged(input_size, aspect, av_codec_id, codec_private, + VideoOutput::InputChanged(video_dim_buf, video_dim_disp, + aspect, av_codec_id, codec_private, aspect_only); vbuffers.DeleteBuffers(); @@ -131,10 +133,12 @@ bool VideoOutputNull::InputChanged(const QSize &input_size, return ok; } -bool VideoOutputNull::Init(int width, int height, float aspect, WId winid, +bool VideoOutputNull::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { - if ((width <= 0) || (height <= 0)) + if ((video_dim_disp.width() <= 0) || (video_dim_disp.height() <= 0)) return false; if (!codec_is_std(codec_id)) @@ -147,12 +151,14 @@ bool VideoOutputNull::Init(int width, int height, float aspect, WId winid, QMutexLocker locker(&global_lock); - VideoOutput::Init(width, height, aspect, winid, win_rect, codec_id); + VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); vbuffers.Init(kNumBuffers, true, kNeedFreeFrames, kPrebufferFramesNormal, kPrebufferFramesSmall, kKeepPrebuffer); + // XXX should this be GetActualVideoDim() ? const QSize video_dim = window.GetVideoDim(); if (!vbuffers.CreateBuffers(FMT_YV12, video_dim.width(), video_dim.height())) diff --git a/mythtv/libs/libmythtv/videoout_null.h b/mythtv/libs/libmythtv/videoout_null.h index 8613a79b96e..acdfeb66411 100644 --- a/mythtv/libs/libmythtv/videoout_null.h +++ b/mythtv/libs/libmythtv/videoout_null.h @@ -12,14 +12,17 @@ class VideoOutputNull : public VideoOutput VideoOutputNull(); ~VideoOutputNull(); - bool Init(int width, int height, float aspect, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); bool SetupDeinterlace(bool, const QString &ovrf = "") { (void)ovrf; return false; } // we don't deinterlace in null output.. void PrepareFrame(VideoFrame *buffer, FrameScanType, OSD *osd); void Show(FrameScanType ); void CreatePauseFrame(void); - bool InputChanged(const QSize &input_size, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_nullvaapi.cpp b/mythtv/libs/libmythtv/videoout_nullvaapi.cpp index 32a51f615d2..f710b449524 100644 --- a/mythtv/libs/libmythtv/videoout_nullvaapi.cpp +++ b/mythtv/libs/libmythtv/videoout_nullvaapi.cpp @@ -117,12 +117,15 @@ QStringList VideoOutputNullVAAPI::GetAllowedRenderers(MythCodecID myth_codec_id) return list; } -bool VideoOutputNullVAAPI::Init(int width, int height, float aspect, +bool VideoOutputNullVAAPI::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { QMutexLocker locker(&m_lock); - bool ok = VideoOutput::Init(width, height, aspect, winid, win_rect, codec_id); + bool ok = VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); if (!codec_is_vaapi_hw(video_codec_id)) return false; @@ -138,7 +141,8 @@ bool VideoOutputNullVAAPI::Init(int width, int height, float aspect, return ok; } -bool VideoOutputNullVAAPI::InputChanged(const QSize &input_size, +bool VideoOutputNullVAAPI::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -146,13 +150,14 @@ bool VideoOutputNullVAAPI::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(%1,%2,%3) '%4'->'%5'") - .arg(input_size.width()).arg(input_size.height()).arg(aspect) + .arg(video_dim_disp.width()).arg(video_dim_disp.height()) + .arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); QMutexLocker locker(&m_lock); bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); if (!res_changed && !cid_changed) { aspect_only = true; @@ -161,7 +166,7 @@ bool VideoOutputNullVAAPI::InputChanged(const QSize &input_size, TearDown(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, 0, disp, av_codec_id)) { return true; diff --git a/mythtv/libs/libmythtv/videoout_nullvaapi.h b/mythtv/libs/libmythtv/videoout_nullvaapi.h index 4bd82b5012e..9689044b355 100644 --- a/mythtv/libs/libmythtv/videoout_nullvaapi.h +++ b/mythtv/libs/libmythtv/videoout_nullvaapi.h @@ -14,9 +14,12 @@ class VideoOutputNullVAAPI : public VideoOutput ~VideoOutputNullVAAPI(); virtual void* GetDecoderContext(unsigned char* buf, uint8_t*& id); - virtual bool Init(int width, int height, float aspect, WId winid, + virtual bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); - virtual bool InputChanged(const QSize &input_size, + virtual bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_nullvdpau.cpp b/mythtv/libs/libmythtv/videoout_nullvdpau.cpp index 8904fe0b985..f2d010701b9 100644 --- a/mythtv/libs/libmythtv/videoout_nullvdpau.cpp +++ b/mythtv/libs/libmythtv/videoout_nullvdpau.cpp @@ -44,12 +44,15 @@ void VideoOutputNullVDPAU::TearDown(void) DeleteRender(); } -bool VideoOutputNullVDPAU::Init(int width, int height, float aspect, +bool VideoOutputNullVDPAU::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { QMutexLocker locker(&m_lock); - bool ok = VideoOutput::Init(width, height, aspect, winid, win_rect, codec_id); + bool ok = VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); if (!codec_is_vdpau_hw(video_codec_id)) return false; @@ -516,7 +519,8 @@ void VideoOutputNullVDPAU::ReleaseFrame(VideoFrame *frame) VideoOutput::ReleaseFrame(frame); } -bool VideoOutputNullVDPAU::InputChanged(const QSize &input_size, +bool VideoOutputNullVDPAU::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -524,13 +528,14 @@ bool VideoOutputNullVDPAU::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(%1,%2,%3) '%4'->'%5'") - .arg(input_size.width()).arg(input_size.height()).arg(aspect) + .arg(video_dim_disp.width()).arg(video_dim_disp.height()) + .arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); QMutexLocker locker(&m_lock); bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); if (!res_changed && !cid_changed) { @@ -540,7 +545,7 @@ bool VideoOutputNullVDPAU::InputChanged(const QSize &input_size, TearDown(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, 0, disp, av_codec_id)) { return true; diff --git a/mythtv/libs/libmythtv/videoout_nullvdpau.h b/mythtv/libs/libmythtv/videoout_nullvdpau.h index 05a9cd90ad5..e6776a12581 100644 --- a/mythtv/libs/libmythtv/videoout_nullvdpau.h +++ b/mythtv/libs/libmythtv/videoout_nullvdpau.h @@ -35,9 +35,12 @@ class VideoOutputNullVDPAU : public VideoOutput VideoOutputNullVDPAU(); ~VideoOutputNullVDPAU(); - virtual bool Init(int width, int height, float aspect, WId winid, + virtual bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); - virtual bool InputChanged(const QSize &input_size, + virtual bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_opengl.cpp b/mythtv/libs/libmythtv/videoout_opengl.cpp index 031f680db77..bd95898da01 100644 --- a/mythtv/libs/libmythtv/videoout_opengl.cpp +++ b/mythtv/libs/libmythtv/videoout_opengl.cpp @@ -174,14 +174,17 @@ void VideoOutputOpenGL::DestroyVideoResources(void) gl_context_lock.unlock(); } -bool VideoOutputOpenGL::Init(int width, int height, float aspect, WId winid, +bool VideoOutputOpenGL::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { QMutexLocker locker(&gl_context_lock); bool success = true; window.SetAllowPreviewEPG(true); gl_parent_win = winid; - success &= VideoOutput::Init(width, height, aspect, winid, + success &= VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); SetProfile(); InitPictureAttributes(); @@ -214,14 +217,16 @@ void VideoOutputOpenGL::SetProfile(void) } } -bool VideoOutputOpenGL::InputChanged(const QSize &input_size, +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(input_size.width()).arg(input_size.height()).arg(aspect) + .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); @@ -245,7 +250,7 @@ bool VideoOutputOpenGL::InputChanged(const QSize &input_size, } bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) @@ -267,7 +272,7 @@ bool VideoOutputOpenGL::InputChanged(const QSize &input_size, DestroyCPUResources(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, gl_parent_win, disp, av_codec_id)) { if (wasembedding) @@ -472,6 +477,8 @@ void VideoOutputOpenGL::ProcessFrame(VideoFrame *frame, OSD *osd, pauseframe = true; } + CropToDisplay(frame); + bool dummy = frame->dummy; if (filterList && sw_frame && !dummy) filterList->ProcessFrame(frame); diff --git a/mythtv/libs/libmythtv/videoout_opengl.h b/mythtv/libs/libmythtv/videoout_opengl.h index d9d7af3c920..ba67ef9e965 100644 --- a/mythtv/libs/libmythtv/videoout_opengl.h +++ b/mythtv/libs/libmythtv/videoout_opengl.h @@ -13,7 +13,9 @@ class VideoOutputOpenGL : public VideoOutput VideoOutputOpenGL(const QString &profile = QString()); virtual ~VideoOutputOpenGL(); - virtual bool Init(int width, int height, float aspect, + virtual bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); virtual void SetProfile(void); virtual void TearDown(void); @@ -24,7 +26,9 @@ class VideoOutputOpenGL : public VideoOutput const PIPMap &pipPlayers, FrameScanType scan); virtual void Show(FrameScanType ); - virtual bool InputChanged(const QSize &input_size, float aspect, + virtual bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, MythCodecID av_codec_id, void *codec_private, bool &aspect_only); virtual void UpdatePauseFrame(int64_t &disp_timecode); diff --git a/mythtv/libs/libmythtv/videoout_openglvaapi.cpp b/mythtv/libs/libmythtv/videoout_openglvaapi.cpp index 9996cbe55e2..ff96be9f111 100644 --- a/mythtv/libs/libmythtv/videoout_openglvaapi.cpp +++ b/mythtv/libs/libmythtv/videoout_openglvaapi.cpp @@ -40,16 +40,20 @@ void VideoOutputOpenGLVAAPI::TearDown(void) DeleteVAAPIContext(); } -bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &input_size, float aspect, +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(input_size.width()).arg(input_size.height()).arg(aspect) + .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(input_size, aspect, 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); @@ -63,7 +67,7 @@ bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &input_size, float aspect, } bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) @@ -85,7 +89,7 @@ bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &input_size, float aspect, DestroyCPUResources(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, gl_parent_win, disp, av_codec_id)) { if (wasembedding) @@ -101,11 +105,14 @@ bool VideoOutputOpenGLVAAPI::InputChanged(const QSize &input_size, float aspect, return false; } -bool VideoOutputOpenGLVAAPI::Init(int width, int height, float aspect, +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(width, height, aspect, winid, + 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()); diff --git a/mythtv/libs/libmythtv/videoout_openglvaapi.h b/mythtv/libs/libmythtv/videoout_openglvaapi.h index f4cf1804760..54e5bb5ddb1 100644 --- a/mythtv/libs/libmythtv/videoout_openglvaapi.h +++ b/mythtv/libs/libmythtv/videoout_openglvaapi.h @@ -13,7 +13,9 @@ class VideoOutputOpenGLVAAPI : public VideoOutputOpenGL VideoOutputOpenGLVAAPI(); ~VideoOutputOpenGLVAAPI(); - bool Init(int width, int height, float aspect, WId winid, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); bool CreateVAAPIContext(QSize size); void DeleteVAAPIContext(void); @@ -22,7 +24,9 @@ class VideoOutputOpenGLVAAPI : public VideoOutputOpenGL uint8_t* GetSurfaceIDPointer(void* buf); void SetProfile(void); void TearDown(void); - bool InputChanged(const QSize &input_size, float aspect, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, MythCodecID av_codec_id, void *codec_private, bool &aspect_only); virtual void UpdatePauseFrame(int64_t &disp_timecode); diff --git a/mythtv/libs/libmythtv/videoout_quartz.cpp b/mythtv/libs/libmythtv/videoout_quartz.cpp index c4dccaf498f..ab3eadfb326 100644 --- a/mythtv/libs/libmythtv/videoout_quartz.cpp +++ b/mythtv/libs/libmythtv/videoout_quartz.cpp @@ -1176,7 +1176,8 @@ void VideoOutputQuartz::ToggleAspectOverride(AspectOverrideMode aspectMode) MoveResize(); } -bool VideoOutputQuartz::InputChanged(const QSize &input_size, +bool VideoOutputQuartz::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -1184,14 +1185,15 @@ bool VideoOutputQuartz::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(WxH = %1x%2, aspect=%3") - .arg(input_size.width()) - .arg(input_size.height()).arg(aspect)); + .arg(video_dim_disp.width()) + .arg(video_dim_disp.height()).arg(aspect)); bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); - VideoOutput::InputChanged(input_size, aspect, av_codec_id, codec_private, + VideoOutput::InputChanged(video_dim_buf, video_dim_disp, + aspect, av_codec_id, codec_private, aspect_only); if (!res_changed && !cid_changed) @@ -1228,21 +1230,24 @@ bool VideoOutputQuartz::InputChanged(const QSize &input_size, return true; } -bool VideoOutputQuartz::Init(int width, int height, float aspect, +bool VideoOutputQuartz::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Init(WxH %1x%2, aspect=%3, winid=%4\n\t\t\t" "win_bounds(x %5, y%6, WxH %7x%8))") - .arg(width).arg(height).arg(aspect).arg(winid) + .arg(video_dim_disp.width()).arg(video_dim_disp.height()) + .arg(aspect).arg(winid) .arg(win_rect.x()).arg(win_rect.y()) .arg(win_rect.width()).arg(win_rect.height())); vbuffers.Init(kNumBuffers, true, kNeedFreeFrames, kPrebufferFramesNormal, kPrebufferFramesSmall, kKeepPrebuffer); - VideoOutput::Init(width, height, aspect, winid, win_rect, codec_id); + VideoOutput::Init(video_dim_buf, video_dim_disp, aspect, winid, win_rect, codec_id); const QSize video_dim = window.GetVideoDim(); data->srcWidth = video_dim.width(); @@ -1681,6 +1686,8 @@ void VideoOutputQuartz::ProcessFrame(VideoFrame *frame, OSD *osd, CopyFrame(vbuffers.GetScratchFrame(), &pauseFrame); } + CropToDisplay(frame); + if (filterList) filterList->ProcessFrame(frame); diff --git a/mythtv/libs/libmythtv/videoout_quartz.h b/mythtv/libs/libmythtv/videoout_quartz.h index ad4f262fd2f..a709f35222d 100644 --- a/mythtv/libs/libmythtv/videoout_quartz.h +++ b/mythtv/libs/libmythtv/videoout_quartz.h @@ -12,7 +12,9 @@ class VideoOutputQuartz : public VideoOutput VideoOutputQuartz(); ~VideoOutputQuartz(); - bool Init(int width, int height, float aspect, WId winid, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); void ProcessFrame(VideoFrame *frame, OSD *osd, @@ -24,7 +26,8 @@ class VideoOutputQuartz : public VideoOutput void SetVideoFrameRate(float playback_fps); void ToggleAspectOverride(AspectOverrideMode aspectMode); - bool InputChanged(const QSize &input_size, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_vdpau.cpp b/mythtv/libs/libmythtv/videoout_vdpau.cpp index 1d94dc2109b..a42ec52b196 100644 --- a/mythtv/libs/libmythtv/videoout_vdpau.cpp +++ b/mythtv/libs/libmythtv/videoout_vdpau.cpp @@ -85,7 +85,9 @@ void VideoOutputVDPAU::TearDown(void) DeleteRender(); } -bool VideoOutputVDPAU::Init(int width, int height, float aspect, +bool VideoOutputVDPAU::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { @@ -98,11 +100,13 @@ bool VideoOutputVDPAU::Init(int width, int height, float aspect, m_win = winid; QMutexLocker locker(&m_lock); window.SetNeedRepaint(true); - bool ok = VideoOutput::Init(width, height, aspect, winid, win_rect,codec_id); + bool ok = VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect,codec_id); if (db_vdisp_profile) db_vdisp_profile->SetVideoRenderer("vdpau"); - InitDisplayMeasurements(width, height, true); + InitDisplayMeasurements(video_dim_disp.width(), video_dim_disp.height(), + true); ParseOptions(); if (ok) ok = InitRender(); if (ok) ok = InitBuffers(); @@ -704,7 +708,8 @@ void VideoOutputVDPAU::ClearAfterSeek(void) m_lock.unlock(); } -bool VideoOutputVDPAU::InputChanged(const QSize &input_size, +bool VideoOutputVDPAU::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -712,7 +717,8 @@ bool VideoOutputVDPAU::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(%1,%2,%3) '%4'->'%5'") - .arg(input_size.width()).arg(input_size.height()).arg(aspect) + .arg(video_dim_disp.width()).arg(video_dim_disp.height()) + .arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); QMutexLocker locker(&m_lock); @@ -729,7 +735,7 @@ bool VideoOutputVDPAU::InputChanged(const QSize &input_size, } bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) @@ -747,7 +753,7 @@ bool VideoOutputVDPAU::InputChanged(const QSize &input_size, TearDown(); QRect disp = window.GetDisplayVisibleRect(); - if (Init(input_size.width(), input_size.height(), + if (Init(video_dim_buf, video_dim_disp, aspect, m_win, disp, av_codec_id)) { if (wasembedding) diff --git a/mythtv/libs/libmythtv/videoout_vdpau.h b/mythtv/libs/libmythtv/videoout_vdpau.h index 268e92477d1..0511ab49560 100644 --- a/mythtv/libs/libmythtv/videoout_vdpau.h +++ b/mythtv/libs/libmythtv/videoout_vdpau.h @@ -21,7 +21,9 @@ class VideoOutputVDPAU : public VideoOutput static void GetRenderOptions(render_opts &opts); VideoOutputVDPAU(); ~VideoOutputVDPAU(); - bool Init(int width, int height, float aspect, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); bool SetDeinterlacingEnabled(bool interlaced); bool SetupDeinterlace(bool interlaced, const QString& ovrf=""); @@ -34,7 +36,8 @@ class VideoOutputVDPAU : public VideoOutput void DrawSlice(VideoFrame*, int x, int y, int w, int h); void Show(FrameScanType); void ClearAfterSeek(void); - bool InputChanged(const QSize &input_size, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videoout_xv.cpp b/mythtv/libs/libmythtv/videoout_xv.cpp index b4c6edc3a09..e2df180f270 100644 --- a/mythtv/libs/libmythtv/videoout_xv.cpp +++ b/mythtv/libs/libmythtv/videoout_xv.cpp @@ -237,7 +237,8 @@ void VideoOutputXv::WindowResized(const QSize &new_size) } // documented in videooutbase.cpp -bool VideoOutputXv::InputChanged(const QSize &input_size, +bool VideoOutputXv::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, @@ -245,13 +246,14 @@ bool VideoOutputXv::InputChanged(const QSize &input_size, { LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("InputChanged(%1,%2,%3) '%4'->'%5'") - .arg(input_size.width()).arg(input_size.height()).arg(aspect) + .arg(video_dim_disp.width()).arg(video_dim_disp.height()) + .arg(aspect) .arg(toString(video_codec_id)).arg(toString(av_codec_id))); QMutexLocker locker(&global_lock); bool cid_changed = (video_codec_id != av_codec_id); - bool res_changed = input_size != window.GetActualVideoDim(); + bool res_changed = video_dim_disp != window.GetActualVideoDim(); bool asp_changed = aspect != window.GetVideoAspect(); if (!res_changed && !cid_changed) @@ -265,7 +267,8 @@ bool VideoOutputXv::InputChanged(const QSize &input_size, return true; } - VideoOutput::InputChanged(input_size, aspect, av_codec_id, codec_private, + VideoOutput::InputChanged(video_dim_buf, video_dim_disp, + aspect, av_codec_id, codec_private, aspect_only); bool delete_pause_frame = cid_changed; @@ -870,7 +873,9 @@ bool VideoOutputXv::InitSetupBuffers(void) * * \return success or failure. */ -bool VideoOutputXv::Init(int width, int height, float aspect, +bool VideoOutputXv::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { window.SetNeedRepaint(true); @@ -900,10 +905,12 @@ bool VideoOutputXv::Init(int width, int height, float aspect, XJ_started = true; // Basic setup - VideoOutput::Init(width, height, aspect,winid, win_rect,codec_id); + VideoOutput::Init(video_dim_buf, video_dim_disp, + aspect, winid, win_rect, codec_id); // Set resolution/measurements (check XRandR, Xinerama, config settings) - InitDisplayMeasurements(width, height, true); + InitDisplayMeasurements(video_dim_disp.width(), video_dim_disp.height(), + true); if (!InitSetupBuffers()) return false; @@ -1803,6 +1810,8 @@ void VideoOutputXv::ProcessFrame(VideoFrame *frame, OSD *osd, pauseframe = true; } + CropToDisplay(frame); + bool safepauseframe = pauseframe && !IsBobDeint(); if (!pauseframe || safepauseframe) { diff --git a/mythtv/libs/libmythtv/videoout_xv.h b/mythtv/libs/libmythtv/videoout_xv.h index 122481014cd..36757134a23 100644 --- a/mythtv/libs/libmythtv/videoout_xv.h +++ b/mythtv/libs/libmythtv/videoout_xv.h @@ -33,7 +33,9 @@ class VideoOutputXv : public VideoOutput VideoOutputXv(); ~VideoOutputXv(); - bool Init(int width, int height, float aspect, + bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); bool SetDeinterlacingEnabled(bool); @@ -53,7 +55,8 @@ class VideoOutputXv : public VideoOutput void WindowResized(const QSize &new_size); void MoveResize(void); - bool InputChanged(const QSize &input_size, + bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID av_codec_id, void *codec_private, diff --git a/mythtv/libs/libmythtv/videooutbase.cpp b/mythtv/libs/libmythtv/videooutbase.cpp index 5dee521121f..cf70e134e4e 100644 --- a/mythtv/libs/libmythtv/videooutbase.cpp +++ b/mythtv/libs/libmythtv/videooutbase.cpp @@ -111,7 +111,8 @@ void VideoOutput::GetRenderOptions(render_opts &opts) */ VideoOutput *VideoOutput::Create( const QString &decoder, MythCodecID codec_id, void *codec_priv, - PIPState pipState, const QSize &video_dim, float video_aspect, + PIPState pipState, const QSize &video_dim_buf, + const QSize &video_dim_disp, float video_aspect, QWidget *parentwidget, const QRect &embed_rect, float video_prate, uint playerFlags) { @@ -143,29 +144,35 @@ VideoOutput *VideoOutput::Create( else { #ifdef USING_MINGW - renderers += VideoOutputD3D::GetAllowedRenderers(codec_id, video_dim); + renderers += VideoOutputD3D:: + GetAllowedRenderers(codec_id, video_dim_disp); #endif #ifdef USING_XV - xvlist = VideoOutputXv::GetAllowedRenderers(codec_id, video_dim); + xvlist = VideoOutputXv:: + GetAllowedRenderers(codec_id, video_dim_disp); renderers += xvlist; #endif // USING_XV #ifdef USING_QUARTZ_VIDEO - osxlist = VideoOutputQuartz::GetAllowedRenderers(codec_id, video_dim); + osxlist = VideoOutputQuartz:: + GetAllowedRenderers(codec_id, video_dim_disp); renderers += osxlist; #endif // Q_OS_MACX #ifdef USING_OPENGL_VIDEO - renderers += VideoOutputOpenGL::GetAllowedRenderers(codec_id, video_dim); + renderers += VideoOutputOpenGL:: + GetAllowedRenderers(codec_id, video_dim_disp); #endif // USING_OPENGL_VIDEO #ifdef USING_VDPAU - renderers += VideoOutputVDPAU::GetAllowedRenderers(codec_id, video_dim); + renderers += VideoOutputVDPAU:: + GetAllowedRenderers(codec_id, video_dim_disp); #endif // USING_VDPAU #ifdef USING_GLVAAPI - renderers += VideoOutputOpenGLVAAPI::GetAllowedRenderers(codec_id, video_dim); + renderers += VideoOutputOpenGLVAAPI:: + GetAllowedRenderers(codec_id, video_dim_disp); #endif // USING_GLVAAPI } @@ -181,7 +188,7 @@ VideoOutput *VideoOutput::Create( if (renderers.size() > 0) { VideoDisplayProfile vprof; - vprof.SetInput(video_dim); + vprof.SetInput(video_dim_disp); QString tmp = vprof.GetVideoRenderer(); if (vprof.IsDecoderCompatible(decoder) && renderers.contains(tmp)) @@ -276,7 +283,7 @@ VideoOutput *VideoOutput::Create( vo->SetPIPState(pipState); vo->SetVideoFrameRate(video_prate); if (vo->Init( - video_dim.width(), video_dim.height(), video_aspect, + video_dim_buf, video_dim_disp, video_aspect, widget->winId(), display_rect, codec_id)) { vo->SetVideoScalingAllowed(true); @@ -288,7 +295,7 @@ VideoOutput *VideoOutput::Create( } else if (vo && (playerFlags & kVideoIsNull)) { - if (vo->Init(video_dim.width(), video_dim.height(), + if (vo->Init(video_dim_buf, video_dim_disp, video_aspect, 0, QRect(), codec_id)) { return vo; @@ -468,7 +475,9 @@ VideoOutput::~VideoOutput() * \brief Performs most of the initialization for VideoOutput. * \return true if successful, false otherwise. */ -bool VideoOutput::Init(int width, int height, float aspect, WId winid, +bool VideoOutput::Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id) { (void)winid; @@ -482,7 +491,8 @@ bool VideoOutput::Init(int width, int height, float aspect, WId winid, StopEmbedding(); } - bool mainSuccess = window.Init(QSize(width, height), aspect, win_rect, + bool mainSuccess = window.Init(video_dim_buf, video_dim_disp, + aspect, win_rect, db_aspectoverride, db_adjustfill); if (db_vdisp_profile) @@ -734,13 +744,15 @@ void VideoOutput::VideoAspectRatioChanged(float aspect) * \bug We set the new width height and aspect ratio here, but we should * do this based on the new video frames in Show(). */ -bool VideoOutput::InputChanged(const QSize &input_size, +bool VideoOutput::InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID myth_codec_id, void *codec_private, bool &aspect_only) { - window.InputChanged(input_size, aspect, myth_codec_id, codec_private); + window.InputChanged(video_dim_buf, video_dim_disp, + aspect, myth_codec_id, codec_private); if (db_vdisp_profile) db_vdisp_profile->SetInput(window.GetVideoDim()); @@ -1869,3 +1881,41 @@ int VideoOutput::CalcHueBase(const QString &adaptor_name) return hue_adj; } + +void VideoOutput::CropToDisplay(VideoFrame *frame) +{ + // TODO: support cropping in the horizontal dimension + if (!frame) + return; + if (frame->pitches[1] != frame->pitches[2]) + return; + int crop = window.GetVideoDim().height() - + window.GetVideoDispDim().height(); + if (crop <= 0 || crop >= 16) + return; // something may be amiss, so don't crop + + // assume input and output formats are FMT_YV12 + uint64_t *ybuf = (uint64_t*) (frame->buf + frame->offsets[0]); + uint64_t *ubuf = (uint64_t*) (frame->buf + frame->offsets[1]); + uint64_t *vbuf = (uint64_t*) (frame->buf + frame->offsets[2]); + const uint64_t Y_black = 0x0000000000000000LL; // 8 bytes + const uint64_t UV_black = 0x8080808080808080LL; // 8 bytes + int y; + int sz = (frame->pitches[0] * frame->height) >> 3; // div 8 bytes + // Luma bottom + y = ((frame->height - crop) >> 4) * frame->pitches[0] << 1; + y = y + (sz - y) * (16 - crop) / 16; + for (; y < sz; y++) + { + ybuf[y] = Y_black; + } + // Chroma bottom + sz = (frame->pitches[1] * (frame->height >> 1)) >> 3; // div 8 bytes + y = ((frame->height - crop) >> 4) * frame->pitches[1]; + y = y + (sz - y) * (16 - crop) / 16; + for (; y < sz; y++) + { + ubuf[y] = UV_black; + vbuf[y] = UV_black; + } +} diff --git a/mythtv/libs/libmythtv/videooutbase.h b/mythtv/libs/libmythtv/videooutbase.h index c3a901a9374..de1d789df55 100644 --- a/mythtv/libs/libmythtv/videooutbase.h +++ b/mythtv/libs/libmythtv/videooutbase.h @@ -48,14 +48,17 @@ class VideoOutput static void GetRenderOptions(render_opts &opts); static VideoOutput *Create( const QString &decoder, MythCodecID codec_id, void *codec_priv, - PIPState pipState, const QSize &video_dim, float video_aspect, + PIPState pipState, const QSize &video_dim_buf, + const QSize &video_dim_disp, float video_aspect, QWidget *parentwidget, const QRect &embed_rect, float video_prate, uint playerFlags); VideoOutput(); virtual ~VideoOutput(); - virtual bool Init(int width, int height, float aspect, + virtual bool Init(const QSize &video_dim_buf, + const QSize &video_dim_disp, + float aspect, WId winid, const QRect &win_rect, MythCodecID codec_id); virtual void InitOSD(OSD *osd); virtual void SetVideoFrameRate(float); @@ -76,7 +79,8 @@ class VideoOutput virtual void WindowResized(const QSize &new_size) {} - virtual bool InputChanged(const QSize &input_size, + virtual bool InputChanged(const QSize &video_dim_buf, + const QSize &video_dim_disp, float aspect, MythCodecID myth_codec_id, void *codec_private, @@ -126,6 +130,7 @@ class VideoOutput FilterChain *filterList, const PIPMap &pipPlayers, FrameScanType scan = kScan_Ignore) = 0; + void CropToDisplay(VideoFrame *frame); /// \brief Tells video output that a full repaint is needed. void ExposeEvent(void); diff --git a/mythtv/libs/libmythtv/videooutwindow.cpp b/mythtv/libs/libmythtv/videooutwindow.cpp index bb1467f312b..f606620ad1d 100644 --- a/mythtv/libs/libmythtv/videooutwindow.cpp +++ b/mythtv/libs/libmythtv/videooutwindow.cpp @@ -42,7 +42,6 @@ extern "C" { #include "filtermanager.h" -static QSize fix_1080i(QSize raw); static QSize fix_alignment(QSize raw); static float fix_aspect(float raw); static float snap(float value, float snapto, float diff); @@ -484,7 +483,8 @@ void VideoOutWindow::ApplySnapToVideoRect(void) } } -bool VideoOutWindow::Init(const QSize &new_video_dim, float new_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) @@ -499,9 +499,9 @@ bool VideoOutWindow::Init(const QSize &new_video_dim, float new_video_aspect, if (pip_state == kPBPRight) display_visible_rect.moveLeft(pbp_width); - video_dim_act = new_video_dim; - video_disp_dim = fix_1080i(new_video_dim); - video_dim = fix_alignment(new_video_dim); + 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) @@ -601,15 +601,16 @@ void VideoOutWindow::VideoAspectRatioChanged(float aspect) * \bug We set the new width height and aspect ratio here, but we should * do this based on the new video frames in Show(). */ -bool VideoOutWindow::InputChanged(const QSize &input_size, float aspect, +bool VideoOutWindow::InputChanged(const QSize &input_size_buf, + const QSize &input_size_disp, float aspect, MythCodecID myth_codec_id, void *codec_private) { (void) myth_codec_id; (void) codec_private; - video_dim_act = input_size; - video_disp_dim = fix_1080i(input_size); - video_dim = fix_alignment(input_size); + video_dim_act = input_size_disp; + video_disp_dim = input_size_disp; + video_dim = input_size_buf; /* if (db_vdisp_profile) db_vdisp_profile->SetInput(video_dim);*///done in videooutput @@ -968,16 +969,6 @@ void VideoOutWindow::SetPIPState(PIPState setting) pip_state = setting; } -/// Correct for a 1920x1080 frames reported as 1920x1088 -static QSize fix_1080i(QSize raw) -{ - if (QSize(1920, 1088) == raw) - return QSize(1920, 1080); - if (QSize(1440, 1088) == raw) - return QSize(1440, 1080); - return raw; -} - /// Correct for underalignment static QSize fix_alignment(QSize raw) { diff --git a/mythtv/libs/libmythtv/videooutwindow.h b/mythtv/libs/libmythtv/videooutwindow.h index 48c81db7dd3..5cac68bbd48 100644 --- a/mythtv/libs/libmythtv/videooutwindow.h +++ b/mythtv/libs/libmythtv/videooutwindow.h @@ -22,12 +22,14 @@ class VideoOutWindow public: VideoOutWindow(); - bool Init(const QSize &new_video_dim, float aspect, + bool Init(const QSize &new_video_dim_buf, + const QSize &new_video_dim_disp, float aspect, const QRect &new_display_visible_rect, AspectOverrideMode aspectoverride, AdjustFillMode adjustfill); - bool InputChanged(const QSize &input_size, float aspect, + bool InputChanged(const QSize &input_size_buf, + const QSize &input_size_disp, float aspect, MythCodecID myth_codec_id, void *codec_private); void VideoAspectRatioChanged(float aspect);