mf/tests: Add more tests for the H264 decoder output media type.
Checking that some attributes are kept while some, frame size related, are enforced by the stream properties. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a7c6062315
commit
e7a3cf7baf
|
@ -6527,11 +6527,23 @@ static void test_h264_decoder(void)
|
|||
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264),
|
||||
{0},
|
||||
};
|
||||
static 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),
|
||||
{0},
|
||||
};
|
||||
static 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_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_VIDEO_ROTATION, 0),
|
||||
{0},
|
||||
};
|
||||
static const struct attribute_desc output_type_desc_win7[] =
|
||||
|
@ -6539,6 +6551,29 @@ static void test_h264_decoder(void)
|
|||
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_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_VIDEO_ROTATION, 0),
|
||||
{0},
|
||||
};
|
||||
static const struct attribute_desc new_output_type_desc[] =
|
||||
{
|
||||
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
|
||||
ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96),
|
||||
ATTR_RATIO(MF_MT_FRAME_RATE, 1, 1),
|
||||
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 2),
|
||||
{0},
|
||||
};
|
||||
static const struct attribute_desc new_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, 96, 96),
|
||||
ATTR_RATIO(MF_MT_FRAME_RATE, 1, 1),
|
||||
ATTR_RATIO(MF_MT_PIXEL_ASPECT_RATIO, 1, 2),
|
||||
{0},
|
||||
};
|
||||
static const MFVideoArea actual_aperture = {.Area={82,84}};
|
||||
|
@ -6549,7 +6584,7 @@ static void test_h264_decoder(void)
|
|||
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_RATIO(MF_MT_FRAME_RATE, 60000, 1000, .todo_value = TRUE),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_SAMPLE_SIZE, actual_width * actual_height * 3 / 2, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width, .todo_value = TRUE),
|
||||
|
@ -6563,7 +6598,7 @@ static void test_h264_decoder(void)
|
|||
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
|
||||
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_RATIO(MF_MT_FRAME_RATE, 60000, 1000, .todo_value = TRUE),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_SAMPLE_SIZE, actual_width * actual_height * 3 / 2, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width, .todo_value = TRUE),
|
||||
|
@ -6577,7 +6612,7 @@ static void test_h264_decoder(void)
|
|||
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
|
||||
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_RATIO(MF_MT_FRAME_RATE, 60000, 1000, .todo_value = TRUE),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_SAMPLE_SIZE, actual_width * actual_height * 3 / 2, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width, .todo_value = TRUE),
|
||||
|
@ -6591,7 +6626,7 @@ static void test_h264_decoder(void)
|
|||
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
|
||||
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_RATIO(MF_MT_FRAME_RATE, 60000, 1000, .todo_value = TRUE),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_SAMPLE_SIZE, actual_width * actual_height * 3 / 2, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width, .todo_value = TRUE),
|
||||
|
@ -6605,7 +6640,7 @@ static void test_h264_decoder(void)
|
|||
ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),
|
||||
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_RATIO(MF_MT_FRAME_RATE, 60000, 1000, .todo_value = TRUE),
|
||||
ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_SAMPLE_SIZE, actual_width * actual_height * 2, .todo_value = TRUE),
|
||||
ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width * 2, .todo_value = TRUE),
|
||||
|
@ -6761,17 +6796,17 @@ static void test_h264_decoder(void)
|
|||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
todo_wine
|
||||
ok(hr == E_INVALIDARG, "SetOutputType returned %#lx.\n", hr);
|
||||
init_media_type(media_type, output_type_desc, 1);
|
||||
init_media_type(media_type, minimal_output_type_desc, 1);
|
||||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
todo_wine
|
||||
ok(hr == MF_E_INVALIDMEDIATYPE, "SetOutputType returned %#lx.\n", hr);
|
||||
init_media_type(media_type, output_type_desc, 2);
|
||||
for (i = 2; i < ARRAY_SIZE(output_type_desc) - 1; ++i)
|
||||
init_media_type(media_type, minimal_output_type_desc, 2);
|
||||
for (i = 2; i < ARRAY_SIZE(minimal_output_type_desc) - 1; ++i)
|
||||
{
|
||||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
todo_wine
|
||||
ok(hr == MF_E_ATTRIBUTENOTFOUND, "SetOutputType returned %#lx.\n", hr);
|
||||
init_media_type(media_type, output_type_desc, i + 1);
|
||||
init_media_type(media_type, minimal_output_type_desc, i + 1);
|
||||
}
|
||||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
ok(hr == (is_win7 ? MF_E_INVALIDMEDIATYPE : S_OK), "SetOutputType returned %#lx.\n", hr);
|
||||
|
@ -6786,6 +6821,23 @@ static void test_h264_decoder(void)
|
|||
check_media_type(media_type, is_win7 ? output_type_desc_win7 : output_type_desc, -1);
|
||||
ret = IMFMediaType_Release(media_type);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
|
||||
/* check that the output media type we've selected don't change the enumeration */
|
||||
|
||||
i = -1;
|
||||
while (SUCCEEDED(hr = IMFTransform_GetOutputAvailableType(transform, 0, ++i, &media_type)))
|
||||
{
|
||||
winetest_push_context("out %lu", i);
|
||||
ok(hr == S_OK, "GetOutputAvailableType returned %#lx\n", hr);
|
||||
check_media_type(media_type, default_outputs[i], -1);
|
||||
check_media_type(media_type, is_win7 ? default_outputs_win7[i] : default_outputs_extra[i], -1);
|
||||
ret = IMFMediaType_Release(media_type);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
winetest_pop_context();
|
||||
}
|
||||
ok(hr == MF_E_NO_MORE_TYPES, "GetOutputAvailableType returned %#lx\n", hr);
|
||||
ok(i == 5, "%lu output media types\n", i);
|
||||
|
||||
flags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE;
|
||||
memset(&input_info, 0xcd, sizeof(input_info));
|
||||
hr = IMFTransform_GetInputStreamInfo(transform, 0, &input_info);
|
||||
|
@ -6801,6 +6853,7 @@ static void test_h264_decoder(void)
|
|||
hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
|
||||
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 */,
|
||||
"got cbSize %#lx\n", output_info.cbSize);
|
||||
ok(output_info.cbAlignment == 0, "got cbAlignment %#lx\n", output_info.cbAlignment);
|
||||
|
@ -6976,6 +7029,71 @@ static void test_h264_decoder(void)
|
|||
trace("created %s\n", debugstr_w(output_path));
|
||||
CloseHandle(output_file);
|
||||
|
||||
/* we can change it, but only with the correct frame size */
|
||||
hr = MFCreateMediaType(&media_type);
|
||||
ok(hr == S_OK, "MFCreateMediaType returned %#lx\n", hr);
|
||||
init_media_type(media_type, is_win7 ? output_type_desc_win7 : output_type_desc, -1);
|
||||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
todo_wine
|
||||
ok(hr == MF_E_INVALIDMEDIATYPE, "SetOutputType returned %#lx.\n", hr);
|
||||
init_media_type(media_type, is_win7 ? new_output_type_desc_win7 : new_output_type_desc, -1);
|
||||
hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
|
||||
ok(hr == S_OK, "SetOutputType returned %#lx.\n", hr);
|
||||
ret = IMFMediaType_Release(media_type);
|
||||
ok(ret == 1, "Release returned %lu\n", ret);
|
||||
|
||||
hr = IMFTransform_GetOutputCurrentType(transform, 0, &media_type);
|
||||
ok(hr == S_OK, "GetOutputCurrentType returned %#lx\n", hr);
|
||||
check_media_type(media_type, is_win7 ? new_output_type_desc_win7 : new_output_type_desc, -1);
|
||||
hr = IMFMediaType_GetItemType(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, NULL);
|
||||
ok(hr == MF_E_ATTRIBUTENOTFOUND, "GetItemType returned %#lx\n", hr);
|
||||
ret = IMFMediaType_Release(media_type);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
|
||||
status = 0;
|
||||
memset(&output, 0, sizeof(output));
|
||||
output.pSample = create_sample(NULL, actual_width * actual_height * 2);
|
||||
hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
|
||||
todo_wine
|
||||
ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr);
|
||||
ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID);
|
||||
ok(!!output.pSample, "got pSample %p\n", output.pSample);
|
||||
todo_wine
|
||||
ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got dwStatus %#lx\n", output.dwStatus);
|
||||
ok(!output.pEvents, "got pEvents %p\n", output.pEvents);
|
||||
todo_wine
|
||||
ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status);
|
||||
check_sample(output.pSample, NULL, 0, NULL);
|
||||
ret = IMFSample_Release(output.pSample);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
|
||||
status = 0;
|
||||
memset(&output, 0, sizeof(output));
|
||||
output.pSample = create_sample(NULL, actual_width * actual_height * 2);
|
||||
hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr);
|
||||
ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID);
|
||||
ok(!!output.pSample, "got pSample %p\n", output.pSample);
|
||||
ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus);
|
||||
ok(!output.pEvents, "got pEvents %p\n", output.pEvents);
|
||||
ok(status == 0, "got status %#lx\n", status);
|
||||
ret = IMFSample_Release(output.pSample);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
|
||||
status = 0;
|
||||
memset(&output, 0, sizeof(output));
|
||||
output.pSample = create_sample(NULL, actual_width * actual_height * 2);
|
||||
hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
|
||||
ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr);
|
||||
ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID);
|
||||
ok(!!output.pSample, "got pSample %p\n", output.pSample);
|
||||
ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus);
|
||||
ok(!output.pEvents, "got pEvents %p\n", output.pEvents);
|
||||
ok(status == 0, "got status %#lx\n", status);
|
||||
ret = IMFSample_Release(output.pSample);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
|
||||
ret = IMFTransform_Release(transform);
|
||||
ok(ret == 0, "Release returned %lu\n", ret);
|
||||
ret = IMFSample_Release(sample);
|
||||
|
|
Loading…
Reference in New Issue