From: Bruno Jesus <00cpxxx@gmail.com> Subject: quartz: Skip AVI bad chunks while looking for the LIST chunk Message-Id: Date: Thu, 3 Sep 2015 23:12:58 +0800 If we can't find the LIST chunk we cannot go on so I simplified error handling and shifted the indentation back since the if hr == S_OK after the loop is not useful anymore. The AVI in question has a few bad chunks before the good one as seen in https://bugs.winehq.org/attachment.cgi?id=52257 Partially fix bug https://bugs.winehq.org/show_bug.cgi?id=26216 diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index 6059511..d62ec2b 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -1109,24 +1109,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin, return E_FAIL; } - pos += sizeof(RIFFCHUNK) + list.cb; - hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); - - while (list.fcc == ckidAVIPADDING || (list.fcc == FOURCC_LIST && list.fccListType != listtypeAVIMOVIE)) + /* Skip any chunks until we find the LIST chunk */ + do { pos += sizeof(RIFFCHUNK) + list.cb; - hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); } + while (hr == S_OK && (list.fcc != FOURCC_LIST || + (list.fcc == FOURCC_LIST && list.fccListType != listtypeAVIMOVIE))); - if (list.fcc != FOURCC_LIST) - { - ERR("Expected LIST, but got %.04s\n", (LPSTR)&list.fcc); - return E_FAIL; - } - if (list.fccListType != listtypeAVIMOVIE) + if (hr != S_OK) { - ERR("Expected AVI movie list, but got %.04s\n", (LPSTR)&list.fccListType); + ERR("Failed to find LIST chunk from AVI file\n"); return E_FAIL; } @@ -1134,21 +1128,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin, /* FIXME: AVIX files are extended beyond the FOURCC chunk "AVI ", and thus won't be played here, * once I get one of the files I'll try to fix it */ - if (hr == S_OK) - { - This->rtStart = pAviSplit->CurrentChunkOffset = MEDIATIME_FROM_BYTES(pos + sizeof(RIFFLIST)); - pos += list.cb + sizeof(RIFFCHUNK); - - pAviSplit->EndOfFile = This->rtStop = MEDIATIME_FROM_BYTES(pos); - if (pos > total) - { - ERR("File smaller (%x%08x) then EndOfFile (%x%08x)\n", (DWORD)(total >> 32), (DWORD)total, (DWORD)(pAviSplit->EndOfFile >> 32), (DWORD)pAviSplit->EndOfFile); - return E_FAIL; - } + This->rtStart = pAviSplit->CurrentChunkOffset = MEDIATIME_FROM_BYTES(pos + sizeof(RIFFLIST)); + pos += list.cb + sizeof(RIFFCHUNK); - hr = IAsyncReader_SyncRead(This->pReader, BYTES_FROM_MEDIATIME(pAviSplit->CurrentChunkOffset), sizeof(pAviSplit->CurrentChunk), (BYTE *)&pAviSplit->CurrentChunk); + pAviSplit->EndOfFile = This->rtStop = MEDIATIME_FROM_BYTES(pos); + if (pos > total) + { + ERR("File smaller (%x%08x) then EndOfFile (%x%08x)\n", (DWORD)(total >> 32), (DWORD)total, (DWORD)(pAviSplit->EndOfFile >> 32), (DWORD)pAviSplit->EndOfFile); + return E_FAIL; } + hr = IAsyncReader_SyncRead(This->pReader, BYTES_FROM_MEDIATIME(pAviSplit->CurrentChunkOffset), sizeof(pAviSplit->CurrentChunk), (BYTE *)&pAviSplit->CurrentChunk); + props->cbAlign = 1; props->cbPrefix = 0; /* Comrades, prevent shortage of buffers, or you will feel the consequences! DA! */