strmbase: Remove QualityControlImpl from the general strmbase.h.
Quality Control things are not part of the standard strmbase library set.
This commit is contained in:
parent
896be1355b
commit
56477075c2
|
@ -407,7 +407,7 @@ static HRESULT WINAPI DSoundRender_DoRenderSample(BaseRenderer *iface, IMediaSam
|
||||||
q.Proportion = 1.;
|
q.Proportion = 1.;
|
||||||
q.Late = jitter;
|
q.Late = jitter;
|
||||||
q.TimeStamp = tStart;
|
q.TimeStamp = tStart;
|
||||||
IQualityControl_Notify((IQualityControl *)&This->renderer.qcimpl, (IBaseFilter*)This, q);
|
IQualityControl_Notify((IQualityControl *)This->renderer.qcimpl, (IBaseFilter*)This, q);
|
||||||
}
|
}
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "dshow.h"
|
#include "dshow.h"
|
||||||
#include "wine/strmbase.h"
|
#include "wine/strmbase.h"
|
||||||
|
#include "strmbase_private.h"
|
||||||
|
|
||||||
#include "uuids.h"
|
#include "uuids.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
@ -35,11 +36,22 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(strmbase_qc);
|
WINE_DEFAULT_DEBUG_CHANNEL(strmbase_qc);
|
||||||
|
|
||||||
void QualityControlImpl_init(QualityControlImpl *This, IPin *input, IBaseFilter *self) {
|
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv) {
|
||||||
|
QualityControlImpl *This;
|
||||||
|
*ppv = HeapAlloc(GetProcessHeap(),0,sizeof(QualityControlImpl));
|
||||||
|
if (!ppv)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
This = *ppv;
|
||||||
This->input = input;
|
This->input = input;
|
||||||
This->self = self;
|
This->self = self;
|
||||||
This->tonotify = NULL;
|
This->tonotify = NULL;
|
||||||
This->clock = NULL;
|
This->clock = NULL;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT QualityControlImpl_Destroy(QualityControlImpl *This)
|
||||||
|
{
|
||||||
|
return HeapFree(GetProcessHeap(),0,This);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv) {
|
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv) {
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "wine/strmbase.h"
|
#include "wine/strmbase.h"
|
||||||
#include "uuids.h"
|
#include "uuids.h"
|
||||||
#include "vfwmsgs.h"
|
#include "vfwmsgs.h"
|
||||||
|
#include "strmbase_private.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
|
WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
|
||||||
|
|
||||||
|
@ -267,8 +268,8 @@ HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtb
|
||||||
This->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
This->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
This->pMediaSample = NULL;
|
This->pMediaSample = NULL;
|
||||||
|
|
||||||
QualityControlImpl_init(&This->qcimpl, &This->pInputPin->pin.IPin_iface, &This->filter.IBaseFilter_iface);
|
QualityControlImpl_Create(&This->pInputPin->pin.IPin_iface, &This->filter.IBaseFilter_iface, &This->qcimpl);
|
||||||
This->qcimpl.lpVtbl = &Renderer_QualityControl_Vtbl;
|
This->qcimpl->IQualityControl_iface.lpVtbl = &Renderer_QualityControl_Vtbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
|
@ -282,7 +283,7 @@ HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter* iface, REFIID riid,
|
||||||
return IUnknown_QueryInterface(This->pPosition, riid, ppv);
|
return IUnknown_QueryInterface(This->pPosition, riid, ppv);
|
||||||
else if (IsEqualIID(riid, &IID_IQualityControl))
|
else if (IsEqualIID(riid, &IID_IQualityControl))
|
||||||
{
|
{
|
||||||
*ppv = &This->qcimpl.lpVtbl;
|
*ppv = &This->qcimpl->IQualityControl_iface;
|
||||||
IUnknown_AddRef((IUnknown *)(*ppv));
|
IUnknown_AddRef((IUnknown *)(*ppv));
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -317,6 +318,7 @@ ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface)
|
||||||
CloseHandle(This->evComplete);
|
CloseHandle(This->evComplete);
|
||||||
CloseHandle(This->ThreadSignal);
|
CloseHandle(This->ThreadSignal);
|
||||||
CloseHandle(This->RenderEvent);
|
CloseHandle(This->RenderEvent);
|
||||||
|
QualityControlImpl_Destroy(This->qcimpl);
|
||||||
}
|
}
|
||||||
return refCount;
|
return refCount;
|
||||||
}
|
}
|
||||||
|
@ -383,7 +385,7 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
|
||||||
if (This->pFuncsTable->pfnOnWaitStart)
|
if (This->pFuncsTable->pfnOnWaitStart)
|
||||||
This->pFuncsTable->pfnOnWaitStart(This);
|
This->pFuncsTable->pfnOnWaitStart(This);
|
||||||
|
|
||||||
hr = QualityControlRender_WaitFor(&This->qcimpl, pSample, This->RenderEvent);
|
hr = QualityControlRender_WaitFor(This->qcimpl, pSample, This->RenderEvent);
|
||||||
|
|
||||||
if (This->pFuncsTable->pfnOnWaitEnd)
|
if (This->pFuncsTable->pfnOnWaitEnd)
|
||||||
This->pFuncsTable->pfnOnWaitEnd(This);
|
This->pFuncsTable->pfnOnWaitEnd(This);
|
||||||
|
@ -398,12 +400,12 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
QualityControlRender_BeginRender(&This->qcimpl);
|
QualityControlRender_BeginRender(This->qcimpl);
|
||||||
hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
|
hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
|
||||||
QualityControlRender_EndRender(&This->qcimpl);
|
QualityControlRender_EndRender(This->qcimpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
QualityControlRender_DoQOS(&This->qcimpl);
|
QualityControlRender_DoQOS(This->qcimpl);
|
||||||
|
|
||||||
BaseRendererImpl_ClearPendingSample(This);
|
BaseRendererImpl_ClearPendingSample(This);
|
||||||
LeaveCriticalSection(&This->csRenderLock);
|
LeaveCriticalSection(&This->csRenderLock);
|
||||||
|
@ -482,7 +484,7 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
|
||||||
}
|
}
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
QualityControlRender_Start(&This->qcimpl, This->filter.rtStreamStart);
|
QualityControlRender_Start(This->qcimpl, This->filter.rtStreamStart);
|
||||||
if (This->pFuncsTable->pfnOnStartStreaming)
|
if (This->pFuncsTable->pfnOnStartStreaming)
|
||||||
This->pFuncsTable->pfnOnStartStreaming(This);
|
This->pFuncsTable->pfnOnStartStreaming(This);
|
||||||
if (This->filter.state == State_Stopped)
|
if (This->filter.state == State_Stopped)
|
||||||
|
@ -533,7 +535,7 @@ HRESULT WINAPI BaseRendererImpl_SetSyncSource(IBaseFilter *iface, IReferenceCloc
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
EnterCriticalSection(&This->filter.csFilter);
|
EnterCriticalSection(&This->filter.csFilter);
|
||||||
QualityControlRender_SetClock(&This->qcimpl, clock);
|
QualityControlRender_SetClock(This->qcimpl, clock);
|
||||||
hr = BaseFilterImpl_SetSyncSource(iface, clock);
|
hr = BaseFilterImpl_SetSyncSource(iface, clock);
|
||||||
LeaveCriticalSection(&This->filter.csFilter);
|
LeaveCriticalSection(&This->filter.csFilter);
|
||||||
return hr;
|
return hr;
|
||||||
|
@ -592,7 +594,7 @@ HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer* iface)
|
||||||
HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer* iface)
|
HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer* iface)
|
||||||
{
|
{
|
||||||
TRACE("(%p)\n", iface);
|
TRACE("(%p)\n", iface);
|
||||||
QualityControlRender_Start(&iface->qcimpl, iface->filter.rtStreamStart);
|
QualityControlRender_Start(iface->qcimpl, iface->filter.rtStreamStart);
|
||||||
RendererPosPassThru_ResetMediaTime(iface->pPosition);
|
RendererPosPassThru_ResetMediaTime(iface->pPosition);
|
||||||
ResetEvent(iface->ThreadSignal);
|
ResetEvent(iface->ThreadSignal);
|
||||||
ResetEvent(iface->RenderEvent);
|
ResetEvent(iface->RenderEvent);
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Header file for private strmbase implementations
|
||||||
|
*
|
||||||
|
* Copyright 2012 Aric Stewart, CodeWeavers
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Quality Control */
|
||||||
|
typedef struct QualityControlImpl {
|
||||||
|
IQualityControl IQualityControl_iface;
|
||||||
|
IPin *input;
|
||||||
|
IBaseFilter *self;
|
||||||
|
IQualityControl *tonotify;
|
||||||
|
|
||||||
|
/* Render stuff */
|
||||||
|
IReferenceClock *clock;
|
||||||
|
REFERENCE_TIME last_in_time, last_left, avg_duration, avg_pt, avg_render, start, stop;
|
||||||
|
REFERENCE_TIME current_jitter, current_rstart, current_rstop, clockstart;
|
||||||
|
double avg_rate;
|
||||||
|
LONG64 rendered, dropped;
|
||||||
|
BOOL qos_handled, is_dropped;
|
||||||
|
} QualityControlImpl;
|
||||||
|
|
||||||
|
HRESULT QualityControlImpl_Create(IPin *input, IBaseFilter *self, QualityControlImpl **ppv);
|
||||||
|
HRESULT QualityControlImpl_Destroy(QualityControlImpl *This);
|
||||||
|
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv);
|
||||||
|
ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface);
|
||||||
|
ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface);
|
||||||
|
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm);
|
||||||
|
HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify);
|
||||||
|
|
||||||
|
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart);
|
||||||
|
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock);
|
||||||
|
HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev);
|
||||||
|
void QualityControlRender_DoQOS(QualityControlImpl *priv);
|
||||||
|
void QualityControlRender_BeginRender(QualityControlImpl *This);
|
||||||
|
void QualityControlRender_EndRender(QualityControlImpl *This);
|
|
@ -35,6 +35,7 @@
|
||||||
#include "wine/unicode.h"
|
#include "wine/unicode.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/strmbase.h"
|
#include "wine/strmbase.h"
|
||||||
|
#include "strmbase_private.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
|
WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
|
||||||
|
|
||||||
|
@ -233,8 +234,7 @@ static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* p
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
ERR("Cannot create output pin (%x)\n", hr);
|
ERR("Cannot create output pin (%x)\n", hr);
|
||||||
else {
|
else {
|
||||||
QualityControlImpl_init(&pTransformFilter->qcimpl, pTransformFilter->ppPins[0], &pTransformFilter->filter.IBaseFilter_iface);
|
QualityControlImpl_Create( pTransformFilter->ppPins[0], &pTransformFilter->filter.IBaseFilter_iface, &pTransformFilter->qcimpl);
|
||||||
pTransformFilter->qcimpl.lpVtbl = &TransformFilter_QualityControl_Vtbl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
|
@ -278,7 +278,7 @@ HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID ri
|
||||||
TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
|
TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
if (IsEqualIID(riid, &IID_IQualityControl)) {
|
if (IsEqualIID(riid, &IID_IQualityControl)) {
|
||||||
*ppv = (IQualityControl*)&This->qcimpl;
|
*ppv = (IQualityControl*)This->qcimpl;
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -322,6 +322,7 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface)
|
||||||
This->csReceive.DebugInfo->Spare[0] = 0;
|
This->csReceive.DebugInfo->Spare[0] = 0;
|
||||||
DeleteCriticalSection(&This->csReceive);
|
DeleteCriticalSection(&This->csReceive);
|
||||||
FreeMediaType(&This->pmt);
|
FreeMediaType(&This->pmt);
|
||||||
|
QualityControlImpl_Destroy(This->qcimpl);
|
||||||
CoTaskMemFree(This);
|
CoTaskMemFree(This);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -401,6 +402,11 @@ HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStar
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI TransformFilterImpl_Notify(TransformFilter *iface, IBaseFilter *sender, Quality qm)
|
||||||
|
{
|
||||||
|
return QualityControlImpl_Notify((IQualityControl*)&iface->qcimpl, sender, qm);
|
||||||
|
}
|
||||||
|
|
||||||
/** IBaseFilter implementation **/
|
/** IBaseFilter implementation **/
|
||||||
|
|
||||||
HRESULT WINAPI TransformFilterImpl_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin)
|
HRESULT WINAPI TransformFilterImpl_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin)
|
||||||
|
@ -602,7 +608,7 @@ static HRESULT WINAPI TransformFilter_QualityControlImpl_Notify(IQualityControl
|
||||||
if (This->pFuncsTable->pfnNotify)
|
if (This->pFuncsTable->pfnNotify)
|
||||||
return This->pFuncsTable->pfnNotify(This, sender, qm);
|
return This->pFuncsTable->pfnNotify(This, sender, qm);
|
||||||
else
|
else
|
||||||
return QualityControlImpl_Notify(iface, sender, qm);
|
return TransformFilterImpl_Notify(This, sender, qm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const IQualityControlVtbl TransformFilter_QualityControl_Vtbl = {
|
static const IQualityControlVtbl TransformFilter_QualityControl_Vtbl = {
|
||||||
|
|
|
@ -73,6 +73,7 @@ typedef struct GSTImpl {
|
||||||
|
|
||||||
struct GSTOutPin {
|
struct GSTOutPin {
|
||||||
BaseOutputPin pin;
|
BaseOutputPin pin;
|
||||||
|
IQualityControl IQualityControl_iface;
|
||||||
|
|
||||||
GstPad *their_src;
|
GstPad *their_src;
|
||||||
GstPad *my_sink;
|
GstPad *my_sink;
|
||||||
|
@ -80,7 +81,6 @@ struct GSTOutPin {
|
||||||
AM_MEDIA_TYPE * pmt;
|
AM_MEDIA_TYPE * pmt;
|
||||||
HANDLE caps_event;
|
HANDLE caps_event;
|
||||||
GstSegment *segment;
|
GstSegment *segment;
|
||||||
QualityControlImpl qcimpl;
|
|
||||||
SourceSeeking seek;
|
SourceSeeking seek;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1395,9 +1395,31 @@ static const IMediaSeekingVtbl GST_Seeking_Vtbl =
|
||||||
SourceSeekingImpl_GetPreroll
|
SourceSeekingImpl_GetPreroll
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline GSTOutPin *impl_from_IQualityControl( IQualityControl *iface )
|
||||||
|
{
|
||||||
|
return (GSTOutPin*)CONTAINING_RECORD(iface, GSTOutPin, IQualityControl_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI GST_QualityControl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv)
|
||||||
|
{
|
||||||
|
GSTOutPin *pin = impl_from_IQualityControl(iface);
|
||||||
|
return IPin_QueryInterface((IPin*)pin, riid, ppv);
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI GST_QualityControl_AddRef(IQualityControl *iface)
|
||||||
|
{
|
||||||
|
GSTOutPin *pin = impl_from_IQualityControl(iface);
|
||||||
|
return IPin_AddRef((IPin*)pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG WINAPI GST_QualityControl_Release(IQualityControl *iface)
|
||||||
|
{
|
||||||
|
GSTOutPin *pin = impl_from_IQualityControl(iface);
|
||||||
|
return IPin_Release((IPin*)pin);
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) {
|
static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) {
|
||||||
QualityControlImpl *This = (QualityControlImpl*)iface;
|
GSTOutPin *pin = impl_from_IQualityControl(iface);
|
||||||
GSTOutPin *pin = (GSTOutPin*)This->self;
|
|
||||||
REFERENCE_TIME late = qm.Late;
|
REFERENCE_TIME late = qm.Late;
|
||||||
if (qm.Late < 0 && -qm.Late > qm.TimeStamp)
|
if (qm.Late < 0 && -qm.Late > qm.TimeStamp)
|
||||||
late = -qm.TimeStamp;
|
late = -qm.TimeStamp;
|
||||||
|
@ -1405,12 +1427,18 @@ static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFil
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI GST_QualityControl_SetSink(IQualityControl *iface, IQualityControl *tonotify)
|
||||||
|
{
|
||||||
|
/* Do nothing */
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl = {
|
static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl = {
|
||||||
QualityControlImpl_QueryInterface,
|
GST_QualityControl_QueryInterface,
|
||||||
QualityControlImpl_AddRef,
|
GST_QualityControl_AddRef,
|
||||||
QualityControlImpl_Release,
|
GST_QualityControl_Release,
|
||||||
GST_QualityControl_Notify,
|
GST_QualityControl_Notify,
|
||||||
QualityControlImpl_SetSink
|
GST_QualityControl_SetSink
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **ppv) {
|
static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **ppv) {
|
||||||
|
@ -1427,7 +1455,7 @@ static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **
|
||||||
else if (IsEqualIID(riid, &IID_IMediaSeeking))
|
else if (IsEqualIID(riid, &IID_IMediaSeeking))
|
||||||
*ppv = &This->seek;
|
*ppv = &This->seek;
|
||||||
else if (IsEqualIID(riid, &IID_IQualityControl))
|
else if (IsEqualIID(riid, &IID_IQualityControl))
|
||||||
*ppv = &This->qcimpl;
|
*ppv = &This->IQualityControl_iface;
|
||||||
|
|
||||||
if (*ppv) {
|
if (*ppv) {
|
||||||
IUnknown_AddRef((IUnknown *)(*ppv));
|
IUnknown_AddRef((IUnknown *)(*ppv));
|
||||||
|
@ -1555,8 +1583,7 @@ static HRESULT GST_AddPin(GSTImpl *This, const PIN_INFO *piOutput, const AM_MEDI
|
||||||
pin->caps_event = CreateEventW(NULL, 0, 0, NULL);
|
pin->caps_event = CreateEventW(NULL, 0, 0, NULL);
|
||||||
pin->segment = gst_segment_new();
|
pin->segment = gst_segment_new();
|
||||||
This->cStreams++;
|
This->cStreams++;
|
||||||
QualityControlImpl_init(&pin->qcimpl, NULL, (IBaseFilter*)pin);
|
pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
|
||||||
pin->qcimpl.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
|
|
||||||
SourceSeeking_Init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop, GST_ChangeCurrent, GST_ChangeRate, &This->filter.csFilter);
|
SourceSeeking_Init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop, GST_ChangeCurrent, GST_ChangeRate, &This->filter.csFilter);
|
||||||
BaseFilterImpl_IncrementPinVersion((BaseFilter*)This);
|
BaseFilterImpl_IncrementPinVersion((BaseFilter*)This);
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -442,7 +442,7 @@ static HRESULT WINAPI Gstreamer_transform_QOS(TransformFilter *iface, IBaseFilte
|
||||||
if (qm.Late < 0 && -qm.Late > qm.TimeStamp)
|
if (qm.Late < 0 && -qm.Late > qm.TimeStamp)
|
||||||
late = -qm.TimeStamp;
|
late = -qm.TimeStamp;
|
||||||
gst_pad_push_event(This->my_sink, gst_event_new_qos(1000. / qm.Proportion, late * 100, qm.TimeStamp * 100));
|
gst_pad_push_event(This->my_sink, gst_event_new_qos(1000. / qm.Proportion, late * 100, qm.TimeStamp * 100));
|
||||||
return QualityControlImpl_Notify((IQualityControl*)&iface->qcimpl, sender, qm);
|
return TransformFilterImpl_Notify(iface, sender, qm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT Gstreamer_transform_create(IUnknown *punkout, const CLSID *clsid, const char *name, const TransformFilterFuncTable *vtbl, void **obj)
|
static HRESULT Gstreamer_transform_create(IUnknown *punkout, const CLSID *clsid, const char *name, const TransformFilterFuncTable *vtbl, void **obj)
|
||||||
|
|
|
@ -194,36 +194,6 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *iface, BasePin_GetMediaType enu
|
||||||
|
|
||||||
HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_pin, BaseFilter_GetPinCount receive_pincount, BaseFilter_GetPinVersion receive_version, IEnumPins ** ppEnum);
|
HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_pin, BaseFilter_GetPinCount receive_pincount, BaseFilter_GetPinVersion receive_version, IEnumPins ** ppEnum);
|
||||||
|
|
||||||
/* Quality Control */
|
|
||||||
typedef struct QualityControlImpl {
|
|
||||||
const IQualityControlVtbl *lpVtbl;
|
|
||||||
IPin *input;
|
|
||||||
IBaseFilter *self;
|
|
||||||
IQualityControl *tonotify;
|
|
||||||
|
|
||||||
/* Render stuff */
|
|
||||||
IReferenceClock *clock;
|
|
||||||
REFERENCE_TIME last_in_time, last_left, avg_duration, avg_pt, avg_render, start, stop;
|
|
||||||
REFERENCE_TIME current_jitter, current_rstart, current_rstop, clockstart;
|
|
||||||
double avg_rate;
|
|
||||||
LONG64 rendered, dropped;
|
|
||||||
BOOL qos_handled, is_dropped;
|
|
||||||
} QualityControlImpl;
|
|
||||||
|
|
||||||
void QualityControlImpl_init(QualityControlImpl *This, IPin *input, IBaseFilter *self);
|
|
||||||
HRESULT WINAPI QualityControlImpl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv);
|
|
||||||
ULONG WINAPI QualityControlImpl_AddRef(IQualityControl *iface);
|
|
||||||
ULONG WINAPI QualityControlImpl_Release(IQualityControl *iface);
|
|
||||||
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm);
|
|
||||||
HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityControl *tonotify);
|
|
||||||
|
|
||||||
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart);
|
|
||||||
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock);
|
|
||||||
HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev);
|
|
||||||
void QualityControlRender_DoQOS(QualityControlImpl *priv);
|
|
||||||
void QualityControlRender_BeginRender(QualityControlImpl *This);
|
|
||||||
void QualityControlRender_EndRender(QualityControlImpl *This);
|
|
||||||
|
|
||||||
/* Transform Filter */
|
/* Transform Filter */
|
||||||
typedef struct TransformFilter
|
typedef struct TransformFilter
|
||||||
{
|
{
|
||||||
|
@ -235,7 +205,7 @@ typedef struct TransformFilter
|
||||||
CRITICAL_SECTION csReceive;
|
CRITICAL_SECTION csReceive;
|
||||||
|
|
||||||
const struct TransformFilterFuncTable * pFuncsTable;
|
const struct TransformFilterFuncTable * pFuncsTable;
|
||||||
QualityControlImpl qcimpl;
|
struct QualityControlImpl *qcimpl;
|
||||||
} TransformFilter;
|
} TransformFilter;
|
||||||
|
|
||||||
typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
|
typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
|
||||||
|
@ -277,6 +247,7 @@ HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter * iface);
|
||||||
HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter * iface);
|
HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter * iface);
|
||||||
HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart);
|
HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart);
|
||||||
HRESULT WINAPI TransformFilterImpl_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin);
|
HRESULT WINAPI TransformFilterImpl_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin);
|
||||||
|
HRESULT WINAPI TransformFilterImpl_Notify(TransformFilter *iface, IBaseFilter *sender, Quality qm);
|
||||||
|
|
||||||
HRESULT TransformFilter_Construct( const IBaseFilterVtbl *filterVtbl, LONG filter_size, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, IBaseFilter ** ppTransformFilter);
|
HRESULT TransformFilter_Construct( const IBaseFilterVtbl *filterVtbl, LONG filter_size, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, IBaseFilter ** ppTransformFilter);
|
||||||
|
|
||||||
|
@ -588,7 +559,7 @@ typedef struct BaseRendererTag
|
||||||
IMediaSample *pMediaSample;
|
IMediaSample *pMediaSample;
|
||||||
|
|
||||||
IQualityControl *pQSink;
|
IQualityControl *pQSink;
|
||||||
QualityControlImpl qcimpl;
|
struct QualityControlImpl *qcimpl;
|
||||||
|
|
||||||
const struct BaseRendererFuncTable * pFuncsTable;
|
const struct BaseRendererFuncTable * pFuncsTable;
|
||||||
} BaseRenderer;
|
} BaseRenderer;
|
||||||
|
|
Loading…
Reference in New Issue