]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtpdec_ac3.c
Merge commit '12b3459979f5ea6481660cd2c99a0381e2b5ba37'
[ffmpeg] / libavformat / rtpdec_ac3.c
index 7454a9af136f8b2085f42ccdf10524f30d4aa2dd..48b2d9cf98b4bb40b6d48454bb631c6ff4e16f61 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,40 +32,15 @@ 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 inline void free_fragment_if_needed(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_if_needed(data);
-    av_free(data);
+    ffio_free_dyn_buf(&data->fragment);
 }
 
 static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
-                              AVStream *st, AVPacket *pkt, uint32_t *timestamp,
-                              const uint8_t *buf, int len, uint16_t seq,
-                              int flags)
+                             AVStream *st, AVPacket *pkt, uint32_t *timestamp,
+                             const uint8_t *buf, int len, uint16_t seq,
+                             int flags)
 {
     unsigned frame_type;
     unsigned nr_frames;
@@ -97,7 +73,7 @@ static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
 
     case 1:
     case 2: /* First fragment */
-        free_fragment_if_needed(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_if_needed(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_if_needed(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;
@@ -139,7 +115,7 @@ static int ac3_handle_packet(AVFormatContext *ctx, PayloadContext *data,
     err = ff_rtp_finalize_packet(pkt, &data->fragment, st->index);
     if (err < 0) {
         av_log(ctx, AV_LOG_ERROR,
-               "Error occurred when getting fragment buffer.");
+               "Error occurred when getting fragment buffer.\n");
         return err;
     }
 
@@ -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,
 };