From: James S. <jst...@us...> - 2004-02-10 00:41:46
|
Update of /cvsroot/xine/xine-lib/src/libffmpeg In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29884 Modified Files: video_decoder.c Log Message: *) Only read frame duration when BUF_FLAG_FRAMERATE is set *) Dynamic sizing for real video slice offset buffer Index: video_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/video_decoder.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- video_decoder.c 3 Feb 2004 19:42:02 -0000 1.5 +++ video_decoder.c 9 Feb 2004 22:11:30 -0000 1.6 @@ -51,7 +51,8 @@ #define VIDEOBUFSIZE (128*1024) #define SLICE_BUFFER_SIZE (1194*1024) -#define RV10_CHUNK_TAB_SIZE 128 + +#define SLICE_OFFSET_SIZE 128 #define ENABLE_DIRECT_RENDERING @@ -78,6 +79,8 @@ int bufsize; int size; int skipframes; + + int slice_offset_size; AVFrame *av_frame; AVCodecContext *context; @@ -221,7 +224,6 @@ _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH, this->context->width); _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT, this->context->height); - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->video_step); this->stream->video_out->open (this->stream->video_out, this->stream); @@ -834,7 +836,6 @@ /* init package containing bih */ memcpy ( &this->bih, buf->content, sizeof(xine_bmiheader) ); - this->video_step = buf->decoder_info[1]; init_video_codec (this, (xine_bmiheader *) buf->content ); @@ -849,9 +850,14 @@ this->video_step = 90000.0 / ((double) BE_16(&buf->content[22]) + ((double) BE_16(&buf->content[24]) / 65536.0)); + + _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, + this->video_step); this->context->sub_id = BE_32(&buf->content[30]); - this->context->slice_offset = xine_xmalloc(sizeof(int)*RV10_CHUNK_TAB_SIZE); + + this->context->slice_offset = xine_xmalloc(sizeof(int)*SLICE_OFFSET_SIZE); + this->slice_offset_size = SLICE_OFFSET_SIZE; break; default: xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, @@ -893,8 +899,14 @@ } else if (buf->decoder_info[1] == BUF_SPECIAL_RV_CHUNK_TABLE) { - /* FIXME: Check bounds of this->context->slice_offset */ this->context->slice_count = buf->decoder_info[2]+1; + + if(this->context->slice_count > this->slice_offset_size) { + this->context->slice_offset = realloc(this->context->slice_offset, + sizeof(int)*this->context->slice_count); + this->slice_offset_size = this->context->slice_count; + } + for(i = 0; i < this->context->slice_count; i++) this->context->slice_offset[i] = ((uint32_t *) buf->decoder_info_ptr[2])[(2*i)+1]; @@ -916,8 +928,10 @@ } - if (buf->decoder_flags & BUF_FLAG_FRAMERATE) + if (buf->decoder_flags & BUF_FLAG_FRAMERATE) { this->video_step = buf->decoder_info[0]; + _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->video_step); + } if (this->decoder_ok && this->size) { |