[FFmpeg-devel] [PATCH] libavformat/rtpdec_mpeg4: AAC may not contain AU headers.

koushd at gmail.com koushd at gmail.com
Wed Apr 2 06:29:39 EEST 2025


From: Koushik Dutta <koushd at gmail.com>

The codec information may be in the SDP and not in the stream.

Signed-off-by: Koushik Dutta <koushd at gmail.com>
---
 libavformat/rtpdec_mpeg4.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c
index 6531632b2d..c3c3c67c3e 100644
--- a/libavformat/rtpdec_mpeg4.c
+++ b/libavformat/rtpdec_mpeg4.c
@@ -180,6 +180,7 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data,
                             int flags)
 {
     int ret;
+    AVCodecParameters *par = st->codecpar;
 
 
     if (!buf) {
@@ -208,6 +209,26 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data,
         return 1;
     }
 
+    /* Check for and skip ADTS header if we have an explicit decoder config */
+    if (par->extradata && len > 7) {
+    	if (buf[0] == 0xff && (buf[1] & 0xf0) == 0xf0) {
+    	    size_t header_size = 7 + ((buf[1] & 0x01) ? 0 : 2);
+    	    if (len > header_size) {
+                buf += header_size;
+                len -= header_size;
+    	    }
+
+    	    if ((ret = av_new_packet(pkt, len)) < 0) {
+                av_log(ctx, AV_LOG_ERROR, "Out of memory\n");
+                return ret;
+    	    }
+
+            memcpy(pkt->data, buf, len);
+    	    pkt->stream_index = st->index;
+    	    return 0;
+    	}
+    }
+
     if (rtp_parse_mp4_au(data, buf, len)) {
         av_log(ctx, AV_LOG_ERROR, "Error parsing AU headers\n");
         return -1;
-- 
2.39.5 (Apple Git-154)



More information about the ffmpeg-devel mailing list