X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fsierravmd.c;h=18bcb38bbf9f68c0852ee5d4590612717d2a906c;hb=e37f161e66e042d6c2c7470c4d9881df9427fc4a;hp=e1367c29ae1407b64e145f43d385eb8b9b2771f8;hpb=6ace8374bacf33e5f3407cb50e928e7533eb5e92;p=ffmpeg diff --git a/libavformat/sierravmd.c b/libavformat/sierravmd.c index e1367c29ae1..18bcb38bbf9 100644 --- a/libavformat/sierravmd.c +++ b/libavformat/sierravmd.c @@ -29,6 +29,8 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" +#include "avio_internal.h" #define VMD_HEADER_SIZE 0x0330 #define BYTES_PER_FRAME_RECORD 16 @@ -77,8 +79,7 @@ static int vmd_probe(AVProbeData *p) return AVPROBE_SCORE_MAX / 2; } -static int vmd_read_header(AVFormatContext *s, - AVFormatParameters *ap) +static int vmd_read_header(AVFormatContext *s) { VmdDemuxContext *vmd = s->priv_data; AVIOContext *pb = s->pb; @@ -107,7 +108,7 @@ static int vmd_read_header(AVFormatContext *s, vst = avformat_new_stream(s, NULL); if (!vst) return AVERROR(ENOMEM); - av_set_pts_info(vst, 33, 1, 10); + avpriv_set_pts_info(vst, 33, 1, 10); vmd->video_stream_index = vst->index; vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; vst->codec->codec_id = vmd->is_indeo3 ? CODEC_ID_INDEO3 : CODEC_ID_VMDVIDEO; @@ -148,8 +149,8 @@ static int vmd_read_header(AVFormatContext *s, num = st->codec->block_align; den = st->codec->sample_rate * st->codec->channels; av_reduce(&den, &num, den, num, (1UL<<31)-1); - av_set_pts_info(vst, 33, num, den); - av_set_pts_info(st, 33, num, den); + avpriv_set_pts_info(vst, 33, num, den); + avpriv_set_pts_info(st, 33, num, den); } toc_offset = AV_RL32(&vmd->vmd_header[812]); @@ -205,7 +206,7 @@ static int vmd_read_header(AVFormatContext *s, vmd->frame_table[total_frames].pts = current_audio_pts; total_frames++; if(!current_audio_pts) - current_audio_pts += sound_buffers; + current_audio_pts += sound_buffers - 1; else current_audio_pts++; break; @@ -245,6 +246,8 @@ static int vmd_read_packet(AVFormatContext *s, /* position the stream (will probably be there already) */ avio_seek(pb, frame->frame_offset, SEEK_SET); + if(ffio_limit(pb, frame->frame_size) != frame->frame_size) + return AVERROR(EIO); if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD)) return AVERROR(ENOMEM); pkt->pos= avio_tell(pb);