From: Akihiro Sagawa <sagawa.aki@gmail.com> --- dlls/mciavi32/mciavi.c | 9 ++++++--- dlls/mciavi32/mmoutput.c | 22 ++++++++++++++-------- dlls/winmm/tests/mci.c | 4 ++-- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/dlls/mciavi32/mciavi.c b/dlls/mciavi32/mciavi.c index a62c791cc9c..a726d63b6d0 100644 --- a/dlls/mciavi32/mciavi.c +++ b/dlls/mciavi32/mciavi.c @@ -570,7 +570,7 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms } dwFromFrame = wma->dwCurrVideoFrame; - dwToFrame = wma->dwPlayableVideoFrames - 1; + dwToFrame = wma->dwPlayableVideoFrames; if (dwFlags & MCI_FROM) { dwFromFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwFrom); @@ -578,8 +578,11 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms if (dwFlags & MCI_TO) { dwToFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo); } - if (dwToFrame >= wma->dwPlayableVideoFrames) - dwToFrame = wma->dwPlayableVideoFrames - 1; + if (dwToFrame > wma->dwPlayableVideoFrames) + { + LeaveCriticalSection(&wma->cs); + return MCIERR_OUTOFRANGE; + } TRACE("Playing from frame=%lu to frame=%lu\n", dwFromFrame, dwToFrame); diff --git a/dlls/mciavi32/mmoutput.c b/dlls/mciavi32/mmoutput.c index dd8f96e1314..1a3945a60cd 100644 --- a/dlls/mciavi32/mmoutput.c +++ b/dlls/mciavi32/mmoutput.c @@ -588,23 +588,29 @@ double MCIAVI_PaintFrame(WINE_MCIAVI* wma, HDC hDC) { void* pBitmapData; LPBITMAPINFO pBitmapInfo; + DWORD frame; if (!hDC || !wma->inbih) return 0; - TRACE("Painting frame %lu (cached %lu)\n", wma->dwCurrVideoFrame, wma->dwCachedFrame); + if (wma->dwCurrVideoFrame >= wma->dwPlayableVideoFrames) + frame = wma->dwPlayableVideoFrames - 1; + else + frame = wma->dwCurrVideoFrame; + + TRACE("Painting frame %lu (cached %lu)\n", frame, wma->dwCachedFrame); - if (wma->dwCurrVideoFrame != wma->dwCachedFrame) + if (frame != wma->dwCachedFrame) { - if (!wma->lpVideoIndex[wma->dwCurrVideoFrame].dwOffset) + if (!wma->lpVideoIndex[frame].dwOffset) return 0; - if (wma->lpVideoIndex[wma->dwCurrVideoFrame].dwSize) + if (wma->lpVideoIndex[frame].dwSize) { - mmioSeek(wma->hFile, wma->lpVideoIndex[wma->dwCurrVideoFrame].dwOffset, SEEK_SET); - mmioRead(wma->hFile, wma->indata, wma->lpVideoIndex[wma->dwCurrVideoFrame].dwSize); + mmioSeek(wma->hFile, wma->lpVideoIndex[frame].dwOffset, SEEK_SET); + mmioRead(wma->hFile, wma->indata, wma->lpVideoIndex[frame].dwSize); - wma->inbih->biSizeImage = wma->lpVideoIndex[wma->dwCurrVideoFrame].dwSize; + wma->inbih->biSizeImage = wma->lpVideoIndex[frame].dwSize; if (wma->hic && ICDecompress(wma->hic, 0, wma->inbih, wma->indata, wma->outbih, wma->outdata) != ICERR_OK) @@ -614,7 +620,7 @@ double MCIAVI_PaintFrame(WINE_MCIAVI* wma, HDC hDC) } } - wma->dwCachedFrame = wma->dwCurrVideoFrame; + wma->dwCachedFrame = frame; } if (wma->hic) { diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 029609d8835..e9c2b11173d 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1808,7 +1808,7 @@ static void test_avi_end_position(void) parm.status.dwReturn = 0xFEEDABAD; err = mciSendCommandW(id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); ok(!err, "mciCommand status position: %s\n", dbg_mcierr(err)); - todo_wine ok(parm.status.dwReturn == frames, "Got %Iu, expected %Iu\n", parm.status.dwReturn, frames); + ok(parm.status.dwReturn == frames, "Got %Iu, expected %Iu\n", parm.status.dwReturn, frames); /* test "play to" range */ parm.play.dwTo = frames; @@ -1817,7 +1817,7 @@ static void test_avi_end_position(void) parm.play.dwTo = frames + 1; err = mciSendCommandW(id, MCI_PLAY, MCI_TO | MCI_WAIT, (DWORD_PTR)&parm); - todo_wine ok(err == MCIERR_OUTOFRANGE, "mciCommand play to %lu: %s\n", parm.play.dwTo, dbg_mcierr(err)); + ok(err == MCIERR_OUTOFRANGE, "mciCommand play to %lu: %s\n", parm.play.dwTo, dbg_mcierr(err)); /* test "seek to" range */ parm.seek.dwTo = frames; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10089