From: Akihiro Sagawa <sagawa.aki@gmail.com> --- dlls/winmm/tests/mci.c | 106 ++++++++++++++++++++++++++++++++++++++ dlls/winmm/tests/rsrc.rc | 4 ++ dlls/winmm/tests/test.avi | Bin 0 -> 6376 bytes 3 files changed, 110 insertions(+) create mode 100644 dlls/winmm/tests/test.avi diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index f6654912515..029609d8835 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -43,6 +43,8 @@ typedef union { MCI_DGV_WHERE_PARMS where; MCI_DGV_WINDOW_PARMSW win; MCI_GENERIC_PARMS gen; + MCI_PLAY_PARMS play; + MCI_DGV_STEP_PARMS step; } MCI_PARMS_UNION; const char* dbg_mcierr(MCIERROR err) @@ -1763,6 +1765,109 @@ static void test_video_window(void) ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); } +static void test_avi_end_position(void) +{ + const WCHAR *filename = load_resource(L"test.avi"); + MCI_PARMS_UNION parm; + DWORD_PTR frames; + MCIDEVICEID id; + MCIERROR err; + BOOL ret; + + parm.dgv_open.lpstrDeviceType = (WCHAR *)L"AVIVideo"; + parm.dgv_open.lpstrElementName = (WCHAR *)filename; + err = mciSendCommandW(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD_PTR)&parm); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + id = parm.dgv_open.wDeviceID; + + parm.status.dwItem = MCI_STATUS_TIME_FORMAT; + parm.status.dwReturn = 0xFEEDABAD; + err = mciSendCommandW(id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); + ok(!err,"mciCommand status time format: %s\n", dbg_mcierr(err)); + ok(parm.status.dwReturn == MCI_FORMAT_FRAMES, "status time format: %Id\n", parm.status.dwReturn); + + parm.status.dwItem = MCI_STATUS_LENGTH; + parm.status.dwReturn = 0xFEEDABAD; + err = mciSendCommandW(id, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); + ok(!err,"mciCommand status length: %s\n", dbg_mcierr(err)); + ok(parm.status.dwReturn > 0, "status length: %Id\n", parm.status.dwReturn); + frames = (DWORD_PTR)parm.status.dwReturn; + + /* before playing, the position equals to zero */ + parm.status.dwItem = MCI_STATUS_POSITION; + 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)); + ok(parm.status.dwReturn == 0, "Got %Iu, expected 0\n", parm.status.dwReturn); + + /* after playing, the position equals to the length */ + err = mciSendCommandW(id, MCI_PLAY, MCI_WAIT, (DWORD_PTR)&parm); + ok(!err, "mciCommand play: %s\n", dbg_mcierr(err)); + + parm.status.dwItem = MCI_STATUS_POSITION; + 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); + + /* test "play to" range */ + parm.play.dwTo = frames; + err = mciSendCommandW(id, MCI_PLAY, MCI_TO | MCI_WAIT, (DWORD_PTR)&parm); + ok(!err, "mciCommand play to %lu: %s\n", parm.play.dwTo, dbg_mcierr(err)); + + 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)); + + /* test "seek to" range */ + parm.seek.dwTo = frames; + err = mciSendCommandW(id, MCI_SEEK, MCI_TO, (DWORD_PTR)&parm); + todo_wine ok(!err, "mciCommand seek to %lu: %s\n", parm.seek.dwTo, dbg_mcierr(err)); + + parm.seek.dwTo = frames + 1; + err = mciSendCommandW(id, MCI_SEEK, MCI_TO, (DWORD_PTR)&parm); + ok(err == MCIERR_OUTOFRANGE, "mciCommand play to %lu: %s\n", parm.play.dwTo, dbg_mcierr(err)); + + parm.seek.dwTo = 0; + err = mciSendCommandW(id, MCI_SEEK, MCI_TO | MCI_WAIT, (DWORD_PTR)&parm); + ok(!err, "mciCommand seek to %lu: %s\n", parm.seek.dwTo, dbg_mcierr(err)); + + /* the end position equals to the length */ + err = mciSendCommandW(id, MCI_SEEK, MCI_SEEK_TO_END | MCI_WAIT, (DWORD_PTR)&parm); + ok(!err, "mciCommand seek to end: %s\n", dbg_mcierr(err)); + + parm.status.dwItem = MCI_STATUS_POSITION; + 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); + + /* the start position equals to zero */ + err = mciSendCommandW(id, MCI_SEEK, MCI_SEEK_TO_START | MCI_WAIT, (DWORD_PTR)&parm); + ok(!err, "mciCommand seek to end: %s\n", dbg_mcierr(err)); + + parm.status.dwItem = MCI_STATUS_POSITION; + 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)); + ok(parm.status.dwReturn == 0, "Got %Iu, expected %Iu\n", parm.status.dwReturn, frames); + + /* test "step to" range */ + parm.step.dwFrames = frames; + err = mciSendCommandW(id, MCI_STEP, MCI_DGV_STEP_FRAMES | MCI_TEST, (DWORD_PTR)&parm); + todo_wine ok(!err, "mciCommand step by %lu: %s\n", parm.step.dwFrames, dbg_mcierr(err)); + + parm.step.dwFrames = frames + 1; + err = mciSendCommandW(id, MCI_STEP, MCI_DGV_STEP_FRAMES | MCI_TEST, (DWORD_PTR)&parm); + ok(err == MCIERR_OUTOFRANGE, "mciCommand step by %lu: %s\n", parm.step.dwFrames, dbg_mcierr(err)); + + err = mciSendCommandW(id, MCI_CLOSE, 0, 0); + ok(!err, "Got %s.\n", dbg_mcierr(err)); + + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + START_TEST(mci) { char curdir[MAX_PATH], tmpdir[MAX_PATH]; @@ -1789,6 +1894,7 @@ START_TEST(mci) skip("No output devices available, skipping all output tests\n"); test_video_window(); + test_avi_end_position(); /* Win9X hangs when exiting with something still open. */ err = mciSendStringA("close all", NULL, 0, hwnd); diff --git a/dlls/winmm/tests/rsrc.rc b/dlls/winmm/tests/rsrc.rc index b77f501344e..aeda67e1a6a 100644 --- a/dlls/winmm/tests/rsrc.rc +++ b/dlls/winmm/tests/rsrc.rc @@ -24,6 +24,10 @@ /* @makedep: test.mpg */ test.mpg RCDATA "test.mpg" +/* ffmpeg -f lavfi -i smptebars -t 0.16 -r 24 -f avi -vcodec msvideo1 -pix_fmt pal8 -vf scale=32x24 test.avi */ +/* @makedep: test.avi */ +test.avi RCDATA "test.avi" + /* ffmpeg -f lavfi -i "sine=frequency=1000" -t 0.1 -c:a pcm_s24le test_s24le.wav */ /* @makedep: test_s24le.wav */ test_s24le.wav WAVE "test_s24le.wav" diff --git a/dlls/winmm/tests/test.avi b/dlls/winmm/tests/test.avi new file mode 100644 index 0000000000000000000000000000000000000000..1338aec90f7169aef47fda27b1cbbe43197d5109 GIT binary patch literal 6376 zcmWIYbaQ(k!NA}c=BeQ08609E#K4e|Qk0WemYHF}z`$^55d*`DL<TSr;ACK60kaqw z7{Rmvg8~Bsg9Mn3N`TCIAi%&-TvC)%Tv7x!t1L66*f%)L8CfOB9GHHP*}oVW82<nN z{~xACfk6UfMw$i#0|N-d>|<mQU;vxN22+Wky+ZxGB?J&|H84m?M#zq`MnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLI{)<6cxB2c@#AM02^0eW?+GjX~4!N zU~(WDNgJ368f#!-WMIfo$<0a0&B^!y79E)cXv{~7fq}u(&&}U6*e!&Qfq}s%u`JEZ zK+n)j&(Oet0Tfz4m`7&ljQV;s1V(xYfJz80CI*Jw{IX2Ys4Qr-_ie*n!PgC&B>&el zFq~%CD9OO^zrMT_Gy?p;etOvd`hWExntzU<ptb}v3qu14nj5}tU|`^3e9K_YBF4bL zV8L=X@^r&Q$$Qld3?3}%3=SNLEajs2elsxKuP+Z{lUZkBl_3#xRFHQDpA4T2zd~4u zi3bCNBFkM@?HL>bpmLp&L4n~t<2AAWsfrDdSo*<qohe9eDT89ie@n#{kZJ~oA5mAM zu0~yt`f=~^qpOkHhgX>WWZKE*?R?zmCzB-e*UB$Vo7o;PEnpI1{>=1%iGjI1^+6K@ z!)1?+E)2{Mm@fNFba5@UydjyOo4^$!nIM^>o5CGoV9b!f;v?Q5asTn7sgd4?j~huc z|73!hxwTTH`7;wpH_Xh`REB1VSs+o6nWd$Y4<Kg2%w)boYxA_7PZ<4Vl48c<zEV{8 zO>)8RJ_ZI*3IL7y8?@kNXQosbIxs-w1sEV>`k+(;(hG_wHYSJ|j4y=7mxJ;F6Zi91 literal 0 HcmV?d00001 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10089