4 * Copyright 2013 Damjan Jovanovic
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/strmbase.h"
32 #include "wine/test.h"
34 #define DEFINE_EXPECT(func) \
35 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
37 #define SET_EXPECT(func) \
38 expect_ ## func = TRUE
40 #define CHECK_EXPECT2(func) \
42 ok(expect_ ##func, "unexpected call " #func "\n"); \
43 called_ ## func = TRUE; \
46 #define CHECK_EXPECT(func) \
48 CHECK_EXPECT2(func); \
49 expect_ ## func = FALSE; \
52 #define CHECK_CALLED(func) \
54 ok(called_ ## func, "expected " #func "\n"); \
55 expect_ ## func = called_ ## func = FALSE; \
58 DEFINE_EXPECT(ReceiveConnection
);
59 DEFINE_EXPECT(GetAllocatorRequirements
);
60 DEFINE_EXPECT(NotifyAllocator
);
61 DEFINE_EXPECT(Reconnect
);
62 DEFINE_EXPECT(MediaSeeking_GetPositions
);
63 DEFINE_EXPECT(MemAllocator_GetProperties
);
64 DEFINE_EXPECT(MemInputPin_QueryInterface_IStream
);
65 DEFINE_EXPECT(MediaSample_QueryInterface_MediaSample2
);
66 DEFINE_EXPECT(MediaSample_IsDiscontinuity
);
67 DEFINE_EXPECT(MediaSample_IsPreroll
);
68 DEFINE_EXPECT(MediaSample_IsSyncPoint
);
69 DEFINE_EXPECT(MediaSample_GetTime
);
70 DEFINE_EXPECT(MediaSample_GetMediaType
);
71 DEFINE_EXPECT(MediaSample_GetPointer
);
72 DEFINE_EXPECT(MediaSample_GetActualDataLength
);
73 DEFINE_EXPECT(MediaSample_GetSize
);
74 DEFINE_EXPECT(MediaSample_GetMediaTime
);
83 static const char* debugstr_filter_type(filter_type type
)
87 return "SOURCE_FILTER";
90 case INTERMEDIATE_FILTER
:
91 return "INTERMEDIATE_FILTER";
105 ENUMMEDIATYPES_RESET
,
107 GRAPHBUILDER_CONNECT
,
109 BASEFILTER_QUERYINTERFACE
,
113 static const struct {
115 filter_type filter_type
;
118 BOOL optional
; /* fails on wine if missing */
120 } *current_calls_list
;
123 static void check_calls_list(const char *func
, call_id id
, filter_type type
)
125 if(!current_calls_list
)
128 while(current_calls_list
[call_no
].wine_missing
|| current_calls_list
[call_no
].wine_extra
||
129 current_calls_list
[call_no
].optional
|| current_calls_list
[call_no
].broken
) {
130 if(current_calls_list
[call_no
].wine_missing
) {
131 todo_wine
ok((current_calls_list
[call_no
].call_id
== id
&& current_calls_list
[call_no
].filter_type
== type
) ||
132 broken(current_calls_list
[call_no
].optional
&& (current_calls_list
[call_no
].call_id
!= id
||
133 current_calls_list
[call_no
].filter_type
!= type
)),
134 "missing call, got %s(%d), expected %d (%d)\n", func
, id
, current_calls_list
[call_no
].call_id
, call_no
);
136 if(current_calls_list
[call_no
].call_id
!= id
|| current_calls_list
[call_no
].filter_type
!= type
)
140 }else if(current_calls_list
[call_no
].wine_extra
) {
141 todo_wine
ok(current_calls_list
[call_no
].call_id
!= id
|| current_calls_list
[call_no
].filter_type
!= type
,
142 "extra call, got %s(%d) (%d)\n", func
, id
, call_no
);
144 if(current_calls_list
[call_no
].call_id
== id
&& current_calls_list
[call_no
].filter_type
== type
) {
149 }else if(current_calls_list
[call_no
].optional
) {
150 ok((current_calls_list
[call_no
].call_id
== id
&& current_calls_list
[call_no
].filter_type
== type
) ||
151 broken(current_calls_list
[call_no
].call_id
!= id
|| current_calls_list
[call_no
].filter_type
!= type
),
152 "unexpected call: %s on %s (%d)\n", func
, debugstr_filter_type(type
), call_no
);
154 if(current_calls_list
[call_no
].call_id
!= id
|| current_calls_list
[call_no
].filter_type
!= type
)
158 }else if(current_calls_list
[call_no
].broken
) {
159 ok(broken(current_calls_list
[call_no
].call_id
== id
&& current_calls_list
[call_no
].filter_type
== type
) ||
160 (current_calls_list
[call_no
].call_id
!= id
|| current_calls_list
[call_no
].filter_type
!= type
),
161 "unexpected call: %s on %s (%d)\n", func
, debugstr_filter_type(type
), call_no
);
163 if(current_calls_list
[call_no
].call_id
== id
&& current_calls_list
[call_no
].filter_type
== type
)
169 ok(current_calls_list
[call_no
].call_id
== id
, "unexpected call: %s on %s (%d)\n",
170 func
, debugstr_filter_type(type
), call_no
);
171 if(current_calls_list
[call_no
].call_id
!= id
)
174 ok(current_calls_list
[call_no
].filter_type
== type
, "unexpected call: %s on %s (%d)\n",
175 func
, debugstr_filter_type(type
), call_no
);
176 if(current_calls_list
[call_no
].filter_type
!= type
)
182 static HRESULT WINAPI
GraphBuilder_QueryInterface(
183 IGraphBuilder
*iface
, REFIID riid
, void **ppv
)
185 if(IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_IFilterGraph
)
186 || IsEqualIID(riid
, &IID_IGraphBuilder
))
192 ok(IsEqualIID(riid
, &IID_IMediaEvent
) || IsEqualIID(riid
, &IID_IMediaEventSink
),
193 "QueryInterface(%s)\n", wine_dbgstr_guid(riid
));
195 return E_NOINTERFACE
;
198 static ULONG WINAPI
GraphBuilder_AddRef(IGraphBuilder
*iface
)
203 static ULONG WINAPI
GraphBuilder_Release(IGraphBuilder
*iface
)
208 static HRESULT WINAPI
GraphBuilder_AddFilter(IGraphBuilder
*iface
,
209 IBaseFilter
*pFilter
, LPCWSTR pName
)
211 ok(0, "unexpected call\n");
215 static HRESULT WINAPI
GraphBuilder_RemoveFilter(
216 IGraphBuilder
*iface
, IBaseFilter
*pFilter
)
218 ok(0, "unexpected call\n");
222 static HRESULT WINAPI
GraphBuilder_EnumFilters(
223 IGraphBuilder
*iface
, IEnumFilters
**ppEnum
)
225 ok(0, "unexpected call\n");
229 static HRESULT WINAPI
GraphBuilder_FindFilterByName(IGraphBuilder
*iface
,
230 LPCWSTR pName
, IBaseFilter
**ppFilter
)
232 ok(0, "unexpected call\n");
236 static HRESULT WINAPI
GraphBuilder_ConnectDirect(IGraphBuilder
*iface
,
237 IPin
*ppinOut
, IPin
*ppinIn
, const AM_MEDIA_TYPE
*pmt
)
239 ok(0, "unexpected call\n");
243 static HRESULT WINAPI
GraphBuilder_Reconnect(IGraphBuilder
*iface
, IPin
*ppin
)
245 CHECK_EXPECT(Reconnect
);
249 static HRESULT WINAPI
GraphBuilder_Disconnect(IGraphBuilder
*iface
, IPin
*ppin
)
251 ok(0, "unexpected call\n");
255 static HRESULT WINAPI
GraphBuilder_SetDefaultSyncSource(IGraphBuilder
*iface
)
257 ok(0, "unexpected call\n");
261 static HRESULT WINAPI
GraphBuilder_Connect(IGraphBuilder
*iface
, IPin
*ppinOut
, IPin
*ppinIn
)
263 check_calls_list("GraphBuilder_Connect", GRAPHBUILDER_CONNECT
, NOT_FILTER
);
267 static HRESULT WINAPI
GraphBuilder_Render(IGraphBuilder
*iface
, IPin
*ppinOut
)
269 ok(0, "unexpected call\n");
273 static HRESULT WINAPI
GraphBuilder_RenderFile(IGraphBuilder
*iface
,
274 LPCWSTR lpcwstrFile
, LPCWSTR lpcwstrPlayList
)
276 ok(0, "unexpected call\n");
280 static HRESULT WINAPI
GraphBuilder_AddSourceFilter(IGraphBuilder
*iface
, LPCWSTR lpcwstrFileName
,
281 LPCWSTR lpcwstrFilterName
, IBaseFilter
**ppFilter
)
283 ok(0, "unexpected call\n");
287 static HRESULT WINAPI
GraphBuilder_SetLogFile(IGraphBuilder
*iface
, DWORD_PTR hFile
)
289 ok(0, "unexpected call\n");
293 static HRESULT WINAPI
GraphBuilder_Abort(IGraphBuilder
*iface
)
295 ok(0, "unexpected call\n");
299 static HRESULT WINAPI
GraphBuilder_ShouldOperationContinue(IGraphBuilder
*iface
)
301 ok(0, "unexpected call\n");
305 static const IGraphBuilderVtbl GraphBuilder_vtbl
= {
306 GraphBuilder_QueryInterface
,
308 GraphBuilder_Release
,
309 GraphBuilder_AddFilter
,
310 GraphBuilder_RemoveFilter
,
311 GraphBuilder_EnumFilters
,
312 GraphBuilder_FindFilterByName
,
313 GraphBuilder_ConnectDirect
,
314 GraphBuilder_Reconnect
,
315 GraphBuilder_Disconnect
,
316 GraphBuilder_SetDefaultSyncSource
,
317 GraphBuilder_Connect
,
319 GraphBuilder_RenderFile
,
320 GraphBuilder_AddSourceFilter
,
321 GraphBuilder_SetLogFile
,
323 GraphBuilder_ShouldOperationContinue
326 static IGraphBuilder GraphBuilder
= {&GraphBuilder_vtbl
};
329 IBaseFilter IBaseFilter_iface
;
330 IEnumPins IEnumPins_iface
;
332 IKsPropertySet IKsPropertySet_iface
;
333 IMemInputPin IMemInputPin_iface
;
334 IMediaSeeking IMediaSeeking_iface
;
335 IEnumMediaTypes IEnumMediaTypes_iface
;
338 filter_type filter_type
;
341 int enum_media_types_pos
;
344 static test_filter
* impl_from_IBaseFilter(IBaseFilter
*iface
)
346 return CONTAINING_RECORD(iface
, test_filter
, IBaseFilter_iface
);
349 static HRESULT WINAPI
BaseFilter_QueryInterface(IBaseFilter
*iface
, REFIID riid
, void **ppv
)
351 test_filter
*This
= impl_from_IBaseFilter(iface
);
353 if(IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_IPersist
)
354 || IsEqualIID(riid
, &IID_IMediaFilter
) || IsEqualIID(riid
, &IID_IBaseFilter
)) {
359 check_calls_list("BaseFilter_QueryInterface", BASEFILTER_QUERYINTERFACE
, This
->filter_type
);
360 ok(IsEqualIID(riid
, &IID_IPin
), "riid = %s\n", wine_dbgstr_guid(riid
));
361 return E_NOINTERFACE
;
364 static ULONG WINAPI
BaseFilter_AddRef(IBaseFilter
*iface
)
369 static ULONG WINAPI
BaseFilter_Release(IBaseFilter
*iface
)
374 static HRESULT WINAPI
BaseFilter_GetClassID(IBaseFilter
*iface
, CLSID
*pClassID
)
376 ok(0, "unexpected call\n");
380 static HRESULT WINAPI
BaseFilter_Stop(IBaseFilter
*iface
)
382 ok(0, "unexpected call\n");
386 static HRESULT WINAPI
BaseFilter_Pause(IBaseFilter
*iface
)
388 ok(0, "unexpected call\n");
392 static HRESULT WINAPI
BaseFilter_Run(IBaseFilter
*iface
, REFERENCE_TIME tStart
)
394 ok(0, "unexpected call\n");
398 static HRESULT WINAPI
BaseFilter_GetState(IBaseFilter
*iface
,
399 DWORD dwMilliSecsTimeout
, FILTER_STATE
*State
)
401 test_filter
*This
= impl_from_IBaseFilter(iface
);
402 check_calls_list("BaseFilter_GetState", BASEFILTER_GETSTATE
, This
->filter_type
);
406 static HRESULT WINAPI
BaseFilter_SetSyncSource(
407 IBaseFilter
*iface
, IReferenceClock
*pClock
)
409 ok(0, "unexpected call\n");
413 static HRESULT WINAPI
BaseFilter_GetSyncSource(
414 IBaseFilter
*iface
, IReferenceClock
**pClock
)
416 ok(0, "unexpected call\n");
420 static HRESULT WINAPI
BaseFilter_EnumPins(
421 IBaseFilter
*iface
, IEnumPins
**ppEnum
)
423 test_filter
*This
= impl_from_IBaseFilter(iface
);
424 check_calls_list("BaseFilter_EnumPins", BASEFILTER_ENUMPINS
, This
->filter_type
);
426 *ppEnum
= &This
->IEnumPins_iface
;
427 This
->enum_pins_pos
= 0;
431 static HRESULT WINAPI
BaseFilter_FindPin(IBaseFilter
*iface
,
432 LPCWSTR Id
, IPin
**ppPin
)
434 ok(0, "unexpected call\n");
438 static HRESULT WINAPI
BaseFilter_QueryFilterInfo(IBaseFilter
*iface
, FILTER_INFO
*pInfo
)
440 ok(0, "unexpected call\n");
444 static HRESULT WINAPI
BaseFilter_JoinFilterGraph(IBaseFilter
*iface
,
445 IFilterGraph
*pGraph
, LPCWSTR pName
)
447 ok(0, "unexpected call\n");
451 static HRESULT WINAPI
BaseFilter_QueryVendorInfo(IBaseFilter
*iface
, LPWSTR
*pVendorInfo
)
453 ok(0, "unexpected call\n");
457 static const IBaseFilterVtbl BaseFilterVtbl
= {
458 BaseFilter_QueryInterface
,
461 BaseFilter_GetClassID
,
466 BaseFilter_SetSyncSource
,
467 BaseFilter_GetSyncSource
,
470 BaseFilter_QueryFilterInfo
,
471 BaseFilter_JoinFilterGraph
,
472 BaseFilter_QueryVendorInfo
475 static test_filter
* impl_from_IEnumPins(IEnumPins
*iface
)
477 return CONTAINING_RECORD(iface
, test_filter
, IEnumPins_iface
);
480 static HRESULT WINAPI
EnumPins_QueryInterface(IEnumPins
*iface
, REFIID riid
, void **ppv
)
482 ok(0, "unexpected call\n");
486 static ULONG WINAPI
EnumPins_AddRef(IEnumPins
*iface
)
491 static ULONG WINAPI
EnumPins_Release(IEnumPins
*iface
)
496 static HRESULT WINAPI
EnumPins_Next(IEnumPins
*iface
,
497 ULONG cPins
, IPin
**ppPins
, ULONG
*pcFetched
)
499 test_filter
*This
= impl_from_IEnumPins(iface
);
500 check_calls_list("EnumPins_Next", ENUMPINS_NEXT
, This
->filter_type
);
502 ok(cPins
== 1, "cPins = %d\n", cPins
);
503 ok(ppPins
!= NULL
, "ppPins == NULL\n");
504 ok(pcFetched
!= NULL
, "pcFetched == NULL\n");
506 if(This
->enum_pins_pos
++ < (This
->filter_type
== INTERMEDIATE_FILTER
? 2 : 1)) {
507 *ppPins
= &This
->IPin_iface
;
515 static HRESULT WINAPI
EnumPins_Skip(IEnumPins
*iface
, ULONG cPins
)
517 ok(0, "unexpected call\n");
521 static HRESULT WINAPI
EnumPins_Reset(IEnumPins
*iface
)
523 ok(0, "unexpected call\n");
527 static HRESULT WINAPI
EnumPins_Clone(IEnumPins
*iface
, IEnumPins
**ppEnum
)
529 ok(0, "unexpected call\n");
533 static const IEnumPinsVtbl EnumPinsVtbl
= {
534 EnumPins_QueryInterface
,
543 static test_filter
* impl_from_IPin(IPin
*iface
)
545 return CONTAINING_RECORD(iface
, test_filter
, IPin_iface
);
548 static HRESULT WINAPI
Pin_QueryInterface(IPin
*iface
, REFIID riid
, void **ppv
)
550 test_filter
*This
= impl_from_IPin(iface
);
552 if(IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_IPin
)) {
557 if(IsEqualIID(riid
, &IID_IKsPropertySet
)) {
558 *ppv
= &This
->IKsPropertySet_iface
;
562 if(IsEqualIID(riid
, &IID_IMemInputPin
)) {
563 *ppv
= &This
->IMemInputPin_iface
;
567 if(IsEqualIID(riid
, &IID_IMediaSeeking
)) {
568 *ppv
= &This
->IMediaSeeking_iface
;
572 ok(0, "unexpected call: %s\n", wine_dbgstr_guid(riid
));
574 return E_NOINTERFACE
;
577 static ULONG WINAPI
Pin_AddRef(IPin
*iface
)
582 static ULONG WINAPI
Pin_Release(IPin
*iface
)
587 static HRESULT WINAPI
Pin_Connect(IPin
*iface
, IPin
*pReceivePin
, const AM_MEDIA_TYPE
*pmt
)
589 ok(0, "unexpected call\n");
593 static HRESULT WINAPI
Pin_ReceiveConnection(IPin
*iface
,
594 IPin
*pConnector
, const AM_MEDIA_TYPE
*pmt
)
596 CHECK_EXPECT(ReceiveConnection
);
598 ok(IsEqualIID(&pmt
->majortype
, &MEDIATYPE_Stream
), "majortype = %s\n",
599 wine_dbgstr_guid(&pmt
->majortype
));
600 ok(IsEqualIID(&pmt
->subtype
, &MEDIASUBTYPE_Avi
), "subtype = %s\n",
601 wine_dbgstr_guid(&pmt
->subtype
));
602 ok(pmt
->bFixedSizeSamples
, "bFixedSizeSamples = %x\n", pmt
->bFixedSizeSamples
);
603 ok(!pmt
->bTemporalCompression
, "bTemporalCompression = %x\n", pmt
->bTemporalCompression
);
604 ok(pmt
->lSampleSize
== 1, "lSampleSize = %d\n", pmt
->lSampleSize
);
605 ok(IsEqualIID(&pmt
->formattype
, &GUID_NULL
), "formattype = %s\n",
606 wine_dbgstr_guid(&pmt
->formattype
));
607 ok(!pmt
->pUnk
, "pUnk = %p\n", pmt
->pUnk
);
608 ok(!pmt
->cbFormat
, "cbFormat = %d\n", pmt
->cbFormat
);
609 ok(!pmt
->pbFormat
, "pbFormat = %p\n", pmt
->pbFormat
);
613 static HRESULT WINAPI
Pin_Disconnect(IPin
*iface
)
615 ok(0, "unexpected call\n");
619 static HRESULT WINAPI
Pin_ConnectedTo(IPin
*iface
, IPin
**pPin
)
621 test_filter
*This
= impl_from_IPin(iface
);
622 check_calls_list("Pin_ConnectedTo", PIN_CONNECTEDTO
, This
->filter_type
);
628 static HRESULT WINAPI
Pin_ConnectionMediaType(IPin
*iface
, AM_MEDIA_TYPE
*pmt
)
630 ok(0, "unexpected call\n");
634 static HRESULT WINAPI
Pin_QueryPinInfo(IPin
*iface
, PIN_INFO
*pInfo
)
636 test_filter
*This
= impl_from_IPin(iface
);
637 check_calls_list("Pin_QueryPinInfo", PIN_QUERYPININFO
, This
->filter_type
);
641 static HRESULT WINAPI
Pin_QueryDirection(IPin
*iface
, PIN_DIRECTION
*pPinDir
)
643 test_filter
*This
= impl_from_IPin(iface
);
644 check_calls_list("Pin_QueryDirection", PIN_QUERYDIRECTION
, This
->filter_type
);
646 *pPinDir
= This
->dir
;
647 if(This
->filter_type
==INTERMEDIATE_FILTER
&& This
->enum_pins_pos
==2)
648 *pPinDir
= PINDIR_INPUT
;
652 static HRESULT WINAPI
Pin_QueryId(IPin
*iface
, LPWSTR
*Id
)
654 ok(0, "unexpected call\n");
658 static HRESULT WINAPI
Pin_QueryAccept(IPin
*iface
, const AM_MEDIA_TYPE
*pmt
)
660 ok(0, "unexpected call\n");
664 static HRESULT WINAPI
Pin_EnumMediaTypes(IPin
*iface
, IEnumMediaTypes
**ppEnum
)
666 test_filter
*This
= impl_from_IPin(iface
);
667 check_calls_list("Pin_EnumMediaTypes", PIN_ENUMMEDIATYPES
, This
->filter_type
);
669 ok(ppEnum
!= NULL
, "ppEnum == NULL\n");
670 *ppEnum
= &This
->IEnumMediaTypes_iface
;
674 static HRESULT WINAPI
Pin_QueryInternalConnections(IPin
*iface
, IPin
**apPin
, ULONG
*nPin
)
676 ok(0, "unexpected call\n");
680 static HRESULT WINAPI
Pin_EndOfStream(IPin
*iface
)
682 ok(0, "unexpected call\n");
686 static HRESULT WINAPI
Pin_BeginFlush(IPin
*iface
)
688 ok(0, "unexpected call\n");
692 static HRESULT WINAPI
Pin_EndFlush(IPin
*iface
)
694 ok(0, "unexpected call\n");
698 static HRESULT WINAPI
Pin_NewSegment(IPin
*iface
, REFERENCE_TIME tStart
,
699 REFERENCE_TIME tStop
, double dRate
)
701 ok(0, "unexpected call\n");
705 static const IPinVtbl PinVtbl
= {
710 Pin_ReceiveConnection
,
713 Pin_ConnectionMediaType
,
719 Pin_QueryInternalConnections
,
726 static test_filter
* impl_from_IKsPropertySet(IKsPropertySet
*iface
)
728 return CONTAINING_RECORD(iface
, test_filter
, IKsPropertySet_iface
);
731 static HRESULT WINAPI
KsPropertySet_QueryInterface(IKsPropertySet
*iface
, REFIID riid
, void **ppv
)
733 ok(0, "unexpected call\n");
737 static ULONG WINAPI
KsPropertySet_AddRef(IKsPropertySet
*iface
)
742 static ULONG WINAPI
KsPropertySet_Release(IKsPropertySet
*iface
)
747 static HRESULT WINAPI
KsPropertySet_Set(IKsPropertySet
*iface
, REFGUID guidPropSet
, DWORD dwPropID
,
748 LPVOID pInstanceData
, DWORD cbInstanceData
, LPVOID pPropData
, DWORD cbPropData
)
750 ok(0, "unexpected call\n");
754 static HRESULT WINAPI
KsPropertySet_Get(IKsPropertySet
*iface
, REFGUID guidPropSet
, DWORD dwPropID
,
755 LPVOID pInstanceData
, DWORD cbInstanceData
, LPVOID pPropData
, DWORD cbPropData
, DWORD
*pcbReturned
)
757 test_filter
*This
= impl_from_IKsPropertySet(iface
);
758 check_calls_list("KsPropertySet_Get", KSPROPERTYSET_GET
, This
->filter_type
);
760 ok(IsEqualIID(guidPropSet
, &ROPSETID_Pin
), "guidPropSet = %s\n", wine_dbgstr_guid(guidPropSet
));
761 ok(dwPropID
== 0, "dwPropID = %d\n", dwPropID
);
762 ok(pInstanceData
== NULL
, "pInstanceData != NULL\n");
763 ok(cbInstanceData
== 0, "cbInstanceData != 0\n");
764 ok(cbPropData
== sizeof(GUID
), "cbPropData = %d\n", cbPropData
);
765 *pcbReturned
= sizeof(GUID
);
766 memcpy(pPropData
, &PIN_CATEGORY_EDS
, sizeof(GUID
));
770 static HRESULT WINAPI
KsPropertySet_QuerySupported(IKsPropertySet
*iface
,
771 REFGUID guidPropSet
, DWORD dwPropID
, DWORD
*pTypeSupport
)
773 ok(0, "unexpected call\n");
777 static const IKsPropertySetVtbl KsPropertySetVtbl
= {
778 KsPropertySet_QueryInterface
,
779 KsPropertySet_AddRef
,
780 KsPropertySet_Release
,
783 KsPropertySet_QuerySupported
786 static IStream
*avi_stream
;
787 static HRESULT WINAPI
MemInputPin_QueryInterface(IMemInputPin
*iface
, REFIID riid
, void **ppv
)
789 if(IsEqualIID(riid
, &IID_IStream
)) {
790 CHECK_EXPECT(MemInputPin_QueryInterface_IStream
);
793 return E_NOINTERFACE
;
796 IStream_AddRef(avi_stream
);
800 ok(0, "unexpected call: %s\n", wine_dbgstr_guid(riid
));
804 static ULONG WINAPI
MemInputPin_AddRef(IMemInputPin
*iface
)
809 static ULONG WINAPI
MemInputPin_Release(IMemInputPin
*iface
)
814 static HRESULT WINAPI
MemInputPin_GetAllocator(IMemInputPin
*iface
, IMemAllocator
**ppAllocator
)
816 ok(0, "unexpected call\n");
820 static HRESULT WINAPI
MemInputPin_NotifyAllocator(IMemInputPin
*iface
,
821 IMemAllocator
*pAllocator
, BOOL bReadOnly
)
823 ALLOCATOR_PROPERTIES ap
;
826 CHECK_EXPECT(NotifyAllocator
);
828 ok(pAllocator
!= NULL
, "pAllocator = %p\n", pAllocator
);
829 ok(bReadOnly
, "bReadOnly = %x\n", bReadOnly
);
831 hr
= IMemAllocator_GetProperties(pAllocator
, &ap
);
832 ok(hr
== S_OK
, "GetProperties returned %x\n", hr
);
833 ok(ap
.cBuffers
== 32, "cBuffers = %d\n", ap
.cBuffers
);
834 ok(ap
.cbBuffer
== 0, "cbBuffer = %d\n", ap
.cbBuffer
);
835 ok(ap
.cbAlign
== 1, "cbAlign = %d\n", ap
.cbAlign
);
836 ok(ap
.cbPrefix
== 0, "cbPrefix = %d\n", ap
.cbPrefix
);
840 static HRESULT WINAPI
MemInputPin_GetAllocatorRequirements(
841 IMemInputPin
*iface
, ALLOCATOR_PROPERTIES
*pProps
)
843 CHECK_EXPECT(GetAllocatorRequirements
);
847 static HRESULT WINAPI
MemInputPin_Receive(IMemInputPin
*iface
, IMediaSample
*pSample
)
849 REFERENCE_TIME off
, tmp
;
854 hr
= IMediaSample_GetTime(pSample
, &off
, &tmp
);
855 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
856 hr
= IMediaSample_GetPointer(pSample
, &data
);
857 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
859 IStream_Seek(avi_stream
, li
, STREAM_SEEK_SET
, NULL
);
860 IStream_Write(avi_stream
, data
, IMediaSample_GetActualDataLength(pSample
), NULL
);
864 static HRESULT WINAPI
MemInputPin_ReceiveMultiple(IMemInputPin
*iface
,
865 IMediaSample
**pSamples
, LONG nSamples
, LONG
*nSamplesProcessed
)
867 ok(0, "unexpected call\n");
871 static HRESULT WINAPI
MemInputPin_ReceiveCanBlock(IMemInputPin
*iface
)
873 ok(0, "unexpected call\n");
877 static const IMemInputPinVtbl MemInputPinVtbl
= {
878 MemInputPin_QueryInterface
,
881 MemInputPin_GetAllocator
,
882 MemInputPin_NotifyAllocator
,
883 MemInputPin_GetAllocatorRequirements
,
885 MemInputPin_ReceiveMultiple
,
886 MemInputPin_ReceiveCanBlock
889 static HRESULT WINAPI
MediaSeeking_QueryInterface(
890 IMediaSeeking
*iface
, REFIID riid
, void **ppv
)
892 ok(0, "unexpected call\n");
896 static ULONG WINAPI
MediaSeeking_AddRef(IMediaSeeking
*iface
)
901 static ULONG WINAPI
MediaSeeking_Release(IMediaSeeking
*iface
)
906 static HRESULT WINAPI
MediaSeeking_GetCapabilities(
907 IMediaSeeking
*iface
, DWORD
*pCapabilities
)
909 ok(0, "unexpected call\n");
913 static HRESULT WINAPI
MediaSeeking_CheckCapabilities(
914 IMediaSeeking
*iface
, DWORD
*pCapabilities
)
916 ok(0, "unexpected call\n");
920 static HRESULT WINAPI
MediaSeeking_IsFormatSupported(
921 IMediaSeeking
*iface
, const GUID
*pFormat
)
923 ok(0, "unexpected call\n");
927 static HRESULT WINAPI
MediaSeeking_QueryPreferredFormat(
928 IMediaSeeking
*iface
, GUID
*pFormat
)
930 ok(0, "unexpected call\n");
934 static HRESULT WINAPI
MediaSeeking_GetTimeFormat(
935 IMediaSeeking
*iface
, GUID
*pFormat
)
937 ok(0, "unexpected call\n");
941 static HRESULT WINAPI
MediaSeeking_IsUsingTimeFormat(
942 IMediaSeeking
*iface
, const GUID
*pFormat
)
944 ok(0, "unexpected call\n");
948 static HRESULT WINAPI
MediaSeeking_SetTimeFormat(
949 IMediaSeeking
*iface
, const GUID
*pFormat
)
951 ok(0, "unexpected call\n");
955 static HRESULT WINAPI
MediaSeeking_GetDuration(
956 IMediaSeeking
*iface
, LONGLONG
*pDuration
)
958 ok(0, "unexpected call\n");
962 static HRESULT WINAPI
MediaSeeking_GetStopPosition(
963 IMediaSeeking
*iface
, LONGLONG
*pStop
)
965 ok(0, "unexpected call\n");
969 static HRESULT WINAPI
MediaSeeking_GetCurrentPosition(
970 IMediaSeeking
*iface
, LONGLONG
*pCurrent
)
972 ok(0, "unexpected call\n");
976 static HRESULT WINAPI
MediaSeeking_ConvertTimeFormat(IMediaSeeking
*iface
, LONGLONG
*pTarget
,
977 const GUID
*pTargetFormat
, LONGLONG Source
, const GUID
*pSourceFormat
)
979 ok(0, "unexpected call\n");
983 static HRESULT WINAPI
MediaSeeking_SetPositions(IMediaSeeking
*iface
, LONGLONG
*pCurrent
,
984 DWORD dwCurrentFlags
, LONGLONG
*pStop
, DWORD dwStopFlags
)
986 ok(0, "unexpected call\n");
990 static HRESULT WINAPI
MediaSeeking_GetPositions(IMediaSeeking
*iface
,
991 LONGLONG
*pCurrent
, LONGLONG
*pStop
)
993 CHECK_EXPECT(MediaSeeking_GetPositions
);
997 static HRESULT WINAPI
MediaSeeking_GetAvailable(IMediaSeeking
*iface
,
998 LONGLONG
*pEarliest
, LONGLONG
*pLatest
)
1000 ok(0, "unexpected call\n");
1004 static HRESULT WINAPI
MediaSeeking_SetRate(IMediaSeeking
*iface
, double dRate
)
1006 ok(0, "unexpected call\n");
1010 static HRESULT WINAPI
MediaSeeking_GetRate(IMediaSeeking
*iface
, double *pdRate
)
1012 ok(0, "unexpected call\n");
1016 static HRESULT WINAPI
MediaSeeking_GetPreroll(IMediaSeeking
*iface
, LONGLONG
*pllPreroll
)
1018 ok(0, "unexpected call\n");
1022 static const IMediaSeekingVtbl MediaSeekingVtbl
= {
1023 MediaSeeking_QueryInterface
,
1024 MediaSeeking_AddRef
,
1025 MediaSeeking_Release
,
1026 MediaSeeking_GetCapabilities
,
1027 MediaSeeking_CheckCapabilities
,
1028 MediaSeeking_IsFormatSupported
,
1029 MediaSeeking_QueryPreferredFormat
,
1030 MediaSeeking_GetTimeFormat
,
1031 MediaSeeking_IsUsingTimeFormat
,
1032 MediaSeeking_SetTimeFormat
,
1033 MediaSeeking_GetDuration
,
1034 MediaSeeking_GetStopPosition
,
1035 MediaSeeking_GetCurrentPosition
,
1036 MediaSeeking_ConvertTimeFormat
,
1037 MediaSeeking_SetPositions
,
1038 MediaSeeking_GetPositions
,
1039 MediaSeeking_GetAvailable
,
1040 MediaSeeking_SetRate
,
1041 MediaSeeking_GetRate
,
1042 MediaSeeking_GetPreroll
1045 static test_filter
* impl_from_IEnumMediaTypes(IEnumMediaTypes
*iface
)
1047 return CONTAINING_RECORD(iface
, test_filter
, IEnumMediaTypes_iface
);
1050 static HRESULT WINAPI
EnumMediaTypes_QueryInterface(IEnumMediaTypes
*iface
, REFIID riid
, void **ppv
)
1052 ok(0, "unexpected call\n");
1056 static ULONG WINAPI
EnumMediaTypes_AddRef(IEnumMediaTypes
*iface
)
1061 static ULONG WINAPI
EnumMediaTypes_Release(IEnumMediaTypes
*iface
)
1066 static HRESULT WINAPI
EnumMediaTypes_Next(IEnumMediaTypes
*iface
, ULONG cMediaTypes
,
1067 AM_MEDIA_TYPE
**ppMediaTypes
, ULONG
*pcFetched
)
1069 test_filter
*This
= impl_from_IEnumMediaTypes(iface
);
1070 check_calls_list("EnumMediaTypes_Next", ENUMMEDIATYPES_NEXT
, This
->filter_type
);
1072 ok(cMediaTypes
== 1, "cMediaTypes = %d\n", cMediaTypes
);
1073 ok(ppMediaTypes
!= NULL
, "ppMediaTypes == NULL\n");
1074 ok(pcFetched
!= NULL
, "pcFetched == NULL\n");
1076 if(!This
->enum_media_types_pos
++) {
1077 ppMediaTypes
[0] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
1078 memset(ppMediaTypes
[0], 0, sizeof(AM_MEDIA_TYPE
));
1079 ppMediaTypes
[0]->majortype
= MEDIATYPE_Video
;
1088 static HRESULT WINAPI
EnumMediaTypes_Skip(IEnumMediaTypes
*iface
, ULONG cMediaTypes
)
1090 ok(0, "unexpected call\n");
1094 static HRESULT WINAPI
EnumMediaTypes_Reset(IEnumMediaTypes
*iface
)
1096 test_filter
*This
= impl_from_IEnumMediaTypes(iface
);
1097 check_calls_list("EnumMediaTypes_Reset", ENUMMEDIATYPES_RESET
, This
->filter_type
);
1099 This
->enum_media_types_pos
= 0;
1103 static HRESULT WINAPI
EnumMediaTypes_Clone(IEnumMediaTypes
*iface
, IEnumMediaTypes
**ppEnum
)
1105 ok(0, "unexpected call\n");
1109 static const IEnumMediaTypesVtbl EnumMediaTypesVtbl
= {
1110 EnumMediaTypes_QueryInterface
,
1111 EnumMediaTypes_AddRef
,
1112 EnumMediaTypes_Release
,
1113 EnumMediaTypes_Next
,
1114 EnumMediaTypes_Skip
,
1115 EnumMediaTypes_Reset
,
1116 EnumMediaTypes_Clone
1119 static void init_test_filter(test_filter
*This
, PIN_DIRECTION dir
, filter_type type
)
1121 memset(This
, 0, sizeof(*This
));
1122 This
->IBaseFilter_iface
.lpVtbl
= &BaseFilterVtbl
;
1123 This
->IEnumPins_iface
.lpVtbl
= &EnumPinsVtbl
;
1124 This
->IPin_iface
.lpVtbl
= &PinVtbl
;
1125 This
->IKsPropertySet_iface
.lpVtbl
= &KsPropertySetVtbl
;
1126 This
->IMemInputPin_iface
.lpVtbl
= &MemInputPinVtbl
;
1127 This
->IMediaSeeking_iface
.lpVtbl
= &MediaSeekingVtbl
;
1128 This
->IEnumMediaTypes_iface
.lpVtbl
= &EnumMediaTypesVtbl
;
1131 This
->filter_type
= type
;
1134 static HRESULT WINAPI
MemAllocator_QueryInterface(IMemAllocator
*iface
, REFIID riid
, void **ppvObject
)
1136 if(IsEqualIID(riid
, &IID_IUnknown
)) {
1141 ok(0, "unexpected call: %s\n", wine_dbgstr_guid(riid
));
1145 static ULONG WINAPI
MemAllocator_AddRef(IMemAllocator
*iface
)
1150 static ULONG WINAPI
MemAllocator_Release(IMemAllocator
*iface
)
1155 static HRESULT WINAPI
MemAllocator_SetProperties(IMemAllocator
*iface
,
1156 ALLOCATOR_PROPERTIES
*pRequest
, ALLOCATOR_PROPERTIES
*pActual
)
1158 ok(0, "unexpected call\n");
1162 static HRESULT WINAPI
MemAllocator_GetProperties(IMemAllocator
*iface
, ALLOCATOR_PROPERTIES
*pProps
)
1164 CHECK_EXPECT2(MemAllocator_GetProperties
);
1166 pProps
->cBuffers
= 1;
1167 pProps
->cbBuffer
= 1024;
1168 pProps
->cbAlign
= 0;
1169 pProps
->cbPrefix
= 0;
1173 static HRESULT WINAPI
MemAllocator_Commit(IMemAllocator
*iface
)
1175 ok(0, "unexpected call\n");
1179 static HRESULT WINAPI
MemAllocator_Decommit(IMemAllocator
*iface
)
1181 ok(0, "unexpected call\n");
1185 static HRESULT WINAPI
MemAllocator_GetBuffer(IMemAllocator
*iface
, IMediaSample
**ppBuffer
,
1186 REFERENCE_TIME
*pStartTime
, REFERENCE_TIME
*pEndTime
, DWORD dwFlags
)
1188 ok(0, "unexpected call\n");
1192 static HRESULT WINAPI
MemAllocator_ReleaseBuffer(IMemAllocator
*iface
, IMediaSample
*pBuffer
)
1194 ok(0, "unexpected call\n");
1198 static const IMemAllocatorVtbl MemAllocatorVtbl
= {
1199 MemAllocator_QueryInterface
,
1200 MemAllocator_AddRef
,
1201 MemAllocator_Release
,
1202 MemAllocator_SetProperties
,
1203 MemAllocator_GetProperties
,
1204 MemAllocator_Commit
,
1205 MemAllocator_Decommit
,
1206 MemAllocator_GetBuffer
,
1207 MemAllocator_ReleaseBuffer
1209 IMemAllocator MemAllocator
= {&MemAllocatorVtbl
};
1211 static HRESULT WINAPI
MediaSample_QueryInterface(IMediaSample
* This
, REFIID riid
, void **ppv
)
1213 if(IsEqualIID(riid
, &IID_IMediaSample2
))
1214 CHECK_EXPECT(MediaSample_QueryInterface_MediaSample2
);
1216 ok(0, "MediaSample_QueryInterface: %s\n", wine_dbgstr_guid(riid
));
1219 return E_NOINTERFACE
;
1222 static ULONG WINAPI
MediaSample_AddRef(IMediaSample
* This
)
1227 static ULONG WINAPI
MediaSample_Release(IMediaSample
* This
)
1232 static BYTE buf
[1024];
1233 static HRESULT WINAPI
MediaSample_GetPointer(IMediaSample
* This
, BYTE
**ppBuffer
)
1235 CHECK_EXPECT2(MediaSample_GetPointer
);
1237 memset(buf
, 'z', sizeof(buf
));
1241 static LONG WINAPI
MediaSample_GetSize(IMediaSample
* This
)
1243 CHECK_EXPECT2(MediaSample_GetSize
);
1247 static REFERENCE_TIME start_time
, end_time
;
1248 static HRESULT WINAPI
MediaSample_GetTime(IMediaSample
* This
,
1249 REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
)
1251 CHECK_EXPECT2(MediaSample_GetTime
);
1252 *pTimeStart
= start_time
;
1253 *pTimeEnd
= end_time
;
1257 static HRESULT WINAPI
MediaSample_SetTime(IMediaSample
* This
,
1258 REFERENCE_TIME
*pTimeStart
, REFERENCE_TIME
*pTimeEnd
)
1260 ok(0, "unexpected call\n");
1264 static HRESULT WINAPI
MediaSample_IsSyncPoint(IMediaSample
* This
)
1266 CHECK_EXPECT2(MediaSample_IsSyncPoint
);
1270 static HRESULT WINAPI
MediaSample_SetSyncPoint(IMediaSample
* This
, BOOL bIsSyncPoint
)
1272 ok(0, "unexpected call\n");
1276 static HRESULT WINAPI
MediaSample_IsPreroll(IMediaSample
* This
)
1278 CHECK_EXPECT2(MediaSample_IsPreroll
);
1282 static HRESULT WINAPI
MediaSample_SetPreroll(IMediaSample
* This
, BOOL bIsPreroll
)
1284 ok(0, "unexpected call\n");
1288 static LONG WINAPI
MediaSample_GetActualDataLength(IMediaSample
* This
)
1290 CHECK_EXPECT2(MediaSample_GetActualDataLength
);
1294 static HRESULT WINAPI
MediaSample_SetActualDataLength(IMediaSample
* This
, LONG length
)
1296 ok(0, "unexpected call\n");
1300 static HRESULT WINAPI
MediaSample_GetMediaType(IMediaSample
* This
, AM_MEDIA_TYPE
**ppMediaType
)
1302 CHECK_EXPECT2(MediaSample_GetMediaType
);
1303 *ppMediaType
= NULL
;
1307 static HRESULT WINAPI
MediaSample_SetMediaType(IMediaSample
* This
, AM_MEDIA_TYPE
*pMediaType
)
1309 ok(0, "unexpected call\n");
1313 static HRESULT WINAPI
MediaSample_IsDiscontinuity(IMediaSample
* This
)
1315 CHECK_EXPECT(MediaSample_IsDiscontinuity
);
1319 static HRESULT WINAPI
MediaSample_SetDiscontinuity(IMediaSample
* This
, BOOL bDiscontinuity
)
1321 ok(0, "unexpected call\n");
1325 static HRESULT WINAPI
MediaSample_GetMediaTime(IMediaSample
* This
,
1326 LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
1328 CHECK_EXPECT(MediaSample_GetMediaTime
);
1332 static HRESULT WINAPI
MediaSample_SetMediaTime(IMediaSample
* This
,
1333 LONGLONG
*pTimeStart
, LONGLONG
*pTimeEnd
)
1335 ok(0, "unexpected call\n");
1339 static const IMediaSampleVtbl MediaSampleVtbl
= {
1340 MediaSample_QueryInterface
,
1342 MediaSample_Release
,
1343 MediaSample_GetPointer
,
1344 MediaSample_GetSize
,
1345 MediaSample_GetTime
,
1346 MediaSample_SetTime
,
1347 MediaSample_IsSyncPoint
,
1348 MediaSample_SetSyncPoint
,
1349 MediaSample_IsPreroll
,
1350 MediaSample_SetPreroll
,
1351 MediaSample_GetActualDataLength
,
1352 MediaSample_SetActualDataLength
,
1353 MediaSample_GetMediaType
,
1354 MediaSample_SetMediaType
,
1355 MediaSample_IsDiscontinuity
,
1356 MediaSample_SetDiscontinuity
,
1357 MediaSample_GetMediaTime
,
1358 MediaSample_SetMediaTime
,
1360 IMediaSample MediaSample
= {&MediaSampleVtbl
};
1362 static void test_AviMux(char *arg
)
1364 test_filter source_filter
, sink_filter
;
1365 VIDEOINFO videoinfo
;
1366 IPin
*avimux_in
, *avimux_out
, *pin
;
1367 AM_MEDIA_TYPE source_media_type
;
1369 IBaseFilter
*avimux
;
1371 IMemInputPin
*memin
;
1372 ALLOCATOR_PROPERTIES props
;
1373 IMemAllocator
*memalloc
;
1374 IConfigInterleaving
*ci
;
1379 init_test_filter(&source_filter
, PINDIR_OUTPUT
, SOURCE_FILTER
);
1380 init_test_filter(&sink_filter
, PINDIR_INPUT
, SINK_FILTER
);
1382 hr
= CoCreateInstance(&CLSID_AviDest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IBaseFilter
, (void**)&avimux
);
1383 ok(hr
== S_OK
|| broken(hr
== REGDB_E_CLASSNOTREG
),
1384 "couldn't create AVI Mux filter, hr = %08x\n", hr
);
1386 win_skip("AVI Mux filter is not registered\n");
1390 hr
= IBaseFilter_EnumPins(avimux
, &ep
);
1391 ok(hr
== S_OK
, "EnumPins returned %x\n", hr
);
1393 hr
= IEnumPins_Next(ep
, 1, &avimux_out
, NULL
);
1394 ok(hr
== S_OK
, "Next returned %x\n", hr
);
1395 hr
= IPin_QueryDirection(avimux_out
, &dir
);
1396 ok(hr
== S_OK
, "QueryDirection returned %x\n", hr
);
1397 ok(dir
== PINDIR_OUTPUT
, "dir = %d\n", dir
);
1399 hr
= IEnumPins_Next(ep
, 1, &avimux_in
, NULL
);
1400 ok(hr
== S_OK
, "Next returned %x\n", hr
);
1401 hr
= IPin_QueryDirection(avimux_in
, &dir
);
1402 ok(hr
== S_OK
, "QueryDirection returned %x\n", hr
);
1403 ok(dir
== PINDIR_INPUT
, "dir = %d\n", dir
);
1404 IEnumPins_Release(ep
);
1406 hr
= IPin_ReceiveConnection(avimux_in
, &source_filter
.IPin_iface
, NULL
);
1407 ok(hr
== E_POINTER
, "ReceiveConnection returned %x\n", hr
);
1409 current_calls_list
= NULL
;
1410 memset(&source_media_type
, 0, sizeof(AM_MEDIA_TYPE
));
1411 memset(&videoinfo
, 0, sizeof(VIDEOINFO
));
1412 source_media_type
.majortype
= MEDIATYPE_Video
;
1413 source_media_type
.subtype
= MEDIASUBTYPE_RGB32
;
1414 source_media_type
.formattype
= FORMAT_VideoInfo
;
1415 source_media_type
.bFixedSizeSamples
= TRUE
;
1416 source_media_type
.lSampleSize
= 40000;
1417 source_media_type
.cbFormat
= sizeof(VIDEOINFO
);
1418 source_media_type
.pbFormat
= (BYTE
*)&videoinfo
;
1419 videoinfo
.AvgTimePerFrame
= 333333;
1420 videoinfo
.bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
1421 videoinfo
.bmiHeader
.biWidth
= 100;
1422 videoinfo
.bmiHeader
.biHeight
= 100;
1423 videoinfo
.bmiHeader
.biPlanes
= 1;
1424 videoinfo
.bmiHeader
.biBitCount
= 32;
1425 videoinfo
.bmiHeader
.biSizeImage
= 40000;
1426 videoinfo
.bmiHeader
.biClrImportant
= 256;
1427 hr
= IPin_ReceiveConnection(avimux_in
, &source_filter
.IPin_iface
, &source_media_type
);
1428 ok(hr
== S_OK
, "ReceiveConnection returned %x\n", hr
);
1430 hr
= IPin_ConnectedTo(avimux_in
, &pin
);
1431 ok(hr
== S_OK
, "ConnectedTo returned %x\n", hr
);
1432 ok(pin
== &source_filter
.IPin_iface
, "incorrect pin: %p, expected %p\n",
1433 pin
, &source_filter
.IPin_iface
);
1435 hr
= IPin_Connect(avimux_out
, &source_filter
.IPin_iface
, NULL
);
1436 ok(hr
== VFW_E_INVALID_DIRECTION
, "Connect returned %x\n", hr
);
1438 hr
= IBaseFilter_JoinFilterGraph(avimux
, (IFilterGraph
*)&GraphBuilder
, NULL
);
1439 ok(hr
== S_OK
, "JoinFilterGraph returned %x\n", hr
);
1441 SET_EXPECT(ReceiveConnection
);
1442 SET_EXPECT(GetAllocatorRequirements
);
1443 SET_EXPECT(NotifyAllocator
);
1444 SET_EXPECT(Reconnect
);
1445 hr
= IPin_Connect(avimux_out
, &sink_filter
.IPin_iface
, NULL
);
1446 ok(hr
== S_OK
, "Connect returned %x\n", hr
);
1447 CHECK_CALLED(ReceiveConnection
);
1448 CHECK_CALLED(GetAllocatorRequirements
);
1449 CHECK_CALLED(NotifyAllocator
);
1450 CHECK_CALLED(Reconnect
);
1452 hr
= IPin_ConnectedTo(avimux_out
, &pin
);
1453 ok(hr
== S_OK
, "ConnectedTo returned %x\n", hr
);
1454 ok(pin
== &sink_filter
.IPin_iface
, "incorrect pin: %p, expected %p\n",
1455 pin
, &source_filter
.IPin_iface
);
1457 hr
= IPin_QueryInterface(avimux_in
, &IID_IMemInputPin
, (void**)&memin
);
1458 ok(hr
== S_OK
, "QueryInterface returned %x\n", hr
);
1460 props
.cBuffers
= 0xdeadbee1;
1461 props
.cbBuffer
= 0xdeadbee2;
1462 props
.cbAlign
= 0xdeadbee3;
1463 props
.cbPrefix
= 0xdeadbee4;
1464 hr
= IMemInputPin_GetAllocatorRequirements(memin
, &props
);
1465 ok(hr
==S_OK
|| broken(hr
==E_INVALIDARG
), "GetAllocatorRequirements returned %x\n", hr
);
1467 ok(props
.cBuffers
== 0xdeadbee1, "cBuffers = %d\n", props
.cBuffers
);
1468 ok(props
.cbBuffer
== 0xdeadbee2, "cbBuffer = %d\n", props
.cbBuffer
);
1469 ok(props
.cbAlign
== 1, "cbAlign = %d\n", props
.cbAlign
);
1470 ok(props
.cbPrefix
== 8, "cbPrefix = %d\n", props
.cbPrefix
);
1473 hr
= IMemInputPin_GetAllocator(memin
, &memalloc
);
1474 ok(hr
== S_OK
, "GetAllocator returned %x\n", hr
);
1476 props
.cBuffers
= 0xdeadbee1;
1477 props
.cbBuffer
= 0xdeadbee2;
1478 props
.cbAlign
= 0xdeadbee3;
1479 props
.cbPrefix
= 0xdeadbee4;
1480 hr
= IMemAllocator_GetProperties(memalloc
, &props
);
1481 ok(hr
== S_OK
, "GetProperties returned %x\n", hr
);
1482 ok(props
.cBuffers
== 0, "cBuffers = %d\n", props
.cBuffers
);
1483 ok(props
.cbBuffer
== 0, "cbBuffer = %d\n", props
.cbBuffer
);
1484 ok(props
.cbAlign
== 0, "cbAlign = %d\n", props
.cbAlign
);
1485 ok(props
.cbPrefix
== 0, "cbPrefix = %d\n", props
.cbPrefix
);
1486 IMemAllocator_Release(memalloc
);
1488 hr
= IBaseFilter_QueryInterface(avimux
, &IID_IConfigInterleaving
, (void**)&ci
);
1489 ok(hr
== S_OK
, "QueryInterface(IID_IConfigInterleaving) returned %x\n", hr
);
1490 hr
= IConfigInterleaving_put_Mode(ci
, 5);
1491 ok(hr
== E_INVALIDARG
, "put_Mode returned %x\n", hr
);
1492 SET_EXPECT(Reconnect
);
1493 hr
= IConfigInterleaving_put_Mode(ci
, INTERLEAVE_FULL
);
1494 ok(hr
== S_OK
, "put_Mode returned %x\n", hr
);
1495 CHECK_CALLED(Reconnect
);
1496 IConfigInterleaving_Release(ci
);
1498 hr
= IBaseFilter_GetState(avimux
, 0, &state
);
1499 ok(hr
== S_OK
, "GetState returned %x\n", hr
);
1500 ok(state
== State_Stopped
, "state = %d\n", state
);
1502 SET_EXPECT(MemAllocator_GetProperties
);
1503 hr
= IMemInputPin_NotifyAllocator(memin
, &MemAllocator
, TRUE
);
1504 ok(hr
== S_OK
, "NotifyAllocator returned %x\n", hr
);
1505 CHECK_CALLED(MemAllocator_GetProperties
);
1507 hr
= IMemInputPin_GetAllocator(memin
, &memalloc
);
1508 ok(hr
== S_OK
, "GetAllocator returned %x\n", hr
);
1509 ok(memalloc
!= &MemAllocator
, "memalloc == &MemAllocator\n");
1510 IMemAllocator_Release(memalloc
);
1512 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &avi_stream
);
1513 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
1514 SET_EXPECT(MediaSeeking_GetPositions
);
1515 SET_EXPECT(MemInputPin_QueryInterface_IStream
);
1516 hr
= IBaseFilter_Run(avimux
, 0);
1517 ok(hr
== S_OK
, "Run returned %x\n", hr
);
1518 CHECK_CALLED(MediaSeeking_GetPositions
);
1520 hr
= IBaseFilter_GetState(avimux
, 0, &state
);
1521 ok(hr
== S_OK
, "GetState returned %x\n", hr
);
1522 ok(state
== State_Running
, "state = %d\n", state
);
1524 SET_EXPECT(MediaSample_QueryInterface_MediaSample2
);
1525 SET_EXPECT(MediaSample_IsDiscontinuity
);
1526 SET_EXPECT(MediaSample_IsPreroll
);
1527 SET_EXPECT(MediaSample_IsSyncPoint
);
1528 SET_EXPECT(MediaSample_GetTime
);
1529 SET_EXPECT(MediaSample_GetMediaType
);
1530 SET_EXPECT(MediaSample_GetPointer
);
1531 SET_EXPECT(MediaSample_GetActualDataLength
);
1532 SET_EXPECT(MediaSample_GetSize
);
1533 SET_EXPECT(MediaSample_GetMediaTime
);
1534 start_time
= end_time
= 0;
1535 hr
= IMemInputPin_Receive(memin
, &MediaSample
);
1536 ok(hr
== S_OK
, "Receive returned %x\n", hr
);
1537 CHECK_CALLED(MediaSample_QueryInterface_MediaSample2
);
1538 todo_wine
CHECK_CALLED(MediaSample_IsDiscontinuity
);
1539 todo_wine
CHECK_CALLED(MediaSample_IsPreroll
);
1540 CHECK_CALLED(MediaSample_IsSyncPoint
);
1541 CHECK_CALLED(MediaSample_GetTime
);
1542 todo_wine
CHECK_CALLED(MediaSample_GetMediaType
);
1543 CHECK_CALLED(MediaSample_GetPointer
);
1544 CHECK_CALLED(MediaSample_GetActualDataLength
);
1545 todo_wine
CHECK_CALLED(MediaSample_GetSize
);
1546 todo_wine
CHECK_CALLED(MediaSample_GetMediaTime
);
1548 SET_EXPECT(MediaSample_QueryInterface_MediaSample2
);
1549 SET_EXPECT(MediaSample_IsDiscontinuity
);
1550 SET_EXPECT(MediaSample_IsPreroll
);
1551 SET_EXPECT(MediaSample_IsSyncPoint
);
1552 SET_EXPECT(MediaSample_GetTime
);
1553 SET_EXPECT(MediaSample_GetMediaType
);
1554 SET_EXPECT(MediaSample_GetPointer
);
1555 SET_EXPECT(MediaSample_GetActualDataLength
);
1556 SET_EXPECT(MediaSample_GetSize
);
1557 SET_EXPECT(MediaSample_GetMediaTime
);
1558 hr
= IMemInputPin_Receive(memin
, &MediaSample
);
1559 ok(hr
== S_OK
, "Receive returned %x\n", hr
);
1560 CHECK_CALLED(MediaSample_QueryInterface_MediaSample2
);
1561 todo_wine
CHECK_CALLED(MediaSample_IsDiscontinuity
);
1562 todo_wine
CHECK_CALLED(MediaSample_IsPreroll
);
1563 CHECK_CALLED(MediaSample_IsSyncPoint
);
1564 CHECK_CALLED(MediaSample_GetTime
);
1565 todo_wine
CHECK_CALLED(MediaSample_GetMediaType
);
1566 CHECK_CALLED(MediaSample_GetPointer
);
1567 CHECK_CALLED(MediaSample_GetActualDataLength
);
1568 todo_wine
CHECK_CALLED(MediaSample_GetSize
);
1569 todo_wine
CHECK_CALLED(MediaSample_GetMediaTime
);
1571 SET_EXPECT(MediaSample_QueryInterface_MediaSample2
);
1572 SET_EXPECT(MediaSample_IsDiscontinuity
);
1573 SET_EXPECT(MediaSample_IsPreroll
);
1574 SET_EXPECT(MediaSample_IsSyncPoint
);
1575 SET_EXPECT(MediaSample_GetTime
);
1576 SET_EXPECT(MediaSample_GetMediaType
);
1577 SET_EXPECT(MediaSample_GetPointer
);
1578 SET_EXPECT(MediaSample_GetActualDataLength
);
1579 SET_EXPECT(MediaSample_GetSize
);
1580 SET_EXPECT(MediaSample_GetMediaTime
);
1581 start_time
= 20000000;
1582 end_time
= 21000000;
1583 hr
= IMemInputPin_Receive(memin
, &MediaSample
);
1584 ok(hr
== S_OK
, "Receive returned %x\n", hr
);
1585 CHECK_CALLED(MediaSample_QueryInterface_MediaSample2
);
1586 todo_wine
CHECK_CALLED(MediaSample_IsDiscontinuity
);
1587 todo_wine
CHECK_CALLED(MediaSample_IsPreroll
);
1588 CHECK_CALLED(MediaSample_IsSyncPoint
);
1589 CHECK_CALLED(MediaSample_GetTime
);
1590 todo_wine
CHECK_CALLED(MediaSample_GetMediaType
);
1591 CHECK_CALLED(MediaSample_GetPointer
);
1592 CHECK_CALLED(MediaSample_GetActualDataLength
);
1593 todo_wine
CHECK_CALLED(MediaSample_GetSize
);
1594 todo_wine
CHECK_CALLED(MediaSample_GetMediaTime
);
1595 IMemInputPin_Release(memin
);
1597 hr
= IBaseFilter_Stop(avimux
);
1598 ok(hr
== S_OK
, "Stop returned %x\n", hr
);
1599 CHECK_CALLED(MemInputPin_QueryInterface_IStream
);
1601 hr
= IBaseFilter_GetState(avimux
, 0, &state
);
1602 ok(hr
== S_OK
, "GetState returned %x\n", hr
);
1603 ok(state
== State_Stopped
, "state = %d\n", state
);
1605 hr
= IPin_Disconnect(avimux_out
);
1606 ok(hr
== S_OK
, "Disconnect returned %x\n", hr
);
1608 IPin_Release(avimux_in
);
1609 IPin_Release(avimux_out
);
1610 ref
= IBaseFilter_Release(avimux
);
1611 ok(ref
== 0, "Avi Mux filter was not destroyed (%d)\n", ref
);
1613 if(arg
&& !strcmp(arg
, "save")) {
1619 f
= CreateFileA("avimux.avi", GENERIC_WRITE
, 0, NULL
,
1620 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1621 ok(f
!= INVALID_HANDLE_VALUE
, "CreateFile failed\n");
1624 hr
= IStream_Seek(avi_stream
, li
, STREAM_SEEK_SET
, NULL
);
1625 ok(hr
== S_OK
, "IStream_Seek failed: %x\n", hr
);
1628 hr
= IStream_Read(avi_stream
, buf
, sizeof(buf
), &read
);
1630 ok(0, "IStream_Read failed: %x\n", hr
);
1635 ok(WriteFile(f
, buf
, read
, &read
, NULL
), "WriteFile failed\n");
1642 ref
= IStream_Release(avi_stream
);
1643 ok(ref
== 0, "IStream was not destroyed (%d)\n", ref
);
1648 if (SUCCEEDED(CoInitialize(NULL
)))
1653 arg_c
= winetest_get_mainargs(&arg_v
);
1655 test_AviMux(arg_c
>2 ? arg_v
[2] : NULL
);
1660 skip("CoInitialize failed\n");