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@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2021-01-27 15:57:19 +01:00
parent 459c6e8ab3
commit ad2cc0e2f4
1 changed files with 13 additions and 25 deletions

View File

@ -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,