mirror of https://github.com/mpv-player/mpv
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:
parent
602995fd40
commit
1d15a5a059
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
11
meson.build
11
meson.build
|
@ -15,9 +15,11 @@ build_root = meson.project_build_root()
|
||||||
source_root = meson.project_source_root()
|
source_root = meson.project_source_root()
|
||||||
python = find_program('python3')
|
python = find_program('python3')
|
||||||
|
|
||||||
|
avutil = dependency('libavutil', version: '>= 56.12.100')
|
||||||
|
|
||||||
ffmpeg = {
|
ffmpeg = {
|
||||||
'name': 'ffmpeg',
|
'name': 'ffmpeg',
|
||||||
'deps': [dependency('libavutil', version: '>= 56.12.100'),
|
'deps': [avutil,
|
||||||
dependency('libavcodec', version: '>= 58.12.100'),
|
dependency('libavcodec', version: '>= 58.12.100'),
|
||||||
dependency('libavformat', version: '>= 58.9.100'),
|
dependency('libavformat', version: '>= 58.9.100'),
|
||||||
dependency('libswscale', version: '>= 5.0.101'),
|
dependency('libswscale', version: '>= 5.0.101'),
|
||||||
|
@ -595,6 +597,12 @@ endif
|
||||||
|
|
||||||
|
|
||||||
# misc dependencies
|
# 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(
|
cdda_opt = get_option('cdda').require(
|
||||||
get_option('gpl'),
|
get_option('gpl'),
|
||||||
error_message: 'the build is not 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_ALSA', alsa.found())
|
||||||
conf_data.set10('HAVE_ANDROID', android)
|
conf_data.set10('HAVE_ANDROID', android)
|
||||||
conf_data.set10('HAVE_AUDIOUNIT', audiounit['use'])
|
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_FSTATFS', bsd_fstatfs)
|
||||||
conf_data.set10('HAVE_BSD_THREAD_NAME', bsd_thread_name)
|
conf_data.set10('HAVE_BSD_THREAD_NAME', bsd_thread_name)
|
||||||
conf_data.set10('HAVE_CACA', caca.found())
|
conf_data.set10('HAVE_CACA', caca.found())
|
||||||
|
|
4
wscript
4
wscript
|
@ -411,6 +411,10 @@ libav_dependencies = [
|
||||||
'req': True,
|
'req': True,
|
||||||
'fmsg': "Unable to find development files for some of the required \
|
'fmsg': "Unable to find development files for some of the required \
|
||||||
FFmpeg libraries. Git master is recommended."
|
FFmpeg libraries. Git master is recommended."
|
||||||
|
}, {
|
||||||
|
'name': 'av-channel-layout',
|
||||||
|
'desc': 'FFmpeg AVChannelLayout API',
|
||||||
|
'func': check_pkg_config('libavutil', '>= 57.24.100'),
|
||||||
}, {
|
}, {
|
||||||
'name': '--libavdevice',
|
'name': '--libavdevice',
|
||||||
'desc': 'libavdevice',
|
'desc': 'libavdevice',
|
||||||
|
|
|
@ -230,6 +230,7 @@ def build(ctx):
|
||||||
## Audio
|
## Audio
|
||||||
( "audio/aframe.c" ),
|
( "audio/aframe.c" ),
|
||||||
( "audio/chmap.c" ),
|
( "audio/chmap.c" ),
|
||||||
|
( "audio/chmap_avchannel.c", "av-channel-layout" ),
|
||||||
( "audio/chmap_sel.c" ),
|
( "audio/chmap_sel.c" ),
|
||||||
( "audio/decode/ad_lavc.c" ),
|
( "audio/decode/ad_lavc.c" ),
|
||||||
( "audio/decode/ad_spdif.c" ),
|
( "audio/decode/ad_spdif.c" ),
|
||||||
|
|
Loading…
Reference in New Issue