*/
#include "avformat.h"
+#include "avio_internal.h"
#include "rtpdec_formats.h"
#define RTP_AC3_PAYLOAD_HEADER_SIZE 2
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;
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;
}
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;
}
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;
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;
}
.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,
};