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 4ef55a1bcf avcodec/qsvdec: fix av1_qsv decoder exporting duplicate HDR
side data
4ef55a1bcf is described below
commit 4ef55a1bcf8a44d6d529209e80e8293462b67a48
Author: nyanmisaka <[email protected]>
AuthorDate: Wed Sep 9 21:07:01 2026 +0800
Commit: michaelni <[email protected]>
CommitDate: Sun Sep 20 13:48:19 2026 +0000
avcodec/qsvdec: fix av1_qsv decoder exporting duplicate HDR side data
Switch to using `ff_decode_{mastering_display,content_light}_new()`,
based on 6169bd0feaec518a6aacbb3497711052a707e3c2.
Otherwise, it will fail in `av_frame_side_data_clone()` during
subsequent video filter negotiation.
```
ffmpeg -hwaccel qsv -hwaccel_output_format qsv \
-c:v av1_qsv -i SAMPLE.mkv -an -sn -dn -f null -
...
[vf#0:0 @ 0000024bf775e740] Task finished with error code: -17 (File exists)
[vf#0:0 @ 0000024bf775e740] Terminating thread with return code -17 (File
exists)
```
Fixes 473e84ad62a05e83bba5e00b4073980ee171a5bd
Signed-off-by: nyanmisaka <[email protected]>
---
libavcodec/qsvdec.c | 82 ++++++++++++++++++-----------------------------------
1 file changed, 27 insertions(+), 55 deletions(-)
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 5aacde9785..990e46ea1d 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -700,17 +700,35 @@ static int qsv_export_hdr_side_data(AVCodecContext
*avctx, mfxExtMasteringDispla
// The SDK reuses this flag for HDR SEI parsing
if (mdcv->InsertPayloadToggle) {
AVMasteringDisplayMetadata *mastering;
- const int mapping[3] = {2, 0, 1};
- const int chroma_den = 50000;
- const int luma_den = 10000;
- int i;
+ int mapping[3] = { 0, 1, 2 };
+ int chroma_den;
+ int max_luma_den;
+ int min_luma_den;
+
+ switch (avctx->codec_id) {
+ case AV_CODEC_ID_HEVC:
+ mapping[0] = 2;
+ mapping[1] = 0;
+ mapping[2] = 1;
+ chroma_den = 50000;
+ max_luma_den = 10000;
+ min_luma_den = 10000;
+ break;
+ case AV_CODEC_ID_AV1:
+ chroma_den = 1 << 16;
+ max_luma_den = 1 << 8;
+ min_luma_den = 1 << 14;
+ break;
+ default:
+ return AVERROR(ENOSYS);
+ }
ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
if (ret < 0)
return ret;
if (mastering) {
- for (i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++) {
const int j = mapping[i];
mastering->display_primaries[i][0] =
av_make_q(mdcv->DisplayPrimariesX[j], chroma_den);
mastering->display_primaries[i][1] =
av_make_q(mdcv->DisplayPrimariesY[j], chroma_den);
@@ -719,8 +737,8 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx,
mfxExtMasteringDispla
mastering->white_point[0] = av_make_q(mdcv->WhitePointX,
chroma_den);
mastering->white_point[1] = av_make_q(mdcv->WhitePointY,
chroma_den);
- mastering->max_luminance =
av_make_q(mdcv->MaxDisplayMasteringLuminance, luma_den);
- mastering->min_luminance =
av_make_q(mdcv->MinDisplayMasteringLuminance, luma_den);
+ mastering->max_luminance =
av_make_q(mdcv->MaxDisplayMasteringLuminance, max_luma_den);
+ mastering->min_luminance =
av_make_q(mdcv->MinDisplayMasteringLuminance, min_luma_den);
mastering->has_luminance = 1;
mastering->has_primaries = 1;
@@ -743,46 +761,6 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx,
mfxExtMasteringDispla
return 0;
}
-
-static int qsv_export_hdr_side_data_av1(AVCodecContext *avctx,
mfxExtMasteringDisplayColourVolume *mdcv,
- mfxExtContentLightLevelInfo *clli,
AVFrame *frame)
-{
- if (mdcv->InsertPayloadToggle) {
- AVMasteringDisplayMetadata *mastering =
av_mastering_display_metadata_create_side_data(frame);
- const int chroma_den = 1 << 16;
- const int max_luma_den = 1 << 8;
- const int min_luma_den = 1 << 14;
-
- if (!mastering)
- return AVERROR(ENOMEM);
-
- for (int i = 0; i < 3; i++) {
- mastering->display_primaries[i][0] =
av_make_q(mdcv->DisplayPrimariesX[i], chroma_den);
- mastering->display_primaries[i][1] =
av_make_q(mdcv->DisplayPrimariesY[i], chroma_den);
- }
-
- mastering->white_point[0] = av_make_q(mdcv->WhitePointX, chroma_den);
- mastering->white_point[1] = av_make_q(mdcv->WhitePointY, chroma_den);
-
- mastering->max_luminance =
av_make_q(mdcv->MaxDisplayMasteringLuminance, max_luma_den);
- mastering->min_luminance =
av_make_q(mdcv->MinDisplayMasteringLuminance, min_luma_den);
-
- mastering->has_luminance = 1;
- mastering->has_primaries = 1;
- }
-
- if (clli->InsertPayloadToggle) {
- AVContentLightMetadata *light =
av_content_light_metadata_create_side_data(frame);
- if (!light)
- return AVERROR(ENOMEM);
-
- light->MaxCLL = clli->MaxContentLightLevel;
- light->MaxFALL = clli->MaxPicAverageLightLevel;
- }
-
- return 0;
-}
-
#endif
static int qsv_decode(AVCodecContext *avctx, QSVContext *q,
@@ -909,15 +887,9 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext *q,
#endif
#if QSV_VERSION_ATLEAST(1, 35)
- if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 35) && avctx->codec_id ==
AV_CODEC_ID_HEVC) {
+ if ((QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 35) && avctx->codec_id ==
AV_CODEC_ID_HEVC) ||
+ (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 2, 9) && avctx->codec_id ==
AV_CODEC_ID_AV1)) {
ret = qsv_export_hdr_side_data(avctx, &aframe.frame->mdcv,
&aframe.frame->clli, frame);
-
- if (ret < 0)
- return ret;
- }
-
- if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 2, 9) && avctx->codec_id ==
AV_CODEC_ID_AV1) {
- ret = qsv_export_hdr_side_data_av1(avctx, &aframe.frame->mdcv,
&aframe.frame->clli, frame);
if (ret < 0)
return ret;
}
--
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]