X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frmdec.c;h=a36e693ab28ff4dd0efeb23b22deeb095747d5f2;hb=1004a92cd44404ad55a75509cd289a70fa03d333;hp=f26c5b4d90712e4c94dc06f446ffc9dbbe8d7e5b;hpb=34a0a9746b2f441db7c45983838a88aa87a33834;p=ffmpeg diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index f26c5b4d907..a36e693ab28 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -87,9 +87,7 @@ static int rm_read_extradata(AVFormatContext *s, AVIOContext *pb, AVCodecParamet av_log(s, AV_LOG_ERROR, "extradata size %u too large\n", size); return -1; } - if (ff_get_extradata(s, par, pb, size) < 0) - return AVERROR(ENOMEM); - return 0; + return ff_get_extradata(s, par, pb, size); } static void rm_read_metadata(AVFormatContext *s, AVIOContext *pb, int wide) @@ -724,8 +722,8 @@ static int rm_sync(AVFormatContext *s, int64_t *timestamp, int *flags, int *stre num = avio_rb16(pb); *timestamp = avio_rb32(pb); - mlti_id = (avio_r8(pb)>>1)-1<<16; - mlti_id = FFMAX(mlti_id, 0); + mlti_id = (avio_r8(pb) >> 1) - 1; + mlti_id = FFMAX(mlti_id, 0) << 16; *flags = avio_r8(pb); /* flags */ } for(i=0;inb_streams;i++) { @@ -783,8 +781,8 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb, return -1; } rm->remaining_len -= len; - if(av_new_packet(pkt, len + 9) < 0) - return AVERROR(EIO); + if ((ret = av_new_packet(pkt, len + 9)) < 0) + return ret; pkt->data[0] = 0; AV_WL32(pkt->data + 1, 1); AV_WL32(pkt->data + 5, 0); @@ -806,8 +804,8 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb, vst->slices = ((hdr & 0x3F) << 1) + 1; vst->videobufsize = len2 + 8*vst->slices + 1; av_packet_unref(&vst->pkt); //FIXME this should be output. - if(av_new_packet(&vst->pkt, vst->videobufsize) < 0) - return AVERROR(ENOMEM); + if ((ret = av_new_packet(&vst->pkt, vst->videobufsize)) < 0) + return ret; memset(vst->pkt.data, 0, vst->pkt.size); vst->videobufpos = 8*vst->slices + 1; vst->cur_slice = 0; @@ -836,10 +834,7 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb, if (type == 2 || vst->videobufpos == vst->videobufsize) { vst->pkt.data[0] = vst->cur_slice-1; - *pkt= vst->pkt; - vst->pkt.data= NULL; - vst->pkt.size= 0; - vst->pkt.buf = NULL; + av_packet_move_ref(pkt, &vst->pkt); if(vst->slices != vst->cur_slice) //FIXME find out how to set slices correct from the begin memmove(pkt->data + 1 + 8*vst->cur_slice, pkt->data + 1 + 8*vst->slices, vst->videobufpos - 1 - 8*vst->slices); @@ -1067,7 +1062,7 @@ static int rm_read_close(AVFormatContext *s) return 0; } -static int rm_probe(AVProbeData *p) +static int rm_probe(const AVProbeData *p) { /* check file header */ if ((p->buf[0] == '.' && p->buf[1] == 'R' && @@ -1158,7 +1153,7 @@ AVInputFormat ff_rdt_demuxer = { .flags = AVFMT_NOFILE, }; -static int ivr_probe(AVProbeData *p) +static int ivr_probe(const AVProbeData *p) { if (memcmp(p->buf, ".R1M\x0\x1\x1", 7) && memcmp(p->buf, ".REC", 4)) @@ -1174,7 +1169,7 @@ static int ivr_read_header(AVFormatContext *s) uint8_t key[256], val[256]; AVIOContext *pb = s->pb; AVStream *st; - int64_t pos, offset, temp; + int64_t pos, offset=0, temp; pos = avio_tell(pb); tag = avio_rl32(pb); @@ -1191,6 +1186,8 @@ static int ivr_read_header(AVFormatContext *s) offset = temp; temp = avio_rb64(pb); } + if (offset <= 0) + return AVERROR_INVALIDDATA; avio_skip(pb, offset - avio_tell(pb)); if (avio_r8(pb) != 1) return AVERROR_INVALIDDATA;