From 09b4966957b6a9b4f0582eb699dfe088a759447e Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Tue, 7 Jun 2005 20:29:23 +0000 Subject: [PATCH] Don't use fullscreen mode in video renderer for now and improve error handling a bit. Improved a bit Run/Pause/Stop methods of parser template. --- dlls/quartz/avidec.c | 2 +- dlls/quartz/parser.c | 48 +++++++++++++++++++++++++++++-------- dlls/quartz/videorenderer.c | 5 ++-- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index e3f1a85625e..ec60b6f24cd 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -218,7 +218,7 @@ static HRESULT AVIDec_ConnectInput(TransformFilterImpl* pTransformFilter, const /* Update output media type */ CopyMediaType(outpmt, pmt); outpmt->subtype = *outsubtype; - memcpy(&(((VIDEOINFOHEADER*)outpmt->pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize); + memcpy(&(((VIDEOINFOHEADER*)outpmt->pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize); /* Update buffer size of media samples in output */ ((OutputPin*)This->tf.ppPins[1])->allocProps.cbBuffer = This->pBihOut->biSizeImage; diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index aad7273dbbf..7bbd7899eff 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -223,6 +223,11 @@ static HRESULT WINAPI Parser_Stop(IBaseFilter * iface) EnterCriticalSection(&This->csFilter); { + if (This->state == State_Stopped) + { + LeaveCriticalSection(&This->csFilter); + return S_OK; + } hr = PullPin_StopProcessing(This->pInputPin); This->state = State_Stopped; } @@ -241,6 +246,11 @@ static HRESULT WINAPI Parser_Pause(IBaseFilter * iface) EnterCriticalSection(&This->csFilter); { + if (This->state == State_Paused) + { + LeaveCriticalSection(&This->csFilter); + return S_OK; + } bInit = (This->state == State_Stopped); This->state = State_Paused; } @@ -250,7 +260,7 @@ static HRESULT WINAPI Parser_Pause(IBaseFilter * iface) { unsigned int i; - /*hr = PullPin_Seek(This->pInputPin, This->CurrentChunkOffset, This->EndOfFile); */ + hr = PullPin_Seek(This->pInputPin, 0, ((LONGLONG)0x7fffffff << 32) | 0xffffffff); if (SUCCEEDED(hr)) hr = PullPin_InitProcessing(This->pInputPin); @@ -275,6 +285,9 @@ static HRESULT WINAPI Parser_Pause(IBaseFilter * iface) } /* FIXME: else pause thread */ + if (SUCCEEDED(hr)) + hr = PullPin_PauseProcessing(This->pInputPin); + return hr; } @@ -288,19 +301,34 @@ static HRESULT WINAPI Parser_Run(IBaseFilter * iface, REFERENCE_TIME tStart) EnterCriticalSection(&This->csFilter); { - This->rtStreamStart = tStart; - This->state = State_Running; + if (This->state == State_Running) + { + LeaveCriticalSection(&This->csFilter); + return S_OK; + } - hr = PullPin_InitProcessing(This->pInputPin); + This->rtStreamStart = tStart; + + hr = PullPin_Seek(This->pInputPin, tStart, ((LONGLONG)0x7fffffff << 32) | 0xffffffff); + + if (SUCCEEDED(hr) && (This->state == State_Stopped)) + { + hr = PullPin_InitProcessing(This->pInputPin); + + if (SUCCEEDED(hr)) + { + for (i = 1; i < (This->cStreams + 1); i++) + { + OutputPin_CommitAllocator((OutputPin *)This->ppPins[i]); + } + } + } if (SUCCEEDED(hr)) - { - for (i = 1; i < This->cStreams + 1; i++) - { - OutputPin_CommitAllocator((OutputPin *)This->ppPins[i]); - } hr = PullPin_StartProcessing(This->pInputPin); - } + + if (SUCCEEDED(hr)) + This->state = State_Running; } LeaveCriticalSection(&This->csFilter); diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 25bba05eb93..ea0cb55ca8a 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -127,7 +127,7 @@ static HRESULT VideoRenderer_CreatePrimarySurface(IBaseFilter * iface) return hr; } - hr = IDirectDraw_SetCooperativeLevel(This->ddraw, NULL, DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE); + hr = IDirectDraw_SetCooperativeLevel(This->ddraw, GetDesktopWindow(), DDSCL_NORMAL); if (FAILED(hr)) { ERR("Cannot set fulscreen mode\n"); return hr; @@ -298,12 +298,13 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample) if (!This->init) { - This->init = 1; hr = VideoRenderer_CreatePrimarySurface(iface); if (FAILED(hr)) { ERR("Unable to create primary surface\n"); + return hr; } + This->init = 1; } VideoRenderer_SendSampleData(This, pbSrcStream, cbSrcStream);