28 #include "libavutil/avstring.h"
29 #include "libavutil/channel_layout.h"
30 #include "libavutil/common.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/samplefmt.h"
69 #define OFFSET(x) offsetof(ChannelMapContext, x)
70 #define A AV_OPT_FLAG_AUDIO_PARAM
72 {
"map",
"A comma-separated list of input channel numbers in output order.",
74 {
"channel_layout",
"Output channel layout.",
86 static char*
split(
char *message,
char delim) {
87 char *next = strchr(message, delim);
95 char *next =
split(*map, delim);
98 if (!next && delim ==
'-')
101 sscanf(*map,
"%d%n", ch, &n);
104 if (*ch < 0 || *ch > max_ch)
112 char *next =
split(*map, delim);
113 if (!next && delim ==
'-')
125 char *mapping, separator =
'|';
129 uint64_t out_ch_mask = 0;
137 char *dash = strchr(mapping,
'-');
154 #if FF_API_OLD_FILTER_OPTS
155 if (strchr(mapping,
',')) {
157 "'|' to separate the mappings.\n");
166 while ((sep = strchr(sep, separator))) {
172 if (map_entries >
MAX_CH) {
177 for (i = 0; i < map_entries; i++) {
178 int in_ch_idx = -1, out_ch_idx = -1;
179 uint64_t in_ch = 0, out_ch = 0;
180 static const char err[] =
"Failed to parse channel map\n";
191 if (
get_channel(&mapping, &in_ch, separator) < 0) {
210 out_ch & out_ch_mask) {
216 out_ch_mask |= out_ch;
230 out_ch & out_ch_mask) {
236 out_ch_mask |= out_ch;
241 s->
nch = map_entries;
255 for (i = 0; i < s->
nch; i++) {
259 }
else if (out_ch_mask && out_ch_mask != fmt) {
262 "Output channel layout '%s' does not match the list of channel mapped: '%s'.\n",
267 "Output channel layout %s does not match the number of channels mapped %d.\n",
275 "cannot be guessed from the maps.\n");
282 for (i = 0; i < s->
nch; i++) {
309 const int nch_out = s->
nch;
314 nch_in *
sizeof(source_planes[0]));
316 if (nch_out > nch_in) {
320 if (!new_extended_data) {
336 for (ch = 0; ch < nch_out; ch++) {
356 const char *channel_name;
357 char layout_name[256];
359 for (i = 0; i < s->
nch; i++) {
373 "input channel '%s' not available from input layout '%s'\n",
374 channel_name, layout_name);
377 "input channel #%d not available from input layout '%s'\n",
406 .
name =
"channelmap",
411 .priv_class = &channelmap_class,
uint64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.
static const AVOption options[]
uint64_t in_channel
layout describing the input channel
This structure describes decoded (raw) audio or video data.
const char * name
Filter name.
void * priv
private data for use by the filter
#define AV_LOG_WARNING
Something somehow does not look correct.
static const AVFilterPad outputs[]
uint8_t ** extended_data
pointers to the data planes/channels.
AVFilter ff_af_channelmap
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
struct AVFilterChannelLayouts * in_channel_layouts
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int channelmap_filter_frame(AVFilterLink *inlink, AVFrame *buf)
char * channel_layout_str
static int channelmap_query_formats(AVFilterContext *ctx)
int av_get_channel_layout_channel_index(uint64_t channel_layout, uint64_t channel)
Get the index of a channel in channel_layout.
A link between two filters.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
AVFilterChannelLayouts * channel_layouts
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
static char * split(char *message, char delim)
uint64_t channel_layout
Channel layout of the audio data.
#define FF_ARRAY_ELEMS(a)
int in_channel_idx
index of in_channel in the input stream data
Main libavfilter public API header.
AVFilterLink ** outputs
array of pointers to output links
static const AVClass channelmap_class
struct ChannelMap map[MAX_CH]
Describe the class of an AVClass context structure.
static const AVFilterPad inputs[]
AVFilterLink ** inputs
array of pointers to input links
uint64_t out_channel
layout describing the output channel
AVFilterContext * dst
dest filter
static int channelmap_config_input(AVFilterLink *inlink)
const char * av_get_channel_name(uint64_t channel)
Get the name of a given channel.
static const AVFilterPad avfilter_af_channelmap_inputs[]
static int get_channel_idx(char **map, int *ch, char delim, int max_ch)
uint64_t channel_layout
channel layout of current buffer (see libavutil/channel_layout.h)
struct AVFilterPad AVFilterPad
uint64_t av_get_channel_layout(const char *name)
Return a channel layout id that matches name, or 0 if no match is found.
static int get_channel(char **map, uint64_t *ch, char delim)
struct AVFilterChannelLayouts * out_channel_layouts
static av_cold int channelmap_init(AVFilterContext *ctx)
static const AVFilterPad avfilter_af_channelmap_outputs[]
av_default_item_name
Return the context name.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
void * av_mallocz(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
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.