aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-09-06 00:10:45 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-09-06 01:19:37 +0200
commitae57e82469c99538dd14adbe73df663709d71758 (patch)
treee95a9b84dd242e4ab7cd14350955ba06f5425870
parentd2e237338db280ffcdc6ea6f290c58a3b055ba35 (diff)
downloadffmpeg-ae57e82469c99538dd14adbe73df663709d71758.tar.gz
avcodec/dsputil: add 12bit simple idct
Will be needed for jpeg Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/dsputil.c5
-rw-r--r--libavcodec/simple_idct.c4
-rw-r--r--libavcodec/simple_idct.h5
-rw-r--r--libavcodec/simple_idct_template.c8
4 files changed, 21 insertions, 1 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 53fd5720cd..17de1d4f6a 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -2720,6 +2720,11 @@ av_cold void ff_dsputil_init(DSPContext* c, AVCodecContext *avctx)
c->idct_add = ff_simple_idct_add_10;
c->idct = ff_simple_idct_10;
c->idct_permutation_type = FF_NO_IDCT_PERM;
+ } else if (avctx->bits_per_raw_sample == 12) {
+ c->idct_put = ff_simple_idct_put_12;
+ c->idct_add = ff_simple_idct_add_12;
+ c->idct = ff_simple_idct_12;
+ c->idct_permutation_type = FF_NO_IDCT_PERM;
} else {
if(avctx->idct_algo==FF_IDCT_INT){
c->idct_put= jref_idct_put;
diff --git a/libavcodec/simple_idct.c b/libavcodec/simple_idct.c
index d204565ea4..73f62b4021 100644
--- a/libavcodec/simple_idct.c
+++ b/libavcodec/simple_idct.c
@@ -38,6 +38,10 @@
#include "simple_idct_template.c"
#undef BIT_DEPTH
+#define BIT_DEPTH 12
+#include "simple_idct_template.c"
+#undef BIT_DEPTH
+
/* 2x4x8 idct */
#define CN_SHIFT 12
diff --git a/libavcodec/simple_idct.h b/libavcodec/simple_idct.h
index 3fec5e0087..7c0734b836 100644
--- a/libavcodec/simple_idct.h
+++ b/libavcodec/simple_idct.h
@@ -37,6 +37,11 @@ void ff_simple_idct_8(int16_t *block);
void ff_simple_idct_put_10(uint8_t *dest, int line_size, int16_t *block);
void ff_simple_idct_add_10(uint8_t *dest, int line_size, int16_t *block);
void ff_simple_idct_10(int16_t *block);
+
+void ff_simple_idct_put_12(uint8_t *dest, int line_size, int16_t *block);
+void ff_simple_idct_add_12(uint8_t *dest, int line_size, int16_t *block);
+void ff_simple_idct_12(int16_t *block);
+
/**
* Special version of ff_simple_idct_10() which does dequantization
* and scales by a factor of 2 more between the two IDCTs to account
diff --git a/libavcodec/simple_idct_template.c b/libavcodec/simple_idct_template.c
index dabfbda8a0..ffd75780a8 100644
--- a/libavcodec/simple_idct_template.c
+++ b/libavcodec/simple_idct_template.c
@@ -62,7 +62,7 @@
#define MUL(a, b) MUL16(a, b)
#define MAC(a, b, c) MAC16(a, b, c)
-#elif BIT_DEPTH == 10
+#elif BIT_DEPTH == 10 || BIT_DEPTH == 12
#define W1 90901
#define W2 85627
@@ -72,9 +72,15 @@
#define W6 35468
#define W7 18081
+#if BIT_DEPTH == 10
#define ROW_SHIFT 15
#define COL_SHIFT 20
#define DC_SHIFT 1
+#else
+#define ROW_SHIFT 17
+#define COL_SHIFT 18
+#define DC_SHIFT -1
+#endif
#define MUL(a, b) ((a) * (b))
#define MAC(a, b, c) ((a) += (b) * (c))