[STRMBASE] Sync with Wine Staging 1.9.16. CORE-11866

svn path=/trunk/; revision=72447
This commit is contained in:
Amine Khaldi 2016-08-23 19:35:53 +00:00
parent dd7d00f90d
commit fd8f2bb80e
4 changed files with 78 additions and 38 deletions

View file

@ -252,7 +252,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 from Winehq CVS. If you are looking to update something in these files
check Wine current sources first as it may already be fixed. check Wine current sources first as it may already be fixed.
reactos/sdk/lib/3rdparty/strmbase # Synced to WineStaging-1.9.11 reactos/sdk/lib/3rdparty/strmbase # Synced to WineStaging-1.9.16
reactos/sdk/lib/rtl/actctx.c # Partly synced with WineStaging-1.7.55 reactos/sdk/lib/rtl/actctx.c # Partly synced with WineStaging-1.7.55
reactos/sdk/lib/rtl/timerqueue.c # Partly synced with WineStaging-1.7.55 reactos/sdk/lib/rtl/timerqueue.c # Partly synced with WineStaging-1.7.55

View file

@ -104,11 +104,11 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType e
IEnumMediaTypesImpl * pEnumMediaTypes = CoTaskMemAlloc(sizeof(IEnumMediaTypesImpl)); IEnumMediaTypesImpl * pEnumMediaTypes = CoTaskMemAlloc(sizeof(IEnumMediaTypesImpl));
AM_MEDIA_TYPE amt; AM_MEDIA_TYPE amt;
*ppEnum = NULL;
if (!pEnumMediaTypes) if (!pEnumMediaTypes)
{
*ppEnum = NULL;
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
}
pEnumMediaTypes->IEnumMediaTypes_iface.lpVtbl = &IEnumMediaTypesImpl_Vtbl; pEnumMediaTypes->IEnumMediaTypes_iface.lpVtbl = &IEnumMediaTypesImpl_Vtbl;
pEnumMediaTypes->refCount = 1; pEnumMediaTypes->refCount = 1;
pEnumMediaTypes->uIndex = 0; pEnumMediaTypes->uIndex = 0;
@ -122,14 +122,13 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType e
pEnumMediaTypes->enumMediaDetails.cMediaTypes = i; pEnumMediaTypes->enumMediaDetails.cMediaTypes = i;
pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * 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++) for (i = 0; i < pEnumMediaTypes->enumMediaDetails.cMediaTypes; i++)
{ {
enumFunc(basePin,i,&amt); enumFunc(basePin,i,&amt);
if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &amt))) if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &amt)))
{ {
while (i--) IEnumMediaTypes_Release(&pEnumMediaTypes->IEnumMediaTypes_iface);
FreeMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i]);
CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
} }

View file

