From 6be90d3ca5fdf0fe66a8d6380887d70785d297e2 Mon Sep 17 00:00:00 2001 From: Gavin Hurlbut Date: Fri, 10 Jun 2011 22:07:37 -0700 Subject: [PATCH] Fix remote screenshots during TV playback Got home from work and tried while playback was running. Seems there are two separate event paths (makes sense) depending on whether or not the player is running. Tweaked the playback case as well to match the non-playback. All is now working for the remote screenshots on my setup. --- mythtv/libs/libmythtv/mythplayer.cpp | 4 ++-- mythtv/libs/libmythtv/mythplayer.h | 2 +- mythtv/libs/libmythtv/tv_play.cpp | 20 +++++++++++++++----- mythtv/libs/libmythtv/videoout_vdpau.cpp | 4 ++-- mythtv/libs/libmythtv/videoout_vdpau.h | 3 ++- mythtv/libs/libmythtv/videooutbase.h | 3 ++- mythtv/libs/libmythui/mythmainwindow.cpp | 20 ++++++++------------ mythtv/libs/libmythui/mythrender_vdpau.cpp | 7 ++++--- mythtv/libs/libmythui/mythrender_vdpau.h | 2 +- 9 files changed, 37 insertions(+), 28 deletions(-) diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp index f194fb5a52b..56297a5cc22 100644 --- a/mythtv/libs/libmythtv/mythplayer.cpp +++ b/mythtv/libs/libmythtv/mythplayer.cpp @@ -3875,10 +3875,10 @@ bool MythPlayer::IsEmbedding(void) return false; } -bool MythPlayer::GetScreenShot(int width, int height) +bool MythPlayer::GetScreenShot(int width, int height, QString filename) { if (videoOutput) - return videoOutput->GetScreenShot(width, height); + return videoOutput->GetScreenShot(width, height, filename); return false; } diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h index 0e6f048fcc3..7a3c854e2d7 100644 --- a/mythtv/libs/libmythtv/mythplayer.h +++ b/mythtv/libs/libmythtv/mythplayer.h @@ -189,7 +189,7 @@ class MTV_PUBLIC MythPlayer bool UsingNullVideo(void) const { return using_null_videoout; } bool HasTVChainNext(void) const; bool CanSupportDoubleRate(void); - bool GetScreenShot(int width = 0, int height = 0); + bool GetScreenShot(int width = 0, int height = 0, QString filename = ""); // Non-const gets VideoOutput *getVideoOutput(void) { return videoOutput; } diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index ac2b1c846da..621dc1f19c0 100644 --- a/mythtv/libs/libmythtv/tv_play.cpp +++ b/mythtv/libs/libmythtv/tv_play.cpp @@ -8138,15 +8138,25 @@ void TV::customEvent(QEvent *e) if (message == ACTION_SCREENSHOT) { PlayerContext *mctx = GetPlayerWriteLock(0, __FILE__, __LINE__); - bool extra = me->ExtraDataCount() == 2; - int width = extra ? me->ExtraData(0).toInt() : 0; - int height = extra ? me->ExtraData(1).toInt() : 0; - if (mctx && mctx->player && mctx->player->GetScreenShot(width, height)) + int width = 0; + int height = 0; + QString filename; + + if (me->ExtraDataCount() >= 2) + { + width = me->ExtraData(0).toInt(); + height = me->ExtraData(1).toInt(); + + if (me->ExtraDataCount() == 3) + filename = me->ExtraData(2); + } + if (mctx && mctx->player && + mctx->player->GetScreenShot(width, height, filename)) { } else { - GetMythMainWindow()->ScreenShot(width, height); + GetMythMainWindow()->ScreenShot(width, height, filename); } ReturnPlayerLock(mctx); } diff --git a/mythtv/libs/libmythtv/videoout_vdpau.cpp b/mythtv/libs/libmythtv/videoout_vdpau.cpp index a3bf14afbac..978883217ad 100644 --- a/mythtv/libs/libmythtv/videoout_vdpau.cpp +++ b/mythtv/libs/libmythtv/videoout_vdpau.cpp @@ -1258,9 +1258,9 @@ void VideoOutputVDPAU::ParseOptions(void) } } -bool VideoOutputVDPAU::GetScreenShot(int width, int height) +bool VideoOutputVDPAU::GetScreenShot(int width, int height, QString filename) { if (m_render) - return m_render->GetScreenShot(width, height); + return m_render->GetScreenShot(width, height, filename); return false; } diff --git a/mythtv/libs/libmythtv/videoout_vdpau.h b/mythtv/libs/libmythtv/videoout_vdpau.h index 0c31610cc1b..28b41ceb659 100644 --- a/mythtv/libs/libmythtv/videoout_vdpau.h +++ b/mythtv/libs/libmythtv/videoout_vdpau.h @@ -62,7 +62,8 @@ class VideoOutputVDPAU : public VideoOutput virtual bool hasHWAcceleration(void) const { return codec_is_vdpau(video_codec_id); } virtual MythPainter* GetOSDPainter(void) { return (MythPainter*)m_osd_painter; } - virtual bool GetScreenShot(int width = 0, int height = 0); + virtual bool GetScreenShot(int width = 0, int height = 0, + QString filename = ""); virtual bool CanVisualise(AudioPlayer *audio, MythRender *render) { return VideoOutput::CanVisualise(audio, m_render); } diff --git a/mythtv/libs/libmythtv/videooutbase.h b/mythtv/libs/libmythtv/videooutbase.h index a3a261fdcb1..7ff557ae380 100644 --- a/mythtv/libs/libmythtv/videooutbase.h +++ b/mythtv/libs/libmythtv/videooutbase.h @@ -238,7 +238,8 @@ class VideoOutput virtual QString GetOSDRenderer(void) const; virtual MythPainter *GetOSDPainter(void) { return (MythPainter*)osd_painter; } - virtual bool GetScreenShot(int width = 0, int height = 0) { return false; } + virtual bool GetScreenShot(int width = 0, int height = 0, + QString filename = "") { return false; } QString GetFilters(void) const; /// \brief translates caption/dvd button rectangle into 'screen' space diff --git a/mythtv/libs/libmythui/mythmainwindow.cpp b/mythtv/libs/libmythui/mythmainwindow.cpp index 2bdddcb0d0e..7ac309aaac1 100644 --- a/mythtv/libs/libmythui/mythmainwindow.cpp +++ b/mythtv/libs/libmythui/mythmainwindow.cpp @@ -2236,23 +2236,19 @@ void MythMainWindow::customEvent(QEvent *ce) } else if (message.startsWith(ACTION_SCREENSHOT)) { + int width = 0; + int height = 0; + QString filename; + if (me->ExtraDataCount() >= 2) { - int width = me->ExtraData(0).toInt(); - int height = me->ExtraData(1).toInt(); + width = me->ExtraData(0).toInt(); + height = me->ExtraData(1).toInt(); if (me->ExtraDataCount() == 3) - { - QString filename = me->ExtraData(2); - ScreenShot(width, height, filename); - } - else - ScreenShot(width, height); - } - else - { - ScreenShot(); + filename = me->ExtraData(2); } + ScreenShot(width, height, filename); } } else if ((MythEvent::Type)(ce->type()) == MythEvent::MythUserMessage) diff --git a/mythtv/libs/libmythui/mythrender_vdpau.cpp b/mythtv/libs/libmythui/mythrender_vdpau.cpp index 0b2c08149a8..8472b689585 100644 --- a/mythtv/libs/libmythui/mythrender_vdpau.cpp +++ b/mythtv/libs/libmythui/mythrender_vdpau.cpp @@ -475,7 +475,7 @@ void MythRenderVDPAU::MoveResizeWin(QRect &rect) m_display->MoveResizeWin(m_window, rect); } -bool MythRenderVDPAU::GetScreenShot(int width, int height) +bool MythRenderVDPAU::GetScreenShot(int width, int height, QString filename) { LOCK_RENDER CHECK_STATUS(false) @@ -516,8 +516,9 @@ bool MythRenderVDPAU::GetScreenShot(int width, int height) if (height <= 0) height = img.height(); - img = img.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); - success = window->SaveScreenShot(img); + img = img.scaled(width, height, Qt::KeepAspectRatio, + Qt::SmoothTransformation); + success = window->SaveScreenShot(img, filename); } delete [] buffer; return success; diff --git a/mythtv/libs/libmythui/mythrender_vdpau.h b/mythtv/libs/libmythui/mythrender_vdpau.h index 2a0d6751326..be673dc91ca 100644 --- a/mythtv/libs/libmythui/mythrender_vdpau.h +++ b/mythtv/libs/libmythui/mythrender_vdpau.h @@ -73,7 +73,7 @@ class MUI_PUBLIC MythRenderVDPAU : public MythRender void DrawDisplayRect(const QRect &rect, bool use_colorkey = false); void MoveResizeWin(QRect &rect); void CheckOutputSurfaces(void); - bool GetScreenShot(int width = 0, int height = 0); + bool GetScreenShot(int width = 0, int height = 0, QString filename = ""); uint CreateOutputSurface(const QSize &size, VdpRGBAFormat fmt = VDP_RGBA_FORMAT_B8G8R8A8,