annotate loader/dshow/DS_Filter.c @ 33040:a6be6a134ac0

Fix XVMC decoding (avcodec_open would fail if thread_count is set) and simplify code a bit in the process.
author reimar
date Sun, 27 Mar 2011 13:09:27 +0000
parents c121d03db8b9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15166
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 9967
diff changeset
1 /*
18783
0783dd397f74 CVS --> Subversion in copyright notices
diego
parents: 15166
diff changeset
2 * Modified for use with MPlayer, detailed changelog at
0783dd397f74 CVS --> Subversion in copyright notices
diego
parents: 15166
diff changeset
3 * http://svn.mplayerhq.hu/mplayer/trunk/
15166
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 9967
diff changeset
4 */
f5537cc95b02 Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents: 9967
diff changeset
5
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
6 #include "config.h"
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
7 #include "DS_Filter.h"
30824
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
8 #include "graph.h"
30170
008338d7679f Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents: 29263
diff changeset
9 #include "loader/drv.h"
008338d7679f Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents: 29263
diff changeset
10 #include "loader/com.h"
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
11 #include <stdio.h>
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
12 #include <string.h>
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 6768
diff changeset
13 #include <stdlib.h>
30170
008338d7679f Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents: 29263
diff changeset
14 #include "loader/win32.h" // printf macro
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
15
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
16 typedef long STDCALL (*GETCLASS) (const GUID*, const GUID*, void**);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
17
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
18 #ifndef WIN32_LOADER
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
19 const GUID IID_IUnknown =
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
20 {
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
21 0x00000000, 0x0000, 0x0000,
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
22 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
23 };
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
24 const GUID IID_IClassFactory =
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
25 {
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
26 0x00000001, 0x0000, 0x0000,
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
27 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
28 };
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
29
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
30 HRESULT STDCALL CoInitialize(LPVOID pvReserved);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
31 void STDCALL CoUninitialize(void);
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
32 #endif
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
33
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
34 static void DS_Filter_Start(DS_Filter* This)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
35 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
36 HRESULT hr;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
37
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
38 //Debug printf("DS_Filter_Start(%p)\n", This);
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
39 hr = This->m_pFilter->vt->Run(This->m_pFilter, (REFERENCE_TIME)0);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
40 if (hr != 0)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
41 {
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
42 Debug printf("WARNING: m_Filter->Run() failed, error code %x\n", (int)hr);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
43 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
44 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
45
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
46 static void DS_Filter_Stop(DS_Filter* This)
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
47 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
48 if (This->m_pAll)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
49 {
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
50 //Debug printf("DS_Filter_Stop(%p)\n", This);
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
51 This->m_pFilter->vt->Stop(This->m_pFilter); // causes weird crash ??? FIXME
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
52 This->m_pAll->vt->Release((IUnknown*)This->m_pAll);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
53 This->m_pAll = 0;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
54 }
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
55 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
56
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
57 void DS_Filter_Destroy(DS_Filter* This)
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
58 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
59 This->Stop(This);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
60
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
61 if (This->m_pOurInput)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
62 This->m_pOurInput->vt->Release((IUnknown*)This->m_pOurInput);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
63 if (This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
64 This->m_pInputPin->vt->Disconnect(This->m_pInputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
65 if (This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
66 This->m_pOutputPin->vt->Disconnect(This->m_pOutputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
67 if (This->m_pFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
68 This->m_pFilter->vt->Release((IUnknown*)This->m_pFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
69 if (This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
70 This->m_pOutputPin->vt->Release((IUnknown*)This->m_pOutputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
71 if (This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
72 This->m_pInputPin->vt->Release((IUnknown*)This->m_pInputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
73 if (This->m_pImp)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
74 This->m_pImp->vt->Release((IUnknown*)This->m_pImp);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
75
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
76 if (This->m_pOurOutput)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
77 This->m_pOurOutput->vt->Release((IUnknown*)This->m_pOurOutput);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
78 if (This->m_pParentFilter)
3130
623cdb771e97 avifile sync. seems to some bugs fixed...
arpi
parents: 3056
diff changeset
79 This->m_pParentFilter->vt->Release((IUnknown*)This->m_pParentFilter);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
80 if (This->m_pSrcFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
81 This->m_pSrcFilter->vt->Release((IUnknown*)This->m_pSrcFilter);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
82
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
83 // FIXME - we are still leaving few things allocated!
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
84 if (This->m_iHandle)
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
85 FreeLibrary((unsigned)This->m_iHandle);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
86
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
87 free(This);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
88
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
89 #ifdef WIN32_LOADER
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
90 CodecRelease();
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
91 #else
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
92 CoUninitialize();
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
93 #endif
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
94 }
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
95
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
96 static HRESULT STDCALL DS_Filter_CopySample(void* pUserData,IMediaSample* pSample){
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
97 BYTE* pointer;
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
98 int len;
25682
09f31d37d717 Remove another 2 useless casts
reimar
parents: 25680
diff changeset
99 SampleProcUserData* pData=pUserData;
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
100 Debug printf("CopySample called(%p,%p)\n",pSample,pUserData);
25682
09f31d37d717 Remove another 2 useless casts
reimar
parents: 25680
diff changeset
101 if (pSample->vt->GetPointer(pSample, &pointer))
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
102 return 1;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
103 len = pSample->vt->GetActualDataLength(pSample);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
104 if (len == 0)
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
105 len = pSample->vt->GetSize(pSample);//for iv50
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
106
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
107 pData->frame_pointer = pointer;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
108 pData->frame_size = len;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
109 /*
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
110 FILE* file=fopen("./uncompr.bmp", "wb");
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
111 char head[14]={0x42, 0x4D, 0x36, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00};
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
112 *(int*)(&head[2])=len+0x36;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
113 fwrite(head, 14, 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
114 fwrite(&((VIDEOINFOHEADER*)me.type.pbFormat)->bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
115 fwrite(pointer, len, 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
116 fclose(file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
117 */
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
118 return 0;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
119 }
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
120
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
121 DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
122 AM_MEDIA_TYPE* in_fmt,
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
123 AM_MEDIA_TYPE* out_fmt,SampleProcUserData* pUserData)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
124 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
125 int init = 0;
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7386
diff changeset
126 // char eb[250];
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
127 const char* em = NULL;
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
128 MemAllocator* tempAll;
30824
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
129 FilterGraph* graph;
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
130 ALLOCATOR_PROPERTIES props,props1;
25677
b3f780273cb1 Remove a useless cast
reimar
parents: 24405
diff changeset
131 DS_Filter* This = malloc(sizeof(DS_Filter));
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
132 if (!This)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
133 return NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
134
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
135 #ifdef WIN32_LOADER
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
136 CodecAlloc();
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
137 #else
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
138 CoInitialize(0L);
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
139 #endif
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
140
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
141 /*
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
142 tempAll is not used anywhere.
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
143 MemAllocatorCreate() is called to ensure that RegisterComObject for IMemoryAllocator
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
144 will be called before possible call
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
145 to CoCreateInstance(...,&IID_IMemoryAllocator,...) from binary codec.
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
146 */
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
147 tempAll=MemAllocatorCreate();
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
148 This->m_pFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
149 This->m_pInputPin = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
150 This->m_pOutputPin = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
151 This->m_pSrcFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
152 This->m_pParentFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
153 This->m_pOurInput = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
154 This->m_pOurOutput = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
155 This->m_pAll = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
156 This->m_pImp = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
157
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
158 This->Start = DS_Filter_Start;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
159 This->Stop = DS_Filter_Stop;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
160
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
161 for (;;)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
162 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
163 GETCLASS func;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
164 struct IClassFactory* factory = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
165 struct IUnknown* object = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
166 IEnumPins* enum_pins = 0;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
167 IPin* array[256];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
168 ULONG fetched;
25679
12fcf17e83e0 Move variable declaration into block where it is used.
reimar
parents: 25678
diff changeset
169 HRESULT result;
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
170 unsigned int i;
30824
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
171 static const uint16_t filter_name[] = { 'F', 'i', 'l', 't', 'e', 'r', 0 };
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
172
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
173 This->m_iHandle = LoadLibraryA(dllname);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
174 if (!This->m_iHandle)
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
175 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
176 em = "could not open DirectShow DLL";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
177 break;
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
178 }
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
179 func = (GETCLASS)GetProcAddress((unsigned)This->m_iHandle, "DllGetClassObject");
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
180 if (!func)
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
181 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
182 em = "illegal or corrupt DirectShow DLL";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
183 break;
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
184 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
185 result = func(id, &IID_IClassFactory, (void*)&factory);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
186 if (result || !factory)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
187 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
188 em = "no such class object";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
189 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
190 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
191 result = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void*)&object);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
192 factory->vt->Release((IUnknown*)factory);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
193 if (result || !object)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
194 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
195 em = "class factory failure";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
196 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
197 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
198 result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void*)&This->m_pFilter);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
199 object->vt->Release((IUnknown*)object);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
200 if (result || !This->m_pFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
201 {
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 6768
diff changeset
202 em = "object does not provide IBaseFilter interface";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
203 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
204 }
30824
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
205
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
206 graph = FilterGraphCreate();
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
207 result = This->m_pFilter->vt->JoinFilterGraph(This->m_pFilter, (IFilterGraph*)graph, filter_name);
c121d03db8b9 Implement DirectShow filter graph.
sesse
parents: 30474
diff changeset
208
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
209 // enumerate pins
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
210 result = This->m_pFilter->vt->EnumPins(This->m_pFilter, &enum_pins);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
211 if (result || !enum_pins)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
212 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
213 em = "could not enumerate pins";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
214 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
215 }
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
216
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
217 enum_pins->vt->Reset(enum_pins);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
218 result = enum_pins->vt->Next(enum_pins, (ULONG)256, (IPin**)array, &fetched);
30474
31a00b2a621f Release pin enumerator after we are done using it.
reimar
parents: 30170
diff changeset
219 enum_pins->vt->Release(enum_pins);
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
220 Debug printf("Pins enumeration returned %ld pins, error is %x\n", fetched, (int)result);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
221
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
222 for (i = 0; i < fetched; i++)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
223 {
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
224 PIN_DIRECTION direction = -1;
25680
866022c27d67 Remove a cast useless since r24425.
reimar
parents: 25679
diff changeset
225 array[i]->vt->QueryDirection(array[i], &direction);
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
226 if (!This->m_pInputPin && direction == PINDIR_INPUT)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
227 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
228 This->m_pInputPin = array[i];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
229 This->m_pInputPin->vt->AddRef((IUnknown*)This->m_pInputPin);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
230 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
231 if (!This->m_pOutputPin && direction == PINDIR_OUTPUT)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
232 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
233 This->m_pOutputPin = array[i];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
234 This->m_pOutputPin->vt->AddRef((IUnknown*)This->m_pOutputPin);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
235 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
236 array[i]->vt->Release((IUnknown*)(array[i]));
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
237 }
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
238 if (!This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
239 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
240 em = "could not find input pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
241 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
242 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
243 if (!This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
244 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
245 em = "could not find output pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
246 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
247 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
248 result = This->m_pInputPin->vt->QueryInterface((IUnknown*)This->m_pInputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
249 &IID_IMemInputPin,
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
250 (void*)&This->m_pImp);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
251 if (result)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
252 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
253 em = "could not get IMemInputPin interface";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
254 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
255 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
256
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
257 This->m_pOurType = in_fmt;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
258 This->m_pDestType = out_fmt;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
259 result = This->m_pInputPin->vt->QueryAccept(This->m_pInputPin, This->m_pOurType);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
260 if (result)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
261 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
262 em = "source format is not accepted";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
263 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
264 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
265 This->m_pParentFilter = CBaseFilter2Create();
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
266 This->m_pSrcFilter = CBaseFilterCreate(This->m_pOurType, This->m_pParentFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
267 This->m_pOurInput = This->m_pSrcFilter->GetPin(This->m_pSrcFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
268 This->m_pOurInput->vt->AddRef((IUnknown*)This->m_pOurInput);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
269
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
270 result = This->m_pInputPin->vt->ReceiveConnection(This->m_pInputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
271 This->m_pOurInput,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
272 This->m_pOurType);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
273 if (result)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
274 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
275 em = "could not connect to input pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
276 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
277 }
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
278 result = This->m_pImp->vt->GetAllocator(This->m_pImp, &This->m_pAll);
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
279 if (result || !This->m_pAll)
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
280 {
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
281 em="error getting IMemAllocator interface";
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
282 break;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
283 }
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
284
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
285 //Seting allocator property according to our media type
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
286 props.cBuffers=1;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
287 props.cbBuffer=This->m_pOurType->lSampleSize;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
288 props.cbAlign=1;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
289 props.cbPrefix=0;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
290 This->m_pAll->vt->SetProperties(This->m_pAll, &props, &props1);
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
291
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
292 //Notify remote pin about choosed allocator
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
293 This->m_pImp->vt->NotifyAllocator(This->m_pImp, This->m_pAll, 0);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
294
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
295 This->m_pOurOutput = COutputPinCreate(This->m_pDestType,DS_Filter_CopySample,pUserData);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
296
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
297 result = This->m_pOutputPin->vt->ReceiveConnection(This->m_pOutputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
298 (IPin*) This->m_pOurOutput,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
299 This->m_pDestType);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
300 if (result)
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
301 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
302 em = "could not connect to output pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
303 break;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
304 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
305
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
306 init++;
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
307 break;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
308 }
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
309 tempAll->vt->Release(tempAll);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
310
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
311 if (!init)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
312 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
313 DS_Filter_Destroy(This);
25678
ebf1c7d24ca2 Remove result from warning string, it has no useful meaning here.
reimar
parents: 25677
diff changeset
314 printf("Warning: DS_Filter() %s. (DLL=%.200s)\n", em, dllname);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
315 This = 0;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
316 }
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
317 return This;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
318 }