[FFmpeg-devel] [PATCH] avdevice/pulse_audio_dec: identify channel layout
Federico Simoncelli
federico.simoncelli at gmail.com
Sun Jan 26 17:12:50 EET 2020
This patch adds the attempt to identify the pulseaudio channel map and
when possible set the relevant channel_layout parameter of the codec.
The result is an improvement over the current behavior of guessing the
layout based on the number of channels (for more information see
guess_layout_max).
---
libavdevice/pulse_audio_dec.c | 37 +++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c
index 50a3c971ae..2f76cfd474 100644
--- a/libavdevice/pulse_audio_dec.c
+++ b/libavdevice/pulse_audio_dec.c
@@ -135,6 +135,34 @@ static av_cold int pulse_close(AVFormatContext *s)
return 0;
}
+static int pulse_map_to_layout(pa_channel_map *cmap)
+{
+ const char *map_name = pa_channel_map_to_name(cmap);
+
+ if (strcmp(map_name, "mono") == 0)
+ return AV_CH_LAYOUT_MONO;
+
+ if (strcmp(map_name, "stereo") == 0)
+ return AV_CH_LAYOUT_STEREO;
+
+ if (strcmp(map_name, "surround-40") == 0)
+ return AV_CH_LAYOUT_4POINT0;
+
+ if (strcmp(map_name, "surround-41") == 0)
+ return AV_CH_LAYOUT_4POINT1;
+
+ if (strcmp(map_name, "surround-50") == 0)
+ return AV_CH_LAYOUT_5POINT0;
+
+ if (strcmp(map_name, "surround-51") == 0)
+ return AV_CH_LAYOUT_5POINT1;
+
+ if (strcmp(map_name, "surround-71") == 0)
+ return AV_CH_LAYOUT_7POINT1;
+
+ return 0;
+}
+
static av_cold int pulse_read_header(AVFormatContext *s)
{
PulseData *pd = s->priv_data;
@@ -245,10 +273,11 @@ static av_cold int pulse_read_header(AVFormatContext *s)
pa_threaded_mainloop_unlock(pd->mainloop);
/* take real parameters */
- st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
- st->codecpar->codec_id = codec_id;
- st->codecpar->sample_rate = pd->sample_rate;
- st->codecpar->channels = pd->channels;
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codecpar->codec_id = codec_id;
+ st->codecpar->sample_rate = pd->sample_rate;
+ st->codecpar->channels = pd->channels;
+ st->codecpar->channel_layout = pulse_map_to_layout(&cmap);
avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
pd->timefilter = ff_timefilter_new(1000000.0 / pd->sample_rate,
--
2.24.1
More information about the ffmpeg-devel
mailing list