Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: James Almer via ffmpeg-devel <ffmpeg-devel@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Cc: James Almer <code@ffmpeg.org>
Subject: [FFmpeg-devel] [PATCH] avcodec/apv_parser: add support for AU assembly (PR #21216)
Date: Tue, 16 Dec 2025 18:31:24 -0000
Message-ID: <176590988497.60.52283857978838630@2cb04c0e5124> (raw)

PR #21216 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21216
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21216.patch


>From ba76ab558c55f447364521bdae422fa5e6424d3a Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Tue, 16 Dec 2025 15:27:27 -0300
Subject: [PATCH] avcodec/apv_parser: add support for AU assembly

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/apv_parser.c | 69 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 66 insertions(+), 3 deletions(-)

diff --git a/libavcodec/apv_parser.c b/libavcodec/apv_parser.c
index dbecbb5a5e..3417bd751f 100644
--- a/libavcodec/apv_parser.c
+++ b/libavcodec/apv_parser.c
@@ -18,14 +18,18 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/buffer.h"
+#include "libavutil/mem.h"
 
 #include "avcodec.h"
 #include "apv.h"
 #include "cbs.h"
 #include "cbs_apv.h"
+#include "parser.h"
 #include "parser_internal.h"
 
 typedef struct APVParseContext {
+    ParseContext pc;
+
     CodedBitstreamContext *cbc;
     CodedBitstreamFragment au;
 } APVParseContext;
@@ -38,6 +42,48 @@ static const enum AVPixelFormat apv_format_table[5][5] = {
     { AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_YUVA444P16 },
 };
 
+static int find_frame_end(APVParseContext *p, const uint8_t *buf, int buf_size)
+{
+    ParseContext *pc = &p->pc;
+    int pic_found, i = 0;
+    uint32_t state;
+
+    pic_found = pc->frame_start_found;
+    state = pc->state;
+
+    if (buf_size == 0) {
+        pc->frame_start_found = 0;
+        pc->state = -1;
+        return 0;
+    }
+
+    if (!pic_found) {
+        for (; i < buf_size; i++) {
+            state = (state << 8) | buf[i];
+            if (state == APV_SIGNATURE) {
+                i++;
+                pic_found = 1;
+                break;
+            }
+        }
+    }
+
+    if (pic_found) {
+        for(; i < buf_size; i++) {
+            state = (state << 8) | buf[i];
+            if (state == APV_SIGNATURE) {
+                pc->frame_start_found = 0;
+                pc->state = -1;
+                return i - 3;
+            }
+        }
+    }
+
+    pc->frame_start_found = pic_found;
+    pc->state = state;
+    return END_NOT_FOUND;
+}
+
 static void dummy_free(void *opaque, uint8_t *data)
 {
     av_assert0(opaque == data);
@@ -51,15 +97,30 @@ static int parse(AVCodecParserContext *s,
     APVParseContext *p = s->priv_data;
     CodedBitstreamFragment *au = &p->au;
     AVBufferRef *ref = NULL;
-    int ret;
+    int next, ret;
+
+    if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) {
+        next = buf_size;
+    } else {
+        next = find_frame_end(p, buf, buf_size);
+
+        if (ff_combine_frame(&p->pc, next, &buf, &buf_size) < 0) {
+            *poutbuf      = NULL;
+            *poutbuf_size = 0;
+            return buf_size;
+        }
+    }
 
     *poutbuf      = buf;
     *poutbuf_size = buf_size;
 
+    if (!buf_size)
+        return 0;
+
     ref = av_buffer_create((uint8_t *)buf, buf_size, dummy_free,
                            (void *)buf, AV_BUFFER_FLAG_READONLY);
     if (!ref)
-        return buf_size;
+        return next;
 
     p->cbc->log_ctx = avctx;
 
@@ -111,7 +172,7 @@ end:
     av_buffer_unref(&ref);
     p->cbc->log_ctx = NULL;
 
-    return buf_size;
+    return next;
 }
 
 static const CodedBitstreamUnitType decompose_unit_types[] = {
@@ -136,7 +197,9 @@ static av_cold int init(AVCodecParserContext *s)
 static av_cold void close(AVCodecParserContext *s)
 {
     APVParseContext *p = s->priv_data;
+    ParseContext *pc = &p->pc;
 
+    av_freep(&pc->buffer);
     ff_cbs_fragment_free(&p->au);
     ff_cbs_close(&p->cbc);
 }
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

                 reply	other threads:[~2025-12-16 18:31 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=176590988497.60.52283857978838630@2cb04c0e5124 \
    --to=ffmpeg-devel@ffmpeg.org \
    --cc=code@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git