[PATCH] winegstreamer: Ensure that the source reports both PCM and floating point audio formats.
Nikolay Sivov
nsivov at codeweavers.com
Fri May 7 09:29:38 CDT 2021
On 5/7/21 5:08 PM, Giovanni Mascellani wrote:
> From: Derek Lesho <dlesho at codeweavers.com>
>
> The patch is originally by Derek Lesho, with some changes by
> Giovanni Mascellani.
>
> Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
> ---
> dlls/winegstreamer/media_source.c | 42 +++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
> index eb5b9e366ec..d7dcd252a84 100644
> --- a/dlls/winegstreamer/media_source.c
> +++ b/dlls/winegstreamer/media_source.c
> @@ -806,6 +806,48 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
> goto done;
> }
> }
> + else if (format.major_type == WG_MAJOR_TYPE_AUDIO)
> + {
> + /* Expose at least one PCM and one floating point type for the
> + source reader to pick from. */
> + stream_types = malloc( sizeof(IMFMediaType *) * 2 );
It's not specific to the reader.
> +
> + stream_types[0] = mf_media_type_from_wg_format(&format);
> + if (stream_types[0])
> + {
> + GUID base_subtype;
> + UINT32 sample_rate, channel_count, channel_mask;
> +
> + IMFMediaType_GetGUID(stream_types[0], &MF_MT_SUBTYPE, &base_subtype);
> + IMFMediaType_GetUINT32(stream_types[0], &MF_MT_AUDIO_SAMPLES_PER_SECOND, &sample_rate);
> + IMFMediaType_GetUINT32(stream_types[0], &MF_MT_AUDIO_NUM_CHANNELS, &channel_count);
> + IMFMediaType_GetUINT32(stream_types[0], &MF_MT_AUDIO_CHANNEL_MASK, &channel_mask);
> +
> + MFCreateMediaType(&stream_types[1]);
> + IMFMediaType_SetGUID(stream_types[1], &MF_MT_MAJOR_TYPE, &MFMediaType_Audio);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_SAMPLES_PER_SECOND, sample_rate);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_NUM_CHANNELS, channel_count);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_CHANNEL_MASK, channel_mask);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
> +
> + if (IsEqualGUID(&base_subtype, &MFAudioFormat_Float))
> + {
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_BLOCK_ALIGNMENT, channel_count * 16 / 8);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, sample_rate * channel_count * 16 / 8);
> + IMFMediaType_SetGUID(stream_types[1], &MF_MT_SUBTYPE, &MFAudioFormat_PCM);
> + }
> + else
> + {
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_BITS_PER_SAMPLE, 32);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_BLOCK_ALIGNMENT, channel_count * 32 / 8);
> + IMFMediaType_SetUINT32(stream_types[1], &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, sample_rate * channel_count * 32 / 8);
> + IMFMediaType_SetGUID(stream_types[1], &MF_MT_SUBTYPE, &MFAudioFormat_Float);
> + }
> +
> + type_count = 2;
> + }
> + }
Might be shorter to adjust 'format' and call
mf_media_type_from_wg_format() one more time. Regarding attributes,
MF_MT_ALL_SAMPLES_INDEPENDENT should probably be set in
mf_media_type_from_wg_format_audio(). We don't set
MF_MT_AUDIO_AVG_BYTES_PER_SECOND for base types at the moment, so why
set it for this additional one? Also, is it always safe to have
hardcoded bps?
> else
> {
> stream_type = mf_media_type_from_wg_format(&format);
More information about the wine-devel
mailing list