https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a7ef5747b51d323ecbae57...
commit a7ef5747b51d323ecbae5712e9ea97b13844693d Author: Thomas Faber thomas.faber@reactos.org AuthorDate: Mon Feb 5 18:47:10 2018 +0100 Commit: Thomas Faber thomas.faber@reactos.org CommitDate: Sat Feb 10 17:53:05 2018 +0100
[STRMBASE] Sync with Wine 3.0. CORE-14225 --- media/doc/README.WINE | 2 +- sdk/include/reactos/wine/strmbase.h | 4 +- sdk/lib/3rdparty/strmbase/mediatype.c | 13 ++- sdk/lib/3rdparty/strmbase/outputqueue.c | 33 ++---- sdk/lib/3rdparty/strmbase/pin.c | 10 +- sdk/lib/3rdparty/strmbase/pospass.c | 26 ++--- sdk/lib/3rdparty/strmbase/renderer.c | 6 +- sdk/lib/3rdparty/strmbase/transform.c | 10 +- sdk/lib/3rdparty/strmbase/video.c | 196 +++++++++++++++++++++++++------- sdk/lib/3rdparty/strmbase/window.c | 2 +- 10 files changed, 205 insertions(+), 97 deletions(-)
diff --git a/media/doc/README.WINE b/media/doc/README.WINE index 5cafdae121..7f2e9e6af6 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -250,7 +250,7 @@ In addition the following libs, dlls and source files are mostly based on code p from Winehq CVS. If you are looking to update something in these files check Wine current sources first as it may already be fixed.
-reactos/sdk/lib/3rdparty/strmbase # Synced to WineStaging-1.9.16 +reactos/sdk/lib/3rdparty/strmbase # Synced to Wine-3.0
reactos/sdk/lib/rtl/actctx.c # Partly synced with WineStaging-1.9.16 reactos/sdk/lib/rtl/timerqueue.c # Partly synced with WineStaging-1.7.55 diff --git a/sdk/include/reactos/wine/strmbase.h b/sdk/include/reactos/wine/strmbase.h index 841359d445..abe92aea86 100644 --- a/sdk/include/reactos/wine/strmbase.h +++ b/sdk/include/reactos/wine/strmbase.h @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "wine/list.h" + HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc); void WINAPI FreeMediaType(AM_MEDIA_TYPE * pMediaType); AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const * pSrc); @@ -351,7 +353,7 @@ typedef struct tagOutputQueue { BOOL bTerminate; BOOL bSendAnyway;
- struct list *SampleList; + struct list SampleList;
const struct OutputQueueFuncTable* pFuncsTable; } OutputQueue; diff --git a/sdk/lib/3rdparty/strmbase/mediatype.c b/sdk/lib/3rdparty/strmbase/mediatype.c index 0a53357c03..71e29b9430 100644 --- a/sdk/lib/3rdparty/strmbase/mediatype.c +++ b/sdk/lib/3rdparty/strmbase/mediatype.c @@ -118,18 +118,23 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType e pEnumMediaTypes->basePin = basePin;
i = 0; - while (enumFunc(basePin, i, &amt) == S_OK) i++; + while (enumFunc(basePin, i, &amt) == S_OK) + { + FreeMediaType(&amt); + i++; + }
pEnumMediaTypes->enumMediaDetails.cMediaTypes = i; pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i); memset(pEnumMediaTypes->enumMediaDetails.pMediaTypes, 0, sizeof(AM_MEDIA_TYPE) * i); for (i = 0; i < pEnumMediaTypes->enumMediaDetails.cMediaTypes; i++) { - enumFunc(basePin,i,&amt); - if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &amt))) + HRESULT hr; + + if (FAILED(hr = enumFunc(basePin, i, &pEnumMediaTypes->enumMediaDetails.pMediaTypes[i]))) { IEnumMediaTypes_Release(&pEnumMediaTypes->IEnumMediaTypes_iface); - return E_OUTOFMEMORY; + return hr; } } *ppEnum = &pEnumMediaTypes->IEnumMediaTypes_iface; diff --git a/sdk/lib/3rdparty/strmbase/outputqueue.c b/sdk/lib/3rdparty/strmbase/outputqueue.c index 0e2cb5833b..c071599b45 100644 --- a/sdk/lib/3rdparty/strmbase/outputqueue.c +++ b/sdk/lib/3rdparty/strmbase/outputqueue.c @@ -40,7 +40,7 @@ static DWORD WINAPI OutputQueue_InitialThreadProc(LPVOID data) static void OutputQueue_FreeSamples(OutputQueue *pOutputQueue) { struct list *cursor, *cursor2; - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); list_remove(cursor); @@ -77,14 +77,7 @@ HRESULT WINAPI OutputQueue_Construct( This->bBatchExact = bBatchExact; InitializeCriticalSection(&This->csQueue); This->csQueue.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": OutputQueue.csQueue"); - This->SampleList = HeapAlloc(GetProcessHeap(),0,sizeof(struct list)); - if (!This->SampleList) - { - OutputQueue_Destroy(This); - *ppOutputQueue = NULL; - return E_OUTOFMEMORY; - } - list_init(This->SampleList); + list_init(&This->SampleList);
This->pInputPin = pInputPin; IPin_AddRef(&pInputPin->pin.IPin_iface); @@ -121,8 +114,6 @@ HRESULT WINAPI OutputQueue_Destroy(OutputQueue *pOutputQueue) DeleteCriticalSection(&pOutputQueue->csQueue); CloseHandle(pOutputQueue->hProcessQueue);
- HeapFree(GetProcessHeap(),0,pOutputQueue->SampleList); - IPin_Release(&pOutputQueue->pInputPin->pin.IPin_iface); HeapFree(GetProcessHeap(),0,pOutputQueue); return S_OK; @@ -159,11 +150,11 @@ HRESULT WINAPI OutputQueue_ReceiveMultiple(OutputQueue *pOutputQueue, IMediaSamp qev->type = SAMPLE_PACKET; qev->pSample = ppSamples[i]; IMediaSample_AddRef(ppSamples[i]); - list_add_tail(pOutputQueue->SampleList, &qev->entry); + list_add_tail(&pOutputQueue->SampleList, &qev->entry); (*nSamplesProcessed)++; }
- if (!pOutputQueue->bBatchExact || list_count(pOutputQueue->SampleList) >= pOutputQueue->lBatchSize) + if (!pOutputQueue->bBatchExact || list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize) SetEvent(pOutputQueue->hProcessQueue); LeaveCriticalSection(&pOutputQueue->csQueue); } @@ -181,7 +172,7 @@ VOID WINAPI OutputQueue_SendAnyway(OutputQueue *pOutputQueue) if (pOutputQueue->hThread) { EnterCriticalSection(&pOutputQueue->csQueue); - if (!list_empty(pOutputQueue->SampleList)) + if (!list_empty(&pOutputQueue->SampleList)) { pOutputQueue->bSendAnyway = TRUE; SetEvent(pOutputQueue->hProcessQueue); @@ -204,7 +195,7 @@ VOID WINAPI OutputQueue_EOS(OutputQueue *pOutputQueue) } qev->type = EOS_PACKET; qev->pSample = NULL; - list_add_tail(pOutputQueue->SampleList, &qev->entry); + list_add_tail(&pOutputQueue->SampleList, &qev->entry); } else { @@ -226,14 +217,14 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) do { EnterCriticalSection(&pOutputQueue->csQueue); - if (!list_empty(pOutputQueue->SampleList) && + if (!list_empty(&pOutputQueue->SampleList) && (!pOutputQueue->bBatchExact || - list_count(pOutputQueue->SampleList) >= pOutputQueue->lBatchSize || + list_count(&pOutputQueue->SampleList) >= pOutputQueue->lBatchSize || pOutputQueue->bSendAnyway ) ) { - while (!list_empty(pOutputQueue->SampleList)) + while (!list_empty(&pOutputQueue->SampleList)) { IMediaSample **ppSamples; LONG nSamples; @@ -242,10 +233,10 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) int i = 0;
/* First Pass Process Samples */ - i = list_count(pOutputQueue->SampleList); + i = list_count(&pOutputQueue->SampleList); ppSamples = HeapAlloc(GetProcessHeap(),0,sizeof(IMediaSample*) * i); nSamples = 0; - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); if (qev->type == SAMPLE_PACKET) @@ -269,7 +260,7 @@ DWORD WINAPI OutputQueueImpl_ThreadProc(OutputQueue *pOutputQueue) HeapFree(GetProcessHeap(),0,ppSamples);
/* Process Non-Samples */ - LIST_FOR_EACH_SAFE(cursor, cursor2, pOutputQueue->SampleList) + LIST_FOR_EACH_SAFE(cursor, cursor2, &pOutputQueue->SampleList) { QueuedEvent *qev = LIST_ENTRY(cursor, QueuedEvent, entry); if (qev->type == EOS_PACKET) diff --git a/sdk/lib/3rdparty/strmbase/pin.c b/sdk/lib/3rdparty/strmbase/pin.c index 835214b564..447d6f7467 100644 --- a/sdk/lib/3rdparty/strmbase/pin.c +++ b/sdk/lib/3rdparty/strmbase/pin.c @@ -329,7 +329,7 @@ HRESULT WINAPI BasePinImpl_NewSegment(IPin * iface, REFERENCE_TIME tStart, REFER { BasePin *This = impl_from_IPin(iface);
- TRACE("(%x%08x, %x%08x, %e)\n", (ULONG)(tStart >> 32), (ULONG)tStart, (ULONG)(tStop >> 32), (ULONG)tStop, dRate); + TRACE("(%s, %s, %e)\n", wine_dbgstr_longlong(tStart), wine_dbgstr_longlong(tStop), dRate);
This->tStart = tStart; This->tStop = tStop; @@ -387,10 +387,8 @@ ULONG WINAPI BaseOutputPinImpl_Release(IPin * iface) TRACE("(%p)->() Release from %d\n", iface, refCount + 1);
if (!refCount) - { BaseOutputPin_Destroy(This); - return 0; - } + return refCount; }
@@ -1009,7 +1007,7 @@ HRESULT WINAPI BaseInputPinImpl_NewSegment(IPin * iface, REFERENCE_TIME tStart, BaseInputPin *This = impl_BaseInputPin_from_IPin(iface); newsegmentargs args;
- TRACE("(%x%08x, %x%08x, %e)\n", (ULONG)(tStart >> 32), (ULONG)tStart, (ULONG)(tStop >> 32), (ULONG)tStop, dRate); + TRACE("(%s, %s, %e)\n", wine_dbgstr_longlong(tStart), wine_dbgstr_longlong(tStop), dRate);
args.tStart = This->pin.tStart = tStart; args.tStop = This->pin.tStop = tStop; @@ -1202,7 +1200,7 @@ HRESULT BaseInputPin_Construct(const IPinVtbl *InputPin_Vtbl, LONG inputpin_size
if (SUCCEEDED(InputPin_Init(InputPin_Vtbl, pPinInfo, vtbl, pCritSec, allocator, pPinImpl))) { - *ppPin = (IPin *)pPinImpl; + *ppPin = &pPinImpl->pin.IPin_iface; return S_OK; }
diff --git a/sdk/lib/3rdparty/strmbase/pospass.c b/sdk/lib/3rdparty/strmbase/pospass.c index 91af649a9f..9e33d7639b 100644 --- a/sdk/lib/3rdparty/strmbase/pospass.c +++ b/sdk/lib/3rdparty/strmbase/pospass.c @@ -67,7 +67,7 @@ static HRESULT WINAPI SeekInner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID *ppvObj) { PassThruImpl *This = impl_from_IUnknown_inner(iface); - TRACE("(%p)->(%s (%p), %p)\n", This, debugstr_guid(riid), riid, ppvObj); + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObj);
if (This->bAggregatable) This->bUnkOuterValid = TRUE; @@ -142,9 +142,9 @@ static HRESULT SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID { HRESULT hr;
- IUnknown_AddRef((IUnknown *)&(This->IUnknown_inner)); - hr = IUnknown_QueryInterface((IUnknown *)&(This->IUnknown_inner), riid, ppv); - IUnknown_Release((IUnknown *)&(This->IUnknown_inner)); + IUnknown_AddRef(&This->IUnknown_inner); + hr = IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv); + IUnknown_Release(&This->IUnknown_inner); This->bAggregatable = TRUE; return hr; } @@ -153,28 +153,28 @@ static HRESULT SeekOuter_QueryInterface(PassThruImpl *This, REFIID riid, LPVOID return E_NOINTERFACE; }
- return IUnknown_QueryInterface((IUnknown *)&(This->IUnknown_inner), riid, ppv); + return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv); }
static ULONG SeekOuter_AddRef(PassThruImpl *This) { if (This->outer_unk && This->bUnkOuterValid) return IUnknown_AddRef(This->outer_unk); - return IUnknown_AddRef((IUnknown *)&(This->IUnknown_inner)); + return IUnknown_AddRef(&This->IUnknown_inner); }
static ULONG SeekOuter_Release(PassThruImpl *This) { if (This->outer_unk && This->bUnkOuterValid) return IUnknown_Release(This->outer_unk); - return IUnknown_Release((IUnknown *)&(This->IUnknown_inner)); + return IUnknown_Release(&This->IUnknown_inner); }
static HRESULT WINAPI SeekingPassThru_QueryInterface(ISeekingPassThru *iface, REFIID riid, LPVOID *ppvObj) { PassThruImpl *This = impl_from_ISeekingPassThru(iface);
- TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj); + TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
return SeekOuter_QueryInterface(This, riid, ppvObj); } @@ -266,7 +266,7 @@ static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, { PassThruImpl *This = impl_from_IMediaSeeking(iface);
- TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj); + TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
return SeekOuter_QueryInterface(This, riid, ppvObj); } @@ -516,11 +516,9 @@ static HRESULT WINAPI MediaSeekingPassThru_GetPositions(IMediaSeeking * iface, L if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetPositions(seek, pCurrent, pStop); IMediaSeeking_Release(seek); - } else if (hr == VFW_E_NOT_CONNECTED) { - *pCurrent = 0; - *pStop = 0; - hr = S_OK; } + else + return E_NOTIMPL; return hr; }
@@ -651,7 +649,7 @@ static HRESULT WINAPI MediaPositionPassThru_QueryInterface(IMediaPosition *iface { PassThruImpl *This = impl_from_IMediaPosition(iface);
- TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj); + TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
return SeekOuter_QueryInterface(This, riid, ppvObj); } diff --git a/sdk/lib/3rdparty/strmbase/renderer.c b/sdk/lib/3rdparty/strmbase/renderer.c index a89ba5f1bb..2da801ce43 100644 --- a/sdk/lib/3rdparty/strmbase/renderer.c +++ b/sdk/lib/3rdparty/strmbase/renderer.c @@ -228,7 +228,8 @@ static const BaseInputPinFuncTable input_BaseInputFuncTable = { };
-HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseRendererFuncTable* pBaseFuncsTable) +HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid, + DWORD_PTR DebugInfo, const BaseRendererFuncTable* pBaseFuncsTable) { PIN_INFO piInput; HRESULT hr; @@ -247,7 +248,8 @@ HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtb
if (SUCCEEDED(hr)) { - hr = CreatePosPassThru(pUnkOuter ? pUnkOuter: (IUnknown*)This, TRUE, &This->pInputPin->pin.IPin_iface, &This->pPosition); + hr = CreatePosPassThru(pUnkOuter ? pUnkOuter: (IUnknown *)&This->filter.IBaseFilter_iface, TRUE, + &This->pInputPin->pin.IPin_iface, &This->pPosition); if (FAILED(hr)) return hr;
diff --git a/sdk/lib/3rdparty/strmbase/transform.c b/sdk/lib/3rdparty/strmbase/transform.c index acb16938d0..fd7534b4af 100644 --- a/sdk/lib/3rdparty/strmbase/transform.c +++ b/sdk/lib/3rdparty/strmbase/transform.c @@ -223,7 +223,8 @@ static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* p { ISeekingPassThru *passthru; pTransformFilter->seekthru_unk = NULL; - hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pTransformFilter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pTransformFilter->seekthru_unk); + hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown *)&pTransformFilter->filter.IBaseFilter_iface, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (void **)&pTransformFilter->seekthru_unk); if (SUCCEEDED(hr)) { IUnknown_QueryInterface(pTransformFilter->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); @@ -326,11 +327,8 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) IUnknown_Release(This->seekthru_unk); BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); - - return 0; } - else - return refCount; + return refCount; }
/** IMediaFilter methods **/ @@ -530,7 +528,7 @@ static HRESULT WINAPI TransformFilter_InputPin_NewSegment(IPin * iface, REFERENC TransformFilter* pTransform; HRESULT hr = S_OK;
- TRACE("(%p)->()\n", iface); + TRACE("(%p)->(%s %s %e)\n", iface, wine_dbgstr_longlong(tStart), wine_dbgstr_longlong(tStop), dRate);
pTransform = impl_from_IBaseFilter(This->pin.pinInfo.pFilter); EnterCriticalSection(&pTransform->filter.csFilter); diff --git a/sdk/lib/3rdparty/strmbase/video.c b/sdk/lib/3rdparty/strmbase/video.c index ba147d7abb..dd6426d11e 100644 --- a/sdk/lib/3rdparty/strmbase/video.c +++ b/sdk/lib/3rdparty/strmbase/video.c @@ -43,6 +43,33 @@ HRESULT WINAPI BaseControlVideo_Destroy(BaseControlVideo *pControlVideo) return BaseDispatch_Destroy(&pControlVideo->baseDispatch); }
+static HRESULT BaseControlVideoImpl_CheckSourceRect(BaseControlVideo *This, RECT *pSourceRect) +{ + LONG VideoWidth, VideoHeight; + HRESULT hr; + + if (IsRectEmpty(pSourceRect)) + return E_INVALIDARG; + + hr = BaseControlVideoImpl_GetVideoSize((IBasicVideo *)This, &VideoWidth, &VideoHeight); + if (FAILED(hr)) + return hr; + + if (pSourceRect->top < 0 || pSourceRect->left < 0 || + pSourceRect->bottom > VideoHeight || pSourceRect->right > VideoWidth) + return E_INVALIDARG; + + return S_OK; +} + +static HRESULT BaseControlVideoImpl_CheckTargetRect(BaseControlVideo *This, RECT *pTargetRect) +{ + if (IsRectEmpty(pTargetRect)) + return E_INVALIDARG; + + return S_OK; +} + HRESULT WINAPI BaseControlVideoImpl_GetTypeInfoCount(IBasicVideo *iface, UINT *pctinfo) { BaseControlVideo *This = impl_from_IBasicVideo(iface); @@ -85,6 +112,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_AvgTimePerFrame(IBasicVideo *iface, REFT VIDEOINFOHEADER *vih; BaseControlVideo *This = impl_from_IBasicVideo(iface);
+ if (!pAvgTimePerFrame) + return E_POINTER; if (!This->pPin->pConnectedTo) return VFW_E_NOT_CONNECTED;
@@ -102,6 +131,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_BitRate(IBasicVideo *iface, LONG *pBitRa
TRACE("(%p/%p)->(%p)\n", This, iface, pBitRate);
+ if (!pBitRate) + return E_POINTER; if (!This->pPin->pConnectedTo) return VFW_E_NOT_CONNECTED;
@@ -117,6 +148,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_BitErrorRate(IBasicVideo *iface, LONG *p
TRACE("(%p/%p)->(%p)\n", This, iface, pBitErrorRate);
+ if (!pBitErrorRate) + return E_POINTER; if (!This->pPin->pConnectedTo) return VFW_E_NOT_CONNECTED;
@@ -131,6 +164,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_VideoWidth(IBasicVideo *iface, LONG *pVi BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pVideoWidth); + if (!pVideoWidth) + return E_POINTER;
vih = This->pFuncsTable->pfnGetVideoFormat(This); *pVideoWidth = vih->bmiHeader.biWidth; @@ -144,6 +179,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_VideoHeight(IBasicVideo *iface, LONG *pV BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pVideoHeight); + if (!pVideoHeight) + return E_POINTER;
vih = This->pFuncsTable->pfnGetVideoFormat(This); *pVideoHeight = abs(vih->bmiHeader.biHeight); @@ -155,13 +192,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceLeft(IBasicVideo *iface, LONG Sour { RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, SourceLeft); - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - SourceRect.left = SourceLeft; - This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); + if (SUCCEEDED(hr)) + { + SourceRect.right = (SourceRect.right - SourceRect.left) + SourceLeft; + SourceRect.left = SourceLeft; + hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_SourceLeft(IBasicVideo *iface, LONG *pSourceLeft) @@ -170,6 +214,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_SourceLeft(IBasicVideo *iface, LONG *pSo BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pSourceLeft); + if (!pSourceLeft) + return E_POINTER; This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); *pSourceLeft = SourceRect.left;
@@ -180,13 +226,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceWidth(IBasicVideo *iface, LONG Sou { RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, SourceWidth); - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - SourceRect.right = SourceRect.left + SourceWidth; - This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); + if (SUCCEEDED(hr)) + { + SourceRect.right = SourceRect.left + SourceWidth; + hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_SourceWidth(IBasicVideo *iface, LONG *pSourceWidth) @@ -195,6 +247,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_SourceWidth(IBasicVideo *iface, LONG *pS BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pSourceWidth); + if (!pSourceWidth) + return E_POINTER; This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); *pSourceWidth = SourceRect.right - SourceRect.left;
@@ -205,13 +259,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceTop(IBasicVideo *iface, LONG Sourc { RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, SourceTop); - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - SourceRect.top = SourceTop; - This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); + if (SUCCEEDED(hr)) + { + SourceRect.bottom = (SourceRect.bottom - SourceRect.top) + SourceTop; + SourceRect.top = SourceTop; + hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_SourceTop(IBasicVideo *iface, LONG *pSourceTop) @@ -220,6 +281,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_SourceTop(IBasicVideo *iface, LONG *pSou BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pSourceTop); + if (!pSourceTop) + return E_POINTER; This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); *pSourceTop = SourceRect.top;
@@ -230,13 +293,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceHeight(IBasicVideo *iface, LONG So { RECT SourceRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, SourceHeight); - This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); - SourceRect.bottom = SourceRect.top + SourceHeight; - This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); + hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect); + if (SUCCEEDED(hr)) + { + SourceRect.bottom = SourceRect.top + SourceHeight; + hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_SourceHeight(IBasicVideo *iface, LONG *pSourceHeight) @@ -245,6 +314,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_SourceHeight(IBasicVideo *iface, LONG *p BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pSourceHeight); + if (!pSourceHeight) + return E_POINTER; This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
*pSourceHeight = SourceRect.bottom - SourceRect.top; @@ -256,13 +327,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_DestinationLeft(IBasicVideo *iface, LONG { RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, DestinationLeft); - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - DestRect.left = DestinationLeft; - This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); + if (SUCCEEDED(hr)) + { + DestRect.right = (DestRect.right - DestRect.left) + DestinationLeft; + DestRect.left = DestinationLeft; + hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_DestinationLeft(IBasicVideo *iface, LONG *pDestinationLeft) @@ -271,6 +349,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_DestinationLeft(IBasicVideo *iface, LONG BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationLeft); + if (!pDestinationLeft) + return E_POINTER; This->pFuncsTable->pfnGetTargetRect(This, &DestRect); *pDestinationLeft = DestRect.left;
@@ -281,13 +361,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_DestinationWidth(IBasicVideo *iface, LON { RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, DestinationWidth); - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - DestRect.right = DestRect.left + DestinationWidth; - This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); + if (SUCCEEDED(hr)) + { + DestRect.right = DestRect.left + DestinationWidth; + hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_DestinationWidth(IBasicVideo *iface, LONG *pDestinationWidth) @@ -296,6 +382,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_DestinationWidth(IBasicVideo *iface, LON BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationWidth); + if (!pDestinationWidth) + return E_POINTER; This->pFuncsTable->pfnGetTargetRect(This, &DestRect); *pDestinationWidth = DestRect.right - DestRect.left;
@@ -306,13 +394,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_DestinationTop(IBasicVideo *iface, LONG { RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, DestinationTop); - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - DestRect.top = DestinationTop; - This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); + if (SUCCEEDED(hr)) + { + DestRect.bottom = (DestRect.bottom - DestRect.top) + DestinationTop; + DestRect.top = DestinationTop; + hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_DestinationTop(IBasicVideo *iface, LONG *pDestinationTop) @@ -321,6 +416,8 @@ HRESULT WINAPI BaseControlVideoImpl_get_DestinationTop(IBasicVideo *iface, LONG BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationTop); + if (!pDestinationTop) + return E_POINTER; This->pFuncsTable->pfnGetTargetRect(This, &DestRect); *pDestinationTop = DestRect.top;
@@ -331,13 +428,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_DestinationHeight(IBasicVideo *iface, LO { RECT DestRect; BaseControlVideo *This = impl_from_IBasicVideo(iface); + HRESULT hr;
TRACE("(%p/%p)->(%d)\n", This, iface, DestinationHeight); - This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - DestRect.right = DestRect.left + DestinationHeight; - This->pFuncsTable->pfnSetTargetRect(This, &DestRect); + hr = This->pFuncsTable->pfnGetTargetRect(This, &DestRect); + if (SUCCEEDED(hr)) + { + DestRect.bottom = DestRect.top + DestinationHeight; + hr = BaseControlVideoImpl_CheckTargetRect(This, &DestRect); + } + if (SUCCEEDED(hr)) + hr = This->pFuncsTable->pfnSetTargetRect(This, &DestRect);
- return S_OK; + return hr; }
HRESULT WINAPI BaseControlVideoImpl_get_DestinationHeight(IBasicVideo *iface, LONG *pDestinationHeight) @@ -346,8 +449,10 @@ HRESULT WINAPI BaseControlVideoImpl_get_DestinationHeight(IBasicVideo *iface, LO BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationHeight); + if (!pDestinationHeight) + return E_POINTER; This->pFuncsTable->pfnGetTargetRect(This, &DestRect); - *pDestinationHeight = DestRect.right - DestRect.left; + *pDestinationHeight = DestRect.bottom - DestRect.top;
return S_OK; } @@ -360,9 +465,9 @@ HRESULT WINAPI BaseControlVideoImpl_SetSourcePosition(IBasicVideo *iface, LONG L TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
SetRect(&SourceRect, Left, Top, Left + Width, Top + Height); - This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); - - return S_OK; + if (FAILED(BaseControlVideoImpl_CheckSourceRect(This, &SourceRect))) + return E_INVALIDARG; + return This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); }
HRESULT WINAPI BaseControlVideoImpl_GetSourcePosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight) @@ -371,6 +476,8 @@ HRESULT WINAPI BaseControlVideoImpl_GetSourcePosition(IBasicVideo *iface, LONG * BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight); + if (!pLeft || !pTop || !pWidth || !pHeight) + return E_POINTER; This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
*pLeft = SourceRect.left; @@ -397,9 +504,9 @@ HRESULT WINAPI BaseControlVideoImpl_SetDestinationPosition(IBasicVideo *iface, L TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
SetRect(&DestRect, Left, Top, Left + Width, Top + Height); - This->pFuncsTable->pfnSetTargetRect(This, &DestRect); - - return S_OK; + if (FAILED(BaseControlVideoImpl_CheckTargetRect(This, &DestRect))) + return E_INVALIDARG; + return This->pFuncsTable->pfnSetTargetRect(This, &DestRect); }
HRESULT WINAPI BaseControlVideoImpl_GetDestinationPosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight) @@ -408,6 +515,8 @@ HRESULT WINAPI BaseControlVideoImpl_GetDestinationPosition(IBasicVideo *iface, L BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight); + if (!pLeft || !pTop || !pWidth || !pHeight) + return E_POINTER; This->pFuncsTable->pfnGetTargetRect(This, &DestRect);
*pLeft = DestRect.left; @@ -432,6 +541,8 @@ HRESULT WINAPI BaseControlVideoImpl_GetVideoSize(IBasicVideo *iface, LONG *pWidt BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight); + if (!pWidth || !pHeight) + return E_POINTER;
vih = This->pFuncsTable->pfnGetVideoFormat(This); *pHeight = vih->bmiHeader.biHeight; @@ -445,15 +556,18 @@ HRESULT WINAPI BaseControlVideoImpl_GetVideoPaletteEntries(IBasicVideo *iface, L BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%d, %d, %p, %p)\n", This, iface, StartIndex, Entries, pRetrieved, pPalette); + if (!pRetrieved || !pPalette) + return E_POINTER;
- if (pRetrieved) - *pRetrieved = 0; + *pRetrieved = 0; return VFW_E_NO_PALETTE_AVAILABLE; }
HRESULT WINAPI BaseControlVideoImpl_GetCurrentImage(IBasicVideo *iface, LONG *pBufferSize, LONG *pDIBImage) { BaseControlVideo *This = impl_from_IBasicVideo(iface); + if (!pBufferSize || !pDIBImage) + return E_POINTER;
return This->pFuncsTable->pfnGetStaticImage(This, pBufferSize, pDIBImage); } diff --git a/sdk/lib/3rdparty/strmbase/window.c b/sdk/lib/3rdparty/strmbase/window.c index 91606dee97..e35dc138fc 100644 --- a/sdk/lib/3rdparty/strmbase/window.c +++ b/sdk/lib/3rdparty/strmbase/window.c @@ -285,7 +285,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_WindowStyle(IVideoWindow *iface, LONG W
TRACE("(%p/%p)->(%x -> %x)\n", This, iface, old, WindowStyle);
- if (WindowStyle & (WS_DISABLED|WS_HSCROLL|WS_ICONIC|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL)) + if (WindowStyle & (WS_DISABLED|WS_HSCROLL|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL)) return E_INVALIDARG;
SetWindowLongW(This->baseWindow.hWnd, GWL_STYLE, WindowStyle);