3 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg 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.
12 * FFmpeg 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author Michael Niedermayer <michaelni@gmx.at>
30 static av_always_inline
void idct_internal(uint8_t *dst
, DCTELEM
*block
, int stride
, int block_stride
, int shift
, int add
){
32 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
34 block
[0] += 1<<(shift
-1);
37 const int z0
= block
[0 + block_stride
*i
] + block
[2 + block_stride
*i
];
38 const int z1
= block
[0 + block_stride
*i
] - block
[2 + block_stride
*i
];
39 const int z2
= (block
[1 + block_stride
*i
]>>1) - block
[3 + block_stride
*i
];
40 const int z3
= block
[1 + block_stride
*i
] + (block
[3 + block_stride
*i
]>>1);
42 block
[0 + block_stride
*i
]= z0
+ z3
;
43 block
[1 + block_stride
*i
]= z1
+ z2
;
44 block
[2 + block_stride
*i
]= z1
- z2
;
45 block
[3 + block_stride
*i
]= z0
- z3
;
49 const int z0
= block
[i
+ block_stride
*0] + block
[i
+ block_stride
*2];
50 const int z1
= block
[i
+ block_stride
*0] - block
[i
+ block_stride
*2];
51 const int z2
= (block
[i
+ block_stride
*1]>>1) - block
[i
+ block_stride
*3];
52 const int z3
= block
[i
+ block_stride
*1] + (block
[i
+ block_stride
*3]>>1);
54 dst
[i
+ 0*stride
]= cm
[ add
*dst
[i
+ 0*stride
] + ((z0
+ z3
) >> shift
) ];
55 dst
[i
+ 1*stride
]= cm
[ add
*dst
[i
+ 1*stride
] + ((z1
+ z2
) >> shift
) ];
56 dst
[i
+ 2*stride
]= cm
[ add
*dst
[i
+ 2*stride
] + ((z1
- z2
) >> shift
) ];
57 dst
[i
+ 3*stride
]= cm
[ add
*dst
[i
+ 3*stride
] + ((z0
- z3
) >> shift
) ];
61 void ff_h264_idct_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
62 idct_internal(dst
, block
, stride
, 4, 6, 1);
65 void ff_h264_lowres_idct_add_c(uint8_t *dst
, int stride
, DCTELEM
*block
){
66 idct_internal(dst
, block
, stride
, 8, 3, 1);
69 void ff_h264_lowres_idct_put_c(uint8_t *dst
, int stride
, DCTELEM
*block
){
70 idct_internal(dst
, block
, stride
, 8, 3, 0);
73 void ff_h264_idct8_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
75 DCTELEM (*src
)[8] = (DCTELEM(*)[8])block
;
76 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
80 for( i
= 0; i
< 8; i
++ )
82 const int a0
= src
[i
][0] + src
[i
][4];
83 const int a2
= src
[i
][0] - src
[i
][4];
84 const int a4
= (src
[i
][2]>>1) - src
[i
][6];
85 const int a6
= (src
[i
][6]>>1) + src
[i
][2];
87 const int b0
= a0
+ a6
;
88 const int b2
= a2
+ a4
;
89 const int b4
= a2
- a4
;
90 const int b6
= a0
- a6
;
92 const int a1
= -src
[i
][3] + src
[i
][5] - src
[i
][7] - (src
[i
][7]>>1);
93 const int a3
= src
[i
][1] + src
[i
][7] - src
[i
][3] - (src
[i
][3]>>1);
94 const int a5
= -src
[i
][1] + src
[i
][7] + src
[i
][5] + (src
[i
][5]>>1);
95 const int a7
= src
[i
][3] + src
[i
][5] + src
[i
][1] + (src
[i
][1]>>1);
97 const int b1
= (a7
>>2) + a1
;
98 const int b3
= a3
+ (a5
>>2);
99 const int b5
= (a3
>>2) - a5
;
100 const int b7
= a7
- (a1
>>2);
111 for( i
= 0; i
< 8; i
++ )
113 const int a0
= src
[0][i
] + src
[4][i
];
114 const int a2
= src
[0][i
] - src
[4][i
];
115 const int a4
= (src
[2][i
]>>1) - src
[6][i
];
116 const int a6
= (src
[6][i
]>>1) + src
[2][i
];
118 const int b0
= a0
+ a6
;
119 const int b2
= a2
+ a4
;
120 const int b4
= a2
- a4
;
121 const int b6
= a0
- a6
;
123 const int a1
= -src
[3][i
] + src
[5][i
] - src
[7][i
] - (src
[7][i
]>>1);
124 const int a3
= src
[1][i
] + src
[7][i
] - src
[3][i
] - (src
[3][i
]>>1);
125 const int a5
= -src
[1][i
] + src
[7][i
] + src
[5][i
] + (src
[5][i
]>>1);
126 const int a7
= src
[3][i
] + src
[5][i
] + src
[1][i
] + (src
[1][i
]>>1);
128 const int b1
= (a7
>>2) + a1
;
129 const int b3
= a3
+ (a5
>>2);
130 const int b5
= (a3
>>2) - a5
;
131 const int b7
= a7
- (a1
>>2);
133 dst
[i
+ 0*stride
] = cm
[ dst
[i
+ 0*stride
] + ((b0
+ b7
) >> 6) ];
134 dst
[i
+ 1*stride
] = cm
[ dst
[i
+ 1*stride
] + ((b2
+ b5
) >> 6) ];
135 dst
[i
+ 2*stride
] = cm
[ dst
[i
+ 2*stride
] + ((b4
+ b3
) >> 6) ];
136 dst
[i
+ 3*stride
] = cm
[ dst
[i
+ 3*stride
] + ((b6
+ b1
) >> 6) ];
137 dst
[i
+ 4*stride
] = cm
[ dst
[i
+ 4*stride
] + ((b6
- b1
) >> 6) ];
138 dst
[i
+ 5*stride
] = cm
[ dst
[i
+ 5*stride
] + ((b4
- b3
) >> 6) ];
139 dst
[i
+ 6*stride
] = cm
[ dst
[i
+ 6*stride
] + ((b2
- b5
) >> 6) ];
140 dst
[i
+ 7*stride
] = cm
[ dst
[i
+ 7*stride
] + ((b0
- b7
) >> 6) ];
144 // assumes all AC coefs are 0
145 void ff_h264_idct_dc_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
147 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
148 int dc
= (block
[0] + 32) >> 6;
149 for( j
= 0; j
< 4; j
++ )
151 for( i
= 0; i
< 4; i
++ )
152 dst
[i
] = cm
[ dst
[i
] + dc
];
157 void ff_h264_idct8_dc_add_c(uint8_t *dst
, DCTELEM
*block
, int stride
){
159 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
160 int dc
= (block
[0] + 32) >> 6;
161 for( j
= 0; j
< 8; j
++ )
163 for( i
= 0; i
< 8; i
++ )
164 dst
[i
] = cm
[ dst
[i
] + dc
];