/* audio_remap.h * * Copyright (c) 2003-2025 HandBrake Team * This file is part of the HandBrake source code * Homepage: * It may be used under the terms of the GNU General Public License v2. * For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html */ /* This file handles remapping audio channels * * We only need to support: * * a) channels found in our non-libavcodec audio decoders' layouts * b) channels found in HB_AMIXDOWN_* layouts * * We consider that: * * Left/Right Surround == Side Left/Right * Left/Right Rear Surround == Back Left/Right */ #ifndef HANDBRAKE_AUDIO_REMAP_H #define HANDBRAKE_AUDIO_REMAP_H #include #include "libavutil/channel_layout.h" #include "libavutil/samplefmt.h" /* we only need to support the 11 "most common" channels */ #define HB_AUDIO_REMAP_MAX_CHANNELS 11 typedef struct { uint64_t channel_order_map[HB_AUDIO_REMAP_MAX_CHANNELS + 1]; } hb_chan_map_t; /* * Predefined channel maps for common channel orders. */ extern hb_chan_map_t hb_vorbis_chan_map; extern hb_chan_map_t hb_aac_chan_map; /* * Configures a AVChannelLayout with a hb_chan_map_t. */ void hb_audio_remap_map_channel_layout(hb_chan_map_t *map, AVChannelLayout *ch_layout_out, const AVChannelLayout *ch_layout_in); typedef struct { int nchannels; int remap_needed; AVChannelLayout ch_layout_in; AVChannelLayout ch_layout_out; int table[HB_AUDIO_REMAP_MAX_CHANNELS]; void (*remap)(uint8_t **samples, int nsamples, int nchannels, int *remap_table); } hb_audio_remap_t; /* * Initialize an hb_audio_remap_t to remap audio with the specified sample * format, from the input to the output channel layout (indicated by * ch_layout_in and ch_layout_out, respectively). */ hb_audio_remap_t* hb_audio_remap_init(enum AVSampleFormat sample_fmt, const AVChannelLayout *ch_layout_out, const AVChannelLayout *ch_layout_in); /* * Free an hb_audio_remap_t. */ void hb_audio_remap_free(hb_audio_remap_t *remap); /* * Remap audio between 2 different channel orders, using the settings specified * in the remap parameter. Remapping is only done when necessary. * * The remap parameter can be NULL (no remapping). */ void hb_audio_remap(hb_audio_remap_t *remap, uint8_t **samples, int nsamples); /* * Generate a table used to remap audio between 2 different channel orders. * * Usage: output_sample[channel_idx] = input_sample[remap_table[channel_idx]] * * remap_table is allocated by the caller. */ void hb_audio_remap_build_table(AVChannelLayout *ch_layout_out, AVChannelLayout *ch_layout_in, int *remap_table); #endif /* HANDBRAKE_AUDIO_REMAP_H */