68 #define OFFSET(x) offsetof(ChannelMapContext, x)
69 #define A AV_OPT_FLAG_AUDIO_PARAM
70 #define F AV_OPT_FLAG_FILTERING_PARAM
72 {
"map",
"A comma-separated list of input channel numbers in output order.",
74 {
"channel_layout",
"Output channel layout.",
82 char *next = strchr(
message, delim);
96 if (!next && delim ==
'-')
99 sscanf(*
map,
"%d%n", ch, &n);
102 if (*ch < 0 || *ch > max_ch)
111 if (!next && delim ==
'-')
123 char *mapping, separator =
'|';
127 uint64_t out_ch_mask = 0;
130 mapping =
s->mapping_str;
135 char *dash = strchr(mapping,
'-');
157 while ((sep = strchr(sep, separator))) {
163 if (map_entries >
MAX_CH) {
168 for (
i = 0;
i < map_entries;
i++) {
169 int in_ch_idx = -1, out_ch_idx = -1;
170 uint64_t in_ch = 0, out_ch = 0;
171 static const char err[] =
"Failed to parse channel map\n";
178 s->map[
i].in_channel_idx = in_ch_idx;
179 s->map[
i].out_channel_idx =
i;
182 if (
get_channel(&mapping, &in_ch, separator) < 0) {
186 s->map[
i].in_channel = in_ch;
187 s->map[
i].out_channel_idx =
i;
195 s->map[
i].in_channel_idx = in_ch_idx;
196 s->map[
i].out_channel_idx = out_ch_idx;
201 out_ch & out_ch_mask) {
205 s->map[
i].in_channel_idx = in_ch_idx;
206 s->map[
i].out_channel = out_ch;
207 out_ch_mask |= out_ch;
215 s->map[
i].in_channel = in_ch;
216 s->map[
i].out_channel_idx = out_ch_idx;
221 out_ch & out_ch_mask) {
225 s->map[
i].in_channel = in_ch;
226 s->map[
i].out_channel = out_ch;
227 out_ch_mask |= out_ch;
232 s->nch = map_entries;
233 s->output_layout = out_ch_mask ? out_ch_mask :
236 if (
s->channel_layout_str) {
240 s->channel_layout_str);
246 for (
i = 0;
i <
s->nch;
i++) {
247 s->map[
i].in_channel_idx =
i;
248 s->map[
i].out_channel_idx =
i;
250 }
else if (out_ch_mask && out_ch_mask != fmt) {
253 "Output channel layout '%s' does not match the list of channel mapped: '%s'.\n",
254 s->channel_layout_str, buf);
258 "Output channel layout %s does not match the number of channels mapped %d.\n",
259 s->channel_layout_str,
s->nch);
262 s->output_layout = fmt;
264 if (!
s->output_layout) {
266 "cannot be guessed from the maps.\n");
271 for (
i = 0;
i <
s->nch;
i++) {
273 s->output_layout,
s->map[
i].out_channel);
290 &
ctx->outputs[0]->incfg.channel_layouts)) < 0)
294 &
ctx->inputs[0]->outcfg.channel_layouts);
302 const int nch_in = inlink->
channels;
303 const int nch_out =
s->nch;
308 nch_in *
sizeof(source_planes[0]));
310 if (nch_out > nch_in) {
314 if (!new_extended_data) {
330 for (ch = 0; ch < nch_out; ch++) {
332 source_planes[
s->map[ch].in_channel_idx];
352 char layout_name[256];
354 for (
i = 0;
i <
s->nch;
i++) {
368 "input channel '%s' not available from input layout '%s'\n",
372 "input channel #%d not available from input layout '%s'\n",
402 .
name =
"channelmap",
407 .priv_class = &channelmap_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
AVFILTER_DEFINE_CLASS(channelmap)
static int channelmap_config_input(AVFilterLink *inlink)
static const AVFilterPad avfilter_af_channelmap_outputs[]
static const AVFilterPad avfilter_af_channelmap_inputs[]
static int get_channel_idx(char **map, int *ch, char delim, int max_ch)
static av_cold int channelmap_init(AVFilterContext *ctx)
AVFilter ff_af_channelmap
static const AVOption channelmap_options[]
static char * split(char *message, char delim)
static int channelmap_filter_frame(AVFilterLink *inlink, AVFrame *buf)
static int get_channel(char **map, uint64_t *ch, char delim)
static int channelmap_query_formats(AVFilterContext *ctx)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
audio channel layout utility functions
common internal and external API header
static const uint16_t channel_layouts[7]
mode
Use these values in ebur128_init (or'ed).
int av_get_channel_layout_channel_index(uint64_t channel_layout, uint64_t channel)
Get the index of a channel in channel_layout.
uint64_t av_get_channel_layout(const char *name)
Return a channel layout id that matches name, or 0 if no match is found.
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
int64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.
const char * av_get_channel_name(uint64_t channel)
Get the name of a given channel.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
static av_const int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
const VDPAUPixFmtMap * map
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define FF_ARRAY_ELEMS(a)
Describe the class of an AVClass context structure.
A list of supported channel layouts.
A link between two filters.
int channels
Number of channels.
uint64_t channel_layout
channel layout of current buffer (see libavutil/channel_layout.h)
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int channels
number of audio channels, only used for audio.
uint64_t channel_layout
Channel layout of the audio data.
uint8_t ** extended_data
pointers to the data planes/channels.
struct ChannelMap map[MAX_CH]
char * channel_layout_str
uint64_t out_channel
layout describing the output channel
int in_channel_idx
index of in_channel in the input stream data
uint64_t in_channel
layout describing the input channel