3 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * @author Michael Niedermayer <michaelni@gmx.at>
29 static always_inline
void idct_internal(uint8_t *dst
, DCTELEM
*block
, int stride
, int block_stride
, int shift
, int add
){
31 uint8_t *cm
= cropTbl
+ MAX_NEG_CROP
;
33 block
[0] += 1<<(shift
-1);
36 const int z0
= block
[0 + block_stride
*i
] + block
[2 + block_stride
*i
];
37 const int z1
= block
[0 + block_stride
*i
] - block
[2 + block_stride
*i
];
38 const int z2
= (block
[1 + block_stride
*i
]>>1) - block
[3 + block_stride
*i
];
39 const int z3
= block
[1 + block_stride
*i
] + (block
[3 + block_stride
*i
]>>1);
41 block
[0 + block_stride
*i
]= z0
+ z3
;
42 block
[1 + block_stride
*i
]= z1
+ z2
;
43 block
[2 + block_stride
*i
]= z1
- z2
;
44 block
[3 + block_stride
*i
]= z0
- z3
;
48 const int z0
= block
[i
+ block_stride
*0] + block
[i
+ block_stride
*2];
49 const int z1
= block
[i
+ block_stride
*0] - block
[i
+ block_stride
*2];
50 const int z2
= (block
[i
+ block_stride
*1]>>1) - block
[i
+ block_stride
*3];
51 const int z3
= block
[i
+ block_stride
*1] + (block
[i
+ block_stride
*3]>>1);
53 dst
[i
+ 0*stride
]= cm
[ add
*dst
[i
+ 0*stride
] + ((z0
+ z3
) >> shift
) ];
54 dst
[i
+ 1*stride
]= cm
[ add
*dst
[i
+ 1*stride
] + ((z1
+ z2
) >> shift
) ];
55 dst
[i
+ 2*stride
]= cm
[ add
*dst
[i
+ 2*stride
] + ((z1
- z2
) >> shift
) ];
56 dst
[i
+ 3*stride
]= cm
[ add
*dst
[i
+ 3*stride
] + ((z0
- z3
) >> shift
) ];
60 void ff_h264_idct_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
61 idct_internal(dst
, block
, stride
, 4, 6, 1);
64 void ff_h264_lowres_idct_add_c(uint8_t *dst
, int stride
, DCTELEM
*block
){
65 idct_internal(dst
, block
, stride
, 8, 3, 1);
68 void ff_h264_lowres_idct_put_c(uint8_t *dst
, int stride
, DCTELEM
*block
){
69 idct_internal(dst
, block
, stride
, 8, 3, 0);
72 void ff_h264_idct8_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
74 DCTELEM (*src
)[8] = (DCTELEM(*)[8])block
;
75 uint8_t *cm
= cropTbl
+ MAX_NEG_CROP
;
79 for( i
= 0; i
< 8; i
++ )
81 const int a0
= src
[i
][0] + src
[i
][4];
82 const int a2
= src
[i
][0] - src
[i
][4];
83 const int a4
= (src
[i
][2]>>1) - src
[i
][6];
84 const int a6
= (src
[i
][6]>>1) + src
[i
][2];
86 const int b0
= a0
+ a6
;
87 const int b2
= a2
+ a4
;
88 const int b4
= a2
- a4
;
89 const int b6
= a0
- a6
;
91 const int a1
= -src
[i
][3] + src
[i
][5] - src
[i
][7] - (src
[i
][7]>>1);
92 const int a3
= src
[i
][1] + src
[i
][7] - src
[i
][3] - (src
[i
][3]>>1);
93 const int a5
= -src
[i
][1] + src
[i
][7] + src
[i
][5] + (src
[i
][5]>>1);
94 const int a7
= src
[i
][3] + src
[i
][5] + src
[i
][1] + (src
[i
][1]>>1);
96 const int b1
= (a7
>>2) + a1
;
97 const int b3
= a3
+ (a5
>>2);
98 const int b5
= (a3
>>2) - a5
;
99 const int b7
= a7
- (a1
>>2);
110 for( i
= 0; i
< 8; i
++ )
112 const int a0
= src
[0][i
] + src
[4][i
];
113 const int a2
= src
[0][i
] - src
[4][i
];
114 const int a4
= (src
[2][i
]>>1) - src
[6][i
];
115 const int a6
= (src
[6][i
]>>1) + src
[2][i
];
117 const int b0
= a0
+ a6
;
118 const int b2
= a2
+ a4
;
119 const int b4
= a2
- a4
;
120 const int b6
= a0
- a6
;
122 const int a1
= -src
[3][i
] + src
[5][i
] - src
[7][i
] - (src
[7][i
]>>1);
123 const int a3
= src
[1][i
] + src
[7][i
] - src
[3][i
] - (src
[3][i
]>>1);
124 const int a5
= -src
[1][i
] + src
[7][i
] + src
[5][i
] + (src
[5][i
]>>1);
125 const int a7
= src
[3][i
] + src
[5][i
] + src
[1][i
] + (src
[1][i
]>>1);
127 const int b1
= (a7
>>2) + a1
;
128 const int b3
= a3
+ (a5
>>2);
129 const int b5
= (a3
>>2) - a5
;
130 const int b7
= a7
- (a1
>>2);
132 dst
[i
+ 0*stride
] = cm
[ dst
[i
+ 0*stride
] + ((b0
+ b7
) >> 6) ];
133 dst
[i
+ 1*stride
] = cm
[ dst
[i
+ 1*stride
] + ((b2
+ b5
) >> 6) ];
134 dst
[i
+ 2*stride
] = cm
[ dst
[i
+ 2*stride
] + ((b4
+ b3
) >> 6) ];
135 dst
[i
+ 3*stride
] = cm
[ dst
[i
+ 3*stride
] + ((b6
+ b1
) >> 6) ];
136 dst
[i
+ 4*stride
] = cm
[ dst
[i
+ 4*stride
] + ((b6
- b1
) >> 6) ];
137 dst
[i
+ 5*stride
] = cm
[ dst
[i
+ 5*stride
] + ((b4
- b3
) >> 6) ];
138 dst
[i
+ 6*stride
] = cm
[ dst
[i
+ 6*stride
] + ((b2
- b5
) >> 6) ];
139 dst
[i
+ 7*stride
] = cm
[ dst
[i
+ 7*stride
] + ((b0
- b7
) >> 6) ];