Mercurial > mplayer.hg
annotate loader/dmo/dmo.c @ 27427:a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
When trying to seek past the end of file, the ByteIOContext expect
that the stream is left in the same state as it was before the
tentative seek. stream_seek() does not meet this expectation.
It changes current position when seeking past the end of file.
Thus, it is necessary to reset the stream to its previous state
after a seek failure.
author | aurel |
---|---|
date | Wed, 13 Aug 2008 00:01:31 +0000 |
parents | 0b21ffa03b9c |
children | 1e6d3a382e7b |
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" |
26999
0b21ffa03b9c
Rename loader/driver.[ch] to loader/drv.[ch], otherwise loader/driver.h can
diego
parents:
25849
diff
changeset
|
8 #include "drv.h" |
8294 | 9 #include "com.h" |
10 #include <stdio.h> | |
11 #include <stdlib.h> | |
12 #include <string.h> | |
13 #include "win32.h" // printf macro | |
14 | |
15 void trapbug(); | |
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; | |
39 DMO_Filter* This = (DMO_Filter*) malloc(sizeof(DMO_Filter)); | |
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); | |
120 printf("GetOutputType %x \n", i); | |
121 printf("DMO 0x%x (%.4s) 0x%x (%.4s)\n" | |
122 //printf("DMO 0x%x 0x%x\n" | |
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++) | |
138 printf("BYTE %d %02x %02x\n", i, ((uint8_t*)dmo.pbFormat)[i], ((uint8_t*)out_fmt->pbFormat)[i]); | |
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); | |
151 printf("GetOutput r=0x%lx size:%ld align:%ld\n", hr, inputs, outputs); | |
152 | |
153 // This->m_pMedia->vt->AllocateStreamingResources(This->m_pMedia); | |
154 hr = This->m_pMedia->vt->GetStreamCount(This->m_pMedia, &inputs, &outputs); | |
155 printf("StreamCount r=0x%lx %ld %ld\n", hr, inputs, outputs); | |
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 } |