From: James S. <jst...@us...> - 2004-01-12 23:43:42
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs1:/tmp/cvs-serv26401/src/demuxers Modified Files: demux_real.c Log Message: support for AAC in rm files Index: demux_real.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_real.c,v retrieving revision 1.79 retrieving revision 1.80 diff -u -r1.79 -r1.80 --- demux_real.c 12 Jan 2004 17:35:15 -0000 1.79 +++ demux_real.c 12 Jan 2004 23:43:39 -0000 1.80 @@ -714,16 +714,28 @@ buf_element_t *buf; buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo); - buf->content = buf->mem; - memcpy(buf->content, - this->audio_stream->mdpr->type_specific_data + 4, - this->audio_stream->mdpr->type_specific_len - 4); + buf->type = this->audio_stream->buf_type; + buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END; + + if(buf->type == BUF_AUDIO_AAC) { + buf->decoder_info[1] = BE_16(this->audio_stream->mdpr->type_specific_data + 54); + buf->decoder_info[2] = BE_16(this->audio_stream->mdpr->type_specific_data + 58); + buf->decoder_info[3] = BE_16(this->audio_stream->mdpr->type_specific_data + 60); - buf->size = this->audio_stream->mdpr->type_specific_len - 4; + buf->decoder_flags |= BUF_FLAG_STDHEADER; + + buf->content = NULL; + buf->size = 0; + } else { + memcpy(buf->content, + this->audio_stream->mdpr->type_specific_data + 4, + this->audio_stream->mdpr->type_specific_len - 4); + + buf->content = buf->mem; + buf->size = this->audio_stream->mdpr->type_specific_len - 4; + } - buf->type = this->audio_stream->buf_type; - buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END; buf->extra_info->input_pos = 0; buf->extra_info->input_time = 0; @@ -1140,6 +1152,19 @@ input_length = 0; check_newpts (this, pts, PTS_AUDIO, 0); + + /* Each packet of AAC is made up of several AAC frames preceded by a + * list of the sizes of these frames - just read through the list of + * sizes as faad doesn't need it and then send all the AAC frames + * together */ + if(this->audio_stream->buf_type == BUF_AUDIO_AAC) { + int n = 0, max = size; + + while(n < max) { + n += stream_read_word(this); + size -= 2; + } + } if(_x_demux_read_send_data(this->audio_fifo, this->input, size, pts, this->audio_stream->buf_type, 0, this->input->get_current_pos(this->input), |