aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickaël Raulet <mraulet@insa-rennes.fr>2016-07-04 15:37:52 +0200
committerLuca Barbato <lu_zero@gentoo.org>2016-07-18 15:27:13 +0200
commita92fd8a06256e71a0be87b03751ec3c2a4a8aa21 (patch)
tree107afc227b94776a8b834fa21acd169bdf2d6435
parent4f247de3b797cdc9d243d26534412f81c306e5b5 (diff)
downloadffmpeg-a92fd8a06256e71a0be87b03751ec3c2a4a8aa21.tar.gz
hevc: Add DC IDCT
Integrated to Libav by Josh de Kock <josh@itanimul.li>. Signed-off-by: Alexandra Hájková <alexandra@khirnov.net>
-rw-r--r--libavcodec/hevc.c9
-rw-r--r--libavcodec/hevcdsp.c4
-rw-r--r--libavcodec/hevcdsp.h1
-rw-r--r--libavcodec/hevcdsp_template.c19
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