changeset 5289:f44baba9edc3 libavcodec

Integrate reference mpeg IDCT into dsputil.
author iive
date Wed, 11 Jul 2007 22:05:43 +0000
parents 8c0bbf712d76
children 4717b1642993
files Makefile avcodec.h dsputil.c dsputil.h mpegidct.c
diffstat 5 files changed, 29 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Wed Jul 11 22:05:25 2007 +0000
+++ b/Makefile	Wed Jul 11 22:05:43 2007 +0000
@@ -13,6 +13,7 @@
       jrevdct.o \
       jfdctfst.o \
       jfdctint.o\
+      mpegidct.o \
       resample.o \
       resample2.o \
       dsputil.o \
--- a/avcodec.h	Wed Jul 11 22:05:25 2007 +0000
+++ b/avcodec.h	Wed Jul 11 22:05:43 2007 +0000
@@ -1278,6 +1278,7 @@
 #define FF_IDCT_CAVS         15
 #define FF_IDCT_SIMPLEARMV5TE 16
 #define FF_IDCT_SIMPLEARMV6  17
+#define FF_IDCT_MPEG         18
 
     /**
      * slice count
--- a/dsputil.c	Wed Jul 11 22:05:25 2007 +0000
+++ b/dsputil.c	Wed Jul 11 22:05:43 2007 +0000
@@ -3753,6 +3753,17 @@
 
 /* XXX: those functions should be suppressed ASAP when all IDCTs are
  converted */
+static void ff_mpeg_idct_put_c(uint8_t *dest, int line_size, DCTELEM *block)
+{
+    ff_mpeg_idct_c(block);
+    put_pixels_clamped_c(block, dest, line_size);
+}
+static void ff_mpeg_idct_add_c(uint8_t *dest, int line_size, DCTELEM *block)
+{
+    ff_mpeg_idct_c(block);
+    add_pixels_clamped_c(block, dest, line_size);
+}
+
 static void ff_jref_idct_put(uint8_t *dest, int line_size, DCTELEM *block)
 {
     j_rev_dct (block);
@@ -3891,6 +3902,11 @@
             c->idct_add= ff_vp3_idct_add_c;
             c->idct    = ff_vp3_idct_c;
             c->idct_permutation_type= FF_NO_IDCT_PERM;
+        }else if(avctx->idct_algo==FF_IDCT_MPEG){
+            c->idct_put= ff_mpeg_idct_put_c;
+            c->idct_add= ff_mpeg_idct_add_c;
+            c->idct    = ff_mpeg_idct_c;
+            c->idct_permutation_type= FF_NO_IDCT_PERM;
         }else{ //accurate/default
             c->idct_put= simple_idct_put;
             c->idct_add= simple_idct_add;
--- a/dsputil.h	Wed Jul 11 22:05:25 2007 +0000
+++ b/dsputil.h	Wed Jul 11 22:05:43 2007 +0000
@@ -47,6 +47,7 @@
 void j_rev_dct4 (DCTELEM *data);
 void j_rev_dct2 (DCTELEM *data);
 void j_rev_dct1 (DCTELEM *data);
+void ff_mpeg_idct_c(DCTELEM *data);
 
 void ff_fdct_mmx(DCTELEM *block);
 void ff_fdct_mmx2(DCTELEM *block);
--- a/mpegidct.c	Wed Jul 11 22:05:25 2007 +0000
+++ b/mpegidct.c	Wed Jul 11 22:05:43 2007 +0000
@@ -41,7 +41,6 @@
 /* this code assumes >> to be a two's-complement arithmetic */
 /* right shift: (-2)>>1 == -1 , (-3)>>1 == -2               */
 
-#include "config.h"
 
 #define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
 #define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
@@ -50,18 +49,6 @@
 #define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
 #define W7 565  /* 2048*sqrt(2)*cos(7*pi/16) */
 
-/* global declarations */
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-void Fast_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-static short iclip[1024]; /* clipping table */
-static short *iclp;
-
-/* private prototypes */
-static void idctrow _ANSI_ARGS_((short *blk));
-static void idctcol _ANSI_ARGS_((short *blk));
-
 /* row (horizontal) IDCT
  *
  *           7                       pi         1
@@ -144,7 +131,7 @@
         (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
   {
     blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
-      iclp[(blk[8*0]+32)>>6];
+      (blk[8*0]+32)>>6;
     return;
   }
 
@@ -178,18 +165,18 @@
   x4 = (181*(x4-x5)+128)>>8;
 
   /* fourth stage */
-  blk[8*0] = iclp[(x7+x1)>>14];
-  blk[8*1] = iclp[(x3+x2)>>14];
-  blk[8*2] = iclp[(x0+x4)>>14];
-  blk[8*3] = iclp[(x8+x6)>>14];
-  blk[8*4] = iclp[(x8-x6)>>14];
-  blk[8*5] = iclp[(x0-x4)>>14];
-  blk[8*6] = iclp[(x3-x2)>>14];
-  blk[8*7] = iclp[(x7-x1)>>14];
+  blk[8*0] = (x7+x1)>>14;
+  blk[8*1] = (x3+x2)>>14;
+  blk[8*2] = (x0+x4)>>14;
+  blk[8*3] = (x8+x6)>>14;
+  blk[8*4] = (x8-x6)>>14;
+  blk[8*5] = (x0-x4)>>14;
+  blk[8*6] = (x3-x2)>>14;
+  blk[8*7] = (x7-x1)>>14;
 }
 
 /* two dimensional inverse discrete cosine transform */
-void Fast_IDCT(block)
+void ff_mpeg_idct_c(block)
 short *block;
 {
   int i;
@@ -200,12 +187,3 @@
   for (i=0; i<8; i++)
     idctcol(block+i);
 }
-
-void Initialize_Fast_IDCT()
-{
-  int i;
-
-  iclp = iclip+512;
-  for (i= -512; i<512; i++)
-    iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
-}