Patches attached. - Andreas
From 16581fd7fa6b45e69bb8c2d305739cb60bb798e6 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@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.rheinha...@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
From 9feb53a9abaad4111a4e8e3c69434af064ef1f65 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@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.rheinha...@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
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".