Mercurial > mplayer.hg
annotate loader/dmo/dmo.c @ 31972:96559880e475
Improve A/V sync when not using -correct-pts.
This fixes at least playing PAFF streams with the native ts demuxer.
(Breaks the non-standard -demuxer lavf -nocorrect-pts.)
Patch by P«”sztor Szil«”rd, bartosteka freemail hu
author | cehoyos |
---|---|
date | Tue, 07 Sep 2010 16:20:52 +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 } |