Sophie

Sophie

distrib > Mandriva > 2010.1 > i586 > media > contrib-updates-src > by-pkgid > f722e3fddb6bcd9335a8848a4b05a73c > files > 4

xbmc-10.1-1.pvr.2mdv2010.2.src.rpm

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