[PATCH v2 1/5] winegstreamer: Implement stub bytestream handler and media source.
Zebediah Figura
z.figura12 at gmail.com
Thu Aug 27 10:33:13 CDT 2020
On 8/27/20 10:18 AM, Derek Lesho wrote:
>
> On 8/26/20 6:42 PM, Zebediah Figura wrote:
>> This patch is still awfully large to review all at once. Just from
>> skimming I see the "event_queue" field, which could be split into a
>> separate patch, and the different "container_stream_handler" and
>> "media_source" objects, which could be split into separate patches.
>>
>> On 8/26/20 1:59 PM, Derek Lesho wrote:
>>> Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
>>> ---
>>> v2: Fix tests on environments without gstreamer.
>>> ---
>>> dlls/mfplat/tests/mfplat.c | 14 +-
>>> dlls/winegstreamer/Makefile.in | 1 +
>>> dlls/winegstreamer/gst_private.h | 6 +
>>> dlls/winegstreamer/media_source.c | 680 +++++++++++++++++++
>>> dlls/winegstreamer/mfplat.c | 9 +
>>> dlls/winegstreamer/winegstreamer.rgs | 32 +
>>> dlls/winegstreamer/winegstreamer_classes.idl | 7 +
>>> include/mfidl.idl | 1 +
>>> 8 files changed, 746 insertions(+), 4 deletions(-)
>>> create mode 100644 dlls/winegstreamer/media_source.c
>>>
>>> diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
>>> index 01749dd9ef8..29bcef7e46b 100644
>>> --- a/dlls/mfplat/tests/mfplat.c
>>> +++ b/dlls/mfplat/tests/mfplat.c
>>> @@ -441,8 +441,8 @@ static void test_source_resolver(void)
>>> {
>>> struct test_callback callback = { { &test_create_from_url_callback_vtbl } };
>>> struct test_callback callback2 = { { &test_create_from_file_handler_callback_vtbl } };
>>> + IMFPresentationDescriptor *descriptor = NULL;
>>> IMFSourceResolver *resolver, *resolver2;
>>> - IMFPresentationDescriptor *descriptor;
>>> IMFSchemeHandler *scheme_handler;
>>> IMFMediaStream *video_stream;
>>> IMFAttributes *attributes;
>>> @@ -458,9 +458,12 @@ static void test_source_resolver(void)
>>> int i, sample_count;
>>> WCHAR *filename;
>>> PROPVARIANT var;
>>> + BOOL is_wine;
>>> HRESULT hr;
>>> GUID guid;
>>>
>>> + is_wine = !strcmp(winetest_platform, "wine");
>>> +
>>> if (!pMFCreateSourceResolver)
>>> {
>>> win_skip("MFCreateSourceResolver() not found\n");
>>> @@ -529,7 +532,10 @@ static void test_source_resolver(void)
>>> ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type);
>>>
>>> hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor);
>>> +if (!is_wine)
>>> ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr);
>> I suspect you're doing this because of the fallback path in
>> source_resolver_CreateObjectFromByteStream(), combined with the optional
>> presence of winegstreamer. I would propose that this patch series first
>> remove that fallback path, as it is (as I understand) entirely
>> incorrect, and since any potential regression will be addressed by this
>> patch series itself.
>
> Even after I remove the stub source, I think I still need two goto
> paths, one which triggers when the source fails to create, skipping all
> the actions on the source object, and the other which slowly recedes
> over the course of the patches. (skipping tests after
> ::CreatePresentationDescriptor before it's implemented, then skipping
> tests after ::Start before it's implemented, then finally disappearing
> once ::Start is implemented) Is this okay? Or alternatively should I
> just free the resources and return early when creating the media source
> fails, skipping some of the winegstreamer agnostic tests at the end.
I think either way works; I've seen both happen in practice. Generally I
opt for not using a goto, in order to not thrash the end of the function.
>
> In my opinion, the best solution would be to move the winegstreamer
> dependent part/s of the test function to the end so that we can return
> early instead of using a goto in this instance. But isn't there a
> preference against moving code around unnecessarily?
Sure, but improving something's architecture counts as a good reason, I
think.
In general I'm inclined to prefer such an arrangement, but I'm not sure
I'm familiar enough with mfplat to comment on test_source_resolver().
>
>>
>>> + if (FAILED(hr))
>>> + goto skip_source_tests;
>>> ok(descriptor != NULL, "got %p\n", descriptor);
>>>
>>> hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, 0, &selected, &sd);
>>> @@ -540,7 +546,7 @@ static void test_source_resolver(void)
>>> IMFStreamDescriptor_Release(sd);
>>>
>>> hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
>>> -todo_wine
>>> +if (!is_wine)
>>> ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr);
>>> if (FAILED(hr))
>>> goto skip_source_tests;
>>> @@ -632,8 +638,8 @@ todo_wine
>>> ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
>>>
>>> skip_source_tests:
>>> -
>>> - IMFPresentationDescriptor_Release(descriptor);
>>> + if (descriptor)
>>> + IMFPresentationDescriptor_Release(descriptor);
>>> IMFMediaSource_Release(mediasource);
>>> IMFByteStream_Release(stream);
>>>
>>> diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in
>>> index 337c1086e6b..e578d194f7f 100644
>>> --- a/dlls/winegstreamer/Makefile.in
>>> +++ b/dlls/winegstreamer/Makefile.in
>>> @@ -10,6 +10,7 @@ C_SRCS = \
>>> gst_cbs.c \
>>> gstdemux.c \
>>> main.c \
>>> + media_source.c \
>>> mediatype.c \
>>> mfplat.c \
>>> pin.c \
>>> diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
>>> index e6fb841fc87..71ca4290885 100644
>>> --- a/dlls/winegstreamer/gst_private.h
>>> +++ b/dlls/winegstreamer/gst_private.h
>>> @@ -54,4 +54,10 @@ void start_dispatch_thread(void) DECLSPEC_HIDDEN;
>>>
>>> extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN;
>>>
>>> +enum source_type
>>> +{
>>> + SOURCE_TYPE_MPEG_4,
>>> +};
>> This enumeration, and variables associated with it, are dead code, and
>> would be best introduced when used.
>>
>>> +HRESULT container_stream_handler_construct(REFIID riid, void **obj, enum source_type);
>> Missing DECLSPEC_HIDDEN. Using the "_create" convention as elsewhere
>> would probably not be a bad idea, either.
>>
>>> +
>>> #endif /* __GST_PRIVATE_INCLUDED__ */
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20200827/25e90935/attachment.sig>
More information about the wine-devel
mailing list