This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new 78c75d546a avcodec/apv_parser: add support for AU assembly
78c75d546a is described below
commit 78c75d546ac0b328d7bec5e7ac9274f3dec607e7
Author: James Almer <[email protected]>
AuthorDate: Tue Dec 16 15:27:27 2025 -0300
Commit: James Almer <[email protected]>
CommitDate: Thu Dec 18 01:24:35 2025 +0000
avcodec/apv_parser: add support for AU assembly
Signed-off-by: James Almer <[email protected]>
---
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);
}
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]