winegstreamer: Fix seeking for real.

This commit is contained in:
Maarten Lankhorst 2010-11-12 21:43:44 +01:00 committed by Alexandre Julliard
parent 9867c39133
commit 36fb590efd
1 changed files with 11 additions and 8 deletions

View File

@ -326,7 +326,7 @@ static gboolean gst_base_src_perform_seek(GSTImpl *This, GstEvent *event)
gst_pad_activate_push(This->my_src, 0); gst_pad_activate_push(This->my_src, 0);
} }
TRACE("++++++++++++++++ perform byte seek ------------------\n"); This->nextofs = This->start = cur;
/* and prepare to continue streaming */ /* and prepare to continue streaming */
if (flush) { if (flush) {
@ -829,11 +829,15 @@ static gboolean activate_push(GstPad *pad, gboolean activate) {
EnterCriticalSection(&This->filter.csFilter); EnterCriticalSection(&This->filter.csFilter);
if (!activate) { if (!activate) {
TRACE("Deactivating\n"); TRACE("Deactivating\n");
if (!This->initial)
IAsyncReader_BeginFlush(This->pInputPin.pReader);
if (This->push_thread) { if (This->push_thread) {
WaitForSingleObject(This->push_thread, -1); WaitForSingleObject(This->push_thread, -1);
CloseHandle(This->push_thread); CloseHandle(This->push_thread);
This->push_thread = NULL; This->push_thread = NULL;
} }
if (!This->initial)
IAsyncReader_EndFlush(This->pInputPin.pReader);
if (This->filter.state == State_Stopped) if (This->filter.state == State_Stopped)
This->nextofs = This->start; This->nextofs = This->start;
} else if (!This->push_thread) { } else if (!This->push_thread) {
@ -968,6 +972,7 @@ static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTI
gst_pad_query_duration(This->ppPins[0]->their_src, &format, &duration); gst_pad_query_duration(This->ppPins[0]->their_src, &format, &duration);
for (i = 0; i < This->cStreams; ++i) { for (i = 0; i < This->cStreams; ++i) {
This->ppPins[i]->seek.llDuration = This->ppPins[i]->seek.llStop = duration / 100; This->ppPins[i]->seek.llDuration = This->ppPins[i]->seek.llStop = duration / 100;
This->ppPins[i]->seek.llCurrent = 0;
if (!This->ppPins[i]->seek.llDuration) if (!This->ppPins[i]->seek.llDuration)
This->ppPins[i]->seek.dwCapabilities = 0; This->ppPins[i]->seek.dwCapabilities = 0;
WaitForSingleObject(This->ppPins[i]->caps_event, -1); WaitForSingleObject(This->ppPins[i]->caps_event, -1);
@ -1134,11 +1139,8 @@ static HRESULT WINAPI GST_Stop(IBaseFilter *iface) {
TRACE("()\n"); TRACE("()\n");
if (This->gstfilter) { if (This->gstfilter)
IAsyncReader_BeginFlush(This->pInputPin.pReader);
gst_element_set_state(This->gstfilter, GST_STATE_READY); gst_element_set_state(This->gstfilter, GST_STATE_READY);
IAsyncReader_EndFlush(This->pInputPin.pReader);
}
return S_OK; return S_OK;
} }
@ -1313,6 +1315,7 @@ static HRESULT WINAPI GST_Seeking_GetCurrentPosition(IMediaSeeking *iface, REFER
return E_NOTIMPL; return E_NOTIMPL;
} }
*pos /= 100; *pos /= 100;
This->seek.llCurrent = *pos;
return S_OK; return S_OK;
} }
@ -1339,8 +1342,10 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, REFERENCE_T
hr = SourceSeekingImpl_SetPositions(iface, pCur, curflags, pStop, stopflags); hr = SourceSeekingImpl_SetPositions(iface, pCur, curflags, pStop, stopflags);
if (!This->their_src) if (!This->their_src)
return This->seek.llDuration ? hr : E_NOTIMPL; return hr;
curtype = type_from_flags(curflags);
stoptype = type_from_flags(stopflags);
if (curflags & AM_SEEKING_SeekToKeyFrame) if (curflags & AM_SEEKING_SeekToKeyFrame)
f |= GST_SEEK_FLAG_KEY_UNIT; f |= GST_SEEK_FLAG_KEY_UNIT;
if (curflags & AM_SEEKING_Segment) if (curflags & AM_SEEKING_Segment)
@ -1348,8 +1353,6 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, REFERENCE_T
if (!(curflags & AM_SEEKING_NoFlush)) if (!(curflags & AM_SEEKING_NoFlush))
f |= GST_SEEK_FLAG_FLUSH; f |= GST_SEEK_FLAG_FLUSH;
curtype = type_from_flags(curflags);
stoptype = type_from_flags(stopflags);
e = gst_event_new_seek(This->seek.dRate, GST_FORMAT_TIME, f, curtype, pCur ? *pCur * 100 : -1, stoptype, pStop ? *pStop * 100 : -1); e = gst_event_new_seek(This->seek.dRate, GST_FORMAT_TIME, f, curtype, pCur ? *pCur * 100 : -1, stoptype, pStop ? *pStop * 100 : -1);
if (gst_pad_push_event(This->my_sink, e)) if (gst_pad_push_event(This->my_sink, e))
return S_OK; return S_OK;