From 4af7d71e5461f8139643862992993d1de35b7d19 Mon Sep 17 00:00:00 2001 From: Anssi Hannula Date: Wed, 11 Aug 2010 01:24:11 +0300 Subject: [PATCH 1/7] 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). --- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 35 +++++++++++-------- .../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, 25 insertions(+), 15 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index fbc3b4e..7c11e7a 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); @@ -524,23 +524,20 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) pDvdVideoPicture->pts = DVD_NOPTS_VALUE; - // if we have a converted frame, use that - AVFrame *frame = m_pFrame; - - if (!frame) + if (!m_pFrame) return false; - pDvdVideoPicture->iRepeatPicture = 0.5 * frame->repeat_pict; + pDvdVideoPicture->iRepeatPicture = 0.5 * m_pFrame->repeat_pict; pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; - pDvdVideoPicture->iFlags |= frame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; - pDvdVideoPicture->iFlags |= frame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; + pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; + pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; if(m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P) pDvdVideoPicture->color_range = 1; - pDvdVideoPicture->qscale_table = frame->qscale_table; - pDvdVideoPicture->qscale_stride = frame->qstride; + pDvdVideoPicture->qscale_table = m_pFrame->qscale_table; + pDvdVideoPicture->qscale_stride = m_pFrame->qstride; - switch (frame->qscale_type) { + switch (m_pFrame->qscale_type) { case FF_QSCALE_TYPE_MPEG1: pDvdVideoPicture->qscale_type = DVP_QSCALE_MPEG1; break; @@ -556,17 +553,25 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) pDvdVideoPicture->dts = m_dts; m_dts = DVD_NOPTS_VALUE; - if (frame->reordered_opaque) - pDvdVideoPicture->pts = pts_itod(frame->reordered_opaque); + if (m_pFrame->reordered_opaque) + pDvdVideoPicture->pts = pts_itod(m_pFrame->reordered_opaque); else pDvdVideoPicture->pts = DVD_NOPTS_VALUE; 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 +582,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 86845a0..c5ad2f7 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp @@ -468,6 +468,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 8d2b5e0..b2864ff 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1273,6 +1273,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 = 0; picture->iWidth = OutWidth; -- 1.7.2