Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/decode: Fix avcodec parameters when bsfs, are enable by decoder"
@ 2025-06-11 15:25 Andreas Rheinhardt
  2025-06-11 16:00 ` Zhao Zhili
  2025-06-11 16:51 ` [FFmpeg-devel] [PATCH 3/3] fate/video: Add media100 test Andreas Rheinhardt
  0 siblings, 2 replies; 7+ messages in thread
From: Andreas Rheinhardt @ 2025-06-11 15:25 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

[-- Attachment #1: Type: text/plain, Size: 29 bytes --]

Patches attached.

- Andreas

[-- Attachment #2: 0001-Revert-avcodec-decode-Fix-avcodec-parameters-when-bs.patch --]
[-- Type: text/x-patch, Size: 1860 bytes --]

From 16581fd7fa6b45e69bb8c2d305739cb60bb798e6 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Wed, 11 Jun 2025 14:52:47 +0200
Subject: [PATCH 1/2] Revert "avcodec/decode: Fix avcodec parameters when bsfs
 are enable by decoder"

This reverts commit 1c170613975d3cbcbb5aaa469b4a3cf0df5d4c2b.

The commit intended to provide certain codecs using *_mp4toannexb
bitstream filters with updated (annex B) extradata (even when
the user-supplied one was ISOBMFF), yet BSFs are allowed to change
way more. The media100_to_mjpegb BSF used by the media100 decoder
changes the codec id; the commit being reverted therefore changed
AVCodecContext.codec_id which is an API violation and broke
media100 decoding with the FFmpeg cli tool.

This commit also made changes from the internal BSF externally
visible. extradata is documented to be "owned by the codec and
freed in avcodec_free_context()" which does not include replacing
it with something else in avcodec_open2() and may surprise users
who think that AVCodecContext.extradata is immutable before
avcodec_free_context(). It also incurred a memdup which is completely
unnecessary for most decoders.

Therefore this commit is reverted. The problem it tried to solve
will be solved differently in the next commit.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/decode.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index ef09568381..2319e76e4b 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -202,9 +202,6 @@ static int decode_bsfs_init(AVCodecContext *avctx)
         goto fail;
 
     ret = av_bsf_init(avci->bsf);
-    if (ret < 0)
-        goto fail;
-    ret = avcodec_parameters_to_context(avctx, avci->bsf->par_out);
     if (ret < 0)
         goto fail;
 
-- 
2.45.2


[-- Attachment #3: 0002-avcodec-amfdec-rkmppdec-Use-correct-extradata-with-B.patch --]
[-- Type: text/x-patch, Size: 5438 bytes --]

From 9feb53a9abaad4111a4e8e3c69434af064ef1f65 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Wed, 11 Jun 2025 15:53:18 +0200
Subject: [PATCH 2/2] avcodec/amfdec,rkmppdec: Use correct extradata with BSFs

Otherwise the extradata used would be ISOBMFF if the input is
even though we use the *_mp4toannexb BSFs to convert it to
annex B to feed it to the actual decoder.

(The mediacodec decoders also use said BSFs, yet they process
the extradata in a way that works even when using the ISOBMFF
extradata; in fact, using the converted extradata would break
their check for whether to warn for missing extradata for
the ISOBMFF without-in-band-header profiles.

Furthermore, there are several users of the *_mp4toannexb BSFs
that don't ever touch extradata. They have not been touched.)

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/amfdec.c     |  8 ++++++--
 libavcodec/decode_bsf.h | 42 +++++++++++++++++++++++++++++++++++++++++
 libavcodec/rkmppdec.c   |  9 ++++++---
 3 files changed, 54 insertions(+), 5 deletions(-)
 create mode 100644 libavcodec/decode_bsf.h

diff --git a/libavcodec/amfdec.c b/libavcodec/amfdec.c
index 44ccd63aaf..1840a1b3c0 100644
--- a/libavcodec/amfdec.c
+++ b/libavcodec/amfdec.c
@@ -25,6 +25,7 @@
 #include "libavutil/mem.h"
 #include "libavutil/time.h"
 #include "decode.h"
+#include "decode_bsf.h"
 #include "libavutil/mastering_display_metadata.h"
 
 #if CONFIG_D3D11VA
@@ -187,9 +188,12 @@ static int amf_init_decoder(AVCodecContext *avctx)
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->decoder, AMF_VIDEO_DECODER_SURFACE_COPY, ctx->copy_output);
 
     if (avctx->extradata_size) {
-        res = amf_device_ctx->context->pVtbl->AllocBuffer(amf_device_ctx->context, AMF_MEMORY_HOST, avctx->extradata_size, &buffer);
+        const uint8_t *extradata;
+        int extradata_size;
+        ff_decode_get_extradata(avctx, &extradata, &extradata_size);
+        res = amf_device_ctx->context->pVtbl->AllocBuffer(amf_device_ctx->context, AMF_MEMORY_HOST, extradata_size, &buffer);
         if (res == AMF_OK) {
-            memcpy(buffer->pVtbl->GetNative(buffer), avctx->extradata, avctx->extradata_size);
+            memcpy(buffer->pVtbl->GetNative(buffer), extradata, extradata_size);
             AMF_ASSIGN_PROPERTY_INTERFACE(res,ctx->decoder, AMF_VIDEO_DECODER_EXTRADATA, buffer);
             buffer->pVtbl->Release(buffer);
             buffer = NULL;
diff --git a/libavcodec/decode_bsf.h b/libavcodec/decode_bsf.h
new file mode 100644
index 0000000000..9ea9ab70c1
--- /dev/null
+++ b/libavcodec/decode_bsf.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_DECODE_BSF_H
+#define AVCODEC_DECODE_BSF_H
+
+#include <stdint.h>
+
+#include "avcodec.h"
+#include "bsf.h"
+#include "internal.h"
+
+/**
+ * Helper function for decoders that may use a BSF that changes extradata.
+ * This function will get the extradata from the BSF.
+ */
+static inline void ff_decode_get_extradata(const AVCodecContext *avctx,
+                                           const uint8_t **extradata,
+                                           int *extradata_size)
+{
+    // Given that we unconditionally insert a null BSF when no BSF is
+    // explicitly requested, we can just use the BSF's par_out here.
+    *extradata      = avctx->internal->bsf->par_out->extradata;
+    *extradata_size = avctx->internal->bsf->par_out->extradata_size;
+}
+
+#endif /* AVCODEC_DECODE_BSF_H */
diff --git a/libavcodec/rkmppdec.c b/libavcodec/rkmppdec.c
index 54e697664e..dad0e4c25f 100644
--- a/libavcodec/rkmppdec.c
+++ b/libavcodec/rkmppdec.c
@@ -29,6 +29,7 @@
 #include "avcodec.h"
 #include "codec_internal.h"
 #include "decode.h"
+#include "decode_bsf.h"
 #include "hwconfig.h"
 #include "libavutil/refstruct.h"
 #include "libavutil/buffer.h"
@@ -279,9 +280,11 @@ static int rkmpp_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
     // on first packet, send extradata
     if (decoder->first_packet) {
         if (avctx->extradata_size) {
-            ret = rkmpp_write_data(avctx, avctx->extradata,
-                                            avctx->extradata_size,
-                                            avpkt->pts);
+            const uint8_t *extradata;
+            int extradata_size;
+            ff_decode_get_extradata(avctx, &extradata, &extradata_size);
+            ret = rkmpp_write_data(avctx, (uint8_t*)extradata, extradata_size,
+                                   avpkt->pts);
             if (ret) {
                 av_log(avctx, AV_LOG_ERROR, "Failed to write extradata to decoder (code = %d)\n", ret);
                 return ret;
-- 
2.45.2


[-- Attachment #4: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-06-15 15:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-06-11 15:25 [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/decode: Fix avcodec parameters when bsfs, are enable by decoder" Andreas Rheinhardt
2025-06-11 16:00 ` Zhao Zhili
2025-06-11 16:40   ` Andreas Rheinhardt
2025-06-15 15:17   ` Andreas Rheinhardt
2025-06-15 15:22     ` Zhao Zhili
2025-06-11 16:51 ` [FFmpeg-devel] [PATCH 3/3] fate/video: Add media100 test Andreas Rheinhardt
2025-06-12  0:28   ` compn

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