56#define MOD_NAME "[Remap filter] "
75 "channel_remap")
" allows remapping audio channels.\n\n");
77 color_printf(
"\t" TBOLD(
"--audio-filter channel_remap:[<src_ch>]:<dst_ch>[,[<src_ch>]:<dst_ch>]...\n\n"));
79 color_printf(
"Maps source channels into destination channels.\n");
80 color_printf(
"If multiple source channels are mapped into the same destination channel, they are mixed together.\n");
81 color_printf(
"E.g. 0:0,1:0 means that the first and second channel are mixed to produce a single mono channel.\n");
82 color_printf(
"2:0,3:1 means that the third and fourth channel are mapped into first and second channel respectively.\n");
86 auto s = std::make_unique<state_channel_remap>(
parent);
88 if(strcmp(cfg,
"help") == 0){
97 assert(s->channel_map.size > 0);
105 int in_bps,
int in_ch_count,
int in_sample_rate)
110 s->ch_count = in_ch_count;
111 s->sample_rate = in_sample_rate;
113 s->out_frame.bps = s->bps;
114 s->out_frame.sample_rate = s->sample_rate;
116 if(s->channel_map.size > in_ch_count){
153 if(f->bps != s->bps || f->ch_count != s->ch_count){
159 int frame_count = f->data_len / f->ch_count / f->bps;
161 s->out_frame.ch_count = s->channel_map.max_output + 1;
162 s->out_frame.data_len = frame_count * s->out_frame.bps * s->out_frame.ch_count;
163 if(s->out_frame.data_len > s->out_frame.max_size){
164 s->out_frame.max_size = s->out_frame.data_len;
165 s->out_buffer.resize(s->out_frame.max_size);
166 s->out_frame.data = s->out_buffer.data();
169 memset(s->out_frame.data, 0, s->out_frame.data_len);
171 int max_src_count = std::min(s->channel_map.size, f->ch_count);
173 for(
int src_ch = 0; src_ch < max_src_count; src_ch++){
174 for(
int dst_ch = 0; dst_ch < s->channel_map.sizes[src_ch]; dst_ch++){
177 f->ch_count, s->out_frame.ch_count,
178 src_ch, s->channel_map.map[src_ch][dst_ch], 1.0);
182 s->out_frame.timestamp = f->timestamp;
184 *
frame = &s->out_frame;
190 .name =
"channel_remap",
struct video_frame * frame
This file contains definition of some common audio types.
#define AUDIO_FILTER_ABI_VERSION
static void get_configured_in(void *state, int *bps, int *ch_count, int *sample_rate)
static af_result_code filter(void *state, struct audio_frame **frame)
static af_result_code init(struct module *parent, const char *cfg, void **state)
static af_result_code configure(void *state, int in_bps, int in_ch_count, int in_sample_rate)
static void get_configured_out(void *state, int *bps, int *ch_count, int *sample_rate)
static const struct audio_filter_info audio_filter_channel_remap
static void done(void *state)
int color_printf(const char *format,...)
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_WARNING
less severe errors
@ LIBRARY_CLASS_AUDIO_FILTER
#define REGISTER_MODULE(name, info, lclass, abi)
Registers module to global modules' registry.
struct used to comunicate with audio capture/playback device
state_channel_remap(struct module *mod)
struct audio_frame out_frame
std::vector< char > out_buffer
void remux_and_mix_channel(char *out, const char *in, int bps, int frames, int in_stream_channels, int out_stream_channels, int in_channel, int out_channel, double scale)
bool parse_channel_map_cfg(struct channel_map *channel_map, const char *cfg)