ffmpeg / libavcodec / eaidct.c @ 2912e87a
History  View  Annotate  Download (3.01 KB)
1 
/*


2 
* Electronic Arts TGQ/TQI/MAD IDCT algorithm

3 
* Copyright (c) 20072008 Peter Ross <pross@xvid.org>

4 
*

5 
* This file is part of Libav.

6 
*

7 
* Libav is free software; you can redistribute it and/or

8 
* modify it under the terms of the GNU Lesser General Public

9 
* License as published by the Free Software Foundation; either

10 
* version 2.1 of the License, or (at your option) any later version.

11 
*

12 
* Libav is distributed in the hope that it will be useful,

13 
* but WITHOUT ANY WARRANTY; without even the implied warranty of

14 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

15 
* Lesser General Public License for more details.

16 
*

17 
* You should have received a copy of the GNU Lesser General Public

18 
* License along with Libav; if not, write to the Free Software

19 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA

20 
*/

21  
22 
/**

23 
* @file

24 
* Electronic Arts TGQ/TQI/MAD IDCT algorithm

25 
* @author Peter Ross <pross@xvid.org>

26 
*/

27  
28 
#include "dsputil.h" 
29  
30 
#define ASQRT 181 /* (1/sqrt(2))<<8 */ 
31 
#define A4 669 /* cos(pi/8)*sqrt(2)<<9 */ 
32 
#define A2 277 /* sin(pi/8)*sqrt(2)<<9 */ 
33 
#define A5 196 /* sin(pi/8)<<9 */ 
34  
35 
#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\

36 
const int a1 = (src)[s1] + (src)[s7]; \ 
37 
const int a7 = (src)[s1]  (src)[s7]; \ 
38 
const int a5 = (src)[s5] + (src)[s3]; \ 
39 
const int a3 = (src)[s5]  (src)[s3]; \ 
40 
const int a2 = (src)[s2] + (src)[s6]; \ 
41 
const int a6 = (ASQRT*((src)[s2]  (src)[s6]))>>8; \ 
42 
const int a0 = (src)[s0] + (src)[s4]; \ 
43 
const int a4 = (src)[s0]  (src)[s4]; \ 
44 
const int b0 = (((A4A5)*a7  A5*a3)>>9) + a1+a5; \ 
45 
const int b1 = (((A4A5)*a7  A5*a3)>>9) + ((ASQRT*(a1a5))>>8); \ 
46 
const int b2 = (((A2+A5)*a3 + A5*a7)>>9) + ((ASQRT*(a1a5))>>8); \ 
47 
const int b3 = ((A2+A5)*a3 + A5*a7)>>9; \ 
48 
(dest)[d0] = munge(a0+a2+a6+b0); \ 
49 
(dest)[d1] = munge(a4+a6 +b1); \ 
50 
(dest)[d2] = munge(a4a6 +b2); \ 
51 
(dest)[d3] = munge(a0a2a6+b3); \ 
52 
(dest)[d4] = munge(a0a2a6b3); \ 
53 
(dest)[d5] = munge(a4a6 b2); \ 
54 
(dest)[d6] = munge(a4+a6 b1); \ 
55 
(dest)[d7] = munge(a0+a2+a6b0); \ 
56 
} 
57 
/* end IDCT_TRANSFORM macro */

58  
59 
#define MUNGE_NONE(x) (x)

60 
#define IDCT_COL(dest,src) IDCT_TRANSFORM(dest,0,8,16,24,32,40,48,56,0,8,16,24,32,40,48,56,MUNGE_NONE,src) 
61  
62 
#define MUNGE_8BIT(x) av_clip_uint8((x)>>4) 
63 
#define IDCT_ROW(dest,src) IDCT_TRANSFORM(dest,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,MUNGE_8BIT,src) 
64  
65 
static inline void ea_idct_col(DCTELEM *dest, const DCTELEM *src) { 
66 
if ((src[8]src[16]src[24]src[32]src[40]src[48]src[56])==0) { 
67 
dest[0] =

68 
dest[8] =

69 
dest[16] =

70 
dest[24] =

71 
dest[32] =

72 
dest[40] =

73 
dest[48] =

74 
dest[56] = src[0]; 
75 
}else

76 
IDCT_COL(dest, src); 
77 
} 
78  
79 
void ff_ea_idct_put_c(uint8_t *dest, int linesize, DCTELEM *block) { 
80 
int i;

81 
DCTELEM temp[64];

82 
block[0] += 4; 
83 
for (i=0; i<8; i++) 
84 
ea_idct_col(&temp[i], &block[i]); 
85 
for (i=0; i<8; i++) 
86 
IDCT_ROW( (&dest[i*linesize]), (&temp[8*i]) );

87 
} 