Aric Stewart : wineqtdecoder: Add the framework for SourceSeeking to QTSplitter.
Alexandre Julliard
julliard at winehq.org
Wed Jan 18 14:03:41 CST 2012
Module: wine
Branch: master
Commit: 8d25bfd524ca6b7896aa4623cb13ef05d0853a17
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d25bfd524ca6b7896aa4623cb13ef05d0853a17
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Jan 18 07:50:20 2012 -0600
wineqtdecoder: Add the framework for SourceSeeking to QTSplitter.
---
dlls/wineqtdecoder/qtsplitter.c | 90 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
index c206b23..aab9fc1 100644
--- a/dlls/wineqtdecoder/qtsplitter.c
+++ b/dlls/wineqtdecoder/qtsplitter.c
@@ -165,15 +165,26 @@ typedef struct QTSplitter {
FILTER_STATE state;
CRITICAL_SECTION csReceive;
+ SourceSeeking sourceSeeking;
} QTSplitter;
static const IPinVtbl QT_OutputPin_Vtbl;
static const IPinVtbl QT_InputPin_Vtbl;
static const IBaseFilterVtbl QT_Vtbl;
+static const IMediaSeekingVtbl QT_Seeking_Vtbl;
static HRESULT QT_AddPin(QTSplitter *This, const PIN_INFO *piOutput, const AM_MEDIA_TYPE *amt, BOOL video);
static HRESULT QT_RemoveOutputPins(QTSplitter *This);
+static HRESULT WINAPI QTSplitter_ChangeStart(IMediaSeeking *iface);
+static HRESULT WINAPI QTSplitter_ChangeStop(IMediaSeeking *iface);
+static HRESULT WINAPI QTSplitter_ChangeRate(IMediaSeeking *iface);
+
+static inline QTSplitter *impl_from_IMediaSeeking( IMediaSeeking *iface )
+{
+ return (QTSplitter *)((char*)iface - FIELD_OFFSET(QTSplitter, sourceSeeking.lpVtbl));
+}
+
/*
* Base Filter
*/
@@ -256,6 +267,9 @@ IUnknown * CALLBACK QTSplitter_create(IUnknown *punkout, HRESULT *phr)
This->pInputPin.pin.refCount = 1;
This->pInputPin.pin.pConnectedTo = NULL;
This->pInputPin.pin.pCritSec = &This->filter.csFilter;
+
+ SourceSeeking_Init(&This->sourceSeeking, &QT_Seeking_Vtbl, QTSplitter_ChangeStop, QTSplitter_ChangeStart, QTSplitter_ChangeRate, &This->filter.csFilter);
+
*phr = S_OK;
return obj;
}
@@ -315,6 +329,8 @@ static HRESULT WINAPI QT_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID
*ppv = This;
else if (IsEqualIID(riid, &IID_IBaseFilter))
*ppv = This;
+ else if (IsEqualIID(riid, &IID_IMediaSeeking))
+ *ppv = &This->sourceSeeking;
if (*ppv)
{
@@ -906,6 +922,8 @@ static HRESULT QT_Process_Movie(QTSplitter* filter)
short id = 0;
DWORD tid;
HANDLE thread;
+ LONGLONG time;
+ TimeScale scale;
TRACE("Trying movie connect\n");
@@ -944,6 +962,13 @@ static HRESULT QT_Process_Movie(QTSplitter* filter)
if (trk)
hr = QT_Process_Audio_Track(filter, trk);
+ time = GetMovieDuration(filter->pQTMovie);
+ scale = GetMovieTimeScale(filter->pQTMovie);
+ filter->sourceSeeking.llDuration = ((double)time / scale) * 10000000;
+ filter->sourceSeeking.llStop = filter->sourceSeeking.llDuration;
+
+ TRACE("Movie duration is %s\n",wine_dbgstr_longlong(filter->sourceSeeking.llDuration));
+
thread = CreateThread(NULL, 0, QTSplitter_thread, filter, 0, &tid);
if (thread)
{
@@ -1126,9 +1151,7 @@ static HRESULT WINAPI QTInPin_QueryInterface(IPin * iface, REFIID riid, LPVOID *
else if (IsEqualIID(riid, &IID_IPin))
*ppv = iface;
else if (IsEqualIID(riid, &IID_IMediaSeeking))
- {
return IBaseFilter_QueryInterface(This->pin.pinInfo.pFilter, &IID_IMediaSeeking, ppv);
- }
if (*ppv)
{
@@ -1338,3 +1361,66 @@ static HRESULT QT_AddPin(QTSplitter *This, const PIN_INFO *piOutput, const AM_ME
ERR("Failed with error %x\n", hr);
return hr;
}
+
+static HRESULT WINAPI QTSplitter_ChangeStart(IMediaSeeking *iface)
+{
+ FIXME("(%p) filter hasn't implemented start position change!\n", iface);
+ return S_OK;
+}
+
+static HRESULT WINAPI QTSplitter_ChangeStop(IMediaSeeking *iface)
+{
+ FIXME("(%p) filter hasn't implemented stop position change!\n", iface);
+ return S_OK;
+}
+
+static HRESULT WINAPI QTSplitter_ChangeRate(IMediaSeeking *iface)
+{
+ FIXME("(%p) filter hasn't implemented rate change!\n", iface);
+ return S_OK;
+}
+
+static HRESULT WINAPI QT_Seeking_QueryInterface(IMediaSeeking * iface, REFIID riid, LPVOID * ppv)
+{
+ QTSplitter *This = impl_from_IMediaSeeking(iface);
+
+ return IUnknown_QueryInterface((IUnknown *)This, riid, ppv);
+}
+
+static ULONG WINAPI QT_Seeking_AddRef(IMediaSeeking * iface)
+{
+ QTSplitter *This = impl_from_IMediaSeeking(iface);
+
+ return IUnknown_AddRef((IUnknown *)This);
+}
+
+static ULONG WINAPI QT_Seeking_Release(IMediaSeeking * iface)
+{
+ QTSplitter *This = impl_from_IMediaSeeking(iface);
+
+ return IUnknown_Release((IUnknown *)This);
+}
+
+static const IMediaSeekingVtbl QT_Seeking_Vtbl =
+{
+ QT_Seeking_QueryInterface,
+ QT_Seeking_AddRef,
+ QT_Seeking_Release,
+ SourceSeekingImpl_GetCapabilities,
+ SourceSeekingImpl_CheckCapabilities,
+ SourceSeekingImpl_IsFormatSupported,
+ SourceSeekingImpl_QueryPreferredFormat,
+ SourceSeekingImpl_GetTimeFormat,
+ SourceSeekingImpl_IsUsingTimeFormat,
+ SourceSeekingImpl_SetTimeFormat,
+ SourceSeekingImpl_GetDuration,
+ SourceSeekingImpl_GetStopPosition,
+ SourceSeekingImpl_GetCurrentPosition,
+ SourceSeekingImpl_ConvertTimeFormat,
+ SourceSeekingImpl_SetPositions,
+ SourceSeekingImpl_GetPositions,
+ SourceSeekingImpl_GetAvailable,
+ SourceSeekingImpl_SetRate,
+ SourceSeekingImpl_GetRate,
+ SourceSeekingImpl_GetPreroll
+};
More information about the wine-cvs
mailing list