[xiph-commits] r17199 - trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder

cristianadam at svn.xiph.org cristianadam at svn.xiph.org
Mon May 10 14:07:14 PDT 2010


Author: cristianadam
Date: 2010-05-10 14:07:13 -0700 (Mon, 10 May 2010)
New Revision: 17199

Modified:
   trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.cpp
   trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.h
   trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeInputPin.cpp
   trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.cpp
   trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.h
Log:
Fixed crash on Windows Mobile when going to full screen.

Modified: trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.cpp
===================================================================
--- trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.cpp	2010-05-08 03:59:17 UTC (rev 17198)
+++ trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.cpp	2010-05-10 21:07:13 UTC (rev 17199)
@@ -205,11 +205,11 @@
 
 bool TheoraDecodeFilter::FillVideoInfoHeader(int inPosition, VIDEOINFOHEADER* inFormatBuffer) 
 {
-	//MTS::: Needs changes for alternate media types. FOURCC and bitCOunt
-	TheoraDecodeFilter* locFilter = this;
-
-	inFormatBuffer->AvgTimePerFrame = (UNITS * locFilter->m_theoraFormatInfo->frameRateDenominator) / locFilter->m_theoraFormatInfo->frameRateNumerator;
-	inFormatBuffer->dwBitRate = locFilter->m_theoraFormatInfo->targetBitrate;
+    unsigned long width = m_theoraFormatInfo->pictureWidth;
+    unsigned long height = m_theoraFormatInfo->pictureHeight;
+    
+	inFormatBuffer->AvgTimePerFrame = (UNITS * m_theoraFormatInfo->frameRateDenominator) / m_theoraFormatInfo->frameRateNumerator;
+	inFormatBuffer->dwBitRate = m_theoraFormatInfo->targetBitrate;
 	
 	inFormatBuffer->bmiHeader.biBitCount = m_outputVideoParams[inPosition].bitsPerPixel;  
 
@@ -217,8 +217,8 @@
 	inFormatBuffer->bmiHeader.biClrUsed = 0;        //Use max colour depth
 
 	inFormatBuffer->bmiHeader.biCompression = m_outputVideoParams[inPosition].fourCC;
-    inFormatBuffer->bmiHeader.biWidth = locFilter->m_theoraFormatInfo->pictureWidth;
-    inFormatBuffer->bmiHeader.biHeight = locFilter->m_theoraFormatInfo->pictureHeight;
+    inFormatBuffer->bmiHeader.biWidth = width;
+    inFormatBuffer->bmiHeader.biHeight = height;
 	inFormatBuffer->bmiHeader.biPlanes = 1;    //Must be 1
 	inFormatBuffer->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);   
 	inFormatBuffer->bmiHeader.biSizeImage = GetBitmapSize(&inFormatBuffer->bmiHeader);
@@ -226,14 +226,14 @@
 	inFormatBuffer->bmiHeader.biYPelsPerMeter = 0;   //" " " " " 
 	
 	inFormatBuffer->rcSource.top = 0;
-	inFormatBuffer->rcSource.bottom = locFilter->m_theoraFormatInfo->pictureHeight;
+	inFormatBuffer->rcSource.bottom = height;
 	inFormatBuffer->rcSource.left = 0;
-	inFormatBuffer->rcSource.right = locFilter->m_theoraFormatInfo->pictureWidth;
+	inFormatBuffer->rcSource.right = width;
 
 	inFormatBuffer->rcTarget.top = 0;
-	inFormatBuffer->rcTarget.bottom = locFilter->m_theoraFormatInfo->pictureHeight;
+	inFormatBuffer->rcTarget.bottom = height;
 	inFormatBuffer->rcTarget.left = 0;
-	inFormatBuffer->rcTarget.right = locFilter->m_theoraFormatInfo->pictureWidth;
+	inFormatBuffer->rcTarget.right = width;
 
 	inFormatBuffer->dwBitErrorRate=0;
 	return true;
