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.
This commit is contained in:
Jan Ekström 2022-06-01 23:50:49 +03:00
parent 602995fd40
commit 1d15a5a059
5 changed files with 98 additions and 1 deletions

51
audio/chmap_avchannel.c Normal file
View File

@ -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));
}
}

32
audio/chmap_avchannel.h Normal file
View File

@ -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

View File

@ -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())

View File

@ -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',

View File

@ -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" ),