[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