Integrate reference mpeg IDCT into dsputil.
Originally committed as revision 9603 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									c3d0c11bfb
								
							
						
					
					
						commit
						ddeaf723c5
					
				@ -13,6 +13,7 @@ OBJS= bitstream.o \
 | 
				
			|||||||
      jrevdct.o \
 | 
					      jrevdct.o \
 | 
				
			||||||
      jfdctfst.o \
 | 
					      jfdctfst.o \
 | 
				
			||||||
      jfdctint.o\
 | 
					      jfdctint.o\
 | 
				
			||||||
 | 
					      mpegidct.o \
 | 
				
			||||||
      resample.o \
 | 
					      resample.o \
 | 
				
			||||||
      resample2.o \
 | 
					      resample2.o \
 | 
				
			||||||
      dsputil.o \
 | 
					      dsputil.o \
 | 
				
			||||||
 | 
				
			|||||||
@ -1278,6 +1278,7 @@ typedef struct AVCodecContext {
 | 
				
			|||||||
#define FF_IDCT_CAVS         15
 | 
					#define FF_IDCT_CAVS         15
 | 
				
			||||||
#define FF_IDCT_SIMPLEARMV5TE 16
 | 
					#define FF_IDCT_SIMPLEARMV5TE 16
 | 
				
			||||||
#define FF_IDCT_SIMPLEARMV6  17
 | 
					#define FF_IDCT_SIMPLEARMV6  17
 | 
				
			||||||
 | 
					#define FF_IDCT_MPEG         18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * slice count
 | 
					     * slice count
 | 
				
			||||||
 | 
				
			|||||||
@ -3753,6 +3753,17 @@ void ff_float_to_int16_c(int16_t *dst, const float *src, int len){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* XXX: those functions should be suppressed ASAP when all IDCTs are
 | 
					/* XXX: those functions should be suppressed ASAP when all IDCTs are
 | 
				
			||||||
 converted */
 | 
					 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)
 | 
					static void ff_jref_idct_put(uint8_t *dest, int line_size, DCTELEM *block)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    j_rev_dct (block);
 | 
					    j_rev_dct (block);
 | 
				
			||||||
@ -3891,6 +3902,11 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
 | 
				
			|||||||
            c->idct_add= ff_vp3_idct_add_c;
 | 
					            c->idct_add= ff_vp3_idct_add_c;
 | 
				
			||||||
            c->idct    = ff_vp3_idct_c;
 | 
					            c->idct    = ff_vp3_idct_c;
 | 
				
			||||||
            c->idct_permutation_type= FF_NO_IDCT_PERM;
 | 
					            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
 | 
					        }else{ //accurate/default
 | 
				
			||||||
            c->idct_put= simple_idct_put;
 | 
					            c->idct_put= simple_idct_put;
 | 
				
			||||||
            c->idct_add= simple_idct_add;
 | 
					            c->idct_add= simple_idct_add;
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,7 @@ void j_rev_dct (DCTELEM *data);
 | 
				
			|||||||
void j_rev_dct4 (DCTELEM *data);
 | 
					void j_rev_dct4 (DCTELEM *data);
 | 
				
			||||||
void j_rev_dct2 (DCTELEM *data);
 | 
					void j_rev_dct2 (DCTELEM *data);
 | 
				
			||||||
void j_rev_dct1 (DCTELEM *data);
 | 
					void j_rev_dct1 (DCTELEM *data);
 | 
				
			||||||
 | 
					void ff_mpeg_idct_c(DCTELEM *data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ff_fdct_mmx(DCTELEM *block);
 | 
					void ff_fdct_mmx(DCTELEM *block);
 | 
				
			||||||
void ff_fdct_mmx2(DCTELEM *block);
 | 
					void ff_fdct_mmx2(DCTELEM *block);
 | 
				
			||||||
 | 
				
			|||||||
@ -41,7 +41,6 @@
 | 
				
			|||||||
/* this code assumes >> to be a two's-complement arithmetic */
 | 
					/* this code assumes >> to be a two's-complement arithmetic */
 | 
				
			||||||
/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2               */
 | 
					/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2               */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
 | 
					#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
 | 
				
			||||||
#define W2 2676 /* 2048*sqrt(2)*cos(2*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 W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
 | 
				
			||||||
#define W7 565  /* 2048*sqrt(2)*cos(7*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
 | 
					/* row (horizontal) IDCT
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *           7                       pi         1
 | 
					 *           7                       pi         1
 | 
				
			||||||
@ -144,7 +131,7 @@ short *blk;
 | 
				
			|||||||
        (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
 | 
					        (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]=
 | 
					    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;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -178,18 +165,18 @@ short *blk;
 | 
				
			|||||||
  x4 = (181*(x4-x5)+128)>>8;
 | 
					  x4 = (181*(x4-x5)+128)>>8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* fourth stage */
 | 
					  /* fourth stage */
 | 
				
			||||||
  blk[8*0] = iclp[(x7+x1)>>14];
 | 
					  blk[8*0] = (x7+x1)>>14;
 | 
				
			||||||
  blk[8*1] = iclp[(x3+x2)>>14];
 | 
					  blk[8*1] = (x3+x2)>>14;
 | 
				
			||||||
  blk[8*2] = iclp[(x0+x4)>>14];
 | 
					  blk[8*2] = (x0+x4)>>14;
 | 
				
			||||||
  blk[8*3] = iclp[(x8+x6)>>14];
 | 
					  blk[8*3] = (x8+x6)>>14;
 | 
				
			||||||
  blk[8*4] = iclp[(x8-x6)>>14];
 | 
					  blk[8*4] = (x8-x6)>>14;
 | 
				
			||||||
  blk[8*5] = iclp[(x0-x4)>>14];
 | 
					  blk[8*5] = (x0-x4)>>14;
 | 
				
			||||||
  blk[8*6] = iclp[(x3-x2)>>14];
 | 
					  blk[8*6] = (x3-x2)>>14;
 | 
				
			||||||
  blk[8*7] = iclp[(x7-x1)>>14];
 | 
					  blk[8*7] = (x7-x1)>>14;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* two dimensional inverse discrete cosine transform */
 | 
					/* two dimensional inverse discrete cosine transform */
 | 
				
			||||||
void Fast_IDCT(block)
 | 
					void ff_mpeg_idct_c(block)
 | 
				
			||||||
short *block;
 | 
					short *block;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int i;
 | 
					  int i;
 | 
				
			||||||
@ -200,12 +187,3 @@ short *block;
 | 
				
			|||||||
  for (i=0; i<8; i++)
 | 
					  for (i=0; i<8; i++)
 | 
				
			||||||
    idctcol(block+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);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user