[FFmpeg-cvslog] avformat/rtpdec: Avoid allocations of small dynamic buffers
Andreas Rheinhardt
git at videolan.org
Sun Jan 31 22:47:07 EET 2021
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at gmail.com> | Wed Jan 27 15:57:19 2021 +0100| [ad2cc0e2f41f3be59e8c7c1a0ab5c813d7073643] | committer: Andreas Rheinhardt
avformat/rtpdec: Avoid allocations of small dynamic buffers
Besides avoiding allocations this also fixes a design defect of
ff_rtp_send_punch_packets: It did not return an error in case of
these allocations failed.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ad2cc0e2f41f3be59e8c7c1a0ab5c813d7073643
---
libavformat/rtpdec.c | 38 +++++++++++++-------------------------
1 file changed, 13 insertions(+), 25 deletions(-)
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index f40c020c33..d592e34893 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -404,38 +404,26 @@ int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
{
- AVIOContext *pb;
- uint8_t *buf;
- int len;
+ uint8_t buf[RTP_MIN_PACKET_LENGTH], *ptr = buf;
/* Send a small RTP packet */
- if (avio_open_dyn_buf(&pb) < 0)
- return;
- avio_w8(pb, (RTP_VERSION << 6));
- avio_w8(pb, 0); /* Payload type */
- avio_wb16(pb, 0); /* Seq */
- avio_wb32(pb, 0); /* Timestamp */
- avio_wb32(pb, 0); /* SSRC */
+ bytestream_put_byte(&ptr, (RTP_VERSION << 6));
+ bytestream_put_byte(&ptr, 0); /* Payload type */
+ bytestream_put_be16(&ptr, 0); /* Seq */
+ bytestream_put_be32(&ptr, 0); /* Timestamp */
+ bytestream_put_be32(&ptr, 0); /* SSRC */
- len = avio_close_dyn_buf(pb, &buf);
- if ((len > 0) && buf)
- ffurl_write(rtp_handle, buf, len);
- av_free(buf);
+ ffurl_write(rtp_handle, buf, ptr - buf);
/* Send a minimal RTCP RR */
- if (avio_open_dyn_buf(&pb) < 0)
- return;
+ ptr = buf;
+ bytestream_put_byte(&ptr, (RTP_VERSION << 6));
+ bytestream_put_byte(&ptr, RTCP_RR); /* receiver report */
+ bytestream_put_be16(&ptr, 1); /* length in words - 1 */
+ bytestream_put_be32(&ptr, 0); /* our own SSRC */
- avio_w8(pb, (RTP_VERSION << 6));
- avio_w8(pb, RTCP_RR); /* receiver report */
- avio_wb16(pb, 1); /* length in words - 1 */
- avio_wb32(pb, 0); /* our own SSRC */
-
- len = avio_close_dyn_buf(pb, &buf);
- if ((len > 0) && buf)
- ffurl_write(rtp_handle, buf, len);
- av_free(buf);
+ ffurl_write(rtp_handle, buf, ptr - buf);
}
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
More information about the ffmpeg-cvslog
mailing list