]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtpdec_ac3.c
mp3dec: read the initial/trailing padding from the LAME tag
[ffmpeg] / libavformat / rtpdec_ac3.c
index a5943892c5b8af036cc6f3bdfa371577b7552503..e519b283cbdef9ed8dbda68aa2a970a2b90cafe3 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include "avformat.h"
+#include "avio_internal.h"
 #include "rtpdec_formats.h"
 
 #define RTP_AC3_PAYLOAD_HEADER_SIZE 2
@@ -31,34 +32,9 @@ struct PayloadContext {
     AVIOContext *fragment;
 };
 
-static av_cold int ac3_init(AVFormatContext *s, int st_index,
-                            PayloadContext *data)
+static void ac3_close_context(PayloadContext *data)
 {
-    if (st_index < 0)
-        return 0;
-    s->streams[st_index]->need_parsing = AVSTREAM_PARSE_FULL;
-    return 0;
-}
-
-static PayloadContext *ac3_new_context(void)
-{
-    return av_mallocz(sizeof(PayloadContext));
-}
-
-static void free_fragment(PayloadContext *data)
-{
-    if (data->fragment) {
-        uint8_t *p;
-        avio_close_dyn_buf(data->fragment, &p);
-        av_free(p);
-        data->fragment = NULL;
-    }
-}
-
-static void ac3_free_context(PayloadContext *data)
-{
-    free_fragment(data);
-    av_free(data);
+    ffio_free_dyn_buf(&data->fragment);
 }
 
 static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
@@ -97,7 +73,7 @@ static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
 
     case 1:
     case 2: /* First fragment */
-        free_fragment(data);
+        ffio_free_dyn_buf(&data->fragment);
 
         data->last_frame = 1;
         data->nr_frames = nr_frames;
@@ -117,7 +93,7 @@ static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
         }
         if (nr_frames != data->nr_frames ||
             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;
         }
@@ -130,7 +106,7 @@ static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
         return AVERROR(EAGAIN);
 
     if (data->last_frame != data->nr_frames) {
-        free_fragment(data);
+        ffio_free_dyn_buf(&data->fragment);
         av_log(ctx, AV_LOG_ERROR, "Missed %d packets\n",
                data->nr_frames - data->last_frame);
         return AVERROR_INVALIDDATA;
@@ -150,8 +126,8 @@ RTPDynamicProtocolHandler ff_ac3_dynamic_handler = {
     .enc_name           = "ac3",
     .codec_type         = AVMEDIA_TYPE_AUDIO,
     .codec_id           = AV_CODEC_ID_AC3,
-    .init               = ac3_init,
-    .alloc              = ac3_new_context,
-    .free               = ac3_free_context,
+    .need_parsing       = AVSTREAM_PARSE_FULL,
+    .priv_data_size     = sizeof(PayloadContext),
+    .close              = ac3_close_context,
     .parse_packet       = ac3_handle_packet,
 };