diff --git a/dlls/mf/tests/mf_test.h b/dlls/mf/tests/mf_test.h index 05aa34e3d28..e48204224b4 100644 --- a/dlls/mf/tests/mf_test.h +++ b/dlls/mf/tests/mf_test.h @@ -95,7 +95,6 @@ struct sample_desc DWORD repeat_count; BOOL todo_length; BOOL todo_duration; - LONGLONG todo_time; }; #define check_mf_sample_collection(a, b, c) check_mf_sample_collection_(__FILE__, __LINE__, a, b, c) diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 04c59bbdffc..c7b001bfb11 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -1205,7 +1205,6 @@ static DWORD check_mf_sample_(const char *file, int line, IMFSample *sample, con timestamp = 0xdeadbeef; hr = IMFSample_GetSampleTime(sample, ×tamp); ok_(file, line)(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine_if(expect->todo_time && (timestamp == expect->todo_time || expect->todo_time == -1)) ok_(file, line)(llabs(timestamp - expect->sample_time) <= 50, "got sample time %I64d\n", timestamp); @@ -3711,7 +3710,7 @@ static void test_h264_decoder(void) const struct sample_desc expect_output_sample_i420 = { .attributes = output_sample_attributes, - .sample_time = 333667, .sample_duration = 333667, .todo_time = 1334666 /* with VA-API */, + .sample_time = 333667, .sample_duration = 333667, .buffer_count = 1, .buffers = &output_buffer_desc_i420, }; @@ -4037,26 +4036,13 @@ static void test_h264_decoder_concat_streams(void) { .attributes = output_sample_attributes + 0, .sample_time = 0, .sample_duration = 400000, - .todo_duration = 333666, - .buffer_count = 1, .buffers = output_buffer_desc + 0, - }, - { - .attributes = output_sample_attributes + 0, - .sample_time = 400000, .sample_duration = 400000, - .buffer_count = 1, .buffers = output_buffer_desc + 0, .repeat_count = 26, - .todo_time = -1, .todo_duration = 333666, - }, - { - .attributes = output_sample_attributes + 0, - .sample_time = 11200000, .sample_duration = 400000, - .buffer_count = 1, .buffers = output_buffer_desc + 0, .repeat_count = 1, - .todo_time = -1, .todo_duration = 333666, + .buffer_count = 1, .buffers = output_buffer_desc + 0, .repeat_count = 29, }, { .attributes = output_sample_attributes + 0, .sample_time = 12000000, .sample_duration = 400000, .buffer_count = 1, .buffers = output_buffer_desc + 2, .repeat_count = 29, - .todo_time = -1, .todo_duration = 333666, .todo_length = TRUE, + .todo_length = TRUE, }, { .attributes = output_sample_attributes + 0, diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c index 8eeeb52fd60..97289f69a4d 100644 --- a/dlls/winegstreamer/h264_decoder.c +++ b/dlls/winegstreamer/h264_decoder.c @@ -53,6 +53,7 @@ struct h264_decoder IMFAttributes *attributes; IMFAttributes *output_attributes; + UINT64 sample_time; IMFMediaType *input_type; MFT_INPUT_STREAM_INFO input_info; IMFMediaType *output_type; @@ -700,8 +701,9 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, struct h264_decoder *decoder = impl_from_IMFTransform(iface); struct wg_format wg_format; UINT32 sample_size; + LONGLONG duration; IMFSample *sample; - UINT64 frame_size; + UINT64 frame_size, frame_rate; GUID subtype; DWORD size; HRESULT hr; @@ -748,8 +750,20 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, if (SUCCEEDED(hr = wg_transform_read_mf(decoder->wg_transform, sample, sample_size, &wg_format, &samples->dwStatus))) + { wg_sample_queue_flush(decoder->wg_sample_queue, false); + if (FAILED(IMFMediaType_GetUINT64(decoder->input_type, &MF_MT_FRAME_RATE, &frame_rate))) + frame_rate = (UINT64)30000 << 32 | 1001; + + duration = (UINT64)10000000 * (UINT32)frame_rate / (frame_rate >> 32); + if (FAILED(IMFSample_SetSampleTime(sample, decoder->sample_time))) + WARN("Failed to set sample time\n"); + if (FAILED(IMFSample_SetSampleDuration(sample, duration))) + WARN("Failed to set sample duration\n"); + decoder->sample_time += duration; + } + if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE; diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 559e8f976d2..d0f94ed7649 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -342,9 +342,6 @@ NTSTATUS wg_transform_create(void *args) */ transform->input_max_length = 16; transform->output_plane_align = 15; - if (!(element = create_element("h264parse", "base")) - || !append_element(transform->container, element, &first, &last)) - goto out; /* fallthrough */ case WG_MAJOR_TYPE_AUDIO_MPEG1: case WG_MAJOR_TYPE_AUDIO_MPEG4: