[PATCH v2 4/6] winegstreamer: Use H264 input media type frame size when specified.
Rémi Bernon
wine at gitlab.winehq.org
Thu Jun 23 10:20:19 CDT 2022
From: Rémi Bernon <rbernon at codeweavers.com>
Updating the internal stream format frame size accordingly.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45988
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47084
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49715
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52183
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/mf/tests/mf.c | 87 +++++++++++++++++--------------
dlls/winegstreamer/h264_decoder.c | 7 +++
2 files changed, 55 insertions(+), 39 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index afe85ddbf3c..7b598ba7dac 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -6674,14 +6674,17 @@ static void test_h264_decoder(void)
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264_ES),
},
};
- static const media_type_desc default_outputs[] =
+ static const DWORD input_width = 120, input_height = 248;
+ static const DWORD align_input_width = (input_width + 15) & ~15;
+ static const DWORD align_input_height = (input_height + 15) & ~15;
+ const media_type_desc default_outputs[] =
{
{
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 1),
ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001),
- ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 1920),
+ ATTR_UINT32(MF_MT_DEFAULT_STRIDE, input_width),
ATTR_UINT32(MF_MT_INTERLACE_MODE, 7),
ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1),
ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1),
@@ -6691,7 +6694,7 @@ static void test_h264_decoder(void)
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_YV12),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 1),
ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001),
- ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 1920),
+ ATTR_UINT32(MF_MT_DEFAULT_STRIDE, input_width),
ATTR_UINT32(MF_MT_INTERLACE_MODE, 7),
ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1),
ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1),
@@ -6701,7 +6704,7 @@ static void test_h264_decoder(void)
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_IYUV),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 1),
ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001),
- ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 1920),
+ ATTR_UINT32(MF_MT_DEFAULT_STRIDE, input_width),
ATTR_UINT32(MF_MT_INTERLACE_MODE, 7),
ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1),
ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1),
@@ -6711,7 +6714,7 @@ static void test_h264_decoder(void)
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_I420),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 1),
ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001),
- ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 1920),
+ ATTR_UINT32(MF_MT_DEFAULT_STRIDE, input_width),
ATTR_UINT32(MF_MT_INTERLACE_MODE, 7),
ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1),
ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1),
@@ -6721,97 +6724,98 @@ static void test_h264_decoder(void)
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_YUY2),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 1),
ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001),
- ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 3840),
+ ATTR_UINT32(MF_MT_DEFAULT_STRIDE, input_width * 2),
ATTR_UINT32(MF_MT_INTERLACE_MODE, 7),
ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1),
ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1),
},
};
- static const media_type_desc default_outputs_extra[] =
+ const media_type_desc default_outputs_extra[] =
{
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3110400),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, input_width * input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3110400),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, input_width * input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3110400),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, input_width * input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3110400),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, input_width * input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 4147200),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, input_width * input_height * 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
},
};
- static const media_type_desc default_outputs_win7[] =
+ const media_type_desc default_outputs_win7[] =
{
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3133440),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, align_input_width * align_input_height * 3 / 2),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3133440),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, align_input_width * align_input_height * 3 / 2),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3133440),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, align_input_width * align_input_height * 3 / 2),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3133440),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, align_input_width * align_input_height * 3 / 2),
},
{
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 4177920),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, align_input_width * align_input_height * 2),
},
};
- static const struct attribute_desc input_type_desc[] =
+ const struct attribute_desc input_type_desc[] =
{
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
{0},
};
- static const struct attribute_desc minimal_output_type_desc[] =
+ const struct attribute_desc minimal_output_type_desc[] =
{
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12),
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
{0},
};
- static const struct attribute_desc output_type_desc[] =
+ const struct attribute_desc output_type_desc[] =
{
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12),
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1080),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, input_width, input_height),
ATTR_RATIO(MF_MT_FRAME_RATE, 60000, 1000),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 2, 1),
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 3840),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3840 * 1080 * 3 / 2),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3840 * input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
{0},
};
- static const struct attribute_desc output_type_desc_win7[] =
+ const struct attribute_desc output_type_desc_win7[] =
{
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12),
- ATTR_RATIO(MF_MT_FRAME_SIZE, 1920, 1088),
+ ATTR_RATIO(MF_MT_FRAME_SIZE, align_input_width, align_input_height),
ATTR_RATIO(MF_MT_FRAME_RATE, 60000, 1000),
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 2, 1),
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 3840),
- ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3840 * 1088 * 3 / 2),
+ ATTR_UINT32(MF_MT_SAMPLE_SIZE, 3840 * align_input_height * 3 / 2),
ATTR_UINT32(MF_MT_VIDEO_ROTATION, 0),
{0},
};
@@ -7017,6 +7021,9 @@ static void test_h264_decoder(void)
init_media_type(media_type, input_type_desc, 2);
hr = IMFTransform_SetInputType(transform, 0, media_type, 0);
ok(hr == S_OK, "SetInputType returned %#lx.\n", hr);
+ init_media_type(media_type, input_type_desc, -1);
+ hr = IMFTransform_SetInputType(transform, 0, media_type, 0);
+ ok(hr == S_OK, "SetInputType returned %#lx.\n", hr);
ret = IMFMediaType_Release(media_type);
ok(ret == 1, "Release returned %lu\n", ret);
@@ -7026,7 +7033,8 @@ static void test_h264_decoder(void)
ok(hr == S_OK, "GetOutputStreamInfo returned %#lx\n", hr);
ok(output_info.dwFlags == flags, "got dwFlags %#lx\n", output_info.dwFlags);
todo_wine
- ok(output_info.cbSize == 1920 * 1080 * 2 || broken(output_info.cbSize == 1920 * 1088 * 2) /* Win7 */,
+ ok(output_info.cbSize == input_width * input_height * 2
+ || broken(output_info.cbSize == align_input_width * align_input_height * 2) /* Win7 */,
"got cbSize %#lx\n", output_info.cbSize);
ok(output_info.cbAlignment == 0, "got cbAlignment %#lx\n", output_info.cbAlignment);
@@ -7113,7 +7121,8 @@ static void test_h264_decoder(void)
ok(hr == S_OK, "GetOutputStreamInfo returned %#lx\n", hr);
ok(output_info.dwFlags == flags, "got dwFlags %#lx\n", output_info.dwFlags);
todo_wine
- ok(output_info.cbSize == 1920 * 1080 * 2 || broken(output_info.cbSize == 1920 * 1088 * 2) /* Win7 */,
+ ok(output_info.cbSize == input_width * input_height * 2
+ || broken(output_info.cbSize == align_input_width * align_input_height * 2) /* Win7 */,
"got cbSize %#lx\n", output_info.cbSize);
ok(output_info.cbAlignment == 0, "got cbAlignment %#lx\n", output_info.cbAlignment);
diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c
index 1a9dcbd561c..2ece7dee5b1 100644
--- a/dlls/winegstreamer/h264_decoder.c
+++ b/dlls/winegstreamer/h264_decoder.c
@@ -401,6 +401,7 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM
{
struct h264_decoder *decoder = impl_from_IMFTransform(iface);
GUID major, subtype;
+ UINT64 frame_size;
HRESULT hr;
ULONG i;
@@ -429,6 +430,12 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM
IMFMediaType_Release(decoder->input_type);
IMFMediaType_AddRef((decoder->input_type = type));
+ if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size)))
+ {
+ decoder->wg_format.u.video.width = frame_size >> 32;
+ decoder->wg_format.u.video.height = (UINT32)frame_size;
+ }
+
return S_OK;
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/302
More information about the wine-devel
mailing list