[PATCH 3/3] winegstreamer: Support dynamic H264 decoder output format change.
Rémi Bernon
rbernon at codeweavers.com
Wed Apr 6 15:35:55 CDT 2022
On 4/6/22 22:33, Zebediah Figura wrote:
> On 4/6/22 15:29, Rémi Bernon wrote:
>> On 4/6/22 22:13, Zebediah Figura wrote:
>>>>>> +
>>>>>> + if (!(decoder->wg_transform =
>>>>>> wg_transform_create(&input_format, &decoder->output_format)))
>>>>>> return E_FAIL;
>>>>>> return S_OK;
>>>>>> @@ -369,7 +376,7 @@ static HRESULT WINAPI
>>>>>> transform_GetOutputAvailableType(IMFTransform *iface, DWOR
>>>>>> if (FAILED(hr = IMFMediaType_SetGUID(media_type,
>>>>>> &MF_MT_SUBTYPE, output_type)))
>>>>>> goto done;
>>>>>> - hr = fill_output_media_type(media_type, NULL);
>>>>>> + hr = fill_output_media_type(media_type, decoder->output_type);
>>>>>> done:
>>>>>> if (SUCCEEDED(hr))
>>>>>
>>>>> This also seems like it's orthogonal to dynamic format change. (Is
>>>>> it possible to write tests for this?)
>>>>>
>>>>
>>>>
>>>> I don't think it's completely orthogonal, and there are tests
>>>> already, checking the new output types after a format change.
>>>
>>> Right, I missed those the first time...
>>>
>>> I think I see that this isn't orthogonal to dynamic format change,
>>> but now I'm left wondering why those tests aren't fixed by this
>>> patch. We should be reporting the real width and height now, right?
>>>
>>
>>
>> Because the image size that native reports includes NV12 plane
>> alignments that we still have wrong.
>
> Ugh, okay...
>
>>
>>
>>>>>> frame_rate);
>>>>>
>>>>> So if the user never requests a specific frame rate, then we always
>>>>> force it to 29.97? And we ignore dynamic frame rate changes?
>>>>>
>>>>> This is also surprising; do we have tests for these?
>>>>>
>>>>
>>>>
>>>> We have tests that this is the default frame rate, yes.
>>>
>>> Right, but this code will end up forcing the frame rate to 29.97 even
>>> if the H.264 data yields something different, or am I misreading again?
>>>
>>
>>
>> Yes, it's wrong. It worked for all the games I know are using the
>> transform, because most don't even care about the frame rate.
>>
>> I'll have a better look at why GStreamer doesn't get us the correct
>> frame rate.
>>
>>
>> I any case, I wrote more tests about the format changes, and if we
>> want to have things done right from the start, and although the target
>> games don't need it, I'll have to write things differently, using a
>> colorconvert transform on the Win32 side (still implemented using
>> GStreamer videoconvert), and passing buffers back and forth from the
>> unix side.
>>
>> The stream format can be changed at will, even after buffers have been
>> decoded and queued, and without even pushing any more input. I don't
>> think we can do that easily with the current pipeline as simple as it
>> is, as the decoder and the videoconvert elements are plugged together.
>>
>> I also don't want to introduce complexity from an async pipeline as
>> all my previous attempts already failed to satisfy the games
>> expectations.
>>
>
> I'm not necessarily advocating that we get everything exactly right,
> although having the tests still seems valuable. Rather I was just trying
> to understand, or fix, some code that looked really surprising :-)
>
Well I think it's still best, although I'm not really excited about the
time it'll still require.
I intended to try upstreaming ResamplerDMO and ColorConvertDMO anyway,
as they are currently bit rotting in Proton and would clearly benefit
from the wg_transform simplicity.
--
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel
mailing list