Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Remove the multiplier * The missing test cases will be reinsterted in a later commit --- dlls/mfplat/buffer.c | 22 ++++++++++++++++++--- dlls/mfplat/tests/mfplat.c | 40 ++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index eada3df18ad..39407ccc9e2 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -1351,8 +1351,25 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo if (is_yuv && bottom_up) return MF_E_INVALIDMEDIATYPE;
- if (FAILED(hr = MFGetPlaneSize(fourcc, width, height, &plane_size))) - return hr; + switch (fourcc) + { + case MAKEFOURCC('I','M','C','1'): + case MAKEFOURCC('I','M','C','3'): + plane_size = stride * height * 2; + break; + case MAKEFOURCC('I','M','C','2'): + case MAKEFOURCC('I','M','C','4'): + plane_size = stride * 3 / 2 * height; + break; + case MAKEFOURCC('N','V','1','2'): + case MAKEFOURCC('Y','V','1','2'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): + plane_size = stride * height * 3 / 2; + break; + default: + plane_size = stride * height; + }
if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; @@ -1377,7 +1394,6 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo case MAKEFOURCC('I','M','C','1'): case MAKEFOURCC('I','M','C','3'): max_length = pitch * height * 2; - plane_size *= 2; break; case MAKEFOURCC('N','V','1','2'): case MAKEFOURCC('Y','V','1','2'): diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 67cf8954c36..6ad667a7404 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -5723,48 +5723,49 @@ static void test_MFCreate2DMediaBuffer(void) unsigned int fourcc; unsigned int contiguous_length; int pitch; - unsigned int plane_multiplier; unsigned int max_length; } _2d_buffer_tests[] = { - { 2, 2, MAKEFOURCC('N','V','1','2'), 6, 64, 0, 192 }, + { 2, 2, MAKEFOURCC('N','V','1','2'), 6, 64, 192 }, { 4, 2, MAKEFOURCC('N','V','1','2'), 12, 64 }, { 2, 4, MAKEFOURCC('N','V','1','2'), 12, 64 }, { 1, 3, MAKEFOURCC('N','V','1','2'), 4, 64 }, - { 4, 16, MAKEFOURCC('N','V','1','2'), 96, 64, 0, 1536 }, + { 4, 16, MAKEFOURCC('N','V','1','2'), 96, 64, 1536 },
- { 2, 2, MAKEFOURCC('I','M','C','2'), 6, 128, 0, 384 }, + { 2, 2, MAKEFOURCC('I','M','C','2'), 6, 128, 384 }, { 4, 2, MAKEFOURCC('I','M','C','2'), 12, 128 }, { 2, 4, MAKEFOURCC('I','M','C','2'), 12, 128 }, + { 3, 5, MAKEFOURCC('I','M','C','2'), 20, 128 }, { 2, 2, MAKEFOURCC('I','M','C','4'), 6, 128 }, { 4, 2, MAKEFOURCC('I','M','C','4'), 12, 128 }, { 2, 4, MAKEFOURCC('I','M','C','4'), 12, 128 }, + { 3, 5, MAKEFOURCC('I','M','C','4'), 20, 128 },
- { 4, 2, MAKEFOURCC('I','M','C','1'), 32, 128, 2 }, - { 4, 4, MAKEFOURCC('I','M','C','1'), 64, 128, 2 }, - { 4, 16, MAKEFOURCC('I','M','C','1'), 256, 128, 2, 4096 }, - { 4, 20, MAKEFOURCC('I','M','C','1'), 320, 128, 2 }, + { 4, 2, MAKEFOURCC('I','M','C','1'), 32, 128 }, + { 4, 4, MAKEFOURCC('I','M','C','1'), 64, 128 }, + { 4, 16, MAKEFOURCC('I','M','C','1'), 256, 128, 4096 }, + { 4, 20, MAKEFOURCC('I','M','C','1'), 320, 128 },
- { 4, 2, MAKEFOURCC('I','M','C','3'), 32, 128, 2 }, - { 4, 4, MAKEFOURCC('I','M','C','3'), 64, 128, 2 }, - { 4, 16, MAKEFOURCC('I','M','C','3'), 256, 128, 2, 4096 }, - { 4, 20, MAKEFOURCC('I','M','C','3'), 320, 128, 2 }, + { 4, 2, MAKEFOURCC('I','M','C','3'), 32, 128 }, + { 4, 4, MAKEFOURCC('I','M','C','3'), 64, 128 }, + { 4, 16, MAKEFOURCC('I','M','C','3'), 256, 128, 4096 }, + { 4, 20, MAKEFOURCC('I','M','C','3'), 320, 128 },
{ 4, 2, MAKEFOURCC('Y','V','1','2'), 12, 128 }, { 4, 4, MAKEFOURCC('Y','V','1','2'), 24, 128 }, - { 4, 16, MAKEFOURCC('Y','V','1','2'), 96, 128, 0, 3072 }, + { 4, 16, MAKEFOURCC('Y','V','1','2'), 96, 128, 3072 },
{ 4, 2, MAKEFOURCC('A','Y','U','V'), 32, 64 }, { 4, 4, MAKEFOURCC('A','Y','U','V'), 64, 64 }, - { 4, 16, MAKEFOURCC('A','Y','U','V'), 256, 64, 0, 1024 }, + { 4, 16, MAKEFOURCC('A','Y','U','V'), 256, 64, 1024 },
{ 4, 2, MAKEFOURCC('Y','U','Y','2'), 16, 64 }, { 4, 4, MAKEFOURCC('Y','U','Y','2'), 32, 64 }, - { 4, 16, MAKEFOURCC('Y','U','Y','2'), 128, 64, 0, 1024 }, + { 4, 16, MAKEFOURCC('Y','U','Y','2'), 128, 64, 1024 },
{ 4, 2, MAKEFOURCC('U','Y','V','Y'), 16, 64 }, { 4, 4, MAKEFOURCC('U','Y','V','Y'), 32, 64 }, - { 4, 16, MAKEFOURCC('U','Y','V','Y'), 128, 64, 0, 1024 }, + { 4, 16, MAKEFOURCC('U','Y','V','Y'), 128, 64, 1024 },
{ 2, 4, D3DFMT_A8R8G8B8, 32, 64 }, { 1, 4, D3DFMT_A8R8G8B8, 16, 64 }, @@ -5998,13 +5999,6 @@ static void test_MFCreate2DMediaBuffer(void) hr = IMFMediaBuffer_Unlock(buffer); ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr);
- hr = pMFGetPlaneSize(ptr->fourcc, ptr->width, ptr->height, &length2); - ok(hr == S_OK, "Failed to get plane size, hr %#lx.\n", hr); - if (ptr->plane_multiplier) - length2 *= ptr->plane_multiplier; - ok(length2 == length, "%d: contiguous length %lu does not match plane size %lu, %u x %u, format %s.\n", i, length, - length2, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); - hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr);
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v4: * Added v5: * Fixed "todo_if()" to "todo_wine_if()" --- dlls/mfplat/tests/mfplat.c | 82 +++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 18 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 6ad667a7404..f09ae368ccc 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -5994,7 +5994,48 @@ static void test_MFCreate2DMediaBuffer(void) ok(length2 == ptr->contiguous_length, "%d: unexpected linear buffer length %lu for %u x %u, format %s.\n", i, length2, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4));
- memset(data, 0xff, length2); + hr = pMFGetStrideForBitmapInfoHeader(ptr->fourcc, ptr->width, &stride); + ok(hr == S_OK, "Failed to get stride, hr %#lx.\n", hr); + stride = abs(stride); + + /* primary plane */ + ok(ptr->height * stride <= length2, "Insufficient buffer space: expected at least %lu bytes, got only %lu\n", + ptr->height * stride, length2); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride; k++) + data[j * stride + k] = ((j % 16) << 4) + (k % 16); + + data += ptr->height * stride; + + /* secondary planes */ + switch (ptr->fourcc) + { + case MAKEFOURCC('I','M','C','1'): + case MAKEFOURCC('I','M','C','3'): + ok(2 * ptr->height * stride <= length2, "Insufficient buffer space: expected at least %lu bytes, got only %lu\n", + 2 * ptr->height * stride, length2); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride / 2; k++) + data[j * stride + k] = (((j + ptr->height) % 16) << 4) + (k % 16); + break; + + case MAKEFOURCC('I','M','C','2'): + case MAKEFOURCC('I','M','C','4'): + ok(stride * 3 / 2 * ptr->height <= length2, "Insufficient buffer space: expected at least %lu bytes, got only %lu\n", + stride * 3 / 2 * ptr->height, length2); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride / 2; k++) + data[j * (stride / 2) + k] = (((j + ptr->height) % 16) << 4) + (k % 16); + break; + + case MAKEFOURCC('N','V','1','2'): + ok(stride * ptr->height * 3 / 2 <= length2, "Insufficient buffer space: expected at least %lu bytes, got only %lu\n", + stride * ptr->height * 3 / 2, length2); + for (j = 0; j < ptr->height / 2; j++) + for (k = 0; k < stride; k++) + data[j * stride + k] = (((j + ptr->height) % 16) << 4) + (k % 16); + break; + }
hr = IMFMediaBuffer_Unlock(buffer); ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); @@ -6008,37 +6049,42 @@ static void test_MFCreate2DMediaBuffer(void) ok(pitch == pitch2, "Unexpected pitch.\n");
/* primary plane */ - for(j = 0; j < ptr->height; j++) - for (k = 0; k < ptr->width; k++) - ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride; k++) + ok(data[j * pitch + k] == ((j % 16) << 4) + (k % 16), + "Unexpected byte %02x instead of %02x at test %d row %d column %d.\n", + data[j * pitch + k], ((j % 16) << 4) + (k % 16), i, j, k);
- hr = pMFGetStrideForBitmapInfoHeader(ptr->fourcc, ptr->width, &stride); - ok(hr == S_OK, "Failed to get stride, hr %#lx.\n", hr); + data += ptr->height * pitch;
/* secondary planes */ switch (ptr->fourcc) { case MAKEFOURCC('I','M','C','1'): case MAKEFOURCC('I','M','C','3'): - for (j = ptr->height; j < length2 / stride; j++) - for (k = 0; k < ptr->width / 2; k++) - ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride / 2; k++) + ok(data[j * pitch + k] == (((j + ptr->height) % 16) << 4) + (k % 16), + "Unexpected byte %02x instead of %02x at test %d row %d column %d.\n", + data[j * pitch + k], (((j + ptr->height) % 16) << 4) + (k % 16), i, j + ptr->height, k); break;
case MAKEFOURCC('I','M','C','2'): case MAKEFOURCC('I','M','C','4'): - for (j = ptr->height; j < length2 / stride; j++) - for (k = 0; k < ptr->width / 2; k++) - ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); - for (j = ptr->height; j < length2 / stride; j++) - for (k = pitch / 2; k < pitch / 2 + ptr->width / 2; k++) - ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); + for (j = 0; j < ptr->height; j++) + for (k = 0; k < stride / 2; k++) + todo_wine_if(ptr->height % 2 == 1 && j >= 2) + ok(data[j * (pitch / 2) + k] == (((j + ptr->height) % 16) << 4) + (k % 16), + "Unexpected byte %02x instead of %02x at test %d row %d column %d.\n", + data[j * (pitch / 2) + k], (((j + ptr->height) % 16) << 4) + (k % 16), i, j + ptr->height, k); break;
case MAKEFOURCC('N','V','1','2'): - for (j = ptr->height; j < length2 / stride; j++) - for (k = 0; k < ptr->width; k++) - ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); + for (j = 0; j < ptr->height / 2; j++) + for (k = 0; k < stride; k++) + ok(data[j * pitch + k] == (((j + ptr->height) % 16) << 4) + (k % 16), + "Unexpected byte %02x instead of %02x at test %d row %d column %d.\n", + data[j * pitch + k], (((j + ptr->height) % 16) << 4) + (k % 16), i, j + ptr->height, k); break;
default:
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117550
Your paranoid android.
=== w7u_el (32 bit report) ===
mfplat: 0854:mfplat: unhandled exception c0000005 at 72117D1C
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (41870 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (41878 bytes)
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v4: * Rebased on "Use a more unique pattern when testing image formats." --- dlls/mfplat/buffer.c | 3 +-- dlls/mfplat/tests/mfplat.c | 1 - 2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index 39407ccc9e2..a7ba306223d 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -100,8 +100,7 @@ static void copy_image_imc1(BYTE *dest, LONG dest_stride, const BYTE *src, LONG
static void copy_image_imc2(BYTE *dest, LONG dest_stride, const BYTE *src, LONG src_stride, DWORD width, DWORD lines) { - MFCopyImage(dest, dest_stride, src, src_stride, width / 2, lines / 2); - MFCopyImage(dest + dest_stride / 2, dest_stride, src + src_stride / 2, src_stride, width / 2, lines / 2); + MFCopyImage(dest, dest_stride / 2, src, src_stride / 2, width / 2, lines); }
static inline struct buffer *impl_from_IMFMediaBuffer(IMFMediaBuffer *iface) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index f09ae368ccc..48f7a444add 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -6073,7 +6073,6 @@ static void test_MFCreate2DMediaBuffer(void) case MAKEFOURCC('I','M','C','4'): for (j = 0; j < ptr->height; j++) for (k = 0; k < stride / 2; k++) - todo_wine_if(ptr->height % 2 == 1 && j >= 2) ok(data[j * (pitch / 2) + k] == (((j + ptr->height) % 16) << 4) + (k % 16), "Unexpected byte %02x instead of %02x at test %d row %d column %d.\n", data[j * (pitch / 2) + k], (((j + ptr->height) % 16) << 4) + (k % 16), i, j + ptr->height, k);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117551
Your paranoid android.
=== w7u_el (32 bit report) ===
mfplat: 0854:mfplat: unhandled exception c0000005 at 71F57D1C
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (41289 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (37001 bytes)
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Remove the trace in memory_2d_buffer_Lock2D() v3: * Redirect all invocations to helper functions. v4: * Rework helper functions. --- dlls/mfplat/buffer.c | 103 ++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 51 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index a7ba306223d..eff6a43dc70 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -655,18 +655,11 @@ static const IMF2DBuffer2Vtbl memory_2d_buffer_vtbl = memory_2d_buffer_Copy2DTo, };
-static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) +static HRESULT d3d9_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFlags flags, BYTE **scanline0, + LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { - struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
- TRACE("%p, %p, %p.\n", iface, scanline0, pitch); - - if (!scanline0 || !pitch) - return E_POINTER; - - EnterCriticalSection(&buffer->cs); - if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks) @@ -679,8 +672,29 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca buffer->_2d.locks++; *scanline0 = buffer->d3d9_surface.rect.pBits; *pitch = buffer->d3d9_surface.rect.Pitch; + if (buffer_start) + *buffer_start = *scanline0; + if (buffer_length) + *buffer_length = buffer->d3d9_surface.rect.Pitch * buffer->_2d.height; }
+ return hr; +} + +static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) +{ + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); + HRESULT hr; + + TRACE("%p, %p, %p.\n", iface, scanline0, pitch); + + if (!scanline0 || !pitch) + return E_POINTER; + + EnterCriticalSection(&buffer->cs); + + hr = d3d9_surface_buffer_lock(buffer, MF2DBuffer_LockFlags_ReadWrite, scanline0, pitch, NULL, NULL); + LeaveCriticalSection(&buffer->cs);
return hr; @@ -744,7 +758,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { struct buffer *buffer = impl_from_IMF2DBuffer2(iface); - HRESULT hr = S_OK; + HRESULT hr;
TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length);
@@ -753,23 +767,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu
EnterCriticalSection(&buffer->cs);
- if (buffer->_2d.linear_buffer) - hr = MF_E_UNEXPECTED; - else if (!buffer->_2d.locks) - { - hr = IDirect3DSurface9_LockRect(buffer->d3d9_surface.surface, &buffer->d3d9_surface.rect, NULL, 0); - } - - if (SUCCEEDED(hr)) - { - buffer->_2d.locks++; - *scanline0 = buffer->d3d9_surface.rect.pBits; - *pitch = buffer->d3d9_surface.rect.Pitch; - if (buffer_start) - *buffer_start = *scanline0; - if (buffer_length) - *buffer_length = buffer->d3d9_surface.rect.Pitch * buffer->_2d.height; - } + hr = d3d9_surface_buffer_lock(buffer, flags, scanline0, pitch, buffer_start, buffer_length);
LeaveCriticalSection(&buffer->cs);
@@ -1030,18 +1028,11 @@ static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface return S_OK; }
-static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) +static HRESULT dxgi_surface_buffer_lock2d(struct buffer *buffer, MF2DBuffer_LockFlags flags, + BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { - struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
- TRACE("%p, %p, %p.\n", iface, scanline0, pitch); - - if (!scanline0 || !pitch) - return E_POINTER; - - EnterCriticalSection(&buffer->cs); - if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks++) @@ -1051,6 +1042,10 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca { *scanline0 = buffer->dxgi_surface.map_desc.pData; *pitch = buffer->dxgi_surface.map_desc.RowPitch; + if (buffer_start) + *buffer_start = *scanline0; + if (buffer_length) + *buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height; }
LeaveCriticalSection(&buffer->cs); @@ -1058,6 +1053,25 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca return hr; }
+static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) +{ + struct buffer *buffer = impl_from_IMF2DBuffer2(iface); + HRESULT hr; + + TRACE("%p, %p, %p.\n", iface, scanline0, pitch); + + if (!scanline0 || !pitch) + return E_POINTER; + + EnterCriticalSection(&buffer->cs); + + hr = dxgi_surface_buffer_lock2d(buffer, MF2DBuffer_LockFlags_ReadWrite, scanline0, pitch, NULL, NULL); + + LeaveCriticalSection(&buffer->cs); + + return hr; +} + static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface) { struct buffer *buffer = impl_from_IMF2DBuffer2(iface); @@ -1113,7 +1127,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length) { struct buffer *buffer = impl_from_IMF2DBuffer2(iface); - HRESULT hr = S_OK; + HRESULT hr;
TRACE("%p, %#x, %p, %p, %p, %p.\n", iface, flags, scanline0, pitch, buffer_start, buffer_length);
@@ -1122,20 +1136,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu
EnterCriticalSection(&buffer->cs);
- if (buffer->_2d.linear_buffer) - hr = MF_E_UNEXPECTED; - else if (!buffer->_2d.locks++) - hr = dxgi_surface_buffer_map(buffer); - - if (SUCCEEDED(hr)) - { - *scanline0 = buffer->dxgi_surface.map_desc.pData; - *pitch = buffer->dxgi_surface.map_desc.RowPitch; - if (buffer_start) - *buffer_start = *scanline0; - if (buffer_length) - *buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height; - } + hr = dxgi_surface_buffer_lock2d(buffer, flags, scanline0, pitch, buffer_start, buffer_length);
LeaveCriticalSection(&buffer->cs);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117552
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (38251 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (38318 bytes)
On 6/24/22 10:48, Giovanni Mascellani wrote:
-static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **scanline0, LONG *pitch) +static HRESULT dxgi_surface_buffer_lock2d(struct buffer *buffer, MF2DBuffer_LockFlags flags,
{BYTE **scanline0, LONG *pitch, BYTE **buffer_start, DWORD *buffer_length)
struct buffer *buffer = impl_from_IMF2DBuffer2(iface); HRESULT hr = S_OK;
TRACE("%p, %p, %p.\n", iface, scanline0, pitch);
if (!scanline0 || !pitch)
return E_POINTER;
EnterCriticalSection(&buffer->cs);
if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; else if (!buffer->_2d.locks++)
@@ -1051,6 +1042,10 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca { *scanline0 = buffer->dxgi_surface.map_desc.pData; *pitch = buffer->dxgi_surface.map_desc.RowPitch;
if (buffer_start)
*buffer_start = *scanline0;
if (buffer_length)
*buffer_length = buffer->dxgi_surface.map_desc.RowPitch * buffer->_2d.height; } LeaveCriticalSection(&buffer->cs);
@@ -1058,6 +1053,25 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca return hr; }
You forgot to remove LeaveCriticalSection() here. That's actually visible in the test output when running on Wine.
For consistency between d3d9 and dxgi cases, let's pick one suffix - _lock2d() or _lock().
The same tests are already performed in test_MFGetPlaneSize().
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Added --- dlls/mfplat/tests/mfplat.c | 10 ---------- 1 file changed, 10 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 48f7a444add..0b02bd67172 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -4318,7 +4318,6 @@ image_size_tests[] =
static void test_MFCalculateImageSize(void) { - DWORD plane_size; unsigned int i; UINT32 size; HRESULT hr; @@ -4340,15 +4339,6 @@ static void test_MFCalculateImageSize(void) ok(hr == S_OK || (is_broken && hr == E_INVALIDARG), "%u: failed to calculate image size, hr %#lx.\n", i, hr); ok(size == ptr->size, "%u: unexpected image size %u, expected %u. Size %u x %u, format %s.\n", i, size, ptr->size, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->subtype->Data1, 4)); - - if (pMFGetPlaneSize) - { - unsigned int expected = ptr->plane_size ? ptr->plane_size : ptr->size; - - hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &plane_size); - ok(hr == S_OK, "%u: failed to get plane size, hr %#lx.\n", i, hr); - ok(plane_size == expected, "%u: unexpected plane size %lu, expected %u.\n", i, plane_size, expected); - } } }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117553
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (36968 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (38253 bytes)
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Added v4: * Fix typo in subject --- dlls/mfplat/buffer.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index eff6a43dc70..3c2adf63c6d 100644 --- a/dlls/mfplat/buffer.c +++ b/dlls/mfplat/buffer.c @@ -1317,13 +1317,25 @@ static HRESULT create_1d_buffer(DWORD max_length, DWORD alignment, IMFMediaBuffe
static p_copy_image_func get_2d_buffer_copy_func(DWORD fourcc) { - if (fourcc == MAKEFOURCC('N','V','1','2')) - return copy_image_nv12; - if (fourcc == MAKEFOURCC('I','M','C','1') || fourcc == MAKEFOURCC('I','M','C','3')) - return copy_image_imc1; - if (fourcc == MAKEFOURCC('I','M','C','2') || fourcc == MAKEFOURCC('I','M','C','4')) - return copy_image_imc2; - return NULL; + switch (fourcc) + { + case MAKEFOURCC('N','V','1','2'): + return copy_image_nv12; + + case MAKEFOURCC('I','M','C','1'): + case MAKEFOURCC('I','M','C','3'): + return copy_image_imc1; + + case MAKEFOURCC('I','M','C','2'): + case MAKEFOURCC('I','M','C','4'): + case MAKEFOURCC('Y','V','1','2'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): + return copy_image_imc2; + + default: + return NULL; + } }
static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bottom_up, IMFMediaBuffer **buffer) @@ -1359,12 +1371,12 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo break; case MAKEFOURCC('I','M','C','2'): case MAKEFOURCC('I','M','C','4'): - plane_size = stride * 3 / 2 * height; - break; - case MAKEFOURCC('N','V','1','2'): case MAKEFOURCC('Y','V','1','2'): case MAKEFOURCC('I','4','2','0'): case MAKEFOURCC('I','Y','U','V'): + plane_size = stride * 3 / 2 * height; + break; + case MAKEFOURCC('N','V','1','2'): plane_size = stride * height * 3 / 2; break; default: @@ -1381,6 +1393,8 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo case MAKEFOURCC('I','M','C','3'): case MAKEFOURCC('I','M','C','4'): case MAKEFOURCC('Y','V','1','2'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): row_alignment = MF_128_BYTE_ALIGNMENT; break; default: @@ -1399,6 +1413,8 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo case MAKEFOURCC('Y','V','1','2'): case MAKEFOURCC('I','M','C','2'): case MAKEFOURCC('I','M','C','4'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): max_length = pitch * height * 3 / 2; break; default:
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117554
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (41329 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (41317 bytes)
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Added v4: * Rebased on top of previous modifications * Tweak the comments a little bit --- dlls/mfplat/tests/mfplat.c | 290 ++++++++++++++++++------------------- 1 file changed, 141 insertions(+), 149 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 0b02bd67172..dac9dad1004 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -4233,87 +4233,128 @@ static const struct image_size_test UINT32 height; UINT32 size; UINT32 plane_size; /* Matches image size when 0. */ + UINT32 max_length; + UINT32 contiguous_length; + UINT32 pitch; } image_size_tests[] = { - { &MFVideoFormat_RGB8, 3, 5, 20 }, - { &MFVideoFormat_RGB8, 1, 1, 4 }, - { &MFVideoFormat_RGB555, 3, 5, 40 }, - { &MFVideoFormat_RGB555, 1, 1, 4 }, - { &MFVideoFormat_RGB565, 3, 5, 40 }, - { &MFVideoFormat_RGB565, 1, 1, 4 }, - { &MFVideoFormat_RGB24, 3, 5, 60 }, - { &MFVideoFormat_RGB24, 1, 1, 4 }, - { &MFVideoFormat_RGB32, 3, 5, 60 }, - { &MFVideoFormat_RGB32, 1, 1, 4 }, - { &MFVideoFormat_ARGB32, 3, 5, 60 }, - { &MFVideoFormat_ARGB32, 1, 1, 4 }, - { &MFVideoFormat_A2R10G10B10, 3, 5, 60 }, - { &MFVideoFormat_A2R10G10B10, 1, 1, 4 }, - { &MFVideoFormat_A16B16G16R16F, 3, 5, 120 }, - { &MFVideoFormat_A16B16G16R16F, 1, 1, 8 }, - - /* YUV */ - { &MFVideoFormat_NV12, 1, 3, 9, 4 }, - { &MFVideoFormat_NV12, 1, 2, 6, 3 }, - { &MFVideoFormat_NV12, 2, 2, 6, 6 }, - { &MFVideoFormat_NV12, 3, 2, 12, 9 }, - { &MFVideoFormat_NV12, 4, 2, 12 }, - { &MFVideoFormat_NV12, 320, 240, 115200 }, - { &MFVideoFormat_AYUV, 1, 1, 4 }, - { &MFVideoFormat_AYUV, 2, 1, 8 }, - { &MFVideoFormat_AYUV, 1, 2, 8 }, - { &MFVideoFormat_AYUV, 4, 3, 48 }, - { &MFVideoFormat_AYUV, 320, 240, 307200 }, - { &MFVideoFormat_IMC1, 1, 1, 4 }, - { &MFVideoFormat_IMC1, 2, 1, 4 }, - { &MFVideoFormat_IMC1, 1, 2, 8 }, - { &MFVideoFormat_IMC1, 4, 3, 24 }, - { &MFVideoFormat_IMC1, 320, 240, 153600 }, - { &MFVideoFormat_IMC3, 1, 1, 4 }, - { &MFVideoFormat_IMC3, 2, 1, 4 }, - { &MFVideoFormat_IMC3, 1, 2, 8 }, - { &MFVideoFormat_IMC3, 4, 3, 24 }, - { &MFVideoFormat_IMC3, 320, 240, 153600 }, - { &MFVideoFormat_IMC2, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC2, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC2, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC2, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC2, 4, 2, 12 }, - { &MFVideoFormat_IMC2, 320, 240, 115200 }, - { &MFVideoFormat_IMC4, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC4, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC4, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC4, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC4, 4, 2, 12 }, - { &MFVideoFormat_IMC4, 320, 240, 115200 }, - { &MFVideoFormat_YV12, 1, 1, 3, 1 }, - { &MFVideoFormat_YV12, 2, 1, 3 }, - { &MFVideoFormat_YV12, 1, 2, 6, 3 }, - { &MFVideoFormat_YV12, 4, 3, 18 }, - { &MFVideoFormat_YV12, 320, 240, 115200 }, - - { &MFVideoFormat_I420, 1, 1, 3, 1 }, - { &MFVideoFormat_I420, 2, 1, 3 }, - { &MFVideoFormat_I420, 1, 2, 6, 3 }, - { &MFVideoFormat_I420, 4, 3, 18 }, - { &MFVideoFormat_I420, 320, 240, 115200 }, - - { &MFVideoFormat_IYUV, 1, 1, 3, 1 }, - { &MFVideoFormat_IYUV, 2, 1, 3 }, - { &MFVideoFormat_IYUV, 1, 2, 6, 3 }, - { &MFVideoFormat_IYUV, 4, 3, 18 }, - { &MFVideoFormat_IYUV, 320, 240, 115200 }, - - { &MFVideoFormat_YUY2, 2, 1, 4 }, - { &MFVideoFormat_YUY2, 4, 3, 24 }, - { &MFVideoFormat_YUY2, 128, 128, 32768 }, - { &MFVideoFormat_YUY2, 320, 240, 153600 }, - - { &MFVideoFormat_UYVY, 2, 1, 4 }, - { &MFVideoFormat_UYVY, 4, 3, 24 }, - { &MFVideoFormat_UYVY, 128, 128, 32768 }, - { &MFVideoFormat_UYVY, 320, 240, 153600 }, + /* RGB */ + { &MFVideoFormat_RGB8, 3, 5, 20, 0, 320, 20, 64 }, + { &MFVideoFormat_RGB8, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_RGB555, 3, 5, 40, 0, 320, 40, 64 }, + { &MFVideoFormat_RGB555, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_RGB565, 3, 5, 40, 0, 320, 40, 64 }, + { &MFVideoFormat_RGB565, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_RGB24, 3, 5, 60, 0, 320, 60, 64 }, + { &MFVideoFormat_RGB24, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_RGB32, 3, 5, 60, 0, 320, 60, 64 }, + { &MFVideoFormat_RGB32, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_ARGB32, 3, 5, 60, 0, 320, 60, 64 }, + { &MFVideoFormat_ARGB32, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_A2R10G10B10, 3, 5, 60, 0, 320, 60, 64 }, + { &MFVideoFormat_A2R10G10B10, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_A16B16G16R16F, 3, 5, 120, 0, 320, 120, 64 }, + { &MFVideoFormat_A16B16G16R16F, 1, 1, 8, 0, 64, 8, 64 }, + + /* YUV 4:4:4, 32 bpp, packed */ + { &MFVideoFormat_AYUV, 1, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_AYUV, 2, 1, 8, 0, 64, 8, 64 }, + { &MFVideoFormat_AYUV, 1, 2, 8, 0, 128, 8, 64 }, + { &MFVideoFormat_AYUV, 4, 3, 48, 0, 192, 48, 64 }, + { &MFVideoFormat_AYUV, 320, 240, 307200, 0, 307200, 307200, 1280 }, + + /* YUV 4:2:2, 16 bpp, packed */ + { &MFVideoFormat_YUY2, 2, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_YUY2, 4, 3, 24, 0, 192, 24, 64 }, + { &MFVideoFormat_YUY2, 128, 128, 32768, 0, 32768, 32768, 256 }, + { &MFVideoFormat_YUY2, 320, 240, 153600, 0, 153600, 153600, 640 }, + + { &MFVideoFormat_UYVY, 2, 1, 4, 0, 64, 4, 64 }, + { &MFVideoFormat_UYVY, 4, 3, 24, 0, 192, 24, 64 }, + { &MFVideoFormat_UYVY, 128, 128, 32768, 0, 32768, 32768, 256 }, + { &MFVideoFormat_UYVY, 320, 240, 153600, 0, 153600, 153600, 640 }, + + /* YUV 4:2:0, 16 bpp, planar (the secondary plane has the same + * height, half the width and the same stride as the primary + * one) */ + { &MFVideoFormat_IMC1, 1, 1, 4, 0, 256, 8, 128 }, + { &MFVideoFormat_IMC1, 2, 1, 4, 0, 256, 8, 128 }, + { &MFVideoFormat_IMC1, 1, 2, 8, 0, 512, 16, 128 }, + { &MFVideoFormat_IMC1, 2, 2, 8, 0, 512, 16, 128 }, + { &MFVideoFormat_IMC1, 2, 4, 16, 0, 1024, 32, 128 }, + { &MFVideoFormat_IMC1, 4, 2, 16, 0, 512, 32, 128 }, + { &MFVideoFormat_IMC1, 4, 3, 24, 0, 768, 48, 128 }, + { &MFVideoFormat_IMC1, 320, 240, 153600, 0, 307200, 307200, 640 }, + + { &MFVideoFormat_IMC3, 1, 1, 4, 0, 256, 8, 128 }, + { &MFVideoFormat_IMC3, 2, 1, 4, 0, 256, 8, 128 }, + { &MFVideoFormat_IMC3, 1, 2, 8, 0, 512, 16, 128 }, + { &MFVideoFormat_IMC3, 2, 2, 8, 0, 512, 16, 128 }, + { &MFVideoFormat_IMC3, 2, 4, 16, 0, 1024, 32, 128 }, + { &MFVideoFormat_IMC3, 4, 2, 16, 0, 512, 32, 128 }, + { &MFVideoFormat_IMC3, 4, 3, 24, 0, 768, 48, 128 }, + { &MFVideoFormat_IMC3, 320, 240, 153600, 0, 307200, 307200, 640 }, + + /* YUV 4:2:0, 12 bpp, planar, full stride (the secondary plane has + * half the height, the same width and the same stride as the + * primary one) */ + { &MFVideoFormat_NV12, 1, 3, 9, 4, 288, 4, 64 }, + { &MFVideoFormat_NV12, 1, 2, 6, 3, 192, 3, 64 }, + { &MFVideoFormat_NV12, 2, 2, 6, 6, 192, 6, 64 }, + { &MFVideoFormat_NV12, 2, 4, 12, 0, 384, 12, 64 }, + { &MFVideoFormat_NV12, 3, 2, 12, 9, 192, 9, 64 }, + { &MFVideoFormat_NV12, 4, 2, 12, 0, 192, 12, 64 }, + { &MFVideoFormat_NV12, 320, 240, 115200, 0, 115200, 115200, 320 }, + + /* YUV 4:2:0, 12 bpp, planar, half stride (the secondary plane has + * the same height, half the width and half the stride of the + * primary one) */ + { &MFVideoFormat_IMC2, 1, 3, 9, 4, 576, 3, 128 }, + { &MFVideoFormat_IMC2, 3, 5, 30, 22, 960, 20, 128 }, + { &MFVideoFormat_IMC2, 1, 2, 6, 3, 384, 2, 128 }, + { &MFVideoFormat_IMC2, 2, 2, 6, 6, 384, 6, 128 }, + { &MFVideoFormat_IMC2, 2, 4, 12, 0, 768, 12, 128 }, + { &MFVideoFormat_IMC2, 3, 2, 12, 9, 384, 8, 128 }, + { &MFVideoFormat_IMC2, 4, 2, 12, 0, 384, 12, 128 }, + { &MFVideoFormat_IMC2, 320, 240, 115200, 0, 138240, 115200, 384 }, + + { &MFVideoFormat_IMC4, 1, 3, 9, 4, 576, 3, 128 }, + { &MFVideoFormat_IMC4, 3, 5, 30, 22, 960, 20, 128 }, + { &MFVideoFormat_IMC4, 1, 2, 6, 3, 384, 2, 128 }, + { &MFVideoFormat_IMC4, 2, 2, 6, 6, 384, 6, 128 }, + { &MFVideoFormat_IMC4, 2, 4, 12, 0, 768, 12, 128 }, + { &MFVideoFormat_IMC4, 3, 2, 12, 9, 384, 8, 128 }, + { &MFVideoFormat_IMC4, 4, 2, 12, 0, 384, 12, 128 }, + { &MFVideoFormat_IMC4, 320, 240, 115200, 0, 138240, 115200, 384 }, + + { &MFVideoFormat_YV12, 1, 1, 3, 1, 192, 1, 128 }, + { &MFVideoFormat_YV12, 2, 1, 3, 0, 192, 3, 128 }, + { &MFVideoFormat_YV12, 1, 2, 6, 3, 384, 2, 128 }, + { &MFVideoFormat_YV12, 2, 2, 6, 0, 384, 6, 128 }, + { &MFVideoFormat_YV12, 2, 4, 12, 0, 768, 12, 128 }, + { &MFVideoFormat_YV12, 4, 2, 12, 0, 384, 12, 128 }, + { &MFVideoFormat_YV12, 4, 3, 18, 0, 576, 18, 128 }, + { &MFVideoFormat_YV12, 320, 240, 115200, 0, 138240, 115200, 384 }, + + { &MFVideoFormat_I420, 1, 1, 3, 1, 192, 1, 128 }, + { &MFVideoFormat_I420, 2, 1, 3, 0, 192, 3, 128 }, + { &MFVideoFormat_I420, 1, 2, 6, 3, 384, 2, 128 }, + { &MFVideoFormat_I420, 2, 2, 6, 0, 384, 6, 128 }, + { &MFVideoFormat_I420, 2, 4, 12, 0, 768, 12, 128 }, + { &MFVideoFormat_I420, 4, 2, 12, 0, 384, 12, 128 }, + { &MFVideoFormat_I420, 4, 3, 18, 0, 576, 18, 128 }, + { &MFVideoFormat_I420, 320, 240, 115200, 0, 138240, 115200, 384 }, + + { &MFVideoFormat_IYUV, 1, 1, 3, 1, 192, 1, 128 }, + { &MFVideoFormat_IYUV, 2, 1, 3, 0, 192, 3, 128 }, + { &MFVideoFormat_IYUV, 1, 2, 6, 3, 384, 2, 128 }, + { &MFVideoFormat_IYUV, 2, 2, 6, 0, 384, 6, 128 }, + { &MFVideoFormat_IYUV, 2, 4, 12, 0, 768, 12, 128 }, + { &MFVideoFormat_IYUV, 4, 2, 12, 0, 384, 12, 128 }, + { &MFVideoFormat_IYUV, 4, 3, 18, 0, 576, 18, 128 }, + { &MFVideoFormat_IYUV, 320, 240, 115200, 0, 138240, 115200, 384 }, + };
static void test_MFCalculateImageSize(void) @@ -4366,7 +4407,8 @@ static void test_MFGetPlaneSize(void)
hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &size); ok(hr == S_OK, "%u: failed to get plane size, hr %#lx.\n", i, hr); - ok(size == plane_size, "%u: unexpected plane size %lu, expected %u.\n", i, size, plane_size); + ok(size == plane_size, "%u: unexpected plane size %lu, expected %u. Size %u x %u, format %s.\n", i, size, plane_size, + ptr->width, ptr->height, wine_dbgstr_an((char*)&ptr->subtype->Data1, 4)); } }
@@ -5706,61 +5748,6 @@ static void test_MFGetStrideForBitmapInfoHeader(void)
static void test_MFCreate2DMediaBuffer(void) { - static const struct _2d_buffer_test - { - unsigned int width; - unsigned int height; - unsigned int fourcc; - unsigned int contiguous_length; - int pitch; - unsigned int max_length; - } _2d_buffer_tests[] = - { - { 2, 2, MAKEFOURCC('N','V','1','2'), 6, 64, 192 }, - { 4, 2, MAKEFOURCC('N','V','1','2'), 12, 64 }, - { 2, 4, MAKEFOURCC('N','V','1','2'), 12, 64 }, - { 1, 3, MAKEFOURCC('N','V','1','2'), 4, 64 }, - { 4, 16, MAKEFOURCC('N','V','1','2'), 96, 64, 1536 }, - - { 2, 2, MAKEFOURCC('I','M','C','2'), 6, 128, 384 }, - { 4, 2, MAKEFOURCC('I','M','C','2'), 12, 128 }, - { 2, 4, MAKEFOURCC('I','M','C','2'), 12, 128 }, - { 3, 5, MAKEFOURCC('I','M','C','2'), 20, 128 }, - { 2, 2, MAKEFOURCC('I','M','C','4'), 6, 128 }, - { 4, 2, MAKEFOURCC('I','M','C','4'), 12, 128 }, - { 2, 4, MAKEFOURCC('I','M','C','4'), 12, 128 }, - { 3, 5, MAKEFOURCC('I','M','C','4'), 20, 128 }, - - { 4, 2, MAKEFOURCC('I','M','C','1'), 32, 128 }, - { 4, 4, MAKEFOURCC('I','M','C','1'), 64, 128 }, - { 4, 16, MAKEFOURCC('I','M','C','1'), 256, 128, 4096 }, - { 4, 20, MAKEFOURCC('I','M','C','1'), 320, 128 }, - - { 4, 2, MAKEFOURCC('I','M','C','3'), 32, 128 }, - { 4, 4, MAKEFOURCC('I','M','C','3'), 64, 128 }, - { 4, 16, MAKEFOURCC('I','M','C','3'), 256, 128, 4096 }, - { 4, 20, MAKEFOURCC('I','M','C','3'), 320, 128 }, - - { 4, 2, MAKEFOURCC('Y','V','1','2'), 12, 128 }, - { 4, 4, MAKEFOURCC('Y','V','1','2'), 24, 128 }, - { 4, 16, MAKEFOURCC('Y','V','1','2'), 96, 128, 3072 }, - - { 4, 2, MAKEFOURCC('A','Y','U','V'), 32, 64 }, - { 4, 4, MAKEFOURCC('A','Y','U','V'), 64, 64 }, - { 4, 16, MAKEFOURCC('A','Y','U','V'), 256, 64, 1024 }, - - { 4, 2, MAKEFOURCC('Y','U','Y','2'), 16, 64 }, - { 4, 4, MAKEFOURCC('Y','U','Y','2'), 32, 64 }, - { 4, 16, MAKEFOURCC('Y','U','Y','2'), 128, 64, 1024 }, - - { 4, 2, MAKEFOURCC('U','Y','V','Y'), 16, 64 }, - { 4, 4, MAKEFOURCC('U','Y','V','Y'), 32, 64 }, - { 4, 16, MAKEFOURCC('U','Y','V','Y'), 128, 64, 1024 }, - - { 2, 4, D3DFMT_A8R8G8B8, 32, 64 }, - { 1, 4, D3DFMT_A8R8G8B8, 16, 64 }, - { 4, 1, D3DFMT_A8R8G8B8, 16, 64 }, - }; static const char two_aas[] = { 0xaa, 0xaa }; static const char eight_bbs[] = { 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb }; DWORD max_length, length, length2; @@ -5958,18 +5945,17 @@ static void test_MFCreate2DMediaBuffer(void)
IMFMediaBuffer_Release(buffer);
- for (i = 0; i < ARRAY_SIZE(_2d_buffer_tests); ++i) + for (i = 0; i < ARRAY_SIZE(image_size_tests); ++i) { - const struct _2d_buffer_test *ptr = &_2d_buffer_tests[i]; + const struct image_size_test *ptr = &image_size_tests[i];
- hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->fourcc, FALSE, &buffer); + hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->subtype->Data1, FALSE, &buffer); ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr);
hr = IMFMediaBuffer_GetMaxLength(buffer, &length); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (ptr->max_length) - ok(length == ptr->max_length, "%u: unexpected maximum length %lu for %u x %u, format %s.\n", - i, length, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); + ok(length == ptr->max_length, "%u: unexpected maximum length %lu for %u x %u, format %s.\n", + i, length, ptr->width, ptr->height, wine_dbgstr_guid(ptr->subtype));
hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer); ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); @@ -5977,14 +5963,14 @@ static void test_MFCreate2DMediaBuffer(void) hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, &length); ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); ok(length == ptr->contiguous_length, "%d: unexpected contiguous length %lu for %u x %u, format %s.\n", - i, length, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); + i, length, ptr->width, ptr->height, wine_dbgstr_guid(ptr->subtype));
hr = IMFMediaBuffer_Lock(buffer, &data, &length2, NULL); ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); ok(length2 == ptr->contiguous_length, "%d: unexpected linear buffer length %lu for %u x %u, format %s.\n", - i, length2, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); + i, length2, ptr->width, ptr->height, wine_dbgstr_guid(ptr->subtype));
- hr = pMFGetStrideForBitmapInfoHeader(ptr->fourcc, ptr->width, &stride); + hr = pMFGetStrideForBitmapInfoHeader(ptr->subtype->Data1, ptr->width, &stride); ok(hr == S_OK, "Failed to get stride, hr %#lx.\n", hr); stride = abs(stride);
@@ -5998,7 +5984,7 @@ static void test_MFCreate2DMediaBuffer(void) data += ptr->height * stride;
/* secondary planes */ - switch (ptr->fourcc) + switch (ptr->subtype->Data1) { case MAKEFOURCC('I','M','C','1'): case MAKEFOURCC('I','M','C','3'): @@ -6011,6 +5997,9 @@ static void test_MFCreate2DMediaBuffer(void)
case MAKEFOURCC('I','M','C','2'): case MAKEFOURCC('I','M','C','4'): + case MAKEFOURCC('Y','V','1','2'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): ok(stride * 3 / 2 * ptr->height <= length2, "Insufficient buffer space: expected at least %lu bytes, got only %lu\n", stride * 3 / 2 * ptr->height, length2); for (j = 0; j < ptr->height; j++) @@ -6048,7 +6037,7 @@ static void test_MFCreate2DMediaBuffer(void) data += ptr->height * pitch;
/* secondary planes */ - switch (ptr->fourcc) + switch (ptr->subtype->Data1) { case MAKEFOURCC('I','M','C','1'): case MAKEFOURCC('I','M','C','3'): @@ -6061,6 +6050,9 @@ static void test_MFCreate2DMediaBuffer(void)
case MAKEFOURCC('I','M','C','2'): case MAKEFOURCC('I','M','C','4'): + case MAKEFOURCC('Y','V','1','2'): + case MAKEFOURCC('I','4','2','0'): + case MAKEFOURCC('I','Y','U','V'): for (j = 0; j < ptr->height; j++) for (k = 0; k < stride / 2; k++) ok(data[j * (pitch / 2) + k] == (((j + ptr->height) % 16) << 4) + (k % 16), @@ -6084,7 +6076,7 @@ static void test_MFCreate2DMediaBuffer(void) ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr);
ok(pitch == ptr->pitch, "%d: unexpected pitch %ld, expected %d, %u x %u, format %s.\n", i, pitch, ptr->pitch, - ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); + ptr->width, ptr->height, wine_dbgstr_guid(ptr->subtype));
ret = TRUE; hr = IMF2DBuffer_IsContiguousFormat(_2dbuffer, &ret); @@ -6097,11 +6089,11 @@ static void test_MFCreate2DMediaBuffer(void) }
/* Alignment tests */ - for (i = 0; i < ARRAY_SIZE(_2d_buffer_tests); ++i) + for (i = 0; i < ARRAY_SIZE(image_size_tests); ++i) { - const struct _2d_buffer_test *ptr = &_2d_buffer_tests[i]; + const struct image_size_test *ptr = &image_size_tests[i];
- hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->fourcc, FALSE, &buffer); + hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->subtype->Data1, FALSE, &buffer); ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr);
hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117555
Your paranoid android.
=== w7u_el (32 bit report) ===
mfplat: 085c:mfplat: unhandled exception c0000005 at 71EF7D1C
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (41309 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (38290 bytes)
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=117549
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: mfplat:mfplat prints too much data (41258 bytes)
=== debian11 (32 bit WoW report) ===
Report validation errors: mfplat:mfplat prints too much data (38287 bytes)