41#include "wine/unicode.h"
49#define TWOCCFromFOURCC(fcc) HIWORD(fcc)
52#define ckidINFO mmioFOURCC('I','N','F','O')
53#define ckidREC mmioFOURCC('R','E','C',' ')
133 TRACE(
"End of file reached\n");
135 hr = IPin_ConnectedTo(
This->Parser.ppPins[streamnumber+1], &ppin);
138 hr = IPin_EndOfStream(ppin);
156 TRACE(
"(%p, %u)->()\n",
This, streamnumber);
158 hr = IMemAllocator_GetBuffer(
pin->pAlloc, &sample,
NULL,
NULL, 0);
160 ERR(
"... %08x?\n",
hr);
171 IMediaSample_SetDiscontinuity(sample,
stream->seek);
176 IMediaSample_SetPreroll(sample,
TRUE);
179 IMediaSample_SetPreroll(sample,
FALSE);
180 IMediaSample_SetSyncPoint(sample,
TRUE);
190 TRACE(
"END OF STREAM ON %u\n", streamnumber);
191 IMediaSample_Release(sample);
195 rtSampleStart =
index->qwBaseOffset;
196 rtSampleStart +=
entry->dwOffset;
210 else if (
This->oldindex)
218 TRACE(
"END OF STREAM ON %u\n", streamnumber);
219 IMediaSample_Release(sample);
228 FIXME(
"Only stand alone frames are currently handled correctly!\n");
232 FIXME(
"Not sure if this is handled correctly\n");
245 }
while (
stream->pos_next *
sizeof(
This->oldindex->aIndex[0]) <
This->oldindex->cb
249 if (
stream->pos_next *
sizeof(
This->oldindex->aIndex[0]) >=
This->oldindex->cb)
257 ERR(
"CAN'T PLAY WITHOUT AN INDEX! SOS! SOS! SOS!\n");
261 if (rtSampleStart != rtSampleStop)
263 IMediaSample_SetTime(sample, &rtSampleStart, &rtSampleStop);
264 hr = IAsyncReader_Request(
pin->pReader, sample, streamnumber);
268 ref = IMediaSample_Release(sample);
275 IMediaSample_SetActualDataLength(sample, 0);
283 ERR(
"There should be no sample!\n");
284 ref = IMediaSample_Release(sample);
305 if (
stream->streamheader.dwSampleSize)
307 ULONG len = IMediaSample_GetActualDataLength(sample);
313 ++
pin->dwSamplesProcessed;
315 stop =
pin->dwSamplesProcessed;
316 stop *=
stream->streamheader.dwScale;
318 stop /=
stream->streamheader.dwRate;
320 if (IMediaSample_IsDiscontinuity(sample) ==
S_OK) {
324 pin->pin.pin.dRate =
This->Parser.sourceSeeking.dRate;
325 hr = IPin_ConnectedTo(&
pin->pin.pin.IPin_iface, &victim);
328 hr = IPin_NewSegment(victim,
start,
This->Parser.sourceSeeking.llStop,
329 This->Parser.sourceSeeking.dRate);
331 FIXME(
"NewSegment returns %08x\n",
hr);
332 IPin_Release(victim);
339 rtstop = (
double)(stop -
pin->pin.pin.tStart) /
pin->pin.pin.dRate;
340 IMediaSample_SetMediaTime(sample, &
start, &stop);
341 IMediaSample_SetTime(sample, &rtstart, &rtstop);
342 IMediaSample_SetMediaTime(sample, &
start, &stop);
369 sample =
This->streams[streamnumber].sample;
370 This->streams[streamnumber].sample =
NULL;
378 FIXME(
"Receiving error: %08x\n",
hr);
380 IMediaSample_Release(sample);
388 FIXME(
"Thread %u terminated with hr %08x!\n", streamnumber,
hr);
390 TRACE(
"Thread %u terminated properly\n", streamnumber);
400 if (!IMediaSample_GetActualDataLength(pSample))
402 ERR(
"Received empty sample\n");
410 TRACE(
"(%p)->(%p size: %u, %lu)\n",
This, pSample, IMediaSample_GetActualDataLength(pSample),
cookie);
411 assert(cookie < This->Parser.cStreams);
415 IMediaSample_AddRef(pSample);
439 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
467 hr = IAsyncReader_WaitForNext(
This->Parser.pInputPin->pReader, 10000, &sample, &dwUser);
472 IMediaSample_Release(sample);
479 have_sample = (
hr ==
S_OK);
494 if ((
This->streams[
x].stdindex &&
This->streams[
x].index_next >=
This->streams[
x].entries) ||
495 (!
This->streams[
x].stdindex &&
This->streams[
x].index_next))
505 TRACE(
"Created stream %u thread 0x%08x\n",
x,
tid);
509 ERR(
"Horsemen of the apocalypse came to bring error 0x%08x\n",
hr);
520 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
524 TRACE(
"Waiting for %u to terminate\n",
x);
533 ref = IMediaSample_Release(
stream->sample);
540 TRACE(
"All threads are now terminated\n");
547 if (
IsEqualIID(&pmt->majortype, &MEDIATYPE_Stream) &&
IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_Avi))
561 FIXME(
"size %u too small\n",
cb);
573 TRACE(
"wLongsPerEntry: %hd\n",
pIndex->wLongsPerEntry);
574 TRACE(
"bIndexSubType: %u\n",
pIndex->bIndexSubType);
576 TRACE(
"nEntriesInUse: %u\n",
pIndex->nEntriesInUse);
577 TRACE(
"dwChunkId: %.4s\n", (
char *)&
pIndex->dwChunkId);
582 ||
pIndex->wLongsPerEntry != 2
586 FIXME(
"Invalid index chunk encountered: %u/%u, %u/%u, %u/%u, %u/%u\n",
594 for (
x = 0;
x <
pIndex->nEntriesInUse; ++
x)
599 TRACE(
"dwSize: %u\n", (
pIndex->aIndex[
x].dwSize & ~(1u << 31)));
600 TRACE(
"Frame is a keyframe: %s\n", keyframe ?
"yes" :
"no");
614 for (
x = 0;
x < pAviOldIndex->
cb /
sizeof(pAviOldIndex->
aIndex[0]); ++
x)
620 chunkid = pAviOldIndex->
aIndex[
x].dwChunkId;
622 TRACE(
"dwChunkId: %.4s\n", (
char *)&chunkid);
623 TRACE(
"dwFlags: %08x\n", pAviOldIndex->
aIndex[
x].dwFlags);
624 TRACE(
"dwOffset (%s): %08x\n", relative ?
"relative" :
"absolute",
offset);
625 TRACE(
"dwSize: %08x\n", pAviOldIndex->
aIndex[
x].dwSize);
631 relative = (chunkid !=
temp);
634 && ((
char *)&
temp)[0] ==
'i' && ((
char *)&
temp)[1] ==
'x')
643 && ((
char *)&temp2)[0] ==
'i' && ((
char *)&temp2)[1] ==
'x')
647 else if (temp2 != chunkid)
649 ERR(
"Faulty index or bug in handling: Wanted FCC: %s, Abs FCC: %s (@ %x), Rel FCC: %s (@ %s)\n",
666 FIXME(
"Dropping index: no idea whether it is relative or absolute\n");
684 float fSamplesPerSec = 0.0f;
685 DWORD dwSampleSize = 0;
688 static const WCHAR wszStreamTemplate[] = {
'S',
't',
'r',
'e',
'a',
'm',
' ',
'%',
'0',
'2',
'd',0};
693 piOutput.pFilter = &
This->Parser.filter.IBaseFilter_iface;
694 wsprintfW(piOutput.achName, wszStreamTemplate,
This->Parser.cStreams);
709 TRACE(
"processing stream header\n");
710 stream->streamheader = *pStrHdr;
720 amt.formattype = FORMAT_VideoInfo;
723 amt.formattype = FORMAT_WaveFormatEx;
726 FIXME(
"fccType %.4s not handled yet\n", (
const char *)&pStrHdr->
fccType);
727 amt.formattype = FORMAT_None;
729 amt.majortype = MEDIATYPE_Video;
730 amt.majortype.Data1 = pStrHdr->
fccType;
731 amt.subtype = MEDIATYPE_Video;
735 amt.bFixedSizeSamples = (amt.lSampleSize != 0);
738 if (!amt.lSampleSize)
744 amt.bTemporalCompression =
IsEqualGUID(&amt.majortype, &MEDIATYPE_Video);
756 TRACE(
"processing stream format data\n");
757 if (
IsEqualIID(&amt.formattype, &FORMAT_VideoInfo))
765 ERR(
"Not enough bytes for BITMAPINFOHEADER\n");
778 else if (
IsEqualIID(&amt.formattype, &FORMAT_WaveFormatEx))
780 amt.cbFormat = pChunk->
cb;
789 amt.cbFormat = pChunk->
cb;
791 CopyMemory(amt.pbFormat, pChunk + 1, amt.cbFormat);
795 TRACE(
"processing stream name\n");
800 FIXME(
"process stream handler data\n");
803 TRACE(
"JUNK chunk ignored\n");
819 ERR(
"Stream %d got more than 1 superindex?\n",
This->Parser.cStreams);
823 TRACE(
"wLongsPerEntry: %hd\n",
pIndex->wLongsPerEntry);
824 TRACE(
"bIndexSubType: %u\n",
pIndex->bIndexSubType);
826 TRACE(
"nEntriesInUse: %u\n",
pIndex->nEntriesInUse);
827 TRACE(
"dwChunkId: %.4s\n", (
const char *)&
pIndex->dwChunkId);
828 if (
pIndex->dwReserved[0])
829 TRACE(
"dwReserved[0]: %u\n",
pIndex->dwReserved[0]);
830 if (
pIndex->dwReserved[1])
831 TRACE(
"dwReserved[1]: %u\n",
pIndex->dwReserved[1]);
832 if (
pIndex->dwReserved[2])
833 TRACE(
"dwReserved[2]: %u\n",
pIndex->dwReserved[2]);
836 ||
pIndex->wLongsPerEntry != 4
840 FIXME(
"Invalid index chunk encountered\n");
846 for (
x = 0;
x <
pIndex->nEntriesInUse; ++
x)
850 TRACE(
"dwDuration: %u (unreliable)\n",
pIndex->aIndex[
x].dwDuration);
857 FIXME(
"unknown chunk type \"%.04s\" ignored\n", (
LPCSTR)&pChunk->
fcc);
861 if (
IsEqualGUID(&amt.formattype, &FORMAT_WaveFormatEx))
863 amt.subtype = MEDIATYPE_Video;
864 amt.subtype.Data1 = ((
WAVEFORMATEX *)amt.pbFormat)->wFormatTag;
868 TRACE(
"fSamplesPerSec = %f\n", (
double)fSamplesPerSec);
869 TRACE(
"dwSampleSize = %x\n", dwSampleSize);
872 stream->fSamplesPerSec = fSamplesPerSec;
873 stream->dwSampleSize = dwSampleSize;
900 TRACE(
"processing extension header\n");
903 FIXME(
"Size: %u\n", pExtHdr->
cb);
907 for (
x = 0;
x < 61; ++
x)
910 This->ExtHeader = *pExtHdr;
914 FIXME(
"unknown chunk type \"%.04s\" ignored\n", (
LPCSTR)&pChunk->
fcc);
929 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
931 This->streams[
x].frames = 0;
932 This->streams[
x].pos = ~0;
933 This->streams[
x].index = 0;
936 nMax =
This->oldindex->cb /
sizeof(
This->oldindex->aIndex[0]);
939 for (
n = 0;
n < nMax; ++
n)
942 if (streamId >=
This->Parser.cStreams)
947 if (
This->streams[streamId].pos == ~0
U)
948 This->streams[streamId].pos =
n;
950 if (
This->streams[streamId].streamheader.dwSampleSize)
951 This->streams[streamId].frames +=
This->oldindex->aIndex[
n].dwSize /
This->streams[streamId].streamheader.dwSampleSize;
953 ++
This->streams[streamId].frames;
956 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
958 if ((
DWORD)
This->streams[
x].frames !=
This->streams[
x].streamheader.dwLength)
960 FIXME(
"stream %u: frames found: %u, frames meant to be found: %u\n",
x, (
DWORD)
This->streams[
x].frames,
This->streams[
x].streamheader.dwLength);
965 else if (!
This->streams[0].entries)
967 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
969 This->streams[
x].frames =
This->streams[
x].streamheader.dwLength;
972 ERR(
"We should be manually seeking through the entire file to build an index, because the index is missing!!!\n");
977 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
991 if (
stream->streamheader.dwSampleSize)
995 for (
z = 0;
z <
stream->stdindex[
y]->nEntriesInUse; ++
z)
998 frames +=
len /
stream->streamheader.dwSampleSize + !!(
len %
stream->streamheader.dwSampleSize);
1002 frames +=
stream->stdindex[
y]->nEntriesInUse;
1005 else frames =
stream->frames;
1007 frames *=
stream->streamheader.dwScale;
1009 This->Parser.sourceSeeking.llDuration = frames * 10000000;
1010 This->Parser.sourceSeeking.llDuration /=
stream->streamheader.dwRate;
1011 This->Parser.sourceSeeking.llStop =
This->Parser.sourceSeeking.llDuration;
1012 This->Parser.sourceSeeking.llCurrent = 0;
1014 frames /=
stream->streamheader.dwRate;
1016 TRACE(
"Duration: %d days, %d hours, %d minutes and %d.%03u seconds\n", (
DWORD)(frames / 86400),
1017 (
DWORD)((frames % 86400) / 3600), (
DWORD)((frames % 3600) / 60), (
DWORD)(frames % 60),
1018 (
DWORD)(
This->Parser.sourceSeeking.llDuration/10000) % 1000);
1046 ERR(
"Input stream not a RIFF file\n");
1051 ERR(
"Input stream not an AVI RIFF file\n");
1058 ERR(
"Expected LIST chunk, but got %.04s\n", (
LPSTR)&
list.fcc);
1063 ERR(
"Header list expected. Got: %.04s\n", (
LPSTR)&
list.fccListType);
1073 props->cbBuffer = 0x20000;
1079 switch (pCurrentChunk->
fcc)
1087 switch (
pList->fccListType)
1101 FIXME(
"unrecognised header list type: %.04s\n", (
LPSTR)&pCurrentChunk->
fcc);
1108 ERR(
"Avi Header wrong size!\n");
1122 ERR(
"Failed to find LIST chunk from AVI file\n");
1143 props->cbPrefix = 0;
1182 if (indexes < pAviSplit->Parser.cStreams)
1187 ERR(
"%d indexes expected, but only have %d\n", indexes, pAviSplit->
Parser.
cStreams);
1196 FIXME(
"No usable index was found!\n");
1210 TRACE(
"AVI File ok\n");
1223 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
1229 ref = IMediaSample_Release(
stream->sample);
1250 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
1292 newpos =
This->Parser.sourceSeeking.llCurrent;
1293 endpos =
This->Parser.sourceSeeking.llDuration;
1295 if (newpos > endpos)
1297 WARN(
"Requesting position %x%08x beyond end of stream %x%08x\n", (
DWORD)(newpos>>32), (
DWORD)newpos, (
DWORD)(endpos>>32), (
DWORD)endpos);
1301 FIXME(
"Moving position to %u.%03u s!\n", (
DWORD)(newpos / 10000000), (
DWORD)((newpos / 10000)%1000));
1309 for (
x = 0;
x <
This->Parser.cStreams; ++
x)
1314 DWORD last_keyframe = 0, last_keyframeidx = 0, preroll = 0;
1316 wanted_frames = newpos;
1317 wanted_frames *=
stream->streamheader.dwRate;
1318 wanted_frames /= 10000000;
1319 wanted_frames /=
stream->streamheader.dwScale;
1321 pin->dwSamplesProcessed = 0;
1331 for (
z = 0;
z <
stream->stdindex[
y]->nEntriesInUse; ++
z)
1333 if (
stream->streamheader.dwSampleSize)
1340 ++
pin->dwSamplesProcessed;
1342 else ++
pin->dwSamplesProcessed;
1344 if (!(
stream->stdindex[
y]->aIndex[
z].dwSize >> 31))
1347 last_keyframeidx =
y;
1353 if (
pin->dwSamplesProcessed >= wanted_frames)
1356 if (
pin->dwSamplesProcessed >= wanted_frames)
1359 stream->index = last_keyframeidx;
1365 nMax =
This->oldindex->cb /
sizeof(
This->oldindex->aIndex[0]);
1367 for (
n = 0;
n < nMax; ++
n)
1373 if (
stream->streamheader.dwSampleSize)
1380 ++
pin->dwSamplesProcessed;
1382 else ++
pin->dwSamplesProcessed;
1392 if (
pin->dwSamplesProcessed >= wanted_frames)
1399 stream->preroll = preroll;
1404 TRACE(
"Done flushing\n");
1435 TRACE(
"(%p, %p)\n", pUnkOuter,
ppv);
1448 hr =
Parser_Create(&(
This->Parser), &
AVISplitterImpl_Vtbl, &CLSID_AviSplitter,
AVISplitter_Sample,
AVISplitter_QueryAccept,
AVISplitter_InputPin_PreConnect,
AVISplitter_Flush,
AVISplitter_Disconnect,
AVISplitter_first_request,
AVISplitter_done_process,
NULL,
AVISplitter_seek,
NULL);
1453 *
ppv = &
This->Parser.filter.IBaseFilter_iface;
struct tagVIDEOINFOHEADER VIDEOINFOHEADER
#define InterlockedDecrement
#define AVIF_MUSTUSEINDEX
#define ckidAVISUPERINDEX
#define ckidMAINAVIHEADER
#define AVI_INDEX_SUB_2FIELD
struct _avisuperindex AVISUPERINDEX
#define AVI_INDEX_OF_INDEXES
#define AVI_INDEX_SUB_DEFAULT
#define AVI_INDEX_OF_CHUNKS
struct _riffchunk RIFFCHUNK
static AVISplitterImpl * impl_from_IMediaSeeking(IMediaSeeking *iface)
static HRESULT AVISplitter_ProcessOldIndex(AVISplitterImpl *This)
static DWORD WINAPI AVISplitter_thread_reader(LPVOID data)
static HRESULT AVISplitter_ProcessODML(AVISplitterImpl *This, const BYTE *pData, DWORD cb)
static HRESULT AVISplitter_SendEndOfFile(AVISplitterImpl *This, DWORD streamnumber)
static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumber)
static HRESULT AVISplitter_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE *pmt)
static HRESULT WINAPI AVISplitter_seek(IMediaSeeking *iface)
static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample *pSample, DWORD_PTR cookie)
static HRESULT AVISplitter_Disconnect(LPVOID iface)
static HRESULT AVISplitter_Receive(AVISplitterImpl *This, IMediaSample *sample, DWORD streamnumber)
static HRESULT AVISplitter_done_process(LPVOID iface)
static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, AVISTDINDEX **index, LONGLONG qwOffset, DWORD cb)
static const IBaseFilterVtbl AVISplitterImpl_Vtbl
static HRESULT AVISplitter_Flush(LPVOID iface)
HRESULT AVISplitter_create(IUnknown *pUnkOuter, LPVOID *ppv)
static HRESULT AVISplitter_first_request(LPVOID iface)
static HRESULT AVISplitter_InputPin_PreConnect(IPin *iface, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props)
static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl *This, const BYTE *pData, DWORD cb, ALLOCATOR_PROPERTIES *props)
static HRESULT AVISplitter_InitializeStreams(AVISplitterImpl *This)
static ULONG WINAPI AVISplitter_Release(IBaseFilter *iface)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
HRESULT WINAPI Parser_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *pInfo)
HRESULT WINAPI Parser_GetClassID(IBaseFilter *iface, CLSID *pClsid)
HRESULT WINAPI Parser_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
HRESULT WINAPI Parser_Pause(IBaseFilter *iface)
HRESULT WINAPI Parser_Stop(IBaseFilter *iface)
ULONG WINAPI Parser_AddRef(IBaseFilter *iface)
HRESULT WINAPI Parser_QueryVendorInfo(IBaseFilter *iface, LPWSTR *pVendorInfo)
void Parser_Destroy(ParserImpl *This)
HRESULT Parser_AddPin(ParserImpl *This, const PIN_INFO *piOutput, ALLOCATOR_PROPERTIES *props, const AM_MEDIA_TYPE *amt)
HRESULT WINAPI Parser_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *Parser_Vtbl, const CLSID *pClsid, PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup, PFN_DISCONNECT fnDisconnect, REQUESTPROC fnRequest, STOPPROCESSPROC fnDone, SourceSeeking_ChangeStop stop, SourceSeeking_ChangeStart start, SourceSeeking_ChangeRate rate)
HRESULT WINAPI Parser_GetSyncSource(IBaseFilter *iface, IReferenceClock **ppClock)
HRESULT WINAPI Parser_EnumPins(IBaseFilter *iface, IEnumPins **ppEnum)
HRESULT WINAPI Parser_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
HRESULT WINAPI Parser_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
HRESULT WINAPI Parser_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)
HRESULT WINAPI Parser_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *pGraph, LPCWSTR pName)
static Parser_OutputPin * unsafe_impl_Parser_OutputPin_from_IPin(IPin *iface)
static __inline const char * debugstr_an(const char *s, int n)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define HeapFree(x, y, z)
#define MultiByteToWideChar
static DWORD DWORD * dwLength
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, SIZE_T size)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
unsigned long long DWORDLONG
#define memcpy(s1, s2, n)
#define mmioFOURCC(c0, c1, c2, c3)
static HMODULE MODULEINFO DWORD cb
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
static float(__cdecl *square_half_float)(float x
_Out_ PULONG _Out_ PULONG pIndex
static PullPin * impl_PullPin_from_IPin(IPin *iface)
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
#define MEDIATIME_FROM_BYTES(x)
#define BYTES_FROM_MEDIATIME(time)
HRESULT WINAPI BaseOutputPinImpl_Deliver(BaseOutputPin *This, IMediaSample *pSample)
LONGLONG CurrentChunkOffset
CRITICAL_SECTION thread_lock
AVISTREAMHEADER streamheader
struct _avioldindex::_avioldindex_entry aIndex[ANYSIZE_ARRAY]
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
#define CONTAINING_RECORD(address, type, field)
#define listtypeAVIHEADER
#define ckidSTREAMHANDLERDATA
#define StreamFromFOURCC(fcc)
#define VFW_E_NOT_CONNECTED
static const WCHAR props[]
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define CLASS_E_NOAGGREGATION
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)