Mercurial > mplayer.hg
comparison loader/dshow/cmediasample.c @ 3467:e3bbf44dbab2
avifile sync
author | arpi |
---|---|
date | Tue, 11 Dec 2001 23:29:24 +0000 |
parents | 213b35f84cf3 |
children | 174e2a58b4cd |
comparison
equal
deleted
inserted
replaced
3466:b6caac381405 | 3467:e3bbf44dbab2 |
---|---|
43 free(This); | 43 free(This); |
44 } | 44 } |
45 | 45 |
46 static long STDCALL CMediaSample_Release(IUnknown* This) | 46 static long STDCALL CMediaSample_Release(IUnknown* This) |
47 { | 47 { |
48 CMediaSample* parent=(CMediaSample*)This; | 48 CMediaSample* parent = (CMediaSample*)This; |
49 Debug printf("CMediaSample_Release(%p) called (new ref:%d)\n", | 49 Debug printf("CMediaSample_Release(%p) called (new ref:%d)\n", |
50 This, ((CMediaSample*)This)->refcount-1); | 50 This, ((CMediaSample*)This)->refcount-1); |
51 if (--((CMediaSample*)This)->refcount == 0) | 51 |
52 if (--((CMediaSample*) This)->refcount == 0) | |
52 { | 53 { |
53 parent->all->vt->ReleaseBuffer((IMemAllocator*)(parent->all), | 54 parent->all->vt->ReleaseBuffer((IMemAllocator*)(parent->all), |
54 (IMediaSample*)This); | 55 (IMediaSample*)This); |
55 } | 56 } |
56 return 0; | 57 return 0; |
57 } | 58 } |
58 | 59 |
59 static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample * This, | 60 static HRESULT STDCALL CMediaSample_GetPointer(IMediaSample* This, |
60 /* [out] */ BYTE **ppBuffer) | 61 /* [out] */ BYTE** ppBuffer) |
61 { | 62 { |
62 Debug printf("CMediaSample_GetPointer(%p) called\n", This); | 63 Debug printf("CMediaSample_GetPointer(%p) called -> %p, size: %d %d\n", This, ((CMediaSample*) This)->block, ((CMediaSample*)This)->actual_size, ((CMediaSample*)This)->size); |
63 if (!ppBuffer) | 64 if (!ppBuffer) |
64 return E_INVALIDARG; | 65 return E_INVALIDARG; |
65 *ppBuffer=(BYTE *)((CMediaSample*)This)->block; | 66 *ppBuffer = (BYTE*) ((CMediaSample*) This)->block; |
66 return 0; | 67 return 0; |
67 } | 68 } |
68 | 69 |
69 static long STDCALL CMediaSample_GetSize(IMediaSample * This) | 70 static long STDCALL CMediaSample_GetSize(IMediaSample * This) |
70 { | 71 { |
71 Debug printf("CMediaSample_GetSize(%p) called -> %d\n", | 72 Debug printf("CMediaSample_GetSize(%p) called -> %d\n", This, ((CMediaSample*) This)->size); |
72 This, ((CMediaSample*)This)->size); | 73 return ((CMediaSample*) This)->size; |
73 return ((CMediaSample*)This)->size; | |
74 } | 74 } |
75 | 75 |
76 static HRESULT STDCALL CMediaSample_GetTime(IMediaSample * This, | 76 static HRESULT STDCALL CMediaSample_GetTime(IMediaSample * This, |
77 /* [out] */ REFERENCE_TIME *pTimeStart, | 77 /* [out] */ REFERENCE_TIME *pTimeStart, |
78 /* [out] */ REFERENCE_TIME *pTimeEnd) | 78 /* [out] */ REFERENCE_TIME *pTimeEnd) |
79 { | 79 { |
80 Debug printf("CMediaSample_GetTime(%p) called\n", This); | 80 Debug printf("CMediaSample_GetTime(%p) called (UNIMPLIMENTED)\n", This); |
81 return E_NOTIMPL; | 81 return E_NOTIMPL; |
82 } | 82 } |
83 | 83 |
84 static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This, | 84 static HRESULT STDCALL CMediaSample_SetTime(IMediaSample * This, |
85 /* [in] */ REFERENCE_TIME *pTimeStart, | 85 /* [in] */ REFERENCE_TIME *pTimeStart, |
86 /* [in] */ REFERENCE_TIME *pTimeEnd) | 86 /* [in] */ REFERENCE_TIME *pTimeEnd) |
87 { | 87 { |
88 Debug printf("CMediaSample_SetTime(%p) called\n", This); | 88 Debug printf("CMediaSample_SetTime(%p) called (UNIMPLIMENTED)\n", This); |
89 return E_NOTIMPL; | 89 return E_NOTIMPL; |
90 } | 90 } |
91 | 91 |
92 static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This) | 92 static HRESULT STDCALL CMediaSample_IsSyncPoint(IMediaSample * This) |
93 { | 93 { |
99 | 99 |
100 static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This, | 100 static HRESULT STDCALL CMediaSample_SetSyncPoint(IMediaSample * This, |
101 long bIsSyncPoint) | 101 long bIsSyncPoint) |
102 { | 102 { |
103 Debug printf("CMediaSample_SetSyncPoint(%p) called\n", This); | 103 Debug printf("CMediaSample_SetSyncPoint(%p) called\n", This); |
104 ((CMediaSample*)This)->isSyncPoint=bIsSyncPoint; | 104 ((CMediaSample*)This)->isSyncPoint = bIsSyncPoint; |
105 return 0; | 105 return 0; |
106 } | 106 } |
107 | 107 |
108 static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This) | 108 static HRESULT STDCALL CMediaSample_IsPreroll(IMediaSample * This) |
109 { | 109 { |
130 } | 130 } |
131 | 131 |
132 static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample* This, | 132 static HRESULT STDCALL CMediaSample_SetActualDataLength(IMediaSample* This, |
133 long __MIDL_0010) | 133 long __MIDL_0010) |
134 { | 134 { |
135 CMediaSample* cms = (CMediaSample*)This; | |
135 Debug printf("CMediaSample_SetActualDataLength(%p, %ld) called\n", This, __MIDL_0010); | 136 Debug printf("CMediaSample_SetActualDataLength(%p, %ld) called\n", This, __MIDL_0010); |
136 if (__MIDL_0010 > ((CMediaSample*)This)->size) | 137 if (__MIDL_0010 > cms->size) |
137 { | 138 { |
138 printf("%p: ERROR: CMediaSample buffer overflow\n", This); | 139 char* c = cms->own_block; |
139 } | 140 Debug printf(" CMediaSample - buffer overflow %ld %d %p %p\n", |
140 ((CMediaSample*)This)->actual_size = __MIDL_0010; | 141 __MIDL_0010, ((CMediaSample*)This)->size, cms->own_block, cms->block); |
142 cms->own_block = realloc(cms->own_block, __MIDL_0010); | |
143 if (c == cms->block) | |
144 cms->block = cms->own_block; | |
145 cms->size = __MIDL_0010; | |
146 } | |
147 cms->actual_size = __MIDL_0010; | |
141 return 0; | 148 return 0; |
142 } | 149 } |
143 | 150 |
144 static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample* This, | 151 static HRESULT STDCALL CMediaSample_GetMediaType(IMediaSample* This, |
145 AM_MEDIA_TYPE** ppMediaType) | 152 AM_MEDIA_TYPE** ppMediaType) |
173 return E_INVALIDARG; | 180 return E_INVALIDARG; |
174 t = &((CMediaSample*)This)->media_type; | 181 t = &((CMediaSample*)This)->media_type; |
175 if (t->pbFormat) | 182 if (t->pbFormat) |
176 CoTaskMemFree(t->pbFormat); | 183 CoTaskMemFree(t->pbFormat); |
177 t = pMediaType; | 184 t = pMediaType; |
178 t->pbFormat = (char*)CoTaskMemAlloc(t->cbFormat); | 185 if (t->cbFormat) |
179 memcpy(t->pbFormat, pMediaType->pbFormat, t->cbFormat); | 186 { |
180 ((CMediaSample*)This)->type_valid=1; | 187 t->pbFormat = (char*)CoTaskMemAlloc(t->cbFormat); |
188 memcpy(t->pbFormat, pMediaType->pbFormat, t->cbFormat); | |
189 } | |
190 else | |
191 t->pbFormat = 0; | |
192 ((CMediaSample*) This)->type_valid=1; | |
181 | 193 |
182 return 0; | 194 return 0; |
183 } | 195 } |
184 | 196 |
185 static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This) | 197 static HRESULT STDCALL CMediaSample_IsDiscontinuity(IMediaSample * This) |
186 { | 198 { |
187 Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This); | 199 Debug printf("CMediaSample_IsDiscontinuity(%p) called\n", This); |
188 return 1; | 200 return ((CMediaSample*) This)->isDiscontinuity; |
189 } | 201 } |
190 | 202 |
191 static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This, | 203 static HRESULT STDCALL CMediaSample_SetDiscontinuity(IMediaSample * This, |
192 long bDiscontinuity) | 204 long bDiscontinuity) |
193 { | 205 { |
194 Debug printf("CMediaSample_SetDiscontinuity(%p) called\n", This); | 206 Debug printf("CMediaSample_SetDiscontinuity(%p) called (%ld)\n", This, bDiscontinuity); |
195 return E_NOTIMPL; | 207 ((CMediaSample*) This)->isDiscontinuity = bDiscontinuity; |
208 return 0; | |
196 } | 209 } |
197 | 210 |
198 static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This, | 211 static HRESULT STDCALL CMediaSample_GetMediaTime(IMediaSample * This, |
199 /* [out] */ LONGLONG *pTimeStart, | 212 /* [out] */ LONGLONG *pTimeStart, |
200 /* [out] */ LONGLONG *pTimeEnd) | 213 /* [out] */ LONGLONG *pTimeEnd) |
201 { | 214 { |
202 Debug printf("CMediaSample_GetMediaTime(%p) called\n", This); | 215 Debug printf("CMediaSample_GetMediaTime(%p) called\n", This); |
203 return E_NOTIMPL; | 216 if (pTimeStart) |
217 *pTimeStart = ((CMediaSample*) This)->time_start; | |
218 if (pTimeEnd) | |
219 *pTimeEnd = ((CMediaSample*) This)->time_end; | |
220 return 0; | |
204 } | 221 } |
205 | 222 |
206 static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This, | 223 static HRESULT STDCALL CMediaSample_SetMediaTime(IMediaSample * This, |
207 /* [in] */ LONGLONG *pTimeStart, | 224 /* [in] */ LONGLONG *pTimeStart, |
208 /* [in] */ LONGLONG *pTimeEnd) | 225 /* [in] */ LONGLONG *pTimeEnd) |
209 { | 226 { |
210 Debug printf("CMediaSample_SetMediaTime(%p) called\n", This); | 227 Debug printf("CMediaSample_SetMediaTime(%p) called\n", This); |
211 return E_NOTIMPL; | 228 if (pTimeStart) |
212 } | 229 ((CMediaSample*) This)->time_start = *pTimeStart; |
213 | 230 if (pTimeEnd) |
231 ((CMediaSample*) This)->time_end = *pTimeEnd; | |
232 return 0; | |
233 } | |
234 | |
235 // extension for direct memory write or decompressed data | |
214 static void CMediaSample_SetPointer(CMediaSample* This, char* pointer) | 236 static void CMediaSample_SetPointer(CMediaSample* This, char* pointer) |
215 { | 237 { |
216 Debug printf("CMediaSample_SetPointer(%p) called -> %p\n", This, pointer); | 238 Debug printf("CMediaSample_SetPointer(%p) called -> %p\n", This, pointer); |
217 if (pointer) | 239 if (pointer) |
218 This->block = pointer; | 240 This->block = pointer; |
226 This->block = This->own_block; | 248 This->block = This->own_block; |
227 } | 249 } |
228 | 250 |
229 CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size) | 251 CMediaSample* CMediaSampleCreate(IMemAllocator* allocator, int _size) |
230 { | 252 { |
231 CMediaSample* This = (CMediaSample*) malloc(sizeof( CMediaSample )); | 253 CMediaSample* This = (CMediaSample*) malloc(sizeof(CMediaSample)); |
254 if (!This) | |
255 return NULL; | |
256 | |
257 // some hack here! | |
258 // it looks like Acelp decoder is actually accessing | |
259 // the allocated memory before it sets the new size for it ??? | |
260 // -- maybe it's being initialized with wrong parameters | |
261 // anyway this is fixes the problem somehow with some reserves | |
262 // | |
263 // using different trick for now - in DS_Audio modify sample size | |
264 //if (_size < 0x1000) | |
265 // _size = (_size + 0xfff) & ~0xfff; | |
266 | |
232 This->vt = (IMediaSample_vt*) malloc(sizeof(IMediaSample_vt)); | 267 This->vt = (IMediaSample_vt*) malloc(sizeof(IMediaSample_vt)); |
268 This->own_block = (char*) malloc(_size); | |
269 This->media_type.pbFormat = 0; | |
270 | |
271 if (!This->vt || !This->own_block) | |
272 { | |
273 CMediaSample_Destroy(This); | |
274 return NULL; | |
275 } | |
233 | 276 |
234 This->vt->QueryInterface = CMediaSample_QueryInterface; | 277 This->vt->QueryInterface = CMediaSample_QueryInterface; |
235 This->vt->AddRef = CMediaSample_AddRef; | 278 This->vt->AddRef = CMediaSample_AddRef; |
236 This->vt->Release = CMediaSample_Release; | 279 This->vt->Release = CMediaSample_Release; |
237 This->vt->GetPointer = CMediaSample_GetPointer; | 280 This->vt->GetPointer = CMediaSample_GetPointer; |
253 | 296 |
254 This->all = allocator; | 297 This->all = allocator; |
255 This->size = _size; | 298 This->size = _size; |
256 This->refcount = 0; // increased by MemAllocator | 299 This->refcount = 0; // increased by MemAllocator |
257 This->actual_size = 0; | 300 This->actual_size = 0; |
258 This->media_type.pbFormat = 0; | |
259 This->isPreroll = 0; | 301 This->isPreroll = 0; |
302 This->isDiscontinuity = 1; | |
303 This->time_start = 0; | |
304 This->time_end = 0; | |
260 This->type_valid = 0; | 305 This->type_valid = 0; |
261 This->own_block = (char*) malloc(This->size); | |
262 This->block = This->own_block; | 306 This->block = This->own_block; |
263 | 307 |
264 This->SetPointer = CMediaSample_SetPointer; | 308 This->SetPointer = CMediaSample_SetPointer; |
265 This->ResetPointer = CMediaSample_ResetPointer; | 309 This->ResetPointer = CMediaSample_ResetPointer; |
266 | 310 |