From a92fd8a06256e71a0be87b03751ec3c2a4a8aa21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Raulet?= Date: Mon, 4 Jul 2016 15:37:52 +0200 Subject: [PATCH] hevc: Add DC IDCT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Integrated to Libav by Josh de Kock . Signed-off-by: Alexandra Hájková --- libavcodec/hevc.c | 9 +++++++-- libavcodec/hevcdsp.c | 4 ++++ libavcodec/hevcdsp.h | 1 + libavcodec/hevcdsp_template.c | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index d5d3f59859..d8c707b3c6 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -1214,8 +1214,13 @@ static void hls_residual_coding(HEVCContext *s, int x0, int y0, else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 && log2_trafo_size == 2) s->hevcdsp.transform_4x4_luma(coeffs); - else - s->hevcdsp.idct[log2_trafo_size - 2](coeffs); + else { + int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y); + if (max_xy == 0) + s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs); + else + s->hevcdsp.idct[log2_trafo_size - 2](coeffs); + } } s->hevcdsp.add_residual[log2_trafo_size - 2](dst, coeffs, stride); } diff --git a/libavcodec/hevcdsp.c b/libavcodec/hevcdsp.c index 4bd3d97299..7c191986a0 100644 --- a/libavcodec/hevcdsp.c +++ b/libavcodec/hevcdsp.c @@ -175,6 +175,10 @@ void ff_hevc_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth) hevcdsp->idct[2] = FUNC(idct_16x16, depth); \ hevcdsp->idct[3] = FUNC(idct_32x32, depth); \ \ + hevcdsp->idct_dc[0] = FUNC(idct_4x4_dc, depth); \ + hevcdsp->idct_dc[1] = FUNC(idct_8x8_dc, depth); \ + hevcdsp->idct_dc[2] = FUNC(idct_16x16_dc, depth); \ + hevcdsp->idct_dc[3] = FUNC(idct_32x32_dc, depth); \ hevcdsp->sao_band_filter[0] = FUNC(sao_band_filter_0, depth); \ hevcdsp->sao_band_filter[1] = FUNC(sao_band_filter_1, depth); \ hevcdsp->sao_band_filter[2] = FUNC(sao_band_filter_2, depth); \ diff --git a/libavcodec/hevcdsp.h b/libavcodec/hevcdsp.h index decd1c9376..bbc4cb27ce 100644 --- a/libavcodec/hevcdsp.h +++ b/libavcodec/hevcdsp.h @@ -47,6 +47,7 @@ typedef struct HEVCDSPContext { void (*dequant)(int16_t *coeffs); void (*transform_4x4_luma)(int16_t *coeffs); void (*idct[4])(int16_t *coeffs); + void (*idct_dc[4])(int16_t *coeffs); void (*sao_band_filter[4])(uint8_t *dst, uint8_t *src, ptrdiff_t stride, struct SAOParams *sao, int *borders, diff --git a/libavcodec/hevcdsp_template.c b/libavcodec/hevcdsp_template.c index 2cde5a8132..81e3ea5d59 100644 --- a/libavcodec/hevcdsp_template.c +++ b/libavcodec/hevcdsp_template.c @@ -223,10 +223,29 @@ static void FUNC(idct_ ## H ## x ## H )(int16_t *coeffs) \ } \ } +#define IDCT_DC(H) \ +static void FUNC(idct_ ## H ## x ## H ## _dc)(int16_t *coeffs) \ +{ \ + int i, j; \ + int shift = 14 - BIT_DEPTH; \ + int add = 1 << (shift - 1); \ + int coeff = (((coeffs[0] + 1) >> 1) + add) >> shift; \ + \ + for (j = 0; j < H; j++) { \ + for (i = 0; i < H; i++) { \ + coeffs[i + j * H] = coeff; \ + } \ + } \ +} + IDCT( 4) IDCT( 8) IDCT(16) IDCT(32) +IDCT_DC( 4) +IDCT_DC( 8) +IDCT_DC(16) +IDCT_DC(32) #undef TR_4 #undef TR_8 #undef TR_16