* [FFmpeg-devel] [PATCH] avcodec/apv_parser: add support for AU assembly (PR #21216)
@ 2025-12-16 18:31 James Almer via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: James Almer via ffmpeg-devel @ 2025-12-16 18:31 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: James Almer
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-16 18:31 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-16 18:31 [FFmpeg-devel] [PATCH] avcodec/apv_parser: add support for AU assembly (PR #21216) James Almer via ffmpeg-devel
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