@ -25,9 +25,14 @@
#include "strmbase_private.h" #include "strmbase_private.h"
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv) { #define XTIME_FMT "%u.%03u"
#define XTIME(u) (int)(u/10000000), (int)((u / 10000)%1000)
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv)
{
QualityControlImpl *This; QualityControlImpl *This;
*ppv = HeapAlloc(GetProcessHeap(),0,sizeof(QualityControlImpl)); TRACE("%p, %p, %p\n", input, self, ppv);
*ppv = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(QualityControlImpl));
if (!*ppv) if (!*ppv)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
This = *ppv; This = *ppv;
@ -35,6 +40,8 @@ HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControl
This->self = self; This->self = self;
This->tonotify = NULL; This->tonotify = NULL;
This->clock = NULL; This->clock = NULL;
This->current_rstart = This->current_rstop = -1;
TRACE("-> %p\n", This);
return S_OK; return S_OK;
} }
@ -43,26 +50,41 @@ void QualityControlImpl_Destroy(QualityControlImpl *This)
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
} }
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv) { static inline QualityControlImpl *impl_from_IQualityControl(IQualityControl *iface)
QualityControlImpl *This = (QualityControlImpl*)iface; {
return CONTAINING_RECORD(iface, QualityControlImpl, IQualityControl_iface);
}
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv)
{
QualityControlImpl *This = impl_from_IQualityControl(iface);
return IBaseFilter_QueryInterface(This->self, riid, ppv); return IBaseFilter_QueryInterface(This->self, riid, ppv);
} }
ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface) { ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface)
QualityControlImpl *This = (QualityControlImpl*)iface; {
QualityControlImpl *This = impl_from_IQualityControl(iface);
return IBaseFilter_AddRef(This->self); return IBaseFilter_AddRef(This->self);
} }
ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface) { ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface)
QualityControlImpl *This = (QualityControlImpl*)iface; {
QualityControlImpl *This = impl_from_IQualityControl(iface);
return IBaseFilter_Release(This->self); return IBaseFilter_Release(This->self);
} }
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) { HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm)
{
QualityControlImpl *This = impl_from_IQualityControl(iface);
HRESULT hr = S_FALSE; HRESULT hr = S_FALSE;
QualityControlImpl *This = (QualityControlImpl*)iface;
TRACE("%p %p { 0x%x %u " XTIME_FMT " " XTIME_FMT " }\n",
This, sender, qm.Type, qm.Proportion,
XTIME(qm.Late), XTIME(qm.TimeStamp));
if (This->tonotify) if (This->tonotify)
return IQualityControl_Notify(This->tonotify, This->self, qm); return IQualityControl_Notify(This->tonotify, This->self, qm);
if (This->input) { if (This->input) {
IPin *to = NULL; IPin *to = NULL;
IPin_ConnectedTo(This->input, &to); IPin_ConnectedTo(This->input, &to);
@ -76,11 +98,14 @@ HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *se
IPin_Release(to); IPin_Release(to);
} }
} }
return hr; return hr;
} }
HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify) { HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify)
QualityControlImpl *This = (QualityControlImpl*)iface; {
QualityControlImpl *This = impl_from_IQualityControl(iface);
TRACE("%p %p\n", This, tonotify);
This->tonotify = tonotify; This->tonotify = tonotify;
return S_OK; return S_OK;
} }
@ -97,7 +122,9 @@ HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityContro
#define UPDATE_RUNNING_AVG_P(avg,val) DO_RUNNING_AVG(avg,val,16) #define UPDATE_RUNNING_AVG_P(avg,val) DO_RUNNING_AVG(avg,val,16)
#define UPDATE_RUNNING_AVG_N(avg,val) DO_RUNNING_AVG(avg,val,4) #define UPDATE_RUNNING_AVG_N(avg,val) DO_RUNNING_AVG(avg,val,4)
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart) { void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart)
{
TRACE("%p " XTIME_FMT "\n", This, XTIME(tStart));
This->avg_render = This->last_in_time = This->last_left = This->avg_duration = This->avg_pt = -1; This->avg_render = This->last_in_time = This->last_left = This->avg_duration = This->avg_pt = -1;
This->clockstart = tStart; This->clockstart = tStart;
This->avg_rate = -1.0; This->avg_rate = -1.0;
@ -107,7 +134,9 @@ void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart)
} }
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock) { void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock)
{
TRACE("%p %p\n", This, clock);
This->clock = clock; This->clock = clock;
} }
@ -116,6 +145,9 @@ static BOOL QualityControlRender_IsLate(QualityControlImpl *This, REFERENCE_TIME
{ {
REFERENCE_TIME max_lateness = 200000; REFERENCE_TIME max_lateness = 200000;
TRACE("%p " XTIME_FMT " " XTIME_FMT " " XTIME_FMT "\n",
This, XTIME(jitter), XTIME(start), XTIME(stop));
/* we can add a valid stop time */ /* we can add a valid stop time */
if (stop >= start) if (stop >= start)
max_lateness += stop; max_lateness += stop;
@ -137,8 +169,12 @@ static BOOL QualityControlRender_IsLate(QualityControlImpl *This, REFERENCE_TIME
return FALSE; return FALSE;
} }
HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev) { HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev)
{
REFERENCE_TIME start = -1, stop = -1, jitter = 0; REFERENCE_TIME start = -1, stop = -1, jitter = 0;
TRACE("%p %p %p\n", This, sample, ev);
This->current_rstart = This->current_rstop = -1; This->current_rstart = This->current_rstop = -1;
This->current_jitter = 0; This->current_jitter = 0;
if (!This->clock || FAILED(IMediaSample_GetTime(sample, &start, &stop))) if (!This->clock || FAILED(IMediaSample_GetTime(sample, &start, &stop)))
@ -178,6 +214,8 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv)
REFERENCE_TIME start, stop, jitter, pt, entered, left, duration; REFERENCE_TIME start, stop, jitter, pt, entered, left, duration;
double rate; double rate;
TRACE("%p\n", priv);
if (!priv->clock || priv->current_rstart < 0) if (!priv->clock || priv->current_rstart < 0)
return; return;
@ -217,14 +255,12 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv)
pt = priv->avg_pt; pt = priv->avg_pt;
} }
#define XTIME(u) (int)(u/10000000), (int)((u / 10000)%1000) TRACE("start: " XTIME_FMT ", entered " XTIME_FMT ", left " XTIME_FMT ", pt: " XTIME_FMT ", "
TRACE("start: %u.%03u, entered %u.%03u, left %u.%03u, pt: %u.%03u, " "duration " XTIME_FMT ", jitter " XTIME_FMT "\n", XTIME(start), XTIME(entered),
"duration %u.%03u, jitter %u.%03u\n", XTIME(start), XTIME(entered),
XTIME(left), XTIME(pt), XTIME(duration), XTIME(jitter)); XTIME(left), XTIME(pt), XTIME(duration), XTIME(jitter));
TRACE("avg_duration: %u.%03u, avg_pt: %u.%03u, avg_rate: %g\n", TRACE("avg_duration: " XTIME_FMT ", avg_pt: " XTIME_FMT ", avg_rate: %g\n",
XTIME(priv->avg_duration), XTIME(priv->avg_pt), priv->avg_rate); XTIME(priv->avg_duration), XTIME(priv->avg_pt), priv->avg_rate);
#undef XTIME
/* collect running averages. for first observations, we copy the /* collect running averages. for first observations, we copy the
* values */ * values */
@ -277,7 +313,7 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv)
q.Late = priv->current_jitter; q.Late = priv->current_jitter;
q.TimeStamp = priv->current_rstart; q.TimeStamp = priv->current_rstart;
TRACE("Late: %i from %i, rate: %g\n", (int)(q.Late/10000), (int)(q.TimeStamp/10000), 1./priv->avg_rate); TRACE("Late: %i from %i, rate: %g\n", (int)(q.Late/10000), (int)(q.TimeStamp/10000), 1./priv->avg_rate);
hr = IQualityControl_Notify((IQualityControl *)priv, priv->self, q); hr = IQualityControl_Notify(&priv->IQualityControl_iface, priv->self, q);
priv->qos_handled = hr == S_OK; priv->qos_handled = hr == S_OK;
} }
@ -286,15 +322,25 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv)
} }
void QualityControlRender_BeginRender(QualityControlImpl *This) { void QualityControlRender_BeginRender(QualityControlImpl *This)
{
TRACE("%p\n", This);
This->start = -1; This->start = -1;
if (!This->clock) if (!This->clock)
return; return;
IReferenceClock_GetTime(This->clock, &This->start); IReferenceClock_GetTime(This->clock, &This->start);
TRACE("at: " XTIME_FMT "\n", XTIME(This->start));
} }
void QualityControlRender_EndRender(QualityControlImpl *This) { void QualityControlRender_EndRender(QualityControlImpl *This)
{
REFERENCE_TIME elapsed; REFERENCE_TIME elapsed;
TRACE("%p\n", This);
if (!This->clock || This->start < 0 || FAILED(IReferenceClock_GetTime(This->clock, &This->stop))) if (!This->clock || This->start < 0 || FAILED(IReferenceClock_GetTime(This->clock, &This->stop)))
return; return;

View file

@ -358,10 +358,8 @@ HRESULT WINAPI BaseControlVideoImpl_SetSourcePosition(IBasicVideo *iface, LONG L
BaseControlVideo *This = impl_from_IBasicVideo(iface); BaseControlVideo *This = impl_from_IBasicVideo(iface);
TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height); TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
SourceRect.left = Left;
SourceRect.top = Top; SetRect(&SourceRect, Left, Top, Left + Width, Top + Height);
SourceRect.right = Left + Width;
SourceRect.bottom = Top + Height;
This->pFuncsTable->pfnSetSourceRect(This, &SourceRect); This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
return S_OK; return S_OK;
@ -398,10 +396,7 @@ HRESULT WINAPI BaseControlVideoImpl_SetDestinationPosition(IBasicVideo *iface, L
TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height); TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
DestRect.left = Left; SetRect(&DestRect, Left, Top, Left + Width, Top + Height);
DestRect.top = Top;
DestRect.right = Left + Width;
DestRect.bottom = Top + Height;
This->pFuncsTable->pfnSetTargetRect(This, &DestRect); This->pFuncsTable->pfnSetTargetRect(This, &DestRect);
return S_OK; return S_OK;