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 %lu 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%08lX,%ld)\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;
361 This->fInfo.dwStreams++;
368 *avis = &
This->ppStreams[
n]->IAVIStream_iface;
378 TRACE(
"(%p,0x%08lX,%p,%ld)\n", iface, ckid, lpData,
size);
399 TRACE(
"(%p,0x%08lX,%p,%p)\n", iface, ckid, lpData,
size);
408 TRACE(
"(%p)\n",iface);
416 if (
This->dwMoviChunkPos == 0)
429 if (
This->fInfo.dwSuggestedBufferSize <
This->ckLastRecord.cksize + 3 *
sizeof(
DWORD))
430 This->fInfo.dwSuggestedBufferSize =
This->ckLastRecord.cksize + 3 *
sizeof(
DWORD);
434 This->ckLastRecord.cksize = 0;
440 This->dwNextFramePos += 3 *
sizeof(
DWORD);
450 TRACE(
"(%p,0x%08lX,%ld)\n", iface, fccType,
lParam);
463 if (nStream < This->fInfo.dwStreams &&
467 This->fInfo.dwStreams--;
468 if (nStream < This->fInfo.dwStreams)
470 (
This->fInfo.dwStreams - nStream) *
sizeof(
This->ppStreams[0]));
499 return IUnknown_QueryInterface(
This->outer_unk,
riid,
ppv);
506 return IUnknown_AddRef(
This->outer_unk);
513 return IUnknown_Release(
This->outer_unk);
518 TRACE(
"(%p,%p)\n", iface, pClassID);
520 if (pClassID ==
NULL)
523 *pClassID = CLSID_AVIFile;
532 TRACE(
"(%p)\n", iface);
552 This->uMode = dwMode;
568 if (szFileName ==
NULL)
612 TRACE(
"(%p,%p)\n", iface, ppszFileName);
614 if (ppszFileName ==
NULL)
617 *ppszFileName =
NULL;
623 if (*ppszFileName ==
NULL)
632static const struct IPersistFileVtbl
pf_vt = {
656 obj->IPersistFile_iface.lpVtbl = &
pf_vt;
659 obj->outer_unk = pUnkOuter;
661 obj->outer_unk = &
obj->IUnknown_inner;
663 hr = IUnknown_QueryInterface(&
obj->IUnknown_inner,
riid,
ppv);
664 IUnknown_Release(&
obj->IUnknown_inner);
677 WARN(
"invalid parameter\n");
722 TRACE(
"(%p,0x%08IX,0x%08IX)\n", iface, lParam1, lParam2);
732 TRACE(
"(%p,%p,%ld)\n", iface, psi,
size);
759 if (
This->sInfo.dwSampleSize != 0) {
766 while (0 <=
pos && pos <= This->lLastFrame) {
776 while (0 <=
pos && pos <= This->lLastFrame) {
777 if (
This->idxFrames[
pos].dwChunkLength > 0)
791 for (
n = 0;
n <
This->sInfo.dwFormatChangeCount;
n++)
792 if (
This->idxFmtChanges[
n].ckid >=
pos) {
799 for (
n = (
LONG)
This->sInfo.dwFormatChangeCount;
n >= 0;
n--) {
800 if (
This->idxFmtChanges[
n].ckid <=
pos) {
830 if (
This->sInfo.dwSampleSize)
831 pos =
This->sInfo.dwSampleSize;
836 FIXME(
": FIND_INDEX flag is not supported!\n");
851 if (formatsize ==
NULL)
856 *formatsize =
This->cbFormat;
863 if (*(
DWORD*)formatsize < This->cbFormat) {
864 *formatsize =
This->cbFormat;
875 FIXME(
": need to read formatchange for %ld -- unimplemented!\n",lLastFmt);
879 *formatsize =
This->cbFormat;
906 if (
This->paf->dwMoviChunkPos != 0)
912 This->cbFormat = formatsize;
920 lDim =
This->sInfo.rcFrame.right -
This->sInfo.rcFrame.left;
921 if (lDim < lpbiNew->biWidth)
922 This->sInfo.rcFrame.right =
This->sInfo.rcFrame.left + lpbiNew->
biWidth;
923 lDim =
This->sInfo.rcFrame.bottom -
This->sInfo.rcFrame.top;
924 if (lDim < lpbiNew->biHeight)
938 if (
This->cbFormat != formatsize)
998 TRACE(
"(%p,%ld,%ld,%p,%ld,%p,%p)\n", iface,
start,
samples,
buffer,
999 buffersize, bytesread, samplesread);
1002 if (bytesread !=
NULL)
1004 if (samplesread !=
NULL)
1016 if (bytesread ==
NULL && samplesread ==
NULL)
1019 if (
This->sInfo.dwSampleSize != 0)
1035 if (
This->sInfo.dwSampleSize != 0) {
1055 while (
samples > 0 && buffersize > 0) {
1064 blocksize =
This->lpBuffer[1];
1065 TRACE(
"blocksize = %lu\n",blocksize);
1076 if (bytesread !=
NULL)
1078 if (samplesread !=
NULL)
1079 *samplesread +=
size /
This->sInfo.dwSampleSize;
1091 assert(start <= This->lLastFrame);
1101 if (bytesread !=
NULL)
1103 if (samplesread !=
NULL)
1117 TRACE(
"(%p,%ld,%ld,%p,%ld,0x%08lX,%p,%p)\n", iface,
start,
samples,
1118 buffer, buffersize,
flags, sampwritten, byteswritten);
1121 if (sampwritten !=
NULL)
1123 if (byteswritten !=
NULL)
1134 switch (
This->sInfo.fccType) {
1148 if (
This->lLastFrame == -1)
1152 }
else if (
This->lLastFrame == -1)
1155 if (
This->sInfo.dwSampleSize != 0) {
1157 if (
samples *
This->sInfo.dwSampleSize != buffersize)
1168 FIXME(
": not interleaved, could collect audio data!\n");
1176 if (
This->lLastFrame != -1) {
1191 if (sampwritten !=
NULL)
1193 if (byteswritten !=
NULL)
1194 *byteswritten = buffersize;
1211 if (
start + samples < This->sInfo.dwStart)
1242 TRACE(
"(%p,0x%08lX,%p,%p)\n", iface, fcc, lp, lpread);
1245 if (
This->lpHandlerData !=
NULL &&
This->cbHandlerData > 0) {
1246 if (lp ==
NULL || *lpread <= 0) {
1247 *lpread =
This->cbHandlerData;
1252 if (*lpread < This->cbHandlerData)
1265 TRACE(
"(%p,0x%08lx,%p,%ld)\n", iface, fcc, lp,
size);
1278 if (
This->paf->dwMoviChunkPos != 0) {
1285 if (dwPos >=
This->paf->dwMoviChunkPos - 2 *
sizeof(
DWORD))
1293 FIXME(
": handler data already set -- overwrite?\n");
1310 FIXME(
"(%p,%p,%ld): stub\n", iface,
info, infolen);
1347 flags &= ~AVIIF_KEYFRAME;
1351 ERR(
": found palette change in non-video stream!\n");
1355 if (
This->idxFmtChanges ==
NULL ||
This->nIdxFmtChanges <=
This->sInfo.dwFormatChangeCount) {
1356 DWORD new_count =
This->nIdxFmtChanges + 16;
1359 This->idxFmtChanges = new_buffer;
1360 This->nIdxFmtChanges = new_count;
1364 n = ++
This->sInfo.dwFormatChangeCount;
1365 This->idxFmtChanges[
n].ckid =
This->lLastFrame;
1366 This->idxFmtChanges[
n].dwFlags = 0;
1368 This->idxFmtChanges[
n].dwChunkLength =
size;
1381 if (
This->lLastFrame == -1)
1384 if (
This->sInfo.dwSuggestedBufferSize <
size)
1385 This->sInfo.dwSuggestedBufferSize =
size;
1389 This->nIdxFrames += 512;
1396 This->idxFrames[
This->lLastFrame].ckid = ckid;
1399 This->idxFrames[
This->lLastFrame].dwChunkLength =
size;
1402 if (
This->sInfo.dwLength <=
This->lLastFrame)
1403 This->sInfo.dwLength =
This->lLastFrame + 1;
1418 This->cbIdxRecords = new_count;
1431 This->idxRecords[
This->nIdxRecords].dwChunkOffset =
1432 This->ckLastRecord.dwDataOffset - 2 *
sizeof(
DWORD);
1433 This->idxRecords[
This->nIdxRecords].dwChunkLength =
1434 This->ckLastRecord.cksize;
1435 This->nIdxRecords++;
1448 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
1453 dwPos += ((pStream->
cbFormat + 1) & ~1U);
1460 if (
This->dwMoviChunkPos == 0) {
1461 This->dwNextFramePos = dwPos;
1467 This->dwMoviChunkPos =
This->dwNextFramePos -
sizeof(
DWORD);
1525 This->lLastFrame = -1;
1530 This->nIdxFrames = 0;
1542 This->cbHandlerData = 0;
1576 ERR(
": not an AVI!\n");
1592 if (ck.
cksize !=
sizeof(MainAVIHdr)) {
1593 ERR(
": invalid size of %ld for MainAVIHeader!\n", ck.
cksize);
1607 This->uMode &= ~MMIO_RWMODE;
1614 This->fInfo.dwScale = 1000000;
1620 This->fInfo.dwSuggestedBufferSize = 0;
1631 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
1640 if (pStream ==
NULL)
1702 if (ck.
cksize >
sizeof(streamHdr))
1703 n =
sizeof(streamHdr);
1738 for (
n = nStream; 0 <=
n;
n--) {
1739 if (
This->ppStreams[
n]->sInfo.fccHandler == streamHdr.
fccType)
1772 WARN(
": found extra chunk 0x%08lX\n", ck.
ckid);
1821 This->fInfo.dwFlags &= ~AVIFILEINFO_HASINDEX;
1827 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++)
1828 This->ppStreams[nStream]->lLastFrame = -1;
1831 ERR(
": Oops, can't seek back to 'movi' chunk!\n");
1841 if (nStream >
This->fInfo.dwStreams)
1848 WARN(
": file seems to be truncated!\n");
1849 if (nStream <= This->fInfo.dwStreams &&
1850 This->ppStreams[nStream]->sInfo.dwSampleSize > 0) {
1854 ck.
cksize &= ~(
This->ppStreams[nStream]->sInfo.dwSampleSize - 1);
1865 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++)
1867 DWORD sugbuf =
This->ppStreams[nStream]->sInfo.dwSuggestedBufferSize;
1868 if (
This->fInfo.dwSuggestedBufferSize < sugbuf)
1869 This->fInfo.dwSuggestedBufferSize = sugbuf;
1890 for (
n = 0;
n <
This->fInfo.dwStreams;
n++) {
1939 for (
n = 0;
n <
This->fInfo.dwStreams;
n++) {
1944 ERR(
"stream %lu length mismatch: dwLength=%lu found=%ld\n",
1963 if (nStream >
This->fInfo.dwStreams)
1992 assert(
This->sInfo.dwStart <=
pos && pos < This->sInfo.dwLength);
1993 assert(pos <= This->lLastFrame);
2007 void *new_buffer =
realloc(
This->lpBuffer, maxSize);
2009 This->lpBuffer = new_buffer;
2010 This->cbBuffer = maxSize;
2020 if (
This->lpBuffer[0] !=
This->idxFrames[
pos].ckid ||
2021 This->lpBuffer[1] !=
This->idxFrames[
pos].dwChunkLength) {
2022 ERR(
": block %ld not found at 0x%08lX\n",
pos,
This->idxFrames[
pos].dwChunkOffset);
2023 ERR(
": Index says: '%4.4s'(0x%08lX) size 0x%08lX\n",
2025 This->idxFrames[
pos].dwChunkLength);
2026 ERR(
": Data says: '%4.4s'(0x%08lX) size 0x%08lX\n",
2027 (
char*)&
This->lpBuffer[0],
This->lpBuffer[0],
This->lpBuffer[1]);
2052 (*offset) = (*pos) -
This->sInfo.dwStart;
2053 (*offset) *=
This->sInfo.dwSampleSize;
2058 (*offset) -=
This->idxFrames[
block].dwChunkLength;
2079 if (
This->dwMoviChunkPos == 0)
2084 This->dwNextFramePos -= 3 *
sizeof(
DWORD);
2085 if (
This->nIdxRecords > 0)
2086 This->nIdxRecords--;
2093 memset(&MainAVIHdr, 0,
sizeof(MainAVIHdr));
2095 This->fInfo.dwScale);
2124 ck.
cksize =
sizeof(MainAVIHdr);
2134 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2137 pStream =
This->ppStreams[nStream];
2166 ck.
cksize =
sizeof(strHdr);
2244 if (
This->dwMoviChunkPos - 2 *
sizeof(
DWORD) > dwPos) {
2274 if (
This->fileextra.lp !=
NULL &&
This->fileextra.cb > 0) {
2285 memset(&ckRIFF, 0,
sizeof(ckRIFF));
2307 LONG lInitialFrames = 0;
2311 if (
This->ppStreams[0]->sInfo.dwSampleSize == 0)
2318 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2319 if (lInitialFrames < This->ppStreams[nStream]->sInfo.dwInitialFrames)
2320 lInitialFrames =
This->ppStreams[nStream]->sInfo.dwInitialFrames;
2323 for (
i = -lInitialFrames;
i < (
LONG)
This->fInfo.dwLength - lInitialFrames;
2325 DWORD nFrame = lInitialFrames +
i;
2327 assert(nFrame < This->nIdxRecords);
2331 idx.dwChunkLength =
This->idxRecords[nFrame].dwChunkLength;
2332 idx.dwChunkOffset =
This->idxRecords[nFrame].dwChunkOffset
2333 -
This->dwMoviChunkPos;
2337 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2338 pStream =
This->ppStreams[nStream];
2362 -
This->dwMoviChunkPos;
2375 -
This->dwMoviChunkPos;
2382 for (nStream = 0; nStream <
This->fInfo.dwStreams; nStream++) {
2383 pStream =
This->ppStreams[nStream];
2408 -
This->dwMoviChunkPos;
2432 nStream = (
ULONG)-1;
2433 for (
i = 0;
i <
This->fInfo.dwStreams;
i++) {
2436 if (
This->ppStreams[
i]->sInfo.fccType == fcc) {
2457 This->fInfo.dwMaxBytesPerSec = 0;
2459 This->fInfo.dwSuggestedBufferSize = 0;
2460 This->fInfo.dwWidth = 0;
2461 This->fInfo.dwHeight = 0;
2462 This->fInfo.dwScale = 0;
2463 This->fInfo.dwRate = 0;
2464 This->fInfo.dwLength = 0;
2465 This->dwInitialFrames = 0;
2467 for (
i = 0;
i <
This->fInfo.dwStreams;
i++) {
2474 psi = &
This->ppStreams[
i]->sInfo;
2486 if (
This->fInfo.dwLength <
n)
2487 This->fInfo.dwLength =
n;
2507 if (
This->fInfo.dwWidth <
n)
2508 This->fInfo.dwWidth =
n;
2510 if (
This->fInfo.dwHeight <
n)
2511 This->fInfo.dwHeight =
n;
2527 if (
This->paf->dwMoviChunkPos == 0)
#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)
#define DIBWIDTHBYTES(bi)
#define TWOCCFromFOURCC(fcc)
static const WCHAR avifile[]
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
#define WideCharToMultiByte
#define MultiByteToWideChar
_ACRTIMP void *__cdecl _recalloc(void *, size_t, size_t) __WINE_ALLOC_SIZE(2
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
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
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
#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 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