# HG changeset patch # User mstorsjo # Date 1275633759 0 # Node ID d21ccbea32944d992516c753dfc398ed378544d9 # Parent c7ddd67739a68725929065cfe8a9214ad550734f rtspenc: Write the interleaving header in the same buffer as the packet data diff -r c7ddd67739a6 -r d21ccbea3294 rtspenc.c --- a/rtspenc.c Fri Jun 04 06:35:12 2010 +0000 +++ b/rtspenc.c Fri Jun 04 06:42:39 2010 +0000 @@ -69,13 +69,19 @@ AVFormatContext *rtpctx = rtsp_st->transport_priv; uint8_t *buf, *ptr; int size; - uint8_t interleave_header[4]; + uint8_t *interleave_header, *interleaved_packet; size = url_close_dyn_buf(rtpctx->pb, &buf); ptr = buf; while (size > 4) { uint32_t packet_len = AV_RB32(ptr); int id; + /* The interleaving header is exactly 4 bytes, which happens to be + * the same size as the packet length header from + * url_open_dyn_packet_buf. So by writing the interleaving header + * over these bytes, we get a consecutive interleaved packet + * that can be written in one call. */ + interleaved_packet = interleave_header = ptr; ptr += 4; size -= 4; if (packet_len > size || packet_len < 2) @@ -87,8 +93,7 @@ interleave_header[0] = '$'; interleave_header[1] = id; AV_WB16(interleave_header + 2, packet_len); - url_write(rt->rtsp_hd, interleave_header, 4); - url_write(rt->rtsp_hd, ptr, packet_len); + url_write(rt->rtsp_hd, interleaved_packet, 4 + packet_len); ptr += packet_len; size -= packet_len; }