summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Ekström <jeebjp@gmail.com>2022-06-01 23:50:49 +0300
committerJan Ekström <jeebjp@gmail.com>2022-06-12 21:05:59 +0300
commit1d15a5a059064216d97775181506b7f8432eb30d (patch)
tree800e351de568b30d14279489e5f5bb3609a94c5d
parent602995fd40f03440f5fa64113b6188cb46ffcc9c (diff)
downloadmpv-1d15a5a059064216d97775181506b7f8432eb30d.tar.bz2
mpv-1d15a5a059064216d97775181506b7f8432eb30d.tar.xz
audio: add AVChannelLayout helpers to convert from/to mp_chmap
This is the new FFmpeg channel layout structure, which now combines channel count and layout into a single location. Only unspecified (channel count only) and native (channel layout mask based) layouts are currently supported for the initial move towards non-deprecated APIs.
-rw-r--r--audio/chmap_avchannel.c51
-rw-r--r--audio/chmap_avchannel.h32
-rw-r--r--meson.build11
-rw-r--r--wscript4
-rw-r--r--wscript_build.py1
5 files changed, 98 insertions, 1 deletions
diff --git a/audio/chmap_avchannel.c b/audio/chmap_avchannel.c
new file mode 100644
index 0000000000..ec961de422
--- /dev/null
+++ b/audio/chmap_avchannel.c
@@ -0,0 +1,51 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libavutil/channel_layout.h>
+
+#include "chmap.h"
+#include "chmap_avchannel.h"
+
+bool mp_chmap_from_av_layout(struct mp_chmap *dst, const AVChannelLayout *src)
+{
+ *dst = (struct mp_chmap) {0};
+
+ switch (src->order) {
+ case AV_CHANNEL_ORDER_UNSPEC:
+ mp_chmap_from_channels(dst, src->nb_channels);
+ return dst->num == src->nb_channels;
+ case AV_CHANNEL_ORDER_NATIVE:
+ mp_chmap_from_lavc(dst, src->u.mask);
+ return dst->num == src->nb_channels;
+ default:
+ // TODO: handle custom layouts
+ return false;
+ }
+}
+
+void mp_chmap_to_av_layout(AVChannelLayout *dst, const struct mp_chmap *src)
+{
+ *dst = (AVChannelLayout){
+ .order = AV_CHANNEL_ORDER_UNSPEC,
+ .nb_channels = src->num,
+ };
+
+ // TODO: handle custom layouts
+ if (!mp_chmap_is_unknown(src)) {
+ av_channel_layout_from_mask(dst, mp_chmap_to_lavc(src));
+ }
+}
diff --git a/audio/chmap_avchannel.h b/audio/chmap_avchannel.h
new file mode 100644
index 0000000000..e136ccc7ce
--- /dev/null
+++ b/audio/chmap_avchannel.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <libavutil/channel_layout.h>
+
+#include "config.h"
+
+#include "chmap.h"
+
+#if HAVE_AV_CHANNEL_LAYOUT
+
+bool mp_chmap_from_av_layout(struct mp_chmap *dst, const AVChannelLayout *src);
+
+void mp_chmap_to_av_layout(AVChannelLayout *dst, const struct mp_chmap *src);
+
+#endif
diff --git a/meson.build b/meson.build
index 0b07582a33..b8db70f923 100644
--- a/meson.build
+++ b/meson.build
@@ -15,9 +15,11 @@ build_root = meson.project_build_root()
source_root = meson.project_source_root()
python = find_program('python3')
+avutil = dependency('libavutil', version: '>= 56.12.100')
+
ffmpeg = {
'name': 'ffmpeg',
- 'deps': [dependency('libavutil', version: '>= 56.12.100'),
+ 'deps': [avutil,
dependency('libavcodec', version: '>= 58.12.100'),
dependency('libavformat', version: '>= 58.9.100'),
dependency('libswscale', version: '>= 5.0.101'),
@@ -595,6 +597,12 @@ endif
# misc dependencies
+av_ch_layout_available = avutil.version().version_compare('>= 57.24.100')
+if av_ch_layout_available
+ features += 'av-channel-layout'
+ sources += files('audio/chmap_avchannel.c')
+endif
+
cdda_opt = get_option('cdda').require(
get_option('gpl'),
error_message: 'the build is not GPL!',
@@ -1696,6 +1704,7 @@ conf_data.set_quoted('FULLCONFIG', feature_str)
conf_data.set10('HAVE_ALSA', alsa.found())
conf_data.set10('HAVE_ANDROID', android)
conf_data.set10('HAVE_AUDIOUNIT', audiounit['use'])
+conf_data.set10('HAVE_AV_CHANNEL_LAYOUT', av_ch_layout_available)
conf_data.set10('HAVE_BSD_FSTATFS', bsd_fstatfs)
conf_data.set10('HAVE_BSD_THREAD_NAME', bsd_thread_name)
conf_data.set10('HAVE_CACA', caca.found())
diff --git a/wscript b/wscript
index c7685b0879..63069a2248 100644
--- a/wscript
+++ b/wscript
@@ -412,6 +412,10 @@ libav_dependencies = [
'fmsg': "Unable to find development files for some of the required \
FFmpeg libraries. Git master is recommended."
}, {
+ 'name': 'av-channel-layout',
+ 'desc': 'FFmpeg AVChannelLayout API',
+ 'func': check_pkg_config('libavutil', '>= 57.24.100'),
+ }, {
'name': '--libavdevice',
'desc': 'libavdevice',
'func': check_pkg_config('libavdevice', '>= 57.0.0'),
diff --git a/wscript_build.py b/wscript_build.py
index c05df1f964..dad54816eb 100644
--- a/wscript_build.py
+++ b/wscript_build.py
@@ -230,6 +230,7 @@ def build(ctx):
## Audio
( "audio/aframe.c" ),
( "audio/chmap.c" ),
+ ( "audio/chmap_avchannel.c", "av-channel-layout" ),
( "audio/chmap_sel.c" ),
( "audio/decode/ad_lavc.c" ),
( "audio/decode/ad_spdif.c" ),