# HG changeset patch # User mstorsjo # Date 1279732655 0 # Node ID 7e7f9248ec87044b9e8d9c0b9096bffa66708dcf # Parent e8dfc68ad18293e668590b4127d5101bca40077d rtpdec_asf: Handle RTSP-MS packet splitting diff -r e8dfc68ad182 -r 7e7f9248ec87 rtpdec_asf.c --- a/rtpdec_asf.c Wed Jul 21 07:46:02 2010 +0000 +++ b/rtpdec_asf.c Wed Jul 21 17:17:35 2010 +0000 @@ -168,12 +168,18 @@ return -1; if (len > 0) { - int off, out_len; + int off, out_len = 0; if (len < 4) return -1; + av_freep(&asf->buf); + init_put_byte(pb, buf, len, 0, NULL, NULL, NULL, NULL); + + while (url_ftell(pb) + 4 < len) { + int start_off = url_ftell(pb); + mflags = get_byte(pb); if (mflags & 0x80) flags |= RTP_FLAG_KEY; @@ -186,7 +192,6 @@ url_fskip(pb, 4); off = url_ftell(pb); - av_freep(&asf->buf); if (!(mflags & 0x40)) { /** * If 0x40 is not set, the len_off field specifies an offset of this @@ -206,6 +211,7 @@ return AVERROR(EIO); put_buffer(asf->pktbuf, buf + off, len - off); + url_fskip(pb, len - off); if (!(flags & RTP_FLAG_MARKER)) return -1; out_len = url_close_dyn_buf(asf->pktbuf, &asf->buf); @@ -218,14 +224,14 @@ * less in case of packet splitting (i.e. multiple ASF packets in * one RTP packet). */ - if (len_off != len) { - av_log_missing_feature(s, - "RTSP-MS packet splitting", 1); - return -1; - } - asf->buf = av_malloc(len - off); - out_len = len - off; - memcpy(asf->buf, buf + off, len - off); + + int cur_len = start_off + len_off - off; + int prev_len = out_len; + out_len += cur_len; + asf->buf = av_realloc(asf->buf, out_len); + memcpy(asf->buf + prev_len, buf + off, cur_len); + url_fskip(pb, cur_len); + } } init_packetizer(pb, asf->buf, out_len);