From 1d15a5a059064216d97775181506b7f8432eb30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= Date: Wed, 1 Jun 2022 23:50:49 +0300 Subject: 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. --- audio/chmap_avchannel.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ audio/chmap_avchannel.h | 32 +++++++++++++++++++++++++++++++ meson.build | 11 ++++++++++- wscript | 4 ++++ wscript_build.py | 1 + 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 audio/chmap_avchannel.c create mode 100644 audio/chmap_avchannel.h 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 . + */ + +#include + +#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 . + */ + +#pragma once + +#include + +#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 @@ -411,6 +411,10 @@ libav_dependencies = [ 'req': True, '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', 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" ), -- cgit v1.2.3