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 != 
'+') {
 
  235             double gain = pan->
gain[i][j];
 
  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 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. 
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)
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[]