The channel order for oggdec is wrong.
It is necessary to revise oggdec like oggenc.
== patch for oggdec==
diff -crN vorbis-tools-1.4.0/oggdec/oggdec.c vorbis-tools-1.4.0m/oggdec/oggdec.c
*** vorbis-tools-1.4.0/oggdec/oggdec.c Fri Jan 22 15:01:46 2010
--- vorbis-tools-1.4.0m/oggdec/oggdec.c Sun May 01 23:57:57 2011
***************
*** 225,237 ****
static void
permute_channels(char *in, char *out, int len, int channels, int bytespersample)
{
! int permute[6][6] = {{0}, {0,1}, {0,2,1}, {0,1,2,3}, {0,1,2,3,4},
! {0,2,1,5,3,4}};
int i,j,k;
int samples = len/channels/bytespersample;
/* Can't handle, don't try */
! if (channels > 6)
return;
for (i=0; i < samples; i++) {
--- 225,245 ----
static void
permute_channels(char *in, char *out, int len, int channels, int bytespersample)
{
! int permute[8][8] = {
! {0},
! {0,1},
! {0,2,1},
! {0,1,2,3},
! {0,2,1,3,4},
! {0,2,1,4,5,3},
! {0,2,1,5,6,4,3},
! {0,2,1,6,7,4,5,3}
! };
int i,j,k;
int samples = len/channels/bytespersample;
/* Can't handle, don't try */
! if (channels > 8)
return;
for (i=0; i < samples; i++) {