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);
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 & ~(1
u << 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;
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 * u
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
HRESULT AVISplitter_create(IUnknown *pUnkOuter, LPVOID *ppv)
#define ckidMAINAVIHEADER
static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumber)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
static DWORD WINAPI AVISplitter_thread_reader(LPVOID data)
HRESULT WINAPI Parser_Pause(IBaseFilter *iface)
HRESULT WINAPI Parser_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
#define listtypeAVIHEADER
#define AVI_INDEX_OF_INDEXES
#define AVI_INDEX_SUB_DEFAULT
static HRESULT AVISplitter_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE *pmt)
#define AVIF_MUSTUSEINDEX
struct AVISplitterImpl AVISplitterImpl
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
GLint GLint GLint GLint GLint x
HRESULT WINAPI Parser_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
struct tWAVEFORMATEX WAVEFORMATEX
HRESULT WINAPI Parser_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *pGraph, LPCWSTR pName)
#define AVI_INDEX_OF_CHUNKS
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static HRESULT WINAPI AVISplitter_seek(IMediaSeeking *iface)
static PullPin * impl_PullPin_from_IPin(IPin *iface)
static HRESULT AVISplitter_ProcessODML(AVISplitterImpl *This, const BYTE *pData, DWORD cb)
HRESULT WINAPI Parser_GetSyncSource(IBaseFilter *iface, IReferenceClock **ppClock)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
struct _avioldindex::_avioldindex_entry aIndex[ANYSIZE_ARRAY]
static HRESULT AVISplitter_InputPin_PreConnect(IPin *iface, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HRESULT WINAPI Parser_FindPin(IBaseFilter *iface, LPCWSTR Id, IPin **ppPin)
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
static HRESULT AVISplitter_SendEndOfFile(AVISplitterImpl *This, DWORD streamnumber)
static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample *pSample, DWORD_PTR cookie)
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)
static HRESULT AVISplitter_first_request(LPVOID iface)
CRITICAL_SECTION thread_lock
#define VFW_E_NOT_CONNECTED
static HRESULT AVISplitter_InitializeStreams(AVISplitterImpl *This)
HRESULT WINAPI Parser_EnumPins(IBaseFilter *iface, IEnumPins **ppEnum)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
AVISTREAMHEADER streamheader
LONGLONG CurrentChunkOffset
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define ckidSTREAMHANDLERDATA
static DWORD DWORD * dwLength
struct _avisuperindex AVISUPERINDEX
static HRESULT AVISplitter_Disconnect(LPVOID iface)
HRESULT WINAPI Parser_Stop(IBaseFilter *iface)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
struct _riffchunk RIFFCHUNK
#define BYTES_FROM_MEDIATIME(time)
HRESULT Parser_AddPin(ParserImpl *This, const PIN_INFO *piOutput, ALLOCATOR_PROPERTIES *props, const AM_MEDIA_TYPE *amt)
static AVISplitterImpl * impl_from_IMediaSeeking(IMediaSeeking *iface)
static ULONG WINAPI AVISplitter_Release(IBaseFilter *iface)
#define InterlockedDecrement
static __inline const char * debugstr_an(const char *s, int n)
static HRESULT AVISplitter_ProcessOldIndex(AVISplitterImpl *This)
#define mmioFOURCC(c0, c1, c2, c3)
#define memcpy(s1, s2, n)
HRESULT WINAPI Parser_QueryVendorInfo(IBaseFilter *iface, LPWSTR *pVendorInfo)
#define CLASS_E_NOAGGREGATION
static HRESULT AVISplitter_Receive(AVISplitterImpl *This, IMediaSample *sample, DWORD streamnumber)
#define ckidAVISUPERINDEX
_Out_ PULONG _Out_ PULONG pIndex
HRESULT WINAPI Parser_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
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
static const IBaseFilterVtbl AVISplitterImpl_Vtbl
static float(__cdecl *square_half_float)(float x
static Parser_OutputPin * unsafe_impl_Parser_OutputPin_from_IPin(IPin *iface)
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
GLint GLint GLint GLint GLint GLint y
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
#define MultiByteToWideChar
HRESULT WINAPI Parser_SetSyncSource(IBaseFilter *iface, IReferenceClock *pClock)
HRESULT WINAPI Parser_GetClassID(IBaseFilter *iface, CLSID *pClsid)
HRESULT WINAPI BaseOutputPinImpl_Deliver(BaseOutputPin *This, IMediaSample *pSample)
static HMODULE MODULEINFO DWORD cb
unsigned long long DWORDLONG
static const WCHAR props[]
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
static HRESULT AVISplitter_Flush(LPVOID iface)
#define StreamFromFOURCC(fcc)
static HRESULT AVISplitter_done_process(LPVOID iface)
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)
LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, SIZE_T size)
#define MEDIATIME_FROM_BYTES(x)
struct StreamData StreamData
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void Parser_Destroy(ParserImpl *This)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
ULONG WINAPI Parser_AddRef(IBaseFilter *iface)
HRESULT WINAPI Parser_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *pInfo)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
WINE_DEFAULT_DEBUG_CHANNEL(quartz)
#define HeapFree(x, y, z)
#define IsEqualIID(riid1, riid2)
struct tagVIDEOINFOHEADER VIDEOINFOHEADER
static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl *This, const BYTE *pData, DWORD cb, ALLOCATOR_PROPERTIES *props)
static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, AVISTDINDEX **index, LONGLONG qwOffset, DWORD cb)
#define AVI_INDEX_SUB_2FIELD