@@ -241,11 +241,11 @@
 
 bool TheoraDecodeFilter::FillVideoInfoHeader2(int inPosition, VIDEOINFOHEADER2* inFormatBuffer) 
 {
-	//MTS::: Needs changes for alternate media types. FOURCC and bitCOunt
-	TheoraDecodeFilter* locFilter = this;
+    unsigned long width = m_theoraFormatInfo->pictureWidth;
+    unsigned long height = m_theoraFormatInfo->pictureHeight;
 
-	inFormatBuffer->AvgTimePerFrame = (UNITS * locFilter->m_theoraFormatInfo->frameRateDenominator) / locFilter->m_theoraFormatInfo->frameRateNumerator;
-	inFormatBuffer->dwBitRate = locFilter->m_theoraFormatInfo->targetBitrate;
+	inFormatBuffer->AvgTimePerFrame = (UNITS * m_theoraFormatInfo->frameRateDenominator) / m_theoraFormatInfo->frameRateNumerator;
+	inFormatBuffer->dwBitRate = m_theoraFormatInfo->targetBitrate;
 	
 	inFormatBuffer->bmiHeader.biBitCount = m_outputVideoParams[inPosition].bitsPerPixel;  
 
@@ -253,8 +253,8 @@
 	inFormatBuffer->bmiHeader.biClrUsed = 0;        //Use max colour depth
 
 	inFormatBuffer->bmiHeader.biCompression = m_outputVideoParams[inPosition].fourCC;
-    inFormatBuffer->bmiHeader.biWidth = locFilter->m_theoraFormatInfo->pictureWidth;
-    inFormatBuffer->bmiHeader.biHeight = locFilter->m_theoraFormatInfo->pictureHeight;
+    inFormatBuffer->bmiHeader.biWidth = width;
+    inFormatBuffer->bmiHeader.biHeight = height;
 	inFormatBuffer->bmiHeader.biPlanes = 1;    //Must be 1
 	inFormatBuffer->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 	inFormatBuffer->bmiHeader.biSizeImage = GetBitmapSize(&inFormatBuffer->bmiHeader);
@@ -262,14 +262,14 @@
 	inFormatBuffer->bmiHeader.biYPelsPerMeter = 0;   //" " " " " 
 	
 	inFormatBuffer->rcSource.top = 0;
-	inFormatBuffer->rcSource.bottom = locFilter->m_theoraFormatInfo->pictureHeight;
+	inFormatBuffer->rcSource.bottom = height;
 	inFormatBuffer->rcSource.left = 0;
-	inFormatBuffer->rcSource.right = locFilter->m_theoraFormatInfo->pictureWidth;
+	inFormatBuffer->rcSource.right = width;
 
 	inFormatBuffer->rcTarget.top = 0;
-	inFormatBuffer->rcTarget.bottom = locFilter->m_theoraFormatInfo->pictureHeight;
+	inFormatBuffer->rcTarget.bottom = height;
 	inFormatBuffer->rcTarget.left = 0;
-	inFormatBuffer->rcTarget.right = locFilter->m_theoraFormatInfo->pictureWidth;
+	inFormatBuffer->rcTarget.right = width;
 
 	inFormatBuffer->dwBitErrorRate=0;
 
@@ -280,13 +280,13 @@
     if (m_theoraFormatInfo->aspectNumerator == 0 || m_theoraFormatInfo->aspectDenominator == 0) 
 	{
         //Maybe setting to 0?
-        inFormatBuffer->dwPictAspectRatioX = m_theoraFormatInfo->pictureWidth;
-        inFormatBuffer->dwPictAspectRatioY = m_theoraFormatInfo->pictureHeight;
+        inFormatBuffer->dwPictAspectRatioX = width;
+        inFormatBuffer->dwPictAspectRatioY = height;
     } 
 	else 
 	{
-        inFormatBuffer->dwPictAspectRatioX = m_theoraFormatInfo->pictureWidth * m_theoraFormatInfo->aspectNumerator;
-        inFormatBuffer->dwPictAspectRatioY = m_theoraFormatInfo->pictureHeight * m_theoraFormatInfo->aspectDenominator;
+        inFormatBuffer->dwPictAspectRatioX = width * m_theoraFormatInfo->aspectNumerator;
+        inFormatBuffer->dwPictAspectRatioY = height * m_theoraFormatInfo->aspectDenominator;
     }
 #ifndef WINCE
     inFormatBuffer->dwControlFlags = 0;
@@ -330,29 +330,50 @@
 
 HRESULT TheoraDecodeFilter::CheckOutputType(const CMediaType* inMediaType)
 {
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tMajortype: " << inMediaType->majortype;
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tSubtype: " << inMediaType->subtype;
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tFormattype: " << inMediaType->formattype;
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tcbFormat: " << inMediaType->cbFormat;
+
 	for (size_t i = 0; i < m_outputMediaTypesList.size(); i++) 
     {
 		if	(inMediaType->majortype == m_outputMediaTypesList[i]->majortype &&
 			inMediaType->subtype == m_outputMediaTypesList[i]->subtype &&
 			inMediaType->formattype == m_outputMediaTypesList[i]->formattype)
 		{
-			LOG(logDEBUG) << "Output type ok";
+            long biWidth = 0;
+            long biHeight = 0;
+
+            if (inMediaType->formattype == FORMAT_VideoInfo2)
+            {
+                VIDEOINFOHEADER2* locVideoHeader = (VIDEOINFOHEADER2*)inMediaType->Format();
+
+                biWidth = locVideoHeader->bmiHeader.biWidth;
+                biHeight = locVideoHeader->bmiHeader.biHeight;
+            }
+            else if (inMediaType->formattype == FORMAT_VideoInfo)
+            {
+                VIDEOINFOHEADER* locVideoHeader = (VIDEOINFOHEADER*)inMediaType->Format();
+
+                biWidth = locVideoHeader->bmiHeader.biWidth;
+                biHeight = locVideoHeader->bmiHeader.biHeight;
+            }
+
+            LOG(logDEBUG) << __FUNCTIONW__ << "\tbiWidth: " << biWidth;
+            LOG(logDEBUG) << __FUNCTIONW__ << "\tbiHeight:  " << biHeight;
+
+            if (abs(biWidth) < m_theoraFormatInfo->pictureWidth ||
+                abs(biHeight) < m_theoraFormatInfo->pictureHeight)
+            {
+                LOG(logDEBUG) << __FUNCTIONW__ << " Output type NOT OK (" << i << ")";
+                return S_FALSE;
+            }
+
 			return S_OK;
 		} 
 	}
 	LOG(logDEBUG) << "Output type no good";
 
-	if (inMediaType->majortype == MEDIATYPE_Video) 
-    {
-		LOG(logDEBUG) << "Querying for video - FAIL";
-		LOG(logDEBUG) << "Sub type = " << inMediaType->subtype;
-		LOG(logDEBUG) << "format type = " << inMediaType->formattype;
-	} 
-    else 
-    {
-		LOG(logDEBUG) << "Querying for non-video type";
-	}
-
 	//If it matched none... return false.
 	return S_FALSE;
 }
@@ -363,38 +384,42 @@
 	if (CheckInputType(inInputMediaType) == S_OK && 
         CheckOutputType(inOutputMediaType) == S_OK) 
 	{
-		if (inOutputMediaType->formattype == FORMAT_VideoInfo2)
-		{
-			VIDEOINFOHEADER2* locVideoHeader = (VIDEOINFOHEADER2*)inOutputMediaType->Format();
+        LOG(logDEBUG) << __FUNCTIONW__;
+        ComputeBmiFrameSize(inOutputMediaType);
+		return S_OK;
+	} 
+    else 
+    {
+		LOG(logDEBUG) << __FUNCTIONW__ << " FAILED";
+		return S_FALSE;
+	}
+}
 
-			m_bmiHeight = (unsigned long)abs(locVideoHeader->bmiHeader.biHeight);
-			m_bmiWidth = (unsigned long)abs(locVideoHeader->bmiHeader.biWidth);
 
+void TheoraDecodeFilter::ComputeBmiFrameSize(const CMediaType* inOutputMediaType)
+{
+    if (inOutputMediaType->formattype == FORMAT_VideoInfo2)
+    {
+        VIDEOINFOHEADER2* locVideoHeader = (VIDEOINFOHEADER2*)inOutputMediaType->Format();
 
-			m_bmiFrameSize = (m_bmiHeight * m_bmiWidth * locVideoHeader->bmiHeader.biBitCount) / 8;
-		}
-		else if (inOutputMediaType->formattype == FORMAT_VideoInfo)
-		{
-			VIDEOINFOHEADER* locVideoHeader = (VIDEOINFOHEADER*)inOutputMediaType->Format();
+        m_bmiHeight = (unsigned long)abs(locVideoHeader->bmiHeader.biHeight);
+        m_bmiWidth = (unsigned long)abs(locVideoHeader->bmiHeader.biWidth);
 
-			m_bmiHeight = (unsigned long)abs(locVideoHeader->bmiHeader.biHeight);
-			m_bmiWidth = (unsigned long)abs(locVideoHeader->bmiHeader.biWidth);
+        m_bmiFrameSize = (m_bmiHeight * m_bmiWidth * locVideoHeader->bmiHeader.biBitCount) / 8;
+    }
+    else if (inOutputMediaType->formattype == FORMAT_VideoInfo)
+    {
+        VIDEOINFOHEADER* locVideoHeader = (VIDEOINFOHEADER*)inOutputMediaType->Format();
 
-			m_bmiFrameSize = (m_bmiHeight * m_bmiWidth * locVideoHeader->bmiHeader.biBitCount) / 8;
-		}
+        m_bmiHeight = (unsigned long)abs(locVideoHeader->bmiHeader.biHeight);
+        m_bmiWidth = (unsigned long)abs(locVideoHeader->bmiHeader.biWidth);
 
-        LOG(logDEBUG) << "Check transform:";
-        LOG(logDEBUG) << "\tbmiWidth: " << m_bmiWidth;
-        LOG(logDEBUG) << "\tbmiHeight: " << m_bmiHeight;
-        LOG(logDEBUG) << "\tbmiFrameSize: " << m_bmiFrameSize;
+        m_bmiFrameSize = (m_bmiHeight * m_bmiWidth * locVideoHeader->bmiHeader.biBitCount) / 8;
+    }
 
-		return S_OK;
-	} 
-    else 
-    {
-		LOG(logDEBUG) << "Check transform FAILED";
-		return S_FALSE;
-	}
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tbmiWidth: " << m_bmiWidth;
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tbmiHeight: " << m_bmiHeight;
+    LOG(logDEBUG) << __FUNCTIONW__ << "\tbmiFrameSize: " << m_bmiFrameSize;
 }
 
 HRESULT TheoraDecodeFilter::DecideBufferSize(IMemAllocator* inAllocator, ALLOCATOR_PROPERTIES* inPropertyRequest) 
