summaryrefslogtreecommitdiff
path: root/libavcodec/dxva2_hevc.c
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2015-02-03 22:39:45 +0100
committerLuca Barbato <lu_zero@gentoo.org>2015-02-07 14:33:29 +0100
commit8029af586fd5a5f2a0803001f9eff386e5545fe2 (patch)
tree8dc0b812b33bf823d34938811ad3c281e3534470 /libavcodec/dxva2_hevc.c
parent9295d10ea9d138462b7f67d16bf95ae9ca76aca6 (diff)
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: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/dxva2_hevc.c')
-rw-r--r--libavcodec/dxva2_hevc.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
index 2de9ef2c5c..257bee7069 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];
}
}