40 #define MAX_CHANNELS 64 61 sscanf(*arg,
" %n", &len);
68 int len, i, channel_id = 0;
73 if (sscanf(*arg,
"%7[A-Z]%n", buf, &len)) {
76 for (i = 32; i > 0; i >>= 1) {
77 if (layout >= (int64_t)1 << i) {
83 if (channel_id >=
MAX_CHANNELS || layout0 != (int64_t)1 << channel_id)
85 *rchannel = channel_id;
91 if (sscanf(*arg,
"c%d%n", &channel_id, &len) &&
93 *rchannel = channel_id;
105 int out_ch_id, in_ch_id,
len, named, ret, sign = 1;
106 int nb_in_channels[2] = { 0, 0 };
112 "pan filter needs a channel layout and a set " 113 "of channel definitions as parameter\n");
135 "Expected out channel name, got \"%.8s\"\n", arg);
142 "Channel \"%.8s\" does not exist in the chosen layout\n", arg0);
154 "Invalid out channel name \"%.8s\"\n", arg0);
158 if (used_out_ch[out_ch_id]) {
160 "Can not reference out channel %d twice\n", out_ch_id);
164 used_out_ch[out_ch_id] = 1;
168 }
else if (*arg ==
'<') {
173 "Syntax error after channel name in \"%.8s\"\n", arg0);
181 if (sscanf(arg,
"%lf%n *%n", &gain, &len, &len))
185 "Expected in channel name, got \"%.8s\"\n", arg);
189 nb_in_channels[named]++;
190 if (nb_in_channels[!named]) {
192 "Can not mix named and numbered channels\n");
196 if (used_in_ch[in_ch_id]) {
198 "Can not reference in channel %d twice\n", in_ch_id);
202 used_in_ch[in_ch_id] = 1;
203 pan->
gain[out_ch_id][in_ch_id] = sign *
gain;
209 }
else if (*arg !=
'+') {
239 if (gain != 0. && gain != 1.)
242 if (gain && nb_gain++)
285 char buf[1024], *cur;
305 "af_pan supports a maximum of %d channels. " 306 "Feel free to ask for a higher limit.\n",
MAX_CHANNELS);
332 for (j = 0; j < link->
channels; j++) {
333 if (pan->
gain[i][j]) {
350 for (j = 0; j < link->
channels; j++)
351 t += fabs(pan->
gain[i][j]);
352 if (t > -1
E-5 && t < 1
E-5) {
356 "Degenerate coefficients while renormalizing\n");
359 for (j = 0; j < link->
channels; j++)
360 pan->
gain[i][j] /= t;
374 for (j = 0; j < link->
channels; j++) {
375 r =
snprintf(cur, buf +
sizeof(buf) - cur,
"%s%.3g i%d",
376 j ?
" + " :
"", pan->
gain[i][j], j);
377 cur +=
FFMIN(buf +
sizeof(buf) - cur, r);
424 #define OFFSET(x) offsetof(PanContext, x) 455 .priv_class = &pan_class,
double gain[MAX_CHANNELS][MAX_CHANNELS]
This structure describes decoded (raw) audio or video data.
#define AV_LOG_WARNING
Something somehow does not look correct.
Main libavfilter public API header.
#define AV_OPT_FLAG_AUDIO_PARAM
struct AVFilterChannelLayouts * in_channel_layouts
static int config_props(AVFilterLink *link)
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
const char * name
Pad name.
uint64_t av_get_channel_layout(const char *name)
Return a channel layout id that matches name, or 0 if no match is found.
AVFilterLink ** inputs
array of pointers to input links
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
#define AV_LOG_VERBOSE
Detailed information.
static const AVFilterPad pan_inputs[]
static const AVOption pan_options[]
A filter pad used for either input or output.
A link between two filters.
libswresample public header
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int sample_rate
samples per second
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
#define AV_OPT_FLAG_FILTERING_PARAM
a generic parameter which can be set by the user for filtering
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
The libswresample context.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
static int query_formats(AVFilterContext *ctx)
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
struct AVFilterChannelLayouts * out_channel_layouts
static int are_gains_pure(const PanContext *pan)
uint64_t channel_layout
Channel layout of the audio data.
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count, const uint8_t *in_arg [SWR_CH_MAX], int in_count)
int channels
number of audio channels, only used for audio.
audio channel layout utility functions
int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride)
Set a customized remix matrix.
static void skip_spaces(char **arg)
struct SwrContext * swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
Allocate SwrContext if needed and set/reset common parameters.
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
int format
agreed upon media format
A list of supported channel layouts.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int64_t out_channel_layout
#define AV_LOG_INFO
Standard information.
char * av_strdup(const char *s)
Duplicate a string.
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map)
Set a customized input channel mapping.
Describe the class of an AVClass context structure.
int channel_map[MAX_CHANNELS]
const char * name
Filter name.
AVFilterLink ** outputs
array of pointers to output links
enum MovChannelLayoutTag * layouts
AVFILTER_DEFINE_CLASS(pan)
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
uint64_t channel_layout
channel layout of current buffer (see libavutil/channel_layout.h)
static int parse_channel_name(char **arg, int *rchannel, int *rnamed)
int channels
Number of channels.
AVFilterContext * dst
dest filter
static av_cold int init(AVFilterContext *ctx)
uint8_t ** extended_data
pointers to the data planes/channels.
int nb_samples
number of audio samples (per channel) described by this frame
static av_cold void uninit(AVFilterContext *ctx)
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
av_cold int swr_init(struct SwrContext *s)
Initialize context after user parameters have been set.
static const AVFilterPad pan_outputs[]