annotate loader/dshow/DS_Filter.c @ 29938:eb6c70e2cbea

Very preliminary code to allow selecting the OpenGL backend at runtime. Works in the currently supported cases for only Win32 and only X11, the mixed case is not working yet though. But applied anyway since the code is slightly less messy than the current one.
author reimar
date Tue, 08 Dec 2009 06:42:46 +0000
parents 0f1b5b68af32
children 008338d7679f
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"
26999
0b21ffa03b9c Rename loader/driver.[ch] to loader/drv.[ch], otherwise loader/driver.h can
diego
parents: 25849
diff changeset
8 #include "drv.h"
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
9 #include "com.h"
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
10 #include <stdio.h>
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
11 #include <string.h>
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 6768
diff changeset
12 #include <stdlib.h>
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 6768
diff changeset
13 #include "win32.h" // printf macro
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
14
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
15 typedef long STDCALL (*GETCLASS) (const GUID*, const GUID*, void**);
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
16
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
17 #ifndef WIN32_LOADER
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
18 const GUID IID_IUnknown =
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
19 {
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
20 0x00000000, 0x0000, 0x0000,
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
21 {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
22 };
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
23 const GUID IID_IClassFactory =
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
24 {
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
25 0x00000001, 0x0000, 0x0000,
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
26 {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
27 };
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
28
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
29 HRESULT STDCALL CoInitialize(LPVOID pvReserved);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
30 void STDCALL CoUninitialize(void);
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
31 #endif
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
32
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
33 static void DS_Filter_Start(DS_Filter* This)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
34 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
35 HRESULT hr;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
36
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
37 //Debug printf("DS_Filter_Start(%p)\n", This);
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
38 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
39 if (hr != 0)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
40 {
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
41 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
42 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
43 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
44
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
45 static void DS_Filter_Stop(DS_Filter* This)
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
46 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
47 if (This->m_pAll)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
48 {
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
49 //Debug printf("DS_Filter_Stop(%p)\n", This);
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
50 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
51 This->m_pAll->vt->Release((IUnknown*)This->m_pAll);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
52 This->m_pAll = 0;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
53 }
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
54 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
55
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
56 void DS_Filter_Destroy(DS_Filter* This)
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
57 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
58 This->Stop(This);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
59
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
60 if (This->m_pOurInput)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
61 This->m_pOurInput->vt->Release((IUnknown*)This->m_pOurInput);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
62 if (This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
63 This->m_pInputPin->vt->Disconnect(This->m_pInputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
64 if (This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
65 This->m_pOutputPin->vt->Disconnect(This->m_pOutputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
66 if (This->m_pFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
67 This->m_pFilter->vt->Release((IUnknown*)This->m_pFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
68 if (This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
69 This->m_pOutputPin->vt->Release((IUnknown*)This->m_pOutputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
70 if (This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
71 This->m_pInputPin->vt->Release((IUnknown*)This->m_pInputPin);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
72 if (This->m_pImp)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
73 This->m_pImp->vt->Release((IUnknown*)This->m_pImp);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
74
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
75 if (This->m_pOurOutput)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
76 This->m_pOurOutput->vt->Release((IUnknown*)This->m_pOurOutput);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
77 if (This->m_pParentFilter)
3130
623cdb771e97 avifile sync. seems to some bugs fixed...
arpi
parents: 3056
diff changeset
78 This->m_pParentFilter->vt->Release((IUnknown*)This->m_pParentFilter);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
79 if (This->m_pSrcFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
80 This->m_pSrcFilter->vt->Release((IUnknown*)This->m_pSrcFilter);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
81
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
82 // FIXME - we are still leaving few things allocated!
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
83 if (This->m_iHandle)
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
84 FreeLibrary((unsigned)This->m_iHandle);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
85
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
86 free(This);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
87
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
88 #ifdef WIN32_LOADER
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
89 CodecRelease();
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
90 #else
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
91 CoUninitialize();
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
92 #endif
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
93 }
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
94
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
95 static HRESULT STDCALL DS_Filter_CopySample(void* pUserData,IMediaSample* pSample){
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
96 BYTE* pointer;
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
97 int len;
25682
09f31d37d717 Remove another 2 useless casts
reimar
parents: 25680
diff changeset
98 SampleProcUserData* pData=pUserData;
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
99 Debug printf("CopySample called(%p,%p)\n",pSample,pUserData);
25682
09f31d37d717 Remove another 2 useless casts
reimar
parents: 25680
diff changeset
100 if (pSample->vt->GetPointer(pSample, &pointer))
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
101 return 1;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
102 len = pSample->vt->GetActualDataLength(pSample);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
103 if (len == 0)
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
104 len = pSample->vt->GetSize(pSample);//for iv50
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
105
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
106 pData->frame_pointer = pointer;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
107 pData->frame_size = len;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
108 /*
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
109 FILE* file=fopen("./uncompr.bmp", "wb");
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
110 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
111 *(int*)(&head[2])=len+0x36;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
112 fwrite(head, 14, 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
113 fwrite(&((VIDEOINFOHEADER*)me.type.pbFormat)->bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
114 fwrite(pointer, len, 1, file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
115 fclose(file);
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
116 */
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
117 return 0;
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
118 }
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
119
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
120 DS_Filter* DS_FilterCreate(const char* dllname, const GUID* id,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
121 AM_MEDIA_TYPE* in_fmt,
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
122 AM_MEDIA_TYPE* out_fmt,SampleProcUserData* pUserData)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
123 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
124 int init = 0;
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7386
diff changeset
125 // char eb[250];
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
126 const char* em = NULL;
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
127 MemAllocator* tempAll;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
128 ALLOCATOR_PROPERTIES props,props1;
25677
b3f780273cb1 Remove a useless cast
reimar
parents: 24405
diff changeset
129 DS_Filter* This = malloc(sizeof(DS_Filter));
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
130 if (!This)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
131 return NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
132
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
133 #ifdef WIN32_LOADER
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
134 CodecAlloc();
9967
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
135 #else
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
136 CoInitialize(0L);
b0d1b415320c cygwin support patch by Sascha Sommer and some fixes by me
alex
parents: 8292
diff changeset
137 #endif
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
138
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
139 /*
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
140 tempAll is not used anywhere.
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
141 MemAllocatorCreate() is called to ensure that RegisterComObject for IMemoryAllocator
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
142 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
143 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
144 */
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
145 tempAll=MemAllocatorCreate();
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
146 This->m_pFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
147 This->m_pInputPin = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
148 This->m_pOutputPin = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
149 This->m_pSrcFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
150 This->m_pParentFilter = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
151 This->m_pOurInput = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
152 This->m_pOurOutput = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
153 This->m_pAll = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
154 This->m_pImp = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
155
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
156 This->Start = DS_Filter_Start;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
157 This->Stop = DS_Filter_Stop;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
158
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
159 for (;;)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
160 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
161 GETCLASS func;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
162 struct IClassFactory* factory = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
163 struct IUnknown* object = NULL;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
164 IEnumPins* enum_pins = 0;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
165 IPin* array[256];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
166 ULONG fetched;
25679
12fcf17e83e0 Move variable declaration into block where it is used.
reimar
parents: 25678
diff changeset
167 HRESULT result;
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
168 unsigned int i;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
169
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
170 This->m_iHandle = LoadLibraryA(dllname);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
171 if (!This->m_iHandle)
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
172 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
173 em = "could not open DirectShow DLL";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
174 break;
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
175 }
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
176 func = (GETCLASS)GetProcAddress((unsigned)This->m_iHandle, "DllGetClassObject");
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
177 if (!func)
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
178 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
179 em = "illegal or corrupt DirectShow DLL";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
180 break;
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
181 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
182 result = func(id, &IID_IClassFactory, (void*)&factory);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
183 if (result || !factory)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
184 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
185 em = "no such class object";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
186 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
187 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
188 result = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void*)&object);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
189 factory->vt->Release((IUnknown*)factory);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
190 if (result || !object)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
191 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
192 em = "class factory failure";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
193 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
194 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
195 result = object->vt->QueryInterface(object, &IID_IBaseFilter, (void*)&This->m_pFilter);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
196 object->vt->Release((IUnknown*)object);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
197 if (result || !This->m_pFilter)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
198 {
7386
174e2a58b4cd avifile sync - 95% cosmetics 5% bug
arpi
parents: 6768
diff changeset
199 em = "object does not provide IBaseFilter interface";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
200 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
201 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
202 // enumerate pins
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
203 result = This->m_pFilter->vt->EnumPins(This->m_pFilter, &enum_pins);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
204 if (result || !enum_pins)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
205 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
206 em = "could not enumerate pins";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
207 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
208 }
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
209
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
210 enum_pins->vt->Reset(enum_pins);
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
211 result = enum_pins->vt->Next(enum_pins, (ULONG)256, (IPin**)array, &fetched);
8292
9533c26c0806 avifile sync (mostly cosmetics)
arpi
parents: 7472
diff changeset
212 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
213
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
214 for (i = 0; i < fetched; i++)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
215 {
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
216 PIN_DIRECTION direction = -1;
25680
866022c27d67 Remove a cast useless since r24425.
reimar
parents: 25679
diff changeset
217 array[i]->vt->QueryDirection(array[i], &direction);
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
218 if (!This->m_pInputPin && direction == PINDIR_INPUT)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
219 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
220 This->m_pInputPin = array[i];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
221 This->m_pInputPin->vt->AddRef((IUnknown*)This->m_pInputPin);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
222 }
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
223 if (!This->m_pOutputPin && direction == PINDIR_OUTPUT)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
224 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
225 This->m_pOutputPin = array[i];
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
226 This->m_pOutputPin->vt->AddRef((IUnknown*)This->m_pOutputPin);
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
227 }
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
228 array[i]->vt->Release((IUnknown*)(array[i]));
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
229 }
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
230 if (!This->m_pInputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
231 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
232 em = "could not find input pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
233 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
234 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
235 if (!This->m_pOutputPin)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
236 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
237 em = "could not find output pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
238 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
239 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
240 result = This->m_pInputPin->vt->QueryInterface((IUnknown*)This->m_pInputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
241 &IID_IMemInputPin,
24405
3758413ca0c6 Fix for:
voroshil
parents: 22398
diff changeset
242 (void*)&This->m_pImp);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
243 if (result)
3056
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 get IMemInputPin interface";
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 }
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
248
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
249 This->m_pOurType = in_fmt;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
250 This->m_pDestType = out_fmt;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
251 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
252 if (result)
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
253 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
254 em = "source format is not accepted";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
255 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
256 }
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
257 This->m_pParentFilter = CBaseFilter2Create();
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
258 This->m_pSrcFilter = CBaseFilterCreate(This->m_pOurType, This->m_pParentFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
259 This->m_pOurInput = This->m_pSrcFilter->GetPin(This->m_pSrcFilter);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
260 This->m_pOurInput->vt->AddRef((IUnknown*)This->m_pOurInput);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
261
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
262 result = This->m_pInputPin->vt->ReceiveConnection(This->m_pInputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
263 This->m_pOurInput,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
264 This->m_pOurType);
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
265 if (result)
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
266 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
267 em = "could not connect to input pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
268 break;
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
269 }
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
270 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
271 if (result || !This->m_pAll)
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
272 {
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
273 em="error getting IMemAllocator interface";
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
274 break;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
275 }
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
276
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
277 //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
278 props.cBuffers=1;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
279 props.cbBuffer=This->m_pOurType->lSampleSize;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
280 props.cbAlign=1;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
281 props.cbPrefix=0;
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
282 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
283
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
284 //Notify remote pin about choosed allocator
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
285 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
286
22398
49f01f8fbd60 Rework of copying samples from directshow codecs.
voroshil
parents: 22304
diff changeset
287 This->m_pOurOutput = COutputPinCreate(This->m_pDestType,DS_Filter_CopySample,pUserData);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
288
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
289 result = This->m_pOutputPin->vt->ReceiveConnection(This->m_pOutputPin,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
290 (IPin*) This->m_pOurOutput,
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
291 This->m_pDestType);
713
9355b2ae634e avifile-0.6-CVS merge
arpi_esp
parents: 342
diff changeset
292 if (result)
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
293 {
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
294 em = "could not connect to output pin";
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
295 break;
1545
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
296 }
da26060c81ef big avifile sync - from now we have common code
arpi
parents: 1525
diff changeset
297
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
298 init++;
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
299 break;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
300 }
22304
254733f57707 Fixed loading of VoxWare and wma9sp binary audio codecs using dshow engine.
voroshil
parents: 18783
diff changeset
301 tempAll->vt->Release(tempAll);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
302
3467
e3bbf44dbab2 avifile sync
arpi
parents: 3130
diff changeset
303 if (!init)
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
304 {
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
305 DS_Filter_Destroy(This);
25678
ebf1c7d24ca2 Remove result from warning string, it has no useful meaning here.
reimar
parents: 25677
diff changeset
306 printf("Warning: DS_Filter() %s. (DLL=%.200s)\n", em, dllname);
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
307 This = 0;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
308 }
3056
213b35f84cf3 C++ -> C (import from avifile cvs)
arpi
parents: 2580
diff changeset
309 return This;
168
bdc4a8fc04d8 Initial revision
arpi_esp
parents:
diff changeset
310 }