From e7004a036cbd8beea34dfd31476b6c9690e9bc73 Mon Sep 17 00:00:00 2001 From: anssih <anssih@568bbfeb-2a22-0410-94d2-cc84cf5bfa90> Date: Fri, 3 Sep 2010 17:42:16 +0000 Subject: [PATCH 1/8] changed: split CDVDVideoCodecFFmpeg::GetPicture() Factor the part of CDVDVideoCodecFFmpeg::GetPicture() which is used by hardware decoder classes to a separate GetPictureCommon() function that can be used to fill up a DVDVideoPicture structure. This allows hardware decoder classes to fill DVDVideoPicture structures in advance, which is needed if there is a delay between decoding and display (as is needed for e.g. VDPAU advanced deinterlacing). git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@33501 568bbfeb-2a22-0410-94d2-cc84cf5bfa90 (cherry picked from commit 574162c225787e4fbda4a1f8bd56b2a9c4e4d9a2) --- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 14 +++++++++++--- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 1 + xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp | 1 + xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 1 + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 2 ++ 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index fbc3b4e..76cdd79 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -506,7 +506,7 @@ void CDVDVideoCodecFFmpeg::Reset() } } -bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) +bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) { GetVideoAspect(m_pCodecContext, pDvdVideoPicture->iDisplayWidth, pDvdVideoPicture->iDisplayHeight); @@ -564,9 +564,17 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) if(!m_started) pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; + return true; +} + +bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) +{ if(m_pHardware) return m_pHardware->GetPicture(m_pCodecContext, m_pFrame, pDvdVideoPicture); + if(!GetPictureCommon(pDvdVideoPicture)) + return false; + if(m_pConvertFrame) { for (int i = 0; i < 4; i++) @@ -577,9 +585,9 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) else { for (int i = 0; i < 4; i++) - pDvdVideoPicture->data[i] = frame->data[i]; + pDvdVideoPicture->data[i] = m_pFrame->data[i]; for (int i = 0; i < 4; i++) - pDvdVideoPicture->iLineSize[i] = frame->linesize[i]; + pDvdVideoPicture->iLineSize[i] = m_pFrame->linesize[i]; } pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h index 321e2b7..b54de02 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h @@ -55,6 +55,7 @@ public: virtual void Dispose(); virtual int Decode(BYTE* pData, int iSize, double dts, double pts); virtual void Reset(); + bool GetPictureCommon(DVDVideoPicture* pDvdVideoPicture); virtual bool GetPicture(DVDVideoPicture* pDvdVideoPicture); virtual void SetDropState(bool bDrop); virtual const char* GetName() { return m_name.c_str(); }; // m_name is never changed after open diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp index 03ec463..7fd1ec4 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp @@ -540,6 +540,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) { + ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(picture); CSingleLock lock(m_section); picture->format = DVDVideoPicture::FMT_DXVA; picture->proc = m_processor; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp index 6b1853d..c5b4362 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -404,6 +404,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) { + ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(picture); VASurfaceID surface = GetSurfaceID(frame); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp index 4de8c99..04b9e6b 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1287,6 +1287,8 @@ int CVDPAU::Decode(AVCodecContext *avctx, AVFrame *pFrame) bool CVDPAU::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) { + ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(picture); + picture->format = DVDVideoPicture::FMT_VDPAU; picture->iFlags &= DVP_FLAG_DROPPED; picture->iWidth = OutWidth; -- 1.7.3