From: J?rgen K. <jk...@us...> - 2001-08-31 17:57:57
|
Update of /cvsroot/xine/xine-lib/src/liblpcm In directory usw-pr-cvs1:/tmp/cvs-serv15615/src/liblpcm Modified Files: xine_decoder.c Log Message: Fix byte order problems for AVI files with LPCM sound. Index: xine_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/liblpcm/xine_decoder.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- xine_decoder.c 2001/08/31 01:07:55 1.4 +++ xine_decoder.c 2001/08/31 17:57:54 1.5 @@ -48,11 +48,14 @@ ao_instance_t *audio_out; int output_open; - + int cpu_be; /* TRUE, if we're a Big endian CPU */ } lpcm_decoder_t; int lpcm_can_handle (audio_decoder_t *this_gen, int buf_type) { - return ((buf_type & 0xFFFF0000) == BUF_AUDIO_LPCM) ; + buf_type &= 0xFFFF0000; + + return ( buf_type == BUF_AUDIO_LPCM_BE || + buf_type == BUF_AUDIO_LPCM_LE ); } @@ -66,6 +69,8 @@ this->last_pts = 0; this->last_size = 0; this->rate = 0; + + this->cpu_be = ( htons(1) == 1 ); } @@ -73,8 +78,10 @@ lpcm_decoder_t *this = (lpcm_decoder_t *) this_gen; int16_t *sample_buffer=(int16_t *)buf->content; - this->last_pts=this->pts; - this->pts = buf->PTS; + int stream_be; + + this->last_pts=this->pts; + this->pts = buf->PTS; if (buf->decoder_info[0] == 0) return; if ((this->last_pts > 0) && (this->pts > 0) && (this->rate == 0)) { @@ -90,6 +97,12 @@ } if (!this->output_open) return; + + /* Swap LPCM samples into native byte order, if necessary */ + stream_be = ( buf->type == BUF_AUDIO_LPCM_BE ); + if (stream_be != this->cpu_be) + swab(sample_buffer, sample_buffer, buf->size); + this->audio_out->write (this->audio_out, sample_buffer, buf->size/4, |