summaryrefslogtreecommitdiff
path: root/libavformat/rtspenc.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-06-04 06:42:39 +0000
committerMartin Storsjö <martin@martin.st>2010-06-04 06:42:39 +0000
commit35d8ecc54eae48e73f707a1ce170b6cd43a022a6 (patch)
tree32e70b24341d1816dfe7952cb1695b0e00fe2096 /libavformat/rtspenc.c
parentdd798dcd11d5ddf0cad0e44bdcd7bc3e90b3bbe8 (diff)
rtspenc: Write the interleaving header in the same buffer as the packet data
Originally committed as revision 23465 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtspenc.c')
-rw-r--r--libavformat/rtspenc.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/libavformat/rtspenc.c b/libavformat/rtspenc.c
index c0436c35e0..0761783b25 100644
--- a/libavformat/rtspenc.c
+++ b/libavformat/rtspenc.c
@@ -69,13 +69,19 @@ static int tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st)
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 @@ static int tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st)
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;
}