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]

Reply via email to