diff -Nraub mplayer.ori/libmpcodecs/ad_faad.c mplayer/libmpcodecs/ad_faad.c --- mplayer.ori/libmpcodecs/ad_faad.c 2006-10-08 15:58:28.000000000 -0400 +++ mplayer/libmpcodecs/ad_faad.c 2006-10-10 12:10:09.000000000 -0400 @@ -277,7 +277,20 @@ /* XXX: samples already multiplied by channels! */ mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Successfully decoded frame (%ld Bytes)!\n", sh->samplesize*faac_finfo.samples); + + if (sh->channels == 6 || sh->channels == 5) { + //Source channel order: C L R SL SR LFE + //We want: L R SL SR C LFE + int i; + for (i = 0; i < faac_finfo.samples; i += sh->channels) { + memcpy(buf+len+(i+0)*sh->samplesize,faac_sample_buffer+(i+1)*sh->samplesize, sh->samplesize*4); // L R SL SR + memcpy(buf+len+(i+4)*sh->samplesize,faac_sample_buffer+(i+0)*sh->samplesize, sh->samplesize*1); // C + if (sh->channels == 6) + memcpy(buf+len+(i+5)*sh->samplesize,faac_sample_buffer+(i+5)*sh->samplesize, sh->samplesize*1); // LFE + } + } else { memcpy(buf+len,faac_sample_buffer, sh->samplesize*faac_finfo.samples); + } last_dec_len = sh->samplesize*faac_finfo.samples; len += last_dec_len; sh->pts_bytes += last_dec_len;