[FFmpeg-devel] [PATCH 3/3] avcodec/av1_parser: use an AVBufferRef to avoid data copying
James Almer
jamrial at gmail.com
Fri May 23 06:10:21 EEST 2025
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/av1_parser.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/libavcodec/av1_parser.c b/libavcodec/av1_parser.c
index 77906d0c91..b9a96ad59a 100644
--- a/libavcodec/av1_parser.c
+++ b/libavcodec/av1_parser.c
@@ -50,6 +50,11 @@ static const enum AVPixelFormat pix_fmts_rgb[3] = {
AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
};
+static void dummy_free(void *opaque, uint8_t *data)
+{
+ av_assert0(opaque == data);
+}
+
static int av1_parser_parse(AVCodecParserContext *ctx,
AVCodecContext *avctx,
const uint8_t **out_data, int *out_size,
@@ -60,6 +65,7 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
const CodedBitstreamAV1Context *av1 = s->cbc->priv_data;
const AV1RawSequenceHeader *seq;
const AV1RawColorConfig *color;
+ AVBufferRef *ref = NULL;
int ret;
*out_data = data;
@@ -69,6 +75,11 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
ctx->pict_type = AV_PICTURE_TYPE_NONE;
ctx->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
+ ref = av_buffer_create((uint8_t *)data, size, dummy_free,
+ (void *)data, AV_BUFFER_FLAG_READONLY);
+ if (!ref)
+ return size;
+
s->cbc->log_ctx = avctx;
if (avctx->extradata_size && !s->parsed_extradata) {
@@ -171,6 +182,8 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
end:
ff_cbs_fragment_reset(td);
+ av_assert1(av_buffer_get_ref_count(ref) == 1);
+ av_buffer_unref(&ref);
s->cbc->log_ctx = NULL;
--
2.49.0
More information about the ffmpeg-devel
mailing list