[PATCH 3/3] mfplat: Implement GetAudioFormat method for IMFAudioMediaType interface.

Nikolay Sivov nsivov at codeweavers.com
Tue Apr 20 23:49:01 CDT 2021



On 4/21/21 4:58 AM, Connor McAdams wrote:
> Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
> ---
>  dlls/mfplat/mediatype.c | 27 ++++++++++++++++++++++++---
>  1 file changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
> index 4904dbb566f..36747cae5ca 100644
> --- a/dlls/mfplat/mediatype.c
> +++ b/dlls/mfplat/mediatype.c
> @@ -41,6 +41,7 @@ struct media_type
>      IMFVideoMediaType IMFVideoMediaType_iface;
>      IMFAudioMediaType IMFAudioMediaType_iface;
>      MFVIDEOFORMAT *video_format;
> +    WAVEFORMATEX *audio_format;
>  };
>  
>  struct stream_desc
> @@ -1048,7 +1049,18 @@ static ULONG WINAPI audio_mediatype_AddRef(IMFAudioMediaType *iface)
>  static ULONG WINAPI audio_mediatype_Release(IMFAudioMediaType *iface)
>  {
>      struct media_type *media_type = impl_from_IMFAudioMediaType(iface);
> -    return IMFMediaType_Release(&media_type->IMFMediaType_iface);
> +    ULONG refcount = InterlockedDecrement(&media_type->attributes.ref);
> +
> +    TRACE("%p, refcount %u.\n", iface, refcount);
> +
> +    if (!refcount)
> +    {
> +        clear_attributes_object(&media_type->attributes);
> +        CoTaskMemFree(media_type->audio_format);
> +        heap_free(media_type);
> +    }
> +
> +    return refcount;
>  }

This should go to the main Release(), together with currently leaked
video_format.

>  
>  static HRESULT WINAPI audio_mediatype_GetItem(IMFAudioMediaType *iface, REFGUID key, PROPVARIANT *value)
> @@ -1368,9 +1380,18 @@ static HRESULT WINAPI audio_mediatype_FreeRepresentation(IMFAudioMediaType *ifac
>  
>  static const WAVEFORMATEX * WINAPI audio_mediatype_GetAudioFormat(IMFAudioMediaType *iface)
>  {
> -    FIXME("%p.\n", iface);
> +    struct media_type *media_type = impl_from_IMFAudioMediaType(iface);
> +    unsigned int size;
> +    HRESULT hr;
> +
> +    TRACE("%p.\n", iface);
> +
> +    CoTaskMemFree(media_type->audio_format);
> +    if (FAILED(hr = MFCreateWaveFormatExFromMFMediaType((IMFMediaType *)iface, &media_type->audio_format, &size,
> +                    MFWaveFormatExConvertFlag_Normal)))
> +        WARN("Failed to create wave format description, hr %#x.\n", hr);
>  
> -    return NULL;
> +    return media_type->audio_format;
>  }
>  
>  static const IMFAudioMediaTypeVtbl audiomediatypevtbl =




More information about the wine-devel mailing list