#22 closed defect (fixed)
first argument in pan filter is number of INPUT channels, but not OUTPUT as stated in docs
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | normal | Component: | DOCS |
Version: | HEAD | Severity: | normal |
Keywords: | Cc: | ||
Blocked By: | Blocking: | ||
Reproduced by developer: | no | Analyzed by developer: | no |
Description
I'm trying to make 6 channel audio from ordinary stereo track with pan filter.
According to documentation I do such thing:
mplayer -ao alsa9:surround51 -af pan=6:1:0:0:1:1:0:0:1:0.5:0.5,sub -v -channels
6 movie.avi
Checking audio filter chain for 48000Hz/2ch/16bit -> 48000Hz/6ch/16bit...
[libaf] Adding filter pan
[pan] Pan level from channel 0 to channel 0 = 1.000000
[pan] Pan level from channel 1 to channel 0 = 0.000000
[pan] Pan level from channel 2 to channel 0 = 0.000000
[pan] Pan level from channel 3 to channel 0 = 1.000000
[pan] Pan level from channel 4 to channel 0 = 1.000000
[pan] Pan level from channel 5 to channel 0 = 0.000000
[pan] Pan level from channel 0 to channel 1 = 0.000000
[pan] Pan level from channel 1 to channel 1 = 1.000000
[pan] Pan level from channel 2 to channel 1 = 0.500000
[pan] Pan level from channel 3 to channel 1 = 0.500000
[libaf] Adding filter sub
[libaf] Adding filter format
But as we see signal routing is strange, not as I'm expecting. Then I try:
mplayer -ao alsa9:surround51 -af pan=2:1:0:0:1:1:0:0:1:0.5:0.5,sub -v -channels
6
Checking audio filter chain for 48000Hz/2ch/16bit -> 48000Hz/6ch/16bit...
[libaf] Adding filter pan
[pan] Pan level from channel 0 to channel 0 = 1.000000
[pan] Pan level from channel 1 to channel 0 = 0.000000
[pan] Pan level from channel 0 to channel 1 = 0.000000
[pan] Pan level from channel 1 to channel 1 = 1.000000
[pan] Pan level from channel 0 to channel 2 = 1.000000
[pan] Pan level from channel 1 to channel 2 = 0.000000
[pan] Pan level from channel 0 to channel 3 = 0.000000
[pan] Pan level from channel 1 to channel 3 = 1.000000
[pan] Pan level from channel 0 to channel 4 = 0.500000
[pan] Pan level from channel 1 to channel 4 = 0.500000
[libaf] Adding filter sub
[libaf] Adding filter format
[format] Changing sample format from 16bit little endian signed int to 32bit
little endian float
[libaf] Adding filter channels
[channels] Changing number of channels to 6
Exactly what I need. So, first number after pan filter is not a number of
output channels as stated in docs, but number of input channels.
So, I looked up in code (af_pan.c):
static int control(struct af_instance_s* af, int cmd, void* arg)
.....
while((*cp == ':') && (k < AF_NCH)){
sscanf(cp, ":%f%n" , &s->level[k][j], &n);
s->level[k][j] = clamp(s->level[k][j],0.0,1.0);
af_msg(AF_MSG_VERBOSE,"[pan] Pan level from channel %i to"
" channel %i = %f\n",j,k,s->level[k][j]);
cp =&cp[n];
j++;
if(j>=nch){
j = 0;
k++;
}
}
...
As we see j is used as second array index and increments up to nch which is
number of OUTPUT channels. Let's see play function:
.....
int nchi = c->nch; Number of input channels
.....
while(in < end){
for(j=0;j<ncho;j++){
register float x = 0.0;
register float* tin = in;
for(k=0;k<nchi;k++)
x += tin[k] * s->level[j][k];
out[j] = x;
}
out+= ncho;
in+= nchi;
}
Here k is used as second array index and increments up to nchi, which is
number od INPUT channels.
So, "nature" test with mplayer given above shows the same.
Change History (2)
comment:1 by , 20 years ago
Component: | af → DOCS |
---|---|
Owner: | changed from | to
comment:2 by , 20 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
After this had me confused myself a few times, I corrected the documentation.
I assume we need to update the docs for this. Taking.