[MPlayer-users] bug in pan filter

Artem Astafyev ace at insurer.com.ua
Tue Jul 6 17:13:36 CEST 2004


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.

Maybe I'm missing something?
-- 
Best regards,

Artem Astafyev




More information about the MPlayer-users mailing list