#include "libavutil/attributes.h"
#include "libavutil/intreadwrite.h"
+#include "avio_internal.h"
#include "rtpdec_formats.h"
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,
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);
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);
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;
}
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;
}
.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,
};