[PATCH v2 3/5] winegstreamer: Implement IMFMediaSource::CreatePresentationDescriptor.

Zebediah Figura zfigura at codeweavers.com
Tue Oct 6 21:12:07 CDT 2020


On 10/6/20 10:59 AM, Derek Lesho wrote:
> Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
> ---
> v2: Addressed comments.
> ---
>  dlls/mf/tests/mf.c                |  1 -
>  dlls/mfplat/tests/mfplat.c        | 10 +++++-----
>  dlls/winegstreamer/media_source.c | 29 +++++++++++++++++++++++++++--
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
> index 0bc297cc69c..9c4d18478c6 100644
> --- a/dlls/mf/tests/mf.c
> +++ b/dlls/mf/tests/mf.c
> @@ -1451,7 +1451,6 @@ todo_wine
>          return;
>  
>      hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd);
> -todo_wine
>      ok(hr == S_OK, "Failed to create descriptor, hr %#x.\n", hr);
>      if (FAILED(hr))
>          return;
> diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
> index 309f7b669a4..15d5bcba3d6 100644
> --- a/dlls/mfplat/tests/mfplat.c
> +++ b/dlls/mfplat/tests/mfplat.c
> @@ -576,10 +576,7 @@ static void test_source_resolver(void)
>      ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type);
>  
>      hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor);
> -todo_wine
>      ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr);
> -    if (FAILED(hr))
> -        goto skip_source_tests;
>      ok(descriptor != NULL, "got %p\n", descriptor);
>  
>      hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, 0, &selected, &sd);
> @@ -599,6 +596,7 @@ todo_wine
>      ok(hr == S_OK, "Failed to get current media type, hr %#x.\n", hr);
>      hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid);
>      ok(hr == S_OK, "Failed to get media sub type, hr %#x.\n", hr);
> +todo_wine
>      ok(IsEqualGUID(&guid, &MFVideoFormat_M4S2), "Unexpected sub type %s.\n", debugstr_guid(&guid));
>      IMFMediaType_Release(media_type);
>  
> @@ -607,7 +605,10 @@ todo_wine
>  
>      var.vt = VT_EMPTY;
>      hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
> +todo_wine
>      ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
> +    if (FAILED(hr))
> +        goto skip_source_tests;
>  
>      get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var);
>      ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MENewStream event.\n", var.vt);
> @@ -670,11 +671,10 @@ todo_wine
>  
>      get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
>  
> +skip_source_tests:
>      IMFMediaTypeHandler_Release(handler);
>      IMFPresentationDescriptor_Release(descriptor);
>  
> -skip_source_tests:
> -
>      hr = IMFMediaSource_Shutdown(mediasource);
>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>  
> diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
> index a31fa1d6f6c..c70de184f0b 100644
> --- a/dlls/winegstreamer/media_source.c
> +++ b/dlls/winegstreamer/media_source.c
> @@ -67,6 +67,7 @@ struct media_source
>      IMFByteStream *byte_stream;
>      struct media_stream **streams;
>      ULONG stream_count;
> +    IMFPresentationDescriptor *pres_desc;
>      GstBus *bus;
>      GstElement *container;
>      GstElement *decodebin;
> @@ -672,12 +673,12 @@ static HRESULT WINAPI media_source_CreatePresentationDescriptor(IMFMediaSource *
>  {
>      struct media_source *source = impl_from_IMFMediaSource(iface);
>  
> -    FIXME("(%p)->(%p): stub\n", source, descriptor);
> +    TRACE("(%p)->(%p)\n", source, descriptor);
>  
>      if (source->state == SOURCE_SHUTDOWN)
>          return MF_E_SHUTDOWN;
>  
> -    return E_NOTIMPL;
> +    return IMFPresentationDescriptor_Clone(source->pres_desc, descriptor);
>  }
>  
>  static HRESULT WINAPI media_source_Start(IMFMediaSource *iface, IMFPresentationDescriptor *descriptor,
> @@ -740,6 +741,8 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
>      if (source->their_sink)
>          gst_object_unref(GST_OBJECT(source->their_sink));
>  
> +    if (source->pres_desc)
> +        IMFPresentationDescriptor_Release(source->pres_desc);
>      if (source->event_queue)
>          IMFMediaEventQueue_Shutdown(source->event_queue);
>      if (source->byte_stream)
> @@ -840,6 +843,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
>          GST_STATIC_PAD_TEMPLATE("mf_src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY);
>  
>      struct media_source *object = heap_alloc_zero(sizeof(*object));
> +    IMFStreamDescriptor **descriptors = NULL;
>      unsigned int i;
>      HRESULT hr;
>      int ret;
> @@ -927,6 +931,25 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
>          gst_sample_unref(preroll);
>      }
>  
> +    /* init presentation descriptor */
> +
> +    descriptors = heap_alloc(object->stream_count * sizeof(IMFStreamDescriptor*));
> +    for (i = 0; i < object->stream_count; i++)
> +    {
> +        IMFMediaStream_GetStreamDescriptor(&object->streams[i]->IMFMediaStream_iface, &descriptors[i]);
> +    }
> +
> +    if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc)))
> +        goto fail;
> +
> +    for (i = 0; i < object->stream_count; i++)
> +    {
> +        IMFPresentationDescriptor_SelectStream(object->pres_desc, i);
> +        IMFStreamDescriptor_Release(descriptors[i]);
> +    }
> +    heap_free(descriptors);
> +    descriptors = NULL;
> +
>      object->state = SOURCE_STOPPED;
>  
>      *out_media_source = object;
> @@ -935,6 +958,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
>      fail:
>      WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
>  
> +    if (descriptors)

This

> +        heap_free(descriptors);
>      IMFMediaSource_Release(&object->IMFMediaSource_iface);
>      return hr;
>  }
> 



-------------- 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/20201006/9c98d355/attachment-0001.sig>


More information about the wine-devel mailing list