[FFmpeg-devel] [PATCH 3/3] lavf: add AV_PKT_DATA_RTCP_SR side data type

Marvin Scholz epirat07 at gmail.com
Tue Jun 24 21:02:02 EEST 2025


---
 libavcodec/packet.c  |  1 +
 libavcodec/packet.h  |  6 ++++++
 libavformat/rtpdec.c | 18 ++++++++++++++++++
 3 files changed, 25 insertions(+)

diff --git a/libavcodec/packet.c b/libavcodec/packet.c
index 5104eb98b1..2aace71c7d 100644
--- a/libavcodec/packet.c
+++ b/libavcodec/packet.c
@@ -308,6 +308,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type)
     case AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM: return "IAMF Recon Gain Info Parameter Data";
     case AV_PKT_DATA_FRAME_CROPPING:             return "Frame Cropping";
     case AV_PKT_DATA_LCEVC:                      return "LCEVC NAL data";
+    case AV_PKT_DATA_RTCP_SR:                    return "RTCP Sender Report";
     }
     return NULL;
 }
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
index 71bc2e0575..8ac4ef54ca 100644
--- a/libavcodec/packet.h
+++ b/libavcodec/packet.h
@@ -345,6 +345,12 @@ enum AVPacketSideDataType {
      */
     AV_PKT_DATA_LCEVC,
 
+    /**
+     * Contains the last received RTCP SR (Sender Report) information
+     * in the form of the AVRTCPSenderReport struct.
+     */
+    AV_PKT_DATA_RTCP_SR,
+
     /**
      * The number of side data types.
      * This is not part of the public API/ABI in the sense that it may
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 9c9d66f33d..9d93e9023a 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -611,12 +611,30 @@ static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) {
     return 0;
 }
 
+static int rtp_add_sr_sidedata(RTPDemuxContext *s, AVPacket *pkt) {
+    AVRTCPSenderReport *sr =
+        (AVRTCPSenderReport *) av_packet_new_side_data(
+            pkt, AV_PKT_DATA_RTCP_SR, sizeof(AVRTCPSenderReport));
+    if (!sr)
+        return AVERROR(ENOMEM);
+
+    memcpy(sr, &s->last_sr, sizeof(AVRTCPSenderReport));
+    s->pending_sr = 0;
+    return 0;
+}
+
 /**
  * This was the second switch in rtp_parse packet.
  * Normalizes time, if required, sets stream_index, etc.
  */
 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
 {
+    if (s->pending_sr) {
+        int ret = rtp_add_sr_sidedata(s, pkt);
+        if (ret < 0)
+            av_log(s->ic, AV_LOG_WARNING, "rtpdec: failed to add SR sidedata\n");
+    }
+
     if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
         return; /* Timestamp already set by depacketizer */
     if (timestamp == RTP_NOTS_VALUE)
-- 
2.39.5 (Apple Git-154)



More information about the ffmpeg-devel mailing list