49#define DO_RUNNING_AVG(avg,val,size) (((val) + ((size)-1) * (avg)) / (size))
52#define UPDATE_RUNNING_AVG(avg,val) DO_RUNNING_AVG(avg,val,8)
57#define UPDATE_RUNNING_AVG_P(avg,val) DO_RUNNING_AVG(avg,val,16)
58#define UPDATE_RUNNING_AVG_N(avg,val) DO_RUNNING_AVG(avg,val,4)
78 entered =
start + jitter;
84 entered =
start + jitter;
91 duration = stop -
start;
97 if (
filter->last_left >= 0)
99 if (entered >
filter->last_left)
109 TRACE(
"start %s, entered %s, left %s, pt %s, duration %s, jitter %s.\n",
113 TRACE(
"average duration %s, average pt %s, average rate %.16e.\n",
117 if (
filter->avg_duration < 0)
118 filter->avg_duration = duration;
127 if (
filter->avg_duration != 0)
132 if (
filter->last_left >= 0)
134 if (
filter->avg_rate < 0.0)
147 if (
filter->avg_rate >= 0.0)
161 jitter += stop -
start;
164 q.Type = (jitter > 0 ? Famine : Flood);
165 q.Proportion = 1000.0 /
filter->avg_rate;
166 if (
q.Proportion < 200)
168 else if (
q.Proportion > 5000)
172 IQualityControl_Notify(&
filter->IQualityControl_iface, &
filter->
filter.IBaseFilter_iface,
q);
209 if (
filter->ops->renderer_query_interface
216 *
out = &
filter->passthrough.IMediaPosition_iface;
232 if (
filter->sink.pin.peer)
236 if (
filter->ops->renderer_init_stream)
252 if (
filter->sink.pin.peer &&
filter->ops->renderer_start_stream)
257 &IID_IMediaEventSink, (
void **)&event_sink)))
261 IMediaEventSink_Release(event_sink);
273 if (
filter->sink.pin.peer &&
filter->ops->renderer_stop_stream)
322 if (
filter->ops->renderer_pin_query_interface
348 if (
state == State_Stopped)
351 if (IMediaSample_GetMediaType(
sample, &mt) ==
S_OK)
353 TRACE(
"Format change.\n");
367 if (
state == State_Paused)
394 if (jitter <= -10000)
407 TRACE(
"Flush signaled; discarding current sample.\n");
412 if (
state == State_Running)
419 if (
state == State_Running)
430 if (
filter->ops->renderer_connect)
439 if (
filter->ops->renderer_disconnect)
453 &IID_IMediaEventSink, (
void **)&event_sink)))
457 IMediaEventSink_Release(event_sink);
529 TRACE(
"filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s.\n",
535 if (
filter->sink.pin.peer)
538 IPin_QueryInterface(
filter->sink.pin.peer, &IID_IQualityControl, (
void **)&peer_qc);
541 hr = IQualityControl_Notify(peer_qc, &
filter->
filter.IBaseFilter_iface,
q);
542 IQualityControl_Release(peer_qc);
570 if (
filter->sink.pin.peer)
571 IPin_Disconnect(
filter->sink.pin.peer);
572 IPin_Disconnect(&
filter->sink.pin.IPin_iface);
590 ISeekingPassThru_Init(&
filter->passthrough.ISeekingPassThru_iface,
TRUE, &
filter->sink.pin.IPin_iface);
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
GLdouble GLdouble GLdouble GLdouble q
GLsizei GLenum GLboolean sink
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
#define IsEqualGUID(rguid1, rguid2)
static HRESULT renderer_start_stream(struct strmbase_filter *iface, REFERENCE_TIME start)
static struct strmbase_renderer * impl_from_IQualityControl(IQualityControl *iface)
static HRESULT sink_end_flush(struct strmbase_sink *iface)
static HRESULT WINAPI quality_control_QueryInterface(IQualityControl *iface, REFIID iid, void **out)
static HRESULT renderer_wait_state(struct strmbase_filter *iface, DWORD timeout)
static const IQualityControlVtbl quality_control_vtbl
void strmbase_renderer_init(struct strmbase_renderer *filter, IUnknown *outer, const CLSID *clsid, const WCHAR *sink_name, const struct strmbase_renderer_ops *ops)
static void reset_qos(struct strmbase_renderer *filter)
static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
static void sink_disconnect(struct strmbase_sink *iface)
static HRESULT sink_query_accept(struct strmbase_pin *pin, const AM_MEDIA_TYPE *mt)
static HRESULT renderer_stop_stream(struct strmbase_filter *iface)
static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSample *sample)
#define UPDATE_RUNNING_AVG_N(avg, val)
static HRESULT renderer_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
static const struct strmbase_sink_ops sink_ops
static HRESULT WINAPI quality_control_Notify(IQualityControl *iface, IBaseFilter *sender, Quality q)
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
static HRESULT renderer_init_stream(struct strmbase_filter *iface)
static const struct strmbase_filter_ops filter_ops
#define UPDATE_RUNNING_AVG(avg, val)
static HRESULT WINAPI quality_control_SetSink(IQualityControl *iface, IQualityControl *sink)
static struct strmbase_renderer * impl_from_IPin(IPin *iface)
static ULONG WINAPI quality_control_AddRef(IQualityControl *iface)
static HRESULT renderer_cleanup_stream(struct strmbase_filter *iface)
static struct strmbase_renderer * impl_from_strmbase_filter(struct strmbase_filter *iface)
static struct strmbase_pin * renderer_get_pin(struct strmbase_filter *iface, unsigned int index)
static void renderer_destroy(struct strmbase_filter *iface)
static HRESULT sink_begin_flush(struct strmbase_sink *iface)
static HRESULT sink_eos(struct strmbase_sink *iface)
static ULONG WINAPI quality_control_Release(IQualityControl *iface)
static void perform_qos(struct strmbase_renderer *filter, const REFERENCE_TIME start, const REFERENCE_TIME stop, REFERENCE_TIME jitter)
static HRESULT sink_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
#define UPDATE_RUNNING_AVG_P(avg, val)
static const char * debugstr_time(REFERENCE_TIME time)
void strmbase_passthrough_update_time(struct strmbase_passthrough *passthrough, REFERENCE_TIME time)
void strmbase_passthrough_cleanup(struct strmbase_passthrough *passthrough)
void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt)
void strmbase_sink_cleanup(struct strmbase_sink *pin)
void strmbase_sink_init(struct strmbase_sink *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_sink_ops *ops, IMemAllocator *allocator)
void strmbase_filter_cleanup(struct strmbase_filter *filter)
void strmbase_passthrough_init(struct strmbase_passthrough *passthrough, IUnknown *outer)
void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, const CLSID *clsid, const struct strmbase_filter_ops *func_table)
void strmbase_passthrough_invalidate_time(struct strmbase_passthrough *passthrough)
void WINAPI DeleteMediaType(AM_MEDIA_TYPE *pMediaType)
void strmbase_passthrough_eos(struct strmbase_passthrough *passthrough)
IMediaSeeking IMediaSeeking_iface
IQualityControl IQualityControl_iface
const struct strmbase_renderer_ops * ops
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
#define CONTAINING_RECORD(address, type, field)
static EFI_HANDLE * handles
#define VFW_E_TYPE_NOT_ACCEPTED
#define VFW_E_WRONG_STATE
#define VFW_S_STATE_INTERMEDIATE
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)