Mercurial > mplayer.hg
annotate loader/dmo/dmo.c @ 34756:df3ff52039fe
Add code to support CC subtitles in ASTC and MOV.
Code to actually use these will be added later, since it
needs special code in FFmpeg.
Code for MOV is already read, ASTC might take longer.
author | reimar |
---|---|
date | Sat, 07 Apr 2012 00:10:27 +0000 |
parents | 9fc9d1e788aa |
children | 277b0288b0f9 |
rev | line source |
---|---|
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
9967
diff
changeset
|
1 /* |
18783 | 2 * Modified for use with MPlayer, detailed changelog at |
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:
8294
diff
changeset
|
6 #include "config.h" |
8294 | 7 #include "DMO_Filter.h" |
30170
008338d7679f
Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents:
29212
diff
changeset
|
8 #include "loader/drv.h" |
008338d7679f
Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents:
29212
diff
changeset
|
9 #include "loader/com.h" |
8294 | 10 #include <stdio.h> |
11 #include <stdlib.h> | |
12 #include <string.h> | |
30170
008338d7679f
Drop -Iloader from CPPFLAGS for the loader subdirectory.
diego
parents:
29212
diff
changeset
|
13 #include "loader/win32.h" // printf macro |
8294 | 14 |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28094
diff
changeset
|
15 void trapbug(void); |
8294 | 16 typedef long STDCALL (*GETCLASS) (const GUID*, const GUID*, void**); |
17 | |
18 void DMO_Filter_Destroy(DMO_Filter* This) | |
19 { | |
20 if (This->m_pOptim) | |
21 This->m_pOptim->vt->Release((IUnknown*)This->m_pOptim); | |
22 if (This->m_pInPlace) | |
23 This->m_pInPlace->vt->Release((IUnknown*)This->m_pInPlace); | |
24 if (This->m_pMedia) | |
25 This->m_pMedia->vt->Release((IUnknown*)This->m_pMedia); | |
26 | |
27 free(This); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8294
diff
changeset
|
28 #ifdef WIN32_LOADER |
8294 | 29 CodecRelease(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8294
diff
changeset
|
30 #endif |
8294 | 31 } |
32 | |
33 DMO_Filter* DMO_FilterCreate(const char* dllname, const GUID* id, | |
34 DMO_MEDIA_TYPE* in_fmt, | |
35 DMO_MEDIA_TYPE* out_fmt) | |
36 { | |
37 HRESULT hr = 0; | |
38 const char* em = NULL; | |
30702 | 39 DMO_Filter* This = malloc(sizeof(DMO_Filter)); |
8294 | 40 if (!This) |
41 return NULL; | |
42 | |
43 memset(This, 0, sizeof(DMO_Filter)); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8294
diff
changeset
|
44 #ifdef WIN32_LOADER |
8294 | 45 CodecAlloc(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8294
diff
changeset
|
46 #endif |
8294 | 47 |
48 //This->Start = DS_Filter_Start; | |
49 //This->Stop = DS_Filter_Stop; | |
50 | |
51 for (;;) | |
52 { | |
53 GETCLASS func; | |
54 struct IClassFactory* factory = NULL; | |
55 struct IUnknown* object = NULL; | |
56 unsigned int i; | |
57 unsigned long inputs, outputs; | |
58 | |
59 This->m_iHandle = LoadLibraryA(dllname); | |
60 if (!This->m_iHandle) | |
61 { | |
62 em = "could not open DMO DLL"; | |
63 break; | |
64 } | |
65 func = (GETCLASS)GetProcAddress((unsigned)This->m_iHandle, "DllGetClassObject"); | |
66 if (!func) | |
67 { | |
68 em = "illegal or corrupt DMO DLL"; | |
69 break; | |
70 } | |
71 //trapbug(); | |
24405 | 72 hr = func(id, &IID_IClassFactory, (void*)&factory); |
8294 | 73 if (hr || !factory) |
74 { | |
75 em = "no such class object"; | |
76 break; | |
77 } | |
24405 | 78 hr = factory->vt->CreateInstance(factory, 0, &IID_IUnknown, (void*)&object); |
8294 | 79 factory->vt->Release((IUnknown*)factory); |
80 if (hr || !object) | |
81 { | |
82 em = "class factory failure"; | |
83 break; | |
84 } | |
24405 | 85 hr = object->vt->QueryInterface(object, &IID_IMediaObject, (void*)&This->m_pMedia); |
8294 | 86 if (hr == 0) |
87 { | |
88 /* query for some extra available interface */ | |
24405 | 89 HRESULT r = object->vt->QueryInterface(object, &IID_IMediaObjectInPlace, (void*)&This->m_pInPlace); |
8294 | 90 if (r == 0 && This->m_pInPlace) |
91 printf("DMO dll supports InPlace - PLEASE REPORT to developer\n"); | |
24405 | 92 r = object->vt->QueryInterface(object, &IID_IDMOVideoOutputOptimizations, (void*)&This->m_pOptim); |
8294 | 93 if (r == 0 && This->m_pOptim) |
94 { | |
95 unsigned long flags; | |
96 r = This->m_pOptim->vt->QueryOperationModePreferences(This->m_pOptim, 0, &flags); | |
97 printf("DMO dll supports VO Optimizations %ld %lx\n", r, flags); | |
98 if (flags & DMO_VOSF_NEEDS_PREVIOUS_SAMPLE) | |
99 printf("DMO dll might use previous sample when requested\n"); | |
100 } | |
101 } | |
102 object->vt->Release((IUnknown*)object); | |
103 if (hr || !This->m_pMedia) | |
104 { | |
105 em = "object does not provide IMediaObject interface"; | |
106 break; | |
107 } | |
108 hr = This->m_pMedia->vt->SetInputType(This->m_pMedia, 0, in_fmt, 0); | |
109 if (hr) | |
110 { | |
111 em = "input format not accepted"; | |
112 break; | |
113 } | |
114 | |
115 if (0) { | |
116 DMO_MEDIA_TYPE dmo; | |
24393 | 117 //VIDEOINFOHEADER* vi; |
8294 | 118 memset(&dmo, 0, sizeof(dmo)); |
119 i = This->m_pMedia->vt->GetOutputType(This->m_pMedia, 0, 2, &dmo); | |
28094
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
120 Debug printf("GetOutputType %x \n", i); |
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
121 Debug printf("DMO 0x%x (%.4s) 0x%x (%.4s)\n" |
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
122 //Debug printf("DMO 0x%x 0x%x\n" |
8294 | 123 ":: fixszsamp:%d tempcomp:%d sampsz:%ld\n" |
124 ":: formtype: 0x%x\n" | |
125 ":: unk %p cbform: %ld pbform:%p\n", | |
126 dmo.majortype.f1, | |
127 (const char*)&dmo.majortype.f1, | |
128 dmo.subtype.f1, | |
129 (const char*)&dmo.subtype.f1, | |
130 dmo.bFixedSizeSamples, dmo.bTemporalCompression, | |
131 dmo.lSampleSize, | |
132 dmo.formattype.f1, | |
133 dmo.pUnk, dmo.cbFormat, dmo.pbFormat | |
134 ); | |
135 /* vi = (VIDEOINFOHEADER*) dmo.pbFormat; | |
136 vi = (VIDEOINFOHEADER*) out_fmt->pbFormat; | |
137 for (i = 0; i < out_fmt->cbFormat; i++) | |
28094
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
138 Debug printf("BYTE %d %02x %02x\n", i, ((uint8_t*)dmo.pbFormat)[i], ((uint8_t*)out_fmt->pbFormat)[i]); |
8294 | 139 */ |
140 } | |
141 | |
142 hr = This->m_pMedia->vt->SetOutputType(This->m_pMedia, 0, out_fmt, 0); | |
143 if (hr) | |
144 { | |
145 em = "output format no accepted"; | |
146 break; | |
147 } | |
148 | |
149 inputs = outputs = 0; | |
150 hr = This->m_pMedia->vt->GetOutputSizeInfo(This->m_pMedia, 0, &inputs, &outputs); | |
28094
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
151 Debug printf("GetOutput r=0x%lx size:%ld align:%ld\n", hr, inputs, outputs); |
8294 | 152 |
153 // This->m_pMedia->vt->AllocateStreamingResources(This->m_pMedia); | |
154 hr = This->m_pMedia->vt->GetStreamCount(This->m_pMedia, &inputs, &outputs); | |
28094
1e6d3a382e7b
Change some printf calls to 'Debug printf' so as not to pollute stdout.
diego
parents:
26999
diff
changeset
|
155 Debug printf("StreamCount r=0x%lx %ld %ld\n", hr, inputs, outputs); |
8294 | 156 |
157 break; | |
158 } | |
159 if (em) | |
160 { | |
161 DMO_Filter_Destroy(This); | |
162 printf("IMediaObject ERROR: %p %s (0x%lx : %ld)\n", em, em ? em : "", hr, hr); | |
163 This = 0; | |
164 } | |
165 return This; | |
166 } |