@@ -490,11 +515,17 @@
 	
     if (inPosition < (int)m_outputMediaTypesList.size()) 
 	{	
+        long biWidth = 0;
+        long biHeight = 0;
+
 		if (m_outputMediaTypesList[inPosition]->formattype == FORMAT_VideoInfo2)
 		{
 			VIDEOINFOHEADER2* locVideoFormat = (VIDEOINFOHEADER2*)outOutputMediaType->AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
 			FillVideoInfoHeader2(inPosition, locVideoFormat);
 			FillMediaType(inPosition, outOutputMediaType, locVideoFormat->bmiHeader.biSizeImage);
+
+            biWidth = locVideoFormat->bmiHeader.biWidth;
+            biHeight = locVideoFormat->bmiHeader.biHeight;
 		}
 		else if (m_outputMediaTypesList[inPosition]->formattype == FORMAT_VideoInfo)
 		{
@@ -517,9 +548,12 @@
 
 			FillVideoInfoHeader(inPosition, locVideoFormat);
 			FillMediaType(inPosition, outOutputMediaType, locVideoFormat->bmiHeader.biSizeImage);
+
+            biWidth = locVideoFormat->bmiHeader.biWidth;
+            biHeight = locVideoFormat->bmiHeader.biHeight;
 		}
 
-		LOG(logDEBUG) << "Get Media Type";
+        LOG(logDEBUG) << __FUNCTIONW__ << " Width: " << biWidth << ", Height: " << biHeight; 
 		return S_OK;
 	} 
 	else 
