diff options
author | Jan Ekström <jeebjp@gmail.com> | 2022-06-01 23:50:49 +0300 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2022-06-12 21:05:59 +0300 |
commit | 1d15a5a059064216d97775181506b7f8432eb30d (patch) | |
tree | 800e351de568b30d14279489e5f5bb3609a94c5d | |
parent | 602995fd40f03440f5fa64113b6188cb46ffcc9c (diff) | |
download | mpv-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.c | 51 | ||||
-rw-r--r-- | audio/chmap_avchannel.h | 32 | ||||
-rw-r--r-- | meson.build | 11 | ||||
-rw-r--r-- | wscript | 4 | ||||
-rw-r--r-- | wscript_build.py | 1 |
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()) @@ -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" ), |