Maarten Lankhorst : quartz: Fix time on MPEG splitter.
Alexandre Julliard
julliard at winehq.org
Mon Nov 8 11:46:21 CST 2010
Module: wine
Branch: master
Commit: 8c42595c34cbefef84f95a6671349410f3929d22
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c42595c34cbefef84f95a6671349410f3929d22
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Sun Nov 7 15:02:49 2010 +0100
quartz: Fix time on MPEG splitter.
---
dlls/quartz/mpegsplit.c | 34 ++++++++++++++++++++++++----------
1 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c
index 8321131..c556b78 100644
--- a/dlls/quartz/mpegsplit.c
+++ b/dlls/quartz/mpegsplit.c
@@ -171,7 +171,7 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample)
Parser_OutputPin * pOutputPin = (Parser_OutputPin*)This->Parser.ppPins[1];
LONGLONG length = 0;
LONGLONG pos = BYTES_FROM_MEDIATIME(This->Parser.pInputPin->rtNext);
- LONGLONG time = This->position;
+ LONGLONG time = This->position, rtstop, rtstart;
HRESULT hr;
BYTE *fbuf = NULL;
DWORD len = IMediaSample_GetActualDataLength(pCurrentSample);
@@ -229,7 +229,28 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample)
TRACE("Media time : %u.%03u\n", (DWORD)(This->position/10000000), (DWORD)((This->position/10000)%1000));
- IMediaSample_SetTime(pCurrentSample, &time, &This->position);
+ if (IMediaSample_IsDiscontinuity(pCurrentSample) == S_OK) {
+ IPin *victim;
+ EnterCriticalSection(&This->Parser.filter.csFilter);
+ pOutputPin->pin.pin.tStart = time;
+ pOutputPin->pin.pin.dRate = This->Parser.sourceSeeking.dRate;
+ hr = IPin_ConnectedTo((IPin *)pOutputPin, &victim);
+ if (hr == S_OK)
+ {
+ hr = IPin_NewSegment(victim, time, This->Parser.sourceSeeking.llStop,
+ This->Parser.sourceSeeking.dRate);
+ if (hr != S_OK)
+ FIXME("NewSegment returns %08x\n", hr);
+ IPin_Release(victim);
+ }
+ LeaveCriticalSection(&This->Parser.filter.csFilter);
+ if (hr != S_OK)
+ return hr;
+ }
+ rtstart = (double)(time - pOutputPin->pin.pin.tStart) / pOutputPin->pin.pin.dRate;
+ rtstop = (double)(This->position - pOutputPin->pin.pin.tStart) / pOutputPin->pin.pin.dRate;
+ IMediaSample_SetTime(pCurrentSample, &rtstart, &rtstop);
+ IMediaSample_SetMediaTime(pCurrentSample, &time, &This->position);
hr = BaseOutputPinImpl_Deliver((BaseOutputPin*)&pOutputPin->pin, pCurrentSample);
@@ -672,7 +693,6 @@ static HRESULT WINAPI MPEGSplitter_seek(IMediaSeeking *iface)
if (SUCCEEDED(hr))
{
PullPin *pin = This->Parser.pInputPin;
- IPin *victim = NULL;
TRACE("Moving sound to %08u bytes!\n", (DWORD)bytepos);
@@ -682,12 +702,6 @@ static HRESULT WINAPI MPEGSplitter_seek(IMediaSeeking *iface)
/* Make sure this is done while stopped, BeginFlush takes care of this */
EnterCriticalSection(&This->Parser.filter.csFilter);
memcpy(This->header, header, 4);
- IPin_ConnectedTo(This->Parser.ppPins[1], &victim);
- if (victim)
- {
- IPin_NewSegment(victim, newpos, This->duration, pin->dRate);
- IPin_Release(victim);
- }
pin->rtStart = pin->rtCurrent = MEDIATIME_FROM_BYTES(bytepos);
pin->rtStop = MEDIATIME_FROM_BYTES((REFERENCE_TIME)This->EndOfFile);
@@ -744,7 +758,7 @@ static HRESULT MPEGSplitter_first_request(LPVOID iface)
pin->rtNext = rtSampleStop;
IMediaSample_SetPreroll(sample, FALSE);
- IMediaSample_SetDiscontinuity(sample, This->seek);
+ IMediaSample_SetDiscontinuity(sample, TRUE);
IMediaSample_SetSyncPoint(sample, 1);
This->seek = 0;
More information about the wine-cvs
mailing list