54#define IDX_PER_BLOCK 2730
168 WARN(
"invalid parameter\n");
178 *
ppv = &
This->IPersistFile_iface;
185 IUnknown_AddRef(&
This->IUnknown_inner);
211 for (
i = 0;
i <
This->fInfo.dwStreams;
i++) {
213 if (
This->ppStreams[
i]->ref != 0)
214 ERR(
": someone has still %u reference to stream %u (%p)!\n",
225 This->nIdxRecords = 0;
231 This->fileextra.cb = 0;
258 return IUnknown_QueryInterface(
This->outer_unk,
riid,
ppv);
265 return IUnknown_AddRef(
This->outer_unk);
272 return IUnknown_Release(
This->outer_unk);
301 TRACE(
"(%p,%p,0x%08X,%d)\n", iface, avis, fccType,
lParam);
309 if (nStream < This->fInfo.dwStreams &&
311 *avis = &
This->ppStreams[nStream]->IAVIStream_iface;
328 TRACE(
"(%p,%p,%p)\n", iface, avis, asi);
341 n =
This->fInfo.dwStreams;
362 This->fInfo.dwStreams++;
369 *avis = &
This->ppStreams[
n]->IAVIStream_iface;
379 TRACE(
"(%p,0x%08X,%p,%d)\n", iface, ckid, lpData,
size);
400 TRACE(
"(%p,0x%08X,%p,%p)\n", iface, ckid, lpData,
size);
409 TRACE(
"(%p)\n",iface);
417 if (
This->dwMoviChunkPos == 0)
430 if (
This->fInfo.dwSuggestedBufferSize <
This->ckLastRecord.cksize + 3 *
sizeof(
DWORD))
431 This->fInfo.dwSuggestedBufferSize =
This->ckLastRecord.cksize + 3 *
sizeof(
DWORD);
435 This->ckLastRecord.cksize = 0;
441 This->dwNextFramePos += 3 *
sizeof(
DWORD);
464 if (nStream < This->fInfo.dwStreams &&
468 This->fInfo.dwStreams--;
469 if (nStream < This->fInfo.dwStreams)
471 (
This->fInfo.dwStreams - nStream) *
sizeof(
This->ppStreams[0]));
500 return IUnknown_QueryInterface(
This->outer_unk,
riid,
ppv);
507 return IUnknown_AddRef(
This->outer_unk);
514 return IUnknown_Release(
This->outer_unk);
519 TRACE(
"(%p,%p)\n", iface, pClassID);
521 if (pClassID ==
NULL)
524 *pClassID = CLSID_AVIFile;
533 TRACE(
"(%p)\n", iface);
553 This->uMode = dwMode;
569 if (szFileName ==
NULL)
613 TRACE(
"(%p,%p)\n", iface, ppszFileName);
615 if (ppszFileName ==
NULL)
618 *ppszFileName =
NULL;
624 if (*ppszFileName ==
NULL)
633static const struct IPersistFileVtbl
pf_vt = {
657 obj->IPersistFile_iface.lpVtbl = &
pf_vt;
660 obj->outer_unk = pUnkOuter;
662 obj->outer_unk = &
obj->IUnknown_inner;
664 hr = IUnknown_QueryInterface(&
obj->IUnknown_inner,
riid,
ppv);
665 IUnknown_Release(&
obj->IUnknown_inner);
678 WARN(
"invalid parameter\n");
723 TRACE(
"(%p,0x%08lX,0x%08lX)\n", iface, lParam1, lParam2);
760 if (
This->sInfo.dwSampleSize != 0) {
767 while (0 <=
pos && pos <= This->lLastFrame) {
777 while (0 <=
pos && pos <= This->lLastFrame) {
778 if (
This->idxFrames[
pos].dwChunkLength > 0)
792 for (
n = 0;
n <
This->sInfo.dwFormatChangeCount;
n++)
793 if (
This->idxFmtChanges[
n].ckid >=
pos) {
800 for (
n = (
LONG)
This->sInfo.dwFormatChangeCount;
n >= 0;
n--) {
801 if (
This->idxFmtChanges[
n].ckid <=
pos) {
831 if (
This->sInfo.dwSampleSize)
832 pos =
This->sInfo.dwSampleSize;
837 FIXME(
": FIND_INDEX flag is not supported!\n");
852 if (formatsize ==
NULL)
857 *formatsize =
This->cbFormat;
864 if (*(
DWORD*)formatsize < This->cbFormat) {
865 *formatsize =
This->cbFormat;
876 FIXME(
": need to read formatchange for %d -- unimplemented!\n",lLastFmt);
880 *formatsize =
This->cbFormat;
907 if (
This->paf->dwMoviChunkPos != 0)
913 This->cbFormat = formatsize;
921 lDim =
This->sInfo.rcFrame.right -
This->sInfo.rcFrame.left;
922 if (lDim < lpbiNew->biWidth)
923 This->sInfo.rcFrame.right =
This->sInfo.rcFrame.left + lpbiNew->
biWidth;
924 lDim =
This->sInfo.rcFrame.bottom -
This->sInfo.rcFrame.top;
925 if (lDim < lpbiNew->biHeight)
939 if (
This->cbFormat != formatsize)
999 TRACE(
"(%p,%d,%d,%p,%d,%p,%p)\n", iface,
start,
samples,
buffer,
1000 buffersize, bytesread, samplesread);
1003 if (bytesread !=
NULL)
1005 if (samplesread !=
NULL)
1017 if (bytesread ==
NULL && samplesread ==
NULL)
1020 if (
This->sInfo.dwSampleSize != 0)
1036 if (
This->sInfo.dwSampleSize != 0) {
1056 while (
samples > 0 && buffersize > 0) {
1065 blocksize =
This->lpBuffer[1];
1066 TRACE(
"blocksize = %u\n",blocksize);
1077 if (bytesread !=
NULL)
1079 if (samplesread !=
NULL)
1080 *samplesread +=
size /
This->sInfo.dwSampleSize;
1092 assert(start <= This->lLastFrame);
1102 if (bytesread !=
NULL)
1104 if (samplesread !=
NULL)
1118 TRACE(
"(%p,%d,%d,%p,%d,0x%08X,%p,%p)\n", iface,
start,
samples,
1119 buffer, buffersize,
flags, sampwritten, byteswritten);
1122 if (sampwritten !=
NULL)
1124 if (byteswritten !=
NULL)
1135 switch (
This->sInfo.fccType) {
1149 if (
This->lLastFrame == -1)
1153 }
else if (
This->lLastFrame == -1)
1156 if (
This->sInfo.dwSampleSize != 0) {
1158 if (
samples *
This->sInfo.dwSampleSize != buffersize)
1169 FIXME(
": not interleaved, could collect audio data!\n");
1177 if (
This->lLastFrame != -1) {
1192 if (sampwritten !=
NULL)
1194 if (byteswritten !=
NULL)
1195 *byteswritten = buffersize;
1212 if (
start + samples < This->sInfo.dwStart)
1243 TRACE(
"(%p,0x%08X,%p,%p)\n", iface, fcc, lp, lpread);
1246 if (
This->lpHandlerData !=
NULL &&
This->cbHandlerData > 0) {
1247 if (lp ==
NULL || *lpread <= 0) {
1248 *lpread =
This->cbHandlerData;
1253 if (*lpread < This->cbHandlerData)
1266 TRACE(
"(%p,0x%08x,%p,%d)\n", iface, fcc, lp,
size);
1279 if (
This->paf->dwMoviChunkPos != 0) {
1286 if (dwPos >=
This->paf->dwMoviChunkPos - 2 *
sizeof(
DWORD))
1294 FIXME(
": handler data already set -- overwrite?\n");
1311 FIXME(
"(%p,%p,%d): stub\n", iface,
info, infolen);
1348 flags &= ~AVIIF_KEYFRAME;
1352 ERR(
": found palette change in non-video stream!\n");
1356 if (
This->idxFmtChanges ==
NULL ||
This->nIdxFmtChanges <=
This->sInfo.dwFormatChangeCount) {
1357 DWORD new_count =
This->nIdxFmtChanges + 16;
1361 This->idxFmtChanges =
1368 This->idxFmtChanges = new_buffer;
1370 This->nIdxFmtChanges = new_count;
1374 n = ++
This->sInfo.dwFormatChangeCount;
1375 This->idxFmtChanges[
n].ckid =
This->lLastFrame;
1376 This->idxFmtChanges[
n].dwFlags = 0;
1378 This->idxFmtChanges[
n].dwChunkLength =
size;
1391 if (
This->lLastFrame == -1)
1394 if (
This->sInfo.dwSuggestedBufferSize <
size)
1395 This->sInfo.dwSuggestedBufferSize =
size;
1399 This->nIdxFrames += 512;
1410 This->idxFrames[
This->lLastFrame].ckid = ckid;
1413 This->idxFrames[
This->lLastFrame].dwChunkLength =
size;
1416 if (
This->sInfo.dwLength <=
This->lLastFrame)
1417 This->sInfo.dwLength =
This->lLastFrame + 1;
1430 if (!
This->idxRecords)
1435 This->cbIdxRecords = new_count;
1448 This->idxRecords[
This->nIdxRecords].dwChunkOffset =
1449 This->ckLastRecord.dwDataOffset - 2 *
sizeof(
DWORD);
1450 This->idxRecords[
This->nIdxRecords].dwChunkLength =
1451 This->ckLastRecord.cksize;
1452 This->nIdxRecords++;
1465 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
1470 dwPos += ((pStream->
cbFormat + 1) & ~1U);
1477 if (
This->dwMoviChunkPos == 0) {
1478 This->dwNextFramePos = dwPos;
1484 This->dwMoviChunkPos =
This->dwNextFramePos -
sizeof(
DWORD);
1544 This->lLastFrame = -1;
1549 This->nIdxFrames = 0;
1561 This->cbHandlerData = 0;
1595 ERR(
": not an AVI!\n");
1611 if (ck.
cksize !=
sizeof(MainAVIHdr)) {
1612 ERR(
": invalid size of %d for MainAVIHeader!\n", ck.
cksize);
1626 This->uMode &= ~MMIO_RWMODE;
1633 This->fInfo.dwScale = 1000000;
1639 This->fInfo.dwSuggestedBufferSize = 0;
1650 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
1658 pStream =
This->ppStreams[nStream] =
1660 if (pStream ==
NULL)
1717 static const WCHAR streamTypeFmt[] = {
'%',
'4',
'.',
'4',
'h',
's',0};
1718 static const WCHAR streamNameFmt[] = {
'%',
's',
' ',
'%',
's',
' ',
'#',
'%',
'd',0};
1725 if (ck.
cksize >
sizeof(streamHdr))
1726 n =
sizeof(streamHdr);
1761 for (
n = nStream; 0 <=
n;
n--) {
1762 if (
This->ppStreams[
n]->sInfo.fccHandler == streamHdr.
fccType)
1795 WARN(
": found extra chunk 0x%08X\n", ck.
ckid);
1844 This->fInfo.dwFlags &= ~AVIFILEINFO_HASINDEX;
1850 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++)
1851 This->ppStreams[nStream]->lLastFrame = -1;
1854 ERR(
": Oops, can't seek back to 'movi' chunk!\n");
1864 if (nStream >
This->fInfo.dwStreams)
1871 WARN(
": file seems to be truncated!\n");
1872 if (nStream <= This->fInfo.dwStreams &&
1873 This->ppStreams[nStream]->sInfo.dwSampleSize > 0) {
1877 ck.
cksize &= ~(
This->ppStreams[nStream]->sInfo.dwSampleSize - 1);
1888 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++)
1890 DWORD sugbuf =
This->ppStreams[nStream]->sInfo.dwSuggestedBufferSize;
1891 if (
This->fInfo.dwSuggestedBufferSize < sugbuf)
1892 This->fInfo.dwSuggestedBufferSize = sugbuf;
1913 for (
n = 0;
n <
This->fInfo.dwStreams;
n++) {
1963 for (
n = 0;
n <
This->fInfo.dwStreams;
n++) {
1968 ERR(
"stream %u length mismatch: dwLength=%u found=%d\n",
1987 if (nStream >
This->fInfo.dwStreams)
2016 assert(
This->sInfo.dwStart <=
pos && pos < This->sInfo.dwLength);
2017 assert(pos <= This->lLastFrame);
2038 This->lpBuffer = new_buffer;
2040 This->cbBuffer = maxSize;
2050 if (
This->lpBuffer[0] !=
This->idxFrames[
pos].ckid ||
2051 This->lpBuffer[1] !=
This->idxFrames[
pos].dwChunkLength) {
2052 ERR(
": block %d not found at 0x%08X\n",
pos,
This->idxFrames[
pos].dwChunkOffset);
2053 ERR(
": Index says: '%4.4s'(0x%08X) size 0x%08X\n",
2055 This->idxFrames[
pos].dwChunkLength);
2056 ERR(
": Data says: '%4.4s'(0x%08X) size 0x%08X\n",
2057 (
char*)&
This->lpBuffer[0],
This->lpBuffer[0],
This->lpBuffer[1]);
2082 (*offset) = (*pos) -
This->sInfo.dwStart;
2083 (*offset) *=
This->sInfo.dwSampleSize;
2088 (*offset) -=
This->idxFrames[
block].dwChunkLength;
2109 if (
This->dwMoviChunkPos == 0)
2114 This->dwNextFramePos -= 3 *
sizeof(
DWORD);
2115 if (
This->nIdxRecords > 0)
2116 This->nIdxRecords--;
2123 memset(&MainAVIHdr, 0,
sizeof(MainAVIHdr));
2125 This->fInfo.dwScale);
2154 ck.
cksize =
sizeof(MainAVIHdr);
2164 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2167 pStream =
This->ppStreams[nStream];
2196 ck.
cksize =
sizeof(strHdr);
2274 if (
This->dwMoviChunkPos - 2 *
sizeof(
DWORD) > dwPos) {
2304 if (
This->fileextra.lp !=
NULL &&
This->fileextra.cb > 0) {
2315 memset(&ckRIFF, 0,
sizeof(ckRIFF));
2337 LONG lInitialFrames = 0;
2341 if (
This->ppStreams[0]->sInfo.dwSampleSize == 0)
2348 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2349 if (lInitialFrames < This->ppStreams[nStream]->sInfo.dwInitialFrames)
2350 lInitialFrames =
This->ppStreams[nStream]->sInfo.dwInitialFrames;
2353 for (
i = -lInitialFrames;
i < (
LONG)
This->fInfo.dwLength - lInitialFrames;
2355 DWORD nFrame = lInitialFrames +
i;
2357 assert(nFrame < This->nIdxRecords);
2361 idx.dwChunkLength =
This->idxRecords[nFrame].dwChunkLength;
2362 idx.dwChunkOffset =
This->idxRecords[nFrame].dwChunkOffset
2363 -
This->dwMoviChunkPos;
2367 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2368 pStream =
This->ppStreams[nStream];
2392 -
This->dwMoviChunkPos;
2405 -
This->dwMoviChunkPos;
2412 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2413 pStream =
This->ppStreams[nStream];
2438 -
This->dwMoviChunkPos;
2462 nStream = (
ULONG)-1;
2463 for (
i = 0;
i <
This->fInfo.dwStreams;
i++) {
2466 if (
This->ppStreams[
i]->sInfo.fccType == fcc) {
2487 This->fInfo.dwMaxBytesPerSec = 0;
2489 This->fInfo.dwSuggestedBufferSize = 0;
2490 This->fInfo.dwWidth = 0;
2491 This->fInfo.dwHeight = 0;
2492 This->fInfo.dwScale = 0;
2493 This->fInfo.dwRate = 0;
2494 This->fInfo.dwLength = 0;
2495 This->dwInitialFrames = 0;
2497 for (
i = 0;
i <
This->fInfo.dwStreams;
i++) {
2504 psi = &
This->ppStreams[
i]->sInfo;
2516 if (
This->fInfo.dwLength <
n)
2517 This->fInfo.dwLength =
n;
2537 if (
This->fInfo.dwWidth <
n)
2538 This->fInfo.dwWidth =
n;
2540 if (
This->fInfo.dwHeight <
n)
2541 This->fInfo.dwHeight =
n;
2557 if (
This->paf->dwMoviChunkPos == 0)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
#define InterlockedIncrement
#define InterlockedDecrement
static HRESULT WINAPI IAVIFile_fnEndRecord(IAVIFile *iface)
static HRESULT WINAPI IPersistFile_fnSave(IPersistFile *iface, LPCOLESTR pszFileName, BOOL fRemember)
static DWORD AVIFILE_ComputeMoviStart(IAVIFileImpl *This)
static HRESULT AVIFILE_WriteBlock(IAVIStreamImpl *This, DWORD block, FOURCC ckid, DWORD flags, LPCVOID buffer, LONG size)
static ULONG WINAPI IAVIStream_fnAddRef(IAVIStream *iface)
static ULONG WINAPI IUnknown_fnRelease(IUnknown *iface)
static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This)
static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile *iface)
static HRESULT WINAPI IAVIStream_fnSetFormat(IAVIStream *iface, LONG pos, void *format, LONG formatsize)
static HRESULT WINAPI IPersistFile_fnQueryInterface(IPersistFile *iface, REFIID riid, void **ppv)
static HRESULT WINAPI IAVIStream_fnQueryInterface(IAVIStream *iface, REFIID riid, void **ppv)
static ULONG WINAPI IUnknown_fnAddRef(IUnknown *iface)
static ULONG WINAPI IPersistFile_fnRelease(IPersistFile *iface)
static HRESULT WINAPI IAVIStream_fnCreate(IAVIStream *iface, LPARAM lParam1, LPARAM lParam2)
static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size)
static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile *iface)
static HRESULT AVIFILE_ReadBlock(IAVIStreamImpl *This, DWORD start, LPVOID buffer, DWORD size)
static HRESULT WINAPI IPersistFile_fnSaveCompleted(IPersistFile *iface, LPCOLESTR pszFileName)
static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile *iface, DWORD ckid, void *lpData, LONG *size)
static HRESULT WINAPI IAVIStream_fnDelete(IAVIStream *iface, LONG start, LONG samples)
static HRESULT AVIFILE_SaveIndex(const IAVIFileImpl *This)
static HRESULT WINAPI IAVIStream_fnRead(IAVIStream *iface, LONG start, LONG samples, void *buffer, LONG buffersize, LONG *bytesread, LONG *samplesread)
static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile *iface, LPCLSID pClassID)
static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, IAVIStream **avis, DWORD fccType, LONG lParam)
static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile *iface, LPOLESTR *ppszFileName)
static void AVIFILE_ConstructAVIStream(IAVIFileImpl *paf, DWORD nr, const AVISTREAMINFOW *asi)
static ULONG WINAPI IAVIStream_fnRelease(IAVIStream *iface)
struct _IAVIStreamImpl IAVIStreamImpl
static IAVIFileImpl * impl_from_IUnknown(IUnknown *iface)
static HRESULT AVIFILE_AddRecord(IAVIFileImpl *This)
static HRESULT WINAPI IAVIStream_fnInfo(IAVIStream *iface, AVISTREAMINFOW *psi, LONG size)
static ULONG WINAPI IAVIFile_fnAddRef(IAVIFile *iface)
static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile *iface, DWORD ckid, void *lpData, LONG size)
static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile *iface, REFIID riid, void **ppv)
static IAVIFileImpl * impl_from_IAVIFile(IAVIFile *iface)
static ULONG AVIFILE_SearchStream(const IAVIFileImpl *This, DWORD fccType, LONG lSkip)
static HRESULT AVIFILE_SaveFile(IAVIFileImpl *This)
static const struct IAVIFileVtbl avif_vt
static LONG WINAPI IAVIStream_fnFindSample(IAVIStream *iface, LONG pos, LONG flags)
static void AVIFILE_DestructAVIStream(IAVIStreamImpl *This)
static HRESULT AVIFILE_ParseIndex(const IAVIFileImpl *This, AVIINDEXENTRY *lp, LONG count, DWORD pos, BOOL *bAbsolute)
static HRESULT WINAPI IAVIStream_fnWriteData(IAVIStream *iface, DWORD fcc, void *lp, LONG size)
static const IUnknownVtbl unk_vtbl
static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos, void *format, LONG *formatsize)
static IAVIStreamImpl * impl_from_IAVIStream(IAVIStream *iface)
static HRESULT AVIFILE_LoadIndex(const IAVIFileImpl *This, DWORD size, DWORD offset)
static void AVIFILE_SamplesToBlock(const IAVIStreamImpl *This, LPLONG pos, LPLONG offset)
static HRESULT WINAPI IAVIStream_fnWrite(IAVIStream *iface, LONG start, LONG samples, void *buffer, LONG buffersize, DWORD flags, LONG *sampwritten, LONG *byteswritten)
static ULONG WINAPI IAVIFile_fnRelease(IAVIFile *iface)
static HRESULT WINAPI IAVIStream_fnReadData(IAVIStream *iface, DWORD fcc, void *lp, LONG *lpread)
static HRESULT AVIFILE_AddFrame(IAVIStreamImpl *This, DWORD ckid, DWORD size, DWORD offset, DWORD flags)
static HRESULT WINAPI IUnknown_fnQueryInterface(IUnknown *iface, REFIID riid, void **ppv)
static const struct IPersistFileVtbl pf_vt
static IAVIFileImpl * impl_from_IPersistFile(IPersistFile *iface)
static const struct IAVIStreamVtbl avist_vt
static void AVIFILE_UpdateInfo(IAVIFileImpl *This)
static HRESULT WINAPI IAVIStream_fnSetInfo(IAVIStream *iface, AVISTREAMINFOW *info, LONG infolen)
static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface, IAVIStream **avis, AVISTREAMINFOW *asi)
static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile *iface, LPCOLESTR pszFileName, DWORD dwMode)
HRESULT AVIFILE_CreateAVIFile(IUnknown *pUnkOuter, REFIID riid, void **ppv)
static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile *iface, DWORD fccType, LONG lParam)
LPCWSTR AVIFILE_BasenameW(LPCWSTR szFileName) DECLSPEC_HIDDEN
#define DIBWIDTHBYTES(bi)
#define TWOCCFromFOURCC(fcc)
static const WCHAR avifile[]
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime)
#define HeapFree(x, y, z)
#define WideCharToMultiByte
#define MultiByteToWideChar
MMRESULT WINAPI mmioAscend(HMMIO hmmio, LPMMCKINFO lpck, UINT uFlags)
MMRESULT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags)
LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin)
HMMIO WINAPI mmioOpenA(LPSTR szFileName, MMIOINFO *lpmmioinfo, DWORD dwOpenFlags)
MMRESULT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch)
MMRESULT WINAPI mmioDescend(HMMIO hmmio, LPMMCKINFO lpck, const MMCKINFO *lpckParent, UINT uFlags)
LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch)
MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO *lpck, UINT uFlags)
HMMIO WINAPI mmioOpenW(LPWSTR szFileName, MMIOINFO *lpmmioinfo, DWORD dwOpenFlags)
GLuint GLuint GLsizei count
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
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 CoTaskMemAlloc(SIZE_T size)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
struct _WAVEFORMATEX * LPWAVEFORMATEX
#define mmioFOURCC(c0, c1, c2, c3)
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
const GUID IID_IPersistFile
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
DWORD dwSuggestedBufferSize
DWORD dwFormatChangeCount
AVIINDEXENTRY * idxRecords
IPersistFile IPersistFile_iface
IAVIStreamImpl * ppStreams[MAX_AVISTREAMS]
AVIINDEXENTRY * idxFrames
IAVIStream IAVIStream_iface
AVIINDEXENTRY * idxFmtChanges
DWORD dwSuggestedBufferSize
DWORD dwPaddingGranularity
#define CONTAINING_RECORD(address, type, field)
WORD WORD PSZ PSZ pszFileName
#define IAVIStream_AddRef(p)
#define listtypeSTREAMHEADER
#define listtypeAVIRECORD
#define AVISTREAMINFO_FORMATCHANGES
#define AVIERR_UNSUPPORTED
#define AVIStreamSampleToSample(pavi1, pavi2, samp2)
#define cktypeDIBcompressed
#define listtypeAVIHEADER
#define AVIFILECAPS_CANWRITE
#define AVIFILEINFO_ISINTERLEAVED
#define ckidSTREAMHANDLERDATA
#define MAKEAVICKID(tcc, stream)
#define AVIFILEINFO_HASINDEX
#define IAVIFile_Release(p)
#define AVIFILEINFO_TRUSTCKTYPE
#define IAVIFile_AddRef(p)
#define AVIERR_BUFFERTOOSMALL
struct _AVIINDEXENTRY AVIINDEXENTRY
#define AVIFILEINFO_COPYRIGHTED
#define AVIFILECAPS_CANREAD
#define StreamFromFOURCC(fcc)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
static unsigned int block