[FFmpeg-cvslog] avcodec/dsputil: add 12bit simple idct

Michael Niedermayer git at videolan.org
Fri Sep 6 01:26:03 CEST 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Sep  6 00:10:45 2013 +0200| [ae57e82469c99538dd14adbe73df663709d71758] | committer: Michael Niedermayer

avcodec/dsputil: add 12bit simple idct

Will be needed for jpeg

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ae57e82469c99538dd14adbe73df663709d71758
---

 libavcodec/dsputil.c              |    5 +++++
 libavcodec/simple_idct.c          |    4 ++++
 libavcodec/simple_idct.h          |    5 +++++
 libavcodec/simple_idct_template.c |    8 +++++++-
 4 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 53fd572..17de1d4 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 d204565..73f62b4 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 3fec5e0..7c0734b 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 dabfbda..ffd7578 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))



More information about the ffmpeg-cvslog mailing list