X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavformat%2Frtpdec_asf.c;h=d4972bd65db62e8a4e64fb6856c12a70c8db482b;hb=46278ec90ac5ad1dab5e85991f176afe49003fee;hp=bbb7609175f82f5a15d843bc0b1ad028776a6f7d;hpb=456001486ee8fe1cd906e497b603f98159191175;p=ffmpeg diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c index bbb7609175f..d4972bd65db 100644 --- a/libavformat/rtpdec_asf.c +++ b/libavformat/rtpdec_asf.c @@ -102,6 +102,9 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p) AVDictionary *opts = NULL; int len = strlen(p) * 6 / 8; char *buf = av_mallocz(len); + + if (!buf) + return AVERROR(ENOMEM); av_base64_decode(buf, p, len); if (rtp_asf_fix_header(buf, len) < 0) @@ -111,14 +114,19 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p) if (rt->asf_ctx) { avformat_close_input(&rt->asf_ctx); } - if (!(rt->asf_ctx = avformat_alloc_context())) + rt->asf_ctx = avformat_alloc_context(); + if (!rt->asf_ctx) { + av_free(buf); return AVERROR(ENOMEM); + } rt->asf_ctx->pb = &pb; av_dict_set(&opts, "no_resync_search", "1", 0); ret = avformat_open_input(&rt->asf_ctx, "", &ff_asf_demuxer, &opts); av_dict_free(&opts); - if (ret < 0) + if (ret < 0) { + av_free(buf); return ret; + } av_dict_copy(&s->metadata, rt->asf_ctx->metadata, 0); rt->asf_pb_pos = avio_tell(&pb); av_free(buf); @@ -142,10 +150,10 @@ static int asfrtp_parse_sdp_line(AVFormatContext *s, int stream_index, for (i = 0; i < rt->asf_ctx->nb_streams; i++) { if (s->streams[stream_index]->id == rt->asf_ctx->streams[i]->id) { - *s->streams[stream_index]->codec = - *rt->asf_ctx->streams[i]->codec; - rt->asf_ctx->streams[i]->codec->extradata_size = 0; - rt->asf_ctx->streams[i]->codec->extradata = NULL; + avcodec_parameters_copy(s->streams[stream_index]->codecpar, + rt->asf_ctx->streams[i]->codecpar); + s->streams[stream_index]->need_parsing = + rt->asf_ctx->streams[i]->need_parsing; avpriv_set_pts_info(s->streams[stream_index], 32, 1, 1000); } } @@ -168,7 +176,8 @@ struct PayloadContext { static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf, AVStream *st, AVPacket *pkt, uint32_t *timestamp, - const uint8_t *buf, int len, int flags) + const uint8_t *buf, int len, uint16_t seq, + int flags) { AVIOContext *pb = &asf->pb; int res, mflags, len_off; @@ -191,8 +200,6 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf, int start_off = avio_tell(pb); mflags = avio_r8(pb); - if (mflags & 0x80) - flags |= RTP_FLAG_KEY; len_off = avio_rb24(pb); if (mflags & 0x20) /**< relative timestamp */ avio_skip(pb, 4); @@ -210,10 +217,7 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf, * multiple RTP packets. */ if (asf->pktbuf && len_off != avio_tell(asf->pktbuf)) { - uint8_t *p; - avio_close_dyn_buf(asf->pktbuf, &p); - asf->pktbuf = NULL; - av_free(p); + ffio_free_dyn_buf(&asf->pktbuf); } if (!len_off && !asf->pktbuf && (res = avio_open_dyn_buf(&asf->pktbuf)) < 0) @@ -238,14 +242,11 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf, int cur_len = start_off + len_off - off; int prev_len = out_len; - void *newmem; out_len += cur_len; if (FFMIN(cur_len, len - off) < 0) return -1; - newmem = av_realloc(asf->buf, out_len); - if (!newmem) - return -1; - asf->buf = newmem; + if ((res = av_reallocp(&asf->buf, out_len)) < 0) + return res; memcpy(asf->buf + prev_len, buf + off, FFMIN(cur_len, len - off)); avio_skip(pb, cur_len); @@ -271,37 +272,26 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf, return 1; // FIXME: return 0 if last packet } } - av_free_packet(pkt); + av_packet_unref(pkt); } return res == 1 ? -1 : res; } -static PayloadContext *asfrtp_new_context(void) +static void asfrtp_close_context(PayloadContext *asf) { - return av_mallocz(sizeof(PayloadContext)); -} - -static void asfrtp_free_context(PayloadContext *asf) -{ - if (asf->pktbuf) { - uint8_t *p = NULL; - avio_close_dyn_buf(asf->pktbuf, &p); - asf->pktbuf = NULL; - av_free(p); - } + ffio_free_dyn_buf(&asf->pktbuf); av_freep(&asf->buf); - av_free(asf); } #define RTP_ASF_HANDLER(n, s, t) \ RTPDynamicProtocolHandler ff_ms_rtp_ ## n ## _handler = { \ .enc_name = s, \ .codec_type = t, \ - .codec_id = CODEC_ID_NONE, \ + .codec_id = AV_CODEC_ID_NONE, \ + .priv_data_size = sizeof(PayloadContext), \ .parse_sdp_a_line = asfrtp_parse_sdp_line, \ - .alloc = asfrtp_new_context, \ - .free = asfrtp_free_context, \ + .close = asfrtp_close_context, \ .parse_packet = asfrtp_parse_packet, \ }