From: James Courtier-D. <jcd...@us...> - 2003-07-12 00:45:08
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs1:/tmp/cvs-serv16203/xine-lib/src/demuxers Modified Files: demux_mpeg_pes.c Log Message: Fix for mpeg streams with large PES packets. I.E. PES packets larger than fifo buffer size. Index: demux_mpeg_pes.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_mpeg_pes.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- demux_mpeg_pes.c 1 Jul 2003 16:04:53 -0000 1.4 +++ demux_mpeg_pes.c 12 Jul 2003 00:45:04 -0000 1.5 @@ -243,8 +243,15 @@ } buf->size = this->packet_len + 6; } else { - /* FIXME: Handle large PES packets. */ - assert(0); +#ifdef LOG + printf("Jumbo PES packet length=%d, stream_id=0x%x\n",this->packet_len, this->stream_id); +#endif + i = this->input->read (this->input, buf->mem+6, (off_t) (buf->max_size - 6)); + if (i != ( buf->max_size - 6)) { + buf->free_buffer (buf); + this->status = DEMUX_FINISHED; + return; + } } if (this->stream_id == 0xBB) { @@ -871,6 +878,9 @@ static int32_t parse_video_stream(demux_mpeg_pes_t *this, uint8_t *p, buf_element_t *buf) { int32_t result; + uint32_t todo_length=0; + uint32_t i; + uint32_t chunk_length; result = parse_pes_for_pts(this, p, buf); if (result < 0) return -1; @@ -878,7 +888,13 @@ p += result; buf->content = p; - buf->size = this->packet_len; + + if (this->packet_len <= (buf->max_size - 6)) { + buf->size = this->packet_len; + } else { + buf->size = buf->max_size - result; + todo_length = this->packet_len - buf->size; + } buf->type = BUF_VIDEO_MPEG; buf->pts = this->pts; buf->decoder_info[0] = this->pts - this->dts; @@ -886,6 +902,29 @@ check_newpts( this, this->pts, PTS_VIDEO ); this->video_fifo->put (this->video_fifo, buf); + while (todo_length > 0) { + buf = this->video_fifo->buffer_pool_alloc (this->video_fifo); + if (todo_length < buf->max_size) { + chunk_length = todo_length; + } else { + chunk_length = buf->max_size; + } + i = this->input->read (this->input, buf->mem, (off_t) (chunk_length)); + if (i != chunk_length) { + buf->free_buffer (buf); + this->status = DEMUX_FINISHED; + return -1; + } + buf->content = buf->mem; + buf->size = chunk_length; + buf->type = BUF_VIDEO_MPEG; + buf->pts = 0; + this->video_fifo->put (this->video_fifo, buf); + todo_length -= chunk_length; + } + + + #ifdef LOG printf ("demux_mpeg_pes: MPEG Video PACK put on fifo\n"); #endif |