@@ -706,7 +740,7 @@
 }
 HRESULT TheoraDecodeFilter::Transform(IMediaSample* inInputSample, IMediaSample* outOutputSample) 
 {
-	//LOG(logDEBUG) << "Theora::Transform NOT IMPLEMENTED";
+	LOG(logDEBUG) << __FUNCTIONW__ << " NOT IMPLEMENTED";
 	return E_NOTIMPL;
 }
 
@@ -1090,8 +1124,15 @@
     {
 		m_currentOutputSubType = inMediaType->subtype;
 		
-        LOG(logDEBUG) << "SETTING output type";
+        LOG(logDEBUG) << __FUNCTIONW__ << " SETTING output type";
+        LOG(logDEBUG) << __FUNCTIONW__ << "\tMajortype: " << inMediaType->majortype;
+        LOG(logDEBUG) << __FUNCTIONW__ << "\tSubtype: " << inMediaType->subtype;
+        LOG(logDEBUG) << __FUNCTIONW__ << "\tFormattype: " << inMediaType->formattype;
+        LOG(logDEBUG) << __FUNCTIONW__ << "\tcbFormat: " << inMediaType->cbFormat;
 		
+        LOG(logDEBUG) << __FUNCTIONW__;
+        ComputeBmiFrameSize(inMediaType);
+
         return CTransformFilter::SetMediaType(PINDIR_OUTPUT, inMediaType);//CVideoTransformFilter::SetMediaType(PINDIR_OUTPUT, inMediaType);
 	}
 }
