[FFmpeg-cvslog] avdevice/alsa_dec: add a ch_layout option
James Almer
git at videolan.org
Sat Feb 1 06:13:35 EET 2025
ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Tue Jan 28 09:57:57 2025 -0300| [c6194b50b1b4001db23e8debab4ac4444e794f90] | committer: James Almer
avdevice/alsa_dec: add a ch_layout option
Missed in ffc4fd3cc2ccb2cadb71f19849842b18ca1281c6, which after
e78173557da898f18a78241cc3525b76694164b5 broke setting channel count.
Should fix ticket #11434.
Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
Signed-off-by: James Almer <jamrial at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c6194b50b1b4001db23e8debab4ac4444e794f90
---
libavdevice/alsa.h | 4 ++++
libavdevice/alsa_dec.c | 24 +++++++++++++++++++-----
libavdevice/version_major.h | 1 +
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/libavdevice/alsa.h b/libavdevice/alsa.h
index 07783c983a..3e1ba31384 100644
--- a/libavdevice/alsa.h
+++ b/libavdevice/alsa.h
@@ -35,6 +35,7 @@
#include "libavutil/log.h"
#include "timefilter.h"
#include "avdevice.h"
+#include "version.h"
/* XXX: we make the assumption that the soundcard accepts this format */
/* XXX: find better solution with "preinit" method, needed also in
@@ -51,7 +52,10 @@ typedef struct AlsaData {
int frame_size; ///< bytes per sample * channels
int period_size; ///< preferred size for reads and writes, in frames
int sample_rate; ///< sample rate set by user
+#if FF_API_ALSA_CHANNELS
int channels; ///< number of channels set by user
+#endif
+ AVChannelLayout ch_layout; ///< Channel layout set by user
int last_period;
TimeFilter *timefilter;
void (*reorder_func)(const void *, void *, int);
diff --git a/libavdevice/alsa_dec.c b/libavdevice/alsa_dec.c
index 018afaef08..f0738e3dea 100644
--- a/libavdevice/alsa_dec.c
+++ b/libavdevice/alsa_dec.c
@@ -73,7 +73,14 @@ static av_cold int audio_read_header(AVFormatContext *s1)
}
codec_id = s1->audio_codec_id;
- ret = ff_alsa_open(s1, SND_PCM_STREAM_CAPTURE, &s->sample_rate, s->channels,
+#if FF_API_ALSA_CHANNELS
+ if (s->channels > 0) {
+ av_channel_layout_uninit(&s->ch_layout);
+ s->ch_layout.nb_channels = s->channels;
+ }
+#endif
+
+ ret = ff_alsa_open(s1, SND_PCM_STREAM_CAPTURE, &s->sample_rate, s->ch_layout.nb_channels,
&codec_id);
if (ret < 0) {
return AVERROR(EIO);
@@ -83,20 +90,24 @@ static av_cold int audio_read_header(AVFormatContext *s1)
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
st->codecpar->codec_id = codec_id;
st->codecpar->sample_rate = s->sample_rate;
- st->codecpar->ch_layout.nb_channels = s->channels;
+ ret = av_channel_layout_copy(&st->codecpar->ch_layout, &s->ch_layout);
+ if (ret < 0)
+ goto fail;
st->codecpar->frame_size = s->frame_size;
avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
/* microseconds instead of seconds, MHz instead of Hz */
s->timefilter = ff_timefilter_new(1000000.0 / s->sample_rate,
s->period_size, 1.5E-6);
- if (!s->timefilter)
+ if (!s->timefilter) {
+ ret = AVERROR(EIO);
goto fail;
+ }
return 0;
fail:
snd_pcm_close(s->h);
- return AVERROR(EIO);
+ return ret;
}
static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt)
@@ -146,7 +157,10 @@ static int audio_get_device_list(AVFormatContext *h, AVDeviceInfoList *device_li
static const AVOption options[] = {
{ "sample_rate", "", offsetof(AlsaData, sample_rate), AV_OPT_TYPE_INT, {.i64 = 48000}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
- { "channels", "", offsetof(AlsaData, channels), AV_OPT_TYPE_INT, {.i64 = 2}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
+#if FF_API_ALSA_CHANNELS
+ { "channels", "", offsetof(AlsaData, channels), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_DEPRECATED },
+#endif
+ { "ch_layout", "", offsetof(AlsaData, ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = "2C"}, INT_MIN, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
{ NULL },
};
diff --git a/libavdevice/version_major.h b/libavdevice/version_major.h
index f16abb6909..50f577f295 100644
--- a/libavdevice/version_major.h
+++ b/libavdevice/version_major.h
@@ -39,5 +39,6 @@
#define FF_API_OPENGL_DEVICE (LIBAVDEVICE_VERSION_MAJOR < 62)
// reminder to remove the sdl2 device on next major bump
#define FF_API_SDL2_DEVICE (LIBAVDEVICE_VERSION_MAJOR < 62)
+#define FF_API_ALSA_CHANNELS (LIBAVDEVICE_VERSION_MAJOR < 62)
#endif /* AVDEVICE_VERSION_MAJOR_H */
More information about the ffmpeg-cvslog
mailing list