[FFmpeg-devel] [PATCH] dxva2_hevc: properly fill the scaling list structure

Hendrik Leppkes h.leppkes at gmail.com
Tue Feb 3 22:23:14 CET 2015


The HEVC decoder has the scaling lists in the SPS structs, and not the PPS.
Additionally, it needs to compensate for the diagonal scan permutation
applied in the decoder.
---
 libavcodec/dxva2_hevc.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
index a9df5f4..7050c74 100644
--- a/libavcodec/dxva2_hevc.c
+++ b/libavcodec/dxva2_hevc.c
@@ -192,23 +192,26 @@ static void fill_picture_parameters(struct dxva_context *ctx, const HEVCContext
 
 static void fill_scaling_lists(struct dxva_context *ctx, const HEVCContext *h, DXVA_Qmatrix_HEVC *qm)
 {
-    unsigned i, j;
+    unsigned i, j, pos;
     memset(qm, 0, sizeof(*qm));
     for (i = 0; i < 6; i++) {
-        for (j = 0; j < 16; j++)
-            qm->ucScalingLists0[i][j] = h->pps->scaling_list.sl[0][i][j];
+        for (j = 0; j < 16; j++) {
+            pos = 4 * ff_hevc_diag_scan4x4_y[j] + ff_hevc_diag_scan4x4_x[j];
+            qm->ucScalingLists0[i][j] = h->sps->scaling_list.sl[0][i][pos];
+        }
 
         for (j = 0; j < 64; j++) {
-            qm->ucScalingLists1[i][j] = h->pps->scaling_list.sl[1][i][j];
-            qm->ucScalingLists2[i][j] = h->pps->scaling_list.sl[2][i][j];
+            pos = 8 * ff_hevc_diag_scan8x8_y[j] + ff_hevc_diag_scan8x8_x[j];
+            qm->ucScalingLists1[i][j] = h->sps->scaling_list.sl[1][i][pos];
+            qm->ucScalingLists2[i][j] = h->sps->scaling_list.sl[2][i][pos];
 
             if (i < 2)
-                qm->ucScalingLists3[i][j] = h->pps->scaling_list.sl[3][i][j];
+                qm->ucScalingLists3[i][j] = h->sps->scaling_list.sl[3][i][pos];
         }
 
-        qm->ucScalingListDCCoefSizeID2[i] = h->pps->scaling_list.sl_dc[0][i];
+        qm->ucScalingListDCCoefSizeID2[i] = h->sps->scaling_list.sl_dc[0][i];
         if (i < 2)
-            qm->ucScalingListDCCoefSizeID3[i] = h->pps->scaling_list.sl_dc[1][i];
+            qm->ucScalingListDCCoefSizeID3[i] = h->sps->scaling_list.sl_dc[1][i];
     }
 }
 
-- 
1.9.5.msysgit.0



More information about the ffmpeg-devel mailing list