[AVIFILE] FindSample bugs
Michael Guennewig
Michael.Guennewig at gmx.de
Wed Nov 26 09:27:57 CST 2003
Changelog:
- Fixed multiple bugs in FindSample implementation of AVI and WAV
file handler.
Regards, Michael.
Index: dlls/avifil32/avifile.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/avifile.c,v
retrieving revision 1.40
diff -d -u -r1.40 avifile.c
--- dlls/avifil32/avifile.c 14 Oct 2003 20:06:23 -0000 1.40
+++ dlls/avifil32/avifile.c 26 Nov 2003 15:26:55 -0000
@@ -840,14 +840,18 @@
ULONG n;
for (n = 0; n < This->sInfo.dwFormatChangeCount; n++)
- if (This->idxFmtChanges[n].ckid >= pos)
+ if (This->idxFmtChanges[n].ckid >= pos) {
+ pos = This->idxFmtChanges[n].ckid;
goto RETURN_FOUND;
+ }
} else {
LONG n;
for (n = (LONG)This->sInfo.dwFormatChangeCount; n >= 0; n--) {
- if (This->idxFmtChanges[n].ckid <= pos)
+ if (This->idxFmtChanges[n].ckid <= pos) {
+ pos = This->idxFmtChanges[n].ckid;
goto RETURN_FOUND;
+ }
}
if (pos > (LONG)This->sInfo.dwStart)
@@ -858,30 +862,34 @@
return -1;
}
- if (flags & FIND_RET) {
- RETURN_FOUND:
- if (flags & FIND_LENGTH) {
- /* logical size */
- if (This->sInfo.dwSampleSize)
- pos = This->sInfo.dwSampleSize;
- else
- pos = 1;
- } else if (flags & FIND_OFFSET) {
- /* physical position */
- pos = This->idxFrames[pos].dwChunkOffset + offset * This->sInfo.dwSampleSize;
- } else if (flags & FIND_SIZE) {
- /* physical size */
- pos = This->idxFrames[pos].dwChunkLength;
- } else if (flags & FIND_INDEX) {
- FIXME(": FIND_INDEX flag is not supported!");
-
- pos = This->paf->dwIdxChunkPos;
- } /* else logical position */
+ RETURN_FOUND:
+ if (pos < (LONG)This->sInfo.dwStart)
+ return -1;
- return pos;
- }
+ switch (flags & FIND_RET) {
+ case FIND_LENGTH:
+ /* physical size */
+ pos = This->idxFrames[pos].dwChunkLength;
+ break;
+ case FIND_OFFSET:
+ /* physical position */
+ pos = This->idxFrames[pos].dwChunkOffset + 2 * sizeof(DWORD)
+ + offset * This->sInfo.dwSampleSize;
+ break;
+ case FIND_SIZE:
+ /* logical size */
+ if (This->sInfo.dwSampleSize)
+ pos = This->sInfo.dwSampleSize;
+ else
+ pos = 1;
+ break;
+ case FIND_INDEX:
+ FIXME(": FIND_INDEX flag is not supported!\n");
+ /* This is an index in the index-table on disc. */
+ break;
+ }; /* else logical position */
- return -1;
+ return pos;
}
static HRESULT WINAPI IAVIStream_fnReadFormat(IAVIStream *iface, LONG pos,
Index: dlls/avifil32/wavfile.c
===================================================================
RCS file: /home/wine/wine/dlls/avifil32/wavfile.c,v
retrieving revision 1.8
diff -d -u -r1.8 wavfile.c
--- dlls/avifil32/wavfile.c 5 Sep 2003 23:08:44 -0000 1.8
+++ dlls/avifil32/wavfile.c 26 Nov 2003 15:26:55 -0000
@@ -757,9 +757,10 @@
pos = 0;
}
- if (flags & (FIND_LENGTH|FIND_SIZE))
+ if ((flags & FIND_RET) == FIND_LENGTH ||
+ (flags & FIND_RET) == FIND_SIZE)
return This->sInfo.dwSampleSize;
- if (flags & FIND_OFFSET)
+ if ((flags & FIND_RET) == FIND_OFFSET)
return This->ckData.dwDataOffset + pos * This->sInfo.dwSampleSize;
return pos;
More information about the wine-patches
mailing list