From: Mickaël Raulet <mrau...@insa-rennes.fr>

Integrated to Libav by Josh de Kock <j...@itanimul.li>.

Signed-off-by: Alexandra Hájková <alexan...@khirnov.net>
---
 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 36afbd7..9138080 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -1211,8 +1211,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.idct_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 e797533..8b1b675 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 737083c..87d317c 100644
--- a/libavcodec/hevcdsp.h
+++ b/libavcodec/hevcdsp.h
@@ -47,6 +47,7 @@ typedef struct HEVCDSPContext {
     void (*dequant)(int16_t *coeffs);
     void (*idct_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 0ffe4da..8deadc7 100644
--- a/libavcodec/hevcdsp_template.c
+++ b/libavcodec/hevcdsp_template.c
@@ -225,10 +225,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
-- 
2.1.4

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to