@@ -1352,3 +1393,22 @@
     videoParams.fourCC = BI_RGB;
     m_outputVideoParams.push_back(videoParams);
 }
+
+HRESULT __stdcall TheoraDecodeFilter::Stop()
+{
+    LOG(logDEBUG) << __FUNCTIONW__;
+    return CTransformFilter::Stop();
+}
+
+HRESULT __stdcall TheoraDecodeFilter::Pause()
+{
+    LOG(logDEBUG) << __FUNCTIONW__;
+    return CTransformFilter::Pause();
+}
+
+HRESULT __stdcall TheoraDecodeFilter::Run(REFERENCE_TIME tStart)
+{
+    LOG(logDEBUG) << __FUNCTIONW__;
+    return CTransformFilter::Run(tStart);
+}
+

Modified: trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.h
===================================================================
--- trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.h	2010-05-08 03:59:17 UTC (rev 17198)
+++ trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeFilter.h	2010-05-10 21:07:13 UTC (rev 17199)
@@ -43,6 +43,7 @@
 {
 public:
 	friend class TheoraDecodeInputPin;
+    friend class TheoraDecodeOutputPin;
 	
     TheoraDecodeFilter();
 	virtual ~TheoraDecodeFilter();
@@ -59,7 +60,8 @@
 	//CTransfrom filter pure virtuals
 	virtual HRESULT CheckInputType(const CMediaType* inMediaType);
 	virtual HRESULT CheckTransform(const CMediaType* inInputMediaType, const CMediaType* inOutputMediaType);
-	virtual HRESULT DecideBufferSize(IMemAllocator* inAllocator, ALLOCATOR_PROPERTIES* inPropertyRequest);
+
+    virtual HRESULT DecideBufferSize(IMemAllocator* inAllocator, ALLOCATOR_PROPERTIES* inPropertyRequest);
 	virtual HRESULT GetMediaType(int inPosition, CMediaType* outOutputMediaType);
 	virtual HRESULT Transform(IMediaSample* inInputSample, IMediaSample* outOutputSample);
 
@@ -71,6 +73,11 @@
 	//virtual BOOL ShouldSkipFrame(IMediaSample* inSample);
 	virtual CBasePin* TheoraDecodeFilter::GetPin(int inPinNo);
 	
+
+    HRESULT __stdcall Stop();
+    HRESULT __stdcall Pause();
+    HRESULT __stdcall Run(REFERENCE_TIME tStart);
+
 #ifdef WINCE
 	virtual LPAMOVIESETUP_FILTER GetSetupData();
 #endif
@@ -90,6 +97,8 @@
     bool FillVideoInfoHeader2(int inPosition, VIDEOINFOHEADER2* inFormatBuffer);
 	bool SetSampleParams(IMediaSample* outMediaSample, unsigned long inDataSize, REFERENCE_TIME* inStartTime, REFERENCE_TIME* inEndTime, BOOL inIsSync);
 
+    void ComputeBmiFrameSize(const CMediaType* inOutputMediaType);
+
     HRESULT TheoraDecoded (yuv_buffer* inYUVBuffer, IMediaSample* outSample, bool inIsKeyFrame, REFERENCE_TIME inStart, REFERENCE_TIME inEnd);
 
     void DecodeToAYUV(yuv_buffer* inYUVBuffer, IMediaSample* outSample);    

Modified: trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeInputPin.cpp
===================================================================
--- trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeInputPin.cpp	2010-05-08 03:59:17 UTC (rev 17198)
+++ trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeInputPin.cpp	2010-05-10 21:07:13 UTC (rev 17199)
@@ -114,7 +114,6 @@
 		m_oggOutputPinInterface = NULL;
 	}
 
-	LOG(logDEBUG) << "Attempt CompleteConnect";
 	IMediaSeeking* locSeeker = NULL;
 	inReceivePin->QueryInterface(IID_IMediaSeeking, (void**)&locSeeker);
 
@@ -124,7 +123,7 @@
 	}
 	SetDelegate(locSeeker);
 	locHR = CTransformInputPin::CompleteConnect(inReceivePin);
-	LOG(logDEBUG) << "CompleteConnect returns " << locHR;
+    LOG(logDEBUG) << __FUNCTIONW__ <<  " returned: " << locHR;
 
 	return locHR;
 }

Modified: trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.cpp
===================================================================
--- trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.cpp	2010-05-08 03:59:17 UTC (rev 17198)
+++ trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.cpp	2010-05-10 21:07:13 UTC (rev 17199)
@@ -30,9 +30,10 @@
 //===========================================================================
 
 #include "stdafx.h"
-#include "theoradecodeoutputpin.h"
+#include "TheoraDecodeOutputpin.h"
+#include "TheoraDecodeFilter.h"
 
-TheoraDecodeOutputPin::TheoraDecodeOutputPin(CTransformFilter* inParentFilter, HRESULT* outHR) :	
+TheoraDecodeOutputPin::TheoraDecodeOutputPin(TheoraDecodeFilter* inParentFilter, HRESULT* outHR) :	
 CTransformOutputPin(NAME("Theora Output Pin"), inParentFilter, outHR, L"Theora Out")
 {
 }
@@ -90,3 +91,8 @@
 {
 	return E_NOTIMPL;
 }
+
+TheoraDecodeFilter* TheoraDecodeOutputPin::GetFilter()
+{
+    return static_cast<TheoraDecodeFilter*>(m_pTransformFilter);
+}

Modified: trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.h
===================================================================
--- trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.h	2010-05-08 03:59:17 UTC (rev 17198)
+++ trunk/oggdsf/src/lib/codecs/theora/filters/dsfTheoraDecoder/TheoraDecodeOutputPin.h	2010-05-10 21:07:13 UTC (rev 17199)
@@ -33,11 +33,13 @@
 #include "Theoradecoderdllstuff.h"
 #include "BasicSeekPassThrough.h"
 
+class TheoraDecodeFilter;
+
 class TheoraDecodeOutputPin : public CTransformOutputPin, public BasicSeekPassThrough
 {
 public:
 	
-	TheoraDecodeOutputPin(CTransformFilter* inParentFilter, HRESULT* outHR);
+	TheoraDecodeOutputPin(TheoraDecodeFilter* inParentFilter, HRESULT* outHR);
 	virtual ~TheoraDecodeOutputPin();
 
 	//COM Guff
@@ -50,4 +52,6 @@
 
 	//Quality control
 	virtual STDMETHODIMP Notify(IBaseFilter* inMessageSource, Quality inQuality);
+
+    TheoraDecodeFilter* GetFilter();
 };



More information about the commits mailing list