]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtpdec_mpa_robust.c
mp3enc: write trailing padding
[ffmpeg] / libavformat / rtpdec_mpa_robust.c
index d7a01049b049965f6623bf2b48496c2e880dfbc0..a65e139cfcd76a74a0e5df3b1e1099abcfe5f605 100644 (file)
@@ -22,6 +22,7 @@
 #include "libavutil/attributes.h"
 #include "libavutil/intreadwrite.h"
 
+#include "avio_internal.h"
 #include "rtpdec_formats.h"
 
 struct PayloadContext {
@@ -33,21 +34,10 @@ struct PayloadContext {
     AVIOContext *fragment;
 };
 
-static void free_fragment(PayloadContext *data)
+static void mpa_robust_close_context(PayloadContext *data)
 {
-    if (data->fragment) {
-        uint8_t *p;
-        avio_close_dyn_buf(data->fragment, &p);
-        av_free(p);
-        data->fragment = NULL;
-    }
-}
-
-static void mpa_robust_free_context(PayloadContext *data)
-{
-    free_fragment(data);
+    ffio_free_dyn_buf(&data->fragment);
     av_free(data->split_buf);
-    av_free(data);
 }
 
 static int mpa_robust_parse_rtp_header(AVFormatContext *ctx,
@@ -108,7 +98,7 @@ static int mpa_robust_parse_packet(AVFormatContext *ctx, PayloadContext *data,
         pkt->stream_index = st->index;
         memcpy(pkt->data, buf, adu_size);
 
-        data->split_pos += adu_size;
+        data->split_pos += header_size + adu_size;
 
         if (data->split_pos == data->split_buf_size) {
             av_freep(&data->split_buf);
@@ -146,7 +136,7 @@ static int mpa_robust_parse_packet(AVFormatContext *ctx, PayloadContext *data,
             data->split_pos = 0;
             if (!data->split_buf) {
                 av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-                av_free_packet(pkt);
+                av_packet_unref(pkt);
                 return AVERROR(ENOMEM);
             }
             memcpy(data->split_buf, buf, data->split_buf_size);
@@ -155,7 +145,7 @@ static int mpa_robust_parse_packet(AVFormatContext *ctx, PayloadContext *data,
         return 0;
     } else if (!continuation) { /* && adu_size > len */
         /* First fragment */
-        free_fragment(data);
+        ffio_free_dyn_buf(&data->fragment);
 
         data->adu_size = adu_size;
         data->cur_size = len;
@@ -178,7 +168,7 @@ static int mpa_robust_parse_packet(AVFormatContext *ctx, PayloadContext *data,
     }
     if (adu_size = data->adu_size ||
         data->timestamp != *timestamp) {
-        free_fragment(data);
+        ffio_free_dyn_buf(&data->fragment);
         av_log(ctx, AV_LOG_ERROR, "Invalid packet received\n");
         return AVERROR_INVALIDDATA;
     }
@@ -205,6 +195,6 @@ RTPDynamicProtocolHandler ff_mpeg_audio_robust_dynamic_handler = {
     .codec_id          = AV_CODEC_ID_MP3ADU,
     .need_parsing      = AVSTREAM_PARSE_HEADERS,
     .priv_data_size    = sizeof(PayloadContext),
-    .free              = mpa_robust_free_context,
+    .close             = mpa_robust_close_context,
     .parse_packet      = mpa_robust_parse_packet,
 };