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 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 audio/chmap_avchannel.c create mode 100644 audio/chmap_avchannel.h (limited to 'audio') 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 -- cgit v1.2.3