[FFmpeg-devel] [PATCH] avdevice/pulse_audio_dec: identify channel layout

Federico Simoncelli federico.simoncelli at gmail.com
Sun Jan 26 18:42:20 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 | 40 +++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c
index 50a3c971ae..12f2d15680 100644
--- a/libavdevice/pulse_audio_dec.c
+++ b/libavdevice/pulse_audio_dec.c
@@ -135,6 +135,37 @@ 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 (map_name == NULL)
+        return 0;
+
+    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 +276,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