vlc | branch: master | Francois Cartegnie <[email protected]> | Tue Dec 18 10:00:38 2018 +0100| [f7b78e0e8d9ed7afd433a55e9636516d181e2220] | committer: Francois Cartegnie
demux: libmp4: split CoreAudio definitions > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f7b78e0e8d9ed7afd433a55e9636516d181e2220 --- modules/demux/Makefile.am | 1 + modules/demux/mp4/coreaudio.h | 100 ++++++++++++++++++++++++++++++++++++++++++ modules/demux/mp4/essetup.c | 24 +++------- modules/demux/mp4/libmp4.h | 50 +-------------------- 4 files changed, 109 insertions(+), 66 deletions(-) diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am index 8fab97b525..8ea2e01683 100644 --- a/modules/demux/Makefile.am +++ b/modules/demux/Makefile.am @@ -210,6 +210,7 @@ libmp4_plugin_la_SOURCES = demux/mp4/mp4.c demux/mp4/mp4.h \ demux/mp4/heif.c demux/mp4/heif.h \ demux/mp4/avci.h \ demux/mp4/essetup.c demux/mp4/meta.c \ + demux/mp4/coreaudio.h \ demux/av1_unpack.h \ demux/asf/asfpacket.c demux/asf/asfpacket.h \ packetizer/iso_color_tables.h \ diff --git a/modules/demux/mp4/coreaudio.h b/modules/demux/mp4/coreaudio.h new file mode 100644 index 0000000000..1852ffeca6 --- /dev/null +++ b/modules/demux/mp4/coreaudio.h @@ -0,0 +1,100 @@ +/***************************************************************************** + * coreaudio.h : CoreAudio definitions for vlc + ***************************************************************************** + * Copyright (C) 2014-2018 VideoLabs, VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#include <vlc_aout.h> + +/* According to Apple's CoreAudio_Bitmap/CoreAudio_BitmapTypes.h */ +enum +{ + CoreAudio_Bitmap_LEFT = (1<<0), + CoreAudio_Bitmap_RIGHT = (1<<1), + CoreAudio_Bitmap_CENTER = (1<<2), + CoreAudio_Bitmap_LFESCREEN = (1<<3), + CoreAudio_Bitmap_BACKLEFT = (1<<4), + CoreAudio_Bitmap_BACKRIGHT = (1<<5), + CoreAudio_Bitmap_LEFTCENTER = (1<<6), + CoreAudio_Bitmap_RIGHTCENTER = (1<<7), + CoreAudio_Bitmap_BACKCENTER = (1<<8), + CoreAudio_Bitmap_SIDELEFT = (1<<9), + CoreAudio_Bitmap_SIDERIGHT = (1<<10), + CoreAudio_Bitmap_TOPCENTER = (1<<11), + CoreAudio_Bitmap_TOPFRONTLEFT = (1<<12), + CoreAudio_Bitmap_TOPFRONTENTER = (1<<13), + CoreAudio_Bitmap_TOPFRONTRIGHT = (1<<14), + CoreAudio_Bitmap_TOPBACKLEFT = (1<<15), + CoreAudio_Bitmap_TOPBACKCENTER = (1<<16), + CoreAudio_Bitmap_TOPBACKRIGHT = (1<<17), +}; + +static const struct +{ + uint32_t i_bitmap; + uint32_t i_vlc_bitmap; +} CoreAudio_Bitmap_mapping[] = { + { CoreAudio_Bitmap_LEFT, AOUT_CHAN_LEFT }, + { CoreAudio_Bitmap_RIGHT, AOUT_CHAN_RIGHT }, + { CoreAudio_Bitmap_CENTER, AOUT_CHAN_CENTER }, + { CoreAudio_Bitmap_LFESCREEN, AOUT_CHAN_LFE }, + { CoreAudio_Bitmap_BACKLEFT, AOUT_CHAN_REARLEFT }, + { CoreAudio_Bitmap_BACKRIGHT, AOUT_CHAN_REARRIGHT }, + { CoreAudio_Bitmap_LEFTCENTER, AOUT_CHAN_MIDDLELEFT }, + { CoreAudio_Bitmap_RIGHTCENTER, AOUT_CHAN_MIDDLERIGHT }, + { CoreAudio_Bitmap_BACKCENTER, AOUT_CHAN_REARCENTER }, + { CoreAudio_Bitmap_SIDELEFT, AOUT_CHAN_LEFT }, + { CoreAudio_Bitmap_SIDERIGHT, AOUT_CHAN_RIGHT }, + { CoreAudio_Bitmap_TOPCENTER, AOUT_CHAN_CENTER }, + { CoreAudio_Bitmap_TOPFRONTLEFT, AOUT_CHAN_LEFT }, + { CoreAudio_Bitmap_TOPFRONTENTER,AOUT_CHAN_CENTER }, + { CoreAudio_Bitmap_TOPFRONTRIGHT,AOUT_CHAN_RIGHT }, + { CoreAudio_Bitmap_TOPBACKLEFT, AOUT_CHAN_REARLEFT }, + { CoreAudio_Bitmap_TOPBACKCENTER,AOUT_CHAN_REARCENTER }, + { CoreAudio_Bitmap_TOPBACKRIGHT, AOUT_CHAN_REARRIGHT }, +}; + +enum CoreAudio_Layout +{ + CoreAudio_Layout_DESC = 0, + CoreAudio_Layout_BITMAP = (1<<16), +}; + +static inline int CoreAudio_Bitmap_to_vlc_bitmap( uint32_t i_corebitmap, + uint16_t *pi_mapping, + uint8_t *pi_channels, + uint32_t p_chans[AOUT_CHAN_MAX + 1] ) +{ + *pi_mapping = 0; + *pi_channels = 0; + for (uint8_t i=0;i<ARRAY_SIZE(CoreAudio_Bitmap_mapping);i++) + { + if ( CoreAudio_Bitmap_mapping[i].i_bitmap & i_corebitmap ) + { + if ( (CoreAudio_Bitmap_mapping[i].i_vlc_bitmap & *pi_mapping) || + *pi_channels >= AOUT_CHAN_MAX ) + { + /* double mapping or unsupported number of channels */ + *pi_mapping = 0; + return VLC_EGENERIC; + } + *pi_mapping |= CoreAudio_Bitmap_mapping[i].i_vlc_bitmap; + p_chans[(*pi_channels)++] = CoreAudio_Bitmap_mapping[i].i_vlc_bitmap; + } + } + p_chans[*pi_channels] = 0; + return VLC_SUCCESS; +} diff --git a/modules/demux/mp4/essetup.c b/modules/demux/mp4/essetup.c index bd864e1b8a..4bf8a9c8a4 100644 --- a/modules/demux/mp4/essetup.c +++ b/modules/demux/mp4/essetup.c @@ -1183,30 +1183,20 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample ) const MP4_Box_t *p_chan = MP4_BoxGet( p_sample, "chan" ); if ( p_chan ) { - if ( BOXDATA(p_chan)->layout.i_channels_layout_tag == MP4_CHAN_USE_CHANNELS_BITMAP ) + if ( BOXDATA(p_chan)->layout.i_channels_layout_tag == CoreAudio_Layout_BITMAP ) { uint32_t rgi_chans_sequence[AOUT_CHAN_MAX + 1]; memset(rgi_chans_sequence, 0, sizeof(rgi_chans_sequence)); uint16_t i_vlc_mapping = 0; uint8_t i_channels = 0; - const uint32_t i_bitmap = BOXDATA(p_chan)->layout.i_channels_bitmap; - for (uint8_t i=0;i<MP4_CHAN_BITMAP_MAPPING_COUNT;i++) + + if( CoreAudio_Bitmap_to_vlc_bitmap( BOXDATA(p_chan)->layout.i_channels_bitmap, + &i_vlc_mapping, &i_channels, + rgi_chans_sequence ) != VLC_SUCCESS ) { - if ( chan_bitmap_mapping[i].i_bitmap & i_bitmap ) - { - if ( (chan_bitmap_mapping[i].i_vlc & i_vlc_mapping) || - i_channels >= AOUT_CHAN_MAX ) - { - /* double mapping or unsupported number of channels */ - i_vlc_mapping = 0; - msg_Warn( p_demux, "discarding chan mapping" ); - break; - } - i_vlc_mapping |= chan_bitmap_mapping[i].i_vlc; - rgi_chans_sequence[i_channels++] = chan_bitmap_mapping[i].i_vlc; - } + msg_Warn( p_demux, "discarding chan mapping" ); } - rgi_chans_sequence[i_channels] = 0; + if( aout_CheckChannelReorder( rgi_chans_sequence, NULL, i_vlc_mapping, p_track->rgi_chans_reordering ) && aout_BitsPerSample( p_track->fmt.i_codec ) ) diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index 29de18c4ed..df545c83b2 100644 --- a/modules/demux/mp4/libmp4.h +++ b/modules/demux/mp4/libmp4.h @@ -24,6 +24,7 @@ #include <vlc_es.h> #include <vlc_codecs.h> +#include "coreaudio.h" /* Use alias for scaled time */ typedef int64_t stime_t; @@ -1374,55 +1375,6 @@ typedef struct } entries; } MP4_Box_data_sbgp_t; -/* According to Apple's CoreAudio/CoreAudioTypes.h */ -#define MP4_CHAN_USE_CHANNELS_DESC 0 -#define MP4_CHAN_USE_CHANNELS_BITMAP (1<<16) - -#define MP4_CHAN_BITMAP_LEFT (1<<0) -#define MP4_CHAN_BITMAP_RIGHT (1<<1) -#define MP4_CHAN_BITMAP_CENTER (1<<2) -#define MP4_CHAN_BITMAP_LFESCREEN (1<<3) -#define MP4_CHAN_BITMAP_BACKLEFT (1<<4) -#define MP4_CHAN_BITMAP_BACKRIGHT (1<<5) -#define MP4_CHAN_BITMAP_LEFTCENTER (1<<6) -#define MP4_CHAN_BITMAP_RIGHTCENTER (1<<7) -#define MP4_CHAN_BITMAP_BACKCENTER (1<<8) -#define MP4_CHAN_BITMAP_SIDELEFT (1<<9) -#define MP4_CHAN_BITMAP_SIDERIGHT (1<<10) -#define MP4_CHAN_BITMAP_TOPCENTER (1<<11) -#define MP4_CHAN_BITMAP_TOPFRONTLEFT (1<<12) -#define MP4_CHAN_BITMAP_TOPFRONTENTER (1<<13) -#define MP4_CHAN_BITMAP_TOPFRONTRIGHT (1<<14) -#define MP4_CHAN_BITMAP_TOPBACKLEFT (1<<15) -#define MP4_CHAN_BITMAP_TOPBACKCENTER (1<<16) -#define MP4_CHAN_BITMAP_TOPBACKRIGHT (1<<17) - -#define MP4_CHAN_BITMAP_MAPPING_COUNT 18 -static const struct -{ - uint32_t i_bitmap; - uint32_t i_vlc; -} chan_bitmap_mapping[MP4_CHAN_BITMAP_MAPPING_COUNT] = { - { MP4_CHAN_BITMAP_LEFT, AOUT_CHAN_LEFT }, - { MP4_CHAN_BITMAP_RIGHT, AOUT_CHAN_RIGHT }, - { MP4_CHAN_BITMAP_CENTER, AOUT_CHAN_CENTER }, - { MP4_CHAN_BITMAP_LFESCREEN, AOUT_CHAN_LFE }, - { MP4_CHAN_BITMAP_BACKLEFT, AOUT_CHAN_REARLEFT }, - { MP4_CHAN_BITMAP_BACKRIGHT, AOUT_CHAN_REARRIGHT }, - { MP4_CHAN_BITMAP_LEFTCENTER, AOUT_CHAN_MIDDLELEFT }, - { MP4_CHAN_BITMAP_RIGHTCENTER, AOUT_CHAN_MIDDLERIGHT }, - { MP4_CHAN_BITMAP_BACKCENTER, AOUT_CHAN_REARCENTER }, - { MP4_CHAN_BITMAP_SIDELEFT, AOUT_CHAN_LEFT }, - { MP4_CHAN_BITMAP_SIDERIGHT, AOUT_CHAN_RIGHT }, - { MP4_CHAN_BITMAP_TOPCENTER, AOUT_CHAN_CENTER }, - { MP4_CHAN_BITMAP_TOPFRONTLEFT, AOUT_CHAN_LEFT }, - { MP4_CHAN_BITMAP_TOPFRONTENTER,AOUT_CHAN_CENTER }, - { MP4_CHAN_BITMAP_TOPFRONTRIGHT,AOUT_CHAN_RIGHT }, - { MP4_CHAN_BITMAP_TOPBACKLEFT, AOUT_CHAN_REARLEFT }, - { MP4_CHAN_BITMAP_TOPBACKCENTER,AOUT_CHAN_REARCENTER }, - { MP4_CHAN_BITMAP_TOPBACKRIGHT, AOUT_CHAN_REARRIGHT }, -}; - typedef struct { uint8_t i_version; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
