diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-02-03 22:41:19 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-02-04 16:31:49 +0100 |
commit | b11994593ae4c3856db735800f24d38293838759 (patch) | |
tree | 1d48799ff2fa0d3851c1ef3f8f064bfe5649cea7 /libavcodec | |
parent | 05e161952954acf247e0fd1fdef00559675c4d4d (diff) | |
download | ffmpeg-b11994593ae4c3856db735800f24d38293838759.tar.gz |
dxva2_hevc: properly fill the scaling list structure
The scaling list can be specified in either the SPS or PPS.
Additionally, compensate for the diagonal scan permutation applied in the decoder.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/dxva2_hevc.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c index a9df5f486c..4fba3ad648 100644 --- a/libavcodec/dxva2_hevc.c +++ b/libavcodec/dxva2_hevc.c @@ -192,23 +192,29 @@ 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; + const ScalingList *sl = h->pps->scaling_list_data_present_flag ? + &h->pps->scaling_list : &h->sps->scaling_list; + 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] = sl->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] = sl->sl[1][i][pos]; + qm->ucScalingLists2[i][j] = sl->sl[2][i][pos]; if (i < 2) - qm->ucScalingLists3[i][j] = h->pps->scaling_list.sl[3][i][j]; + qm->ucScalingLists3[i][j] = sl->sl[3][i][pos]; } - qm->ucScalingListDCCoefSizeID2[i] = h->pps->scaling_list.sl_dc[0][i]; + qm->ucScalingListDCCoefSizeID2[i] = sl->sl_dc[0][i]; if (i < 2) - qm->ucScalingListDCCoefSizeID3[i] = h->pps->scaling_list.sl_dc[1][i]; + qm->ucScalingListDCCoefSizeID3[i] = sl->sl_dc[1][i]; } } |