Mercurial > libavcodec.hg
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); -}