/* audio_remap.h
*
* Copyright (c) 2003-2021 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 the following two scenarios:
*
* 1) remapping audio from decoder order to libav order (for downmixing)
*
* 2) remapping audio from libav order to encoder order (for encoding)
*
* 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/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;
typedef struct
{
int nchannels;
int remap_needed;
hb_chan_map_t *channel_map_in;
hb_chan_map_t *channel_map_out;
int table[HB_AUDIO_REMAP_MAX_CHANNELS];
void (*remap)(uint8_t **samples, int nsamples,
int nchannels, int *remap_table);
} hb_audio_remap_t;
/*
* Predefined channel maps for common channel orders.
*/
extern hb_chan_map_t hb_libav_chan_map;
extern hb_chan_map_t hb_liba52_chan_map;
extern hb_chan_map_t hb_vorbis_chan_map;
extern hb_chan_map_t hb_aac_chan_map;
/*
* Initialize an hb_audio_remap_t to remap audio with the specified sample
* format, from the input to the output channel order (indicated by
* channel_map_in and channel_map_out, respectively).
*/
hb_audio_remap_t* hb_audio_remap_init(enum AVSampleFormat sample_fmt,
hb_chan_map_t *channel_map_out,
hb_chan_map_t *channel_map_in);
/*
* Updates an hb_audio_remap_t's number of channels and remap table to work with
* the specified channel layout.
*
* Must be called at least once before remapping.
*/
void hb_audio_remap_set_channel_layout(hb_audio_remap_t *remap,
uint64_t channel_layout);
/*
* 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(hb_chan_map_t *channel_map_out,
hb_chan_map_t *channel_map_in,
uint64_t channel_layout,
int *remap_table);
#endif /* HANDBRAKE_AUDIO_REMAP_H */