annotate libavcodec/dsputil.c @ 4:96e628866d41

naming some tasks to help debugging
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 19 Dec 2012 15:40:26 +0100
parents
children
rev   line source
nengel@2 1 /*
nengel@2 2 * DSP utils
nengel@2 3 * Copyright (c) 2000, 2001 Fabrice Bellard
nengel@2 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
nengel@2 5 *
nengel@2 6 * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at>
nengel@2 7 *
nengel@2 8 * This file is part of FFmpeg.
nengel@2 9 *
nengel@2 10 * FFmpeg is free software; you can redistribute it and/or
nengel@2 11 * modify it under the terms of the GNU Lesser General Public
nengel@2 12 * License as published by the Free Software Foundation; either
nengel@2 13 * version 2.1 of the License, or (at your option) any later version.
nengel@2 14 *
nengel@2 15 * FFmpeg is distributed in the hope that it will be useful,
nengel@2 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nengel@2 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
nengel@2 18 * Lesser General Public License for more details.
nengel@2 19 *
nengel@2 20 * You should have received a copy of the GNU Lesser General Public
nengel@2 21 * License along with FFmpeg; if not, write to the Free Software
nengel@2 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
nengel@2 23 */
nengel@2 24
nengel@2 25 /**
nengel@2 26 * @file
nengel@2 27 * DSP utils
nengel@2 28 */
nengel@2 29
nengel@2 30 #include "libavutil/log.h"
nengel@2 31 #include "dsputil.h"
nengel@2 32 #include "simple_idct.h"
nengel@2 33 #include "mathops.h"
nengel@2 34 #include "config.h"
nengel@2 35
nengel@2 36 uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, };
nengel@2 37 uint32_t ff_squareTbl[512] = {0, };
nengel@2 38
nengel@2 39 const uint8_t ff_zigzag_direct[64] = {
nengel@2 40 0, 1, 8, 16, 9, 2, 3, 10,
nengel@2 41 17, 24, 32, 25, 18, 11, 4, 5,
nengel@2 42 12, 19, 26, 33, 40, 48, 41, 34,
nengel@2 43 27, 20, 13, 6, 7, 14, 21, 28,
nengel@2 44 35, 42, 49, 56, 57, 50, 43, 36,
nengel@2 45 29, 22, 15, 23, 30, 37, 44, 51,
nengel@2 46 58, 59, 52, 45, 38, 31, 39, 46,
nengel@2 47 53, 60, 61, 54, 47, 55, 62, 63
nengel@2 48 };
nengel@2 49
nengel@2 50
nengel@2 51 #define PIXOP2(OPNAME, OP) \
nengel@2 52 static void OPNAME ## _pixels2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 53 int i;\
nengel@2 54 for(i=0; i<h; i++){\
nengel@2 55 OP(*((uint16_t*)(block )), AV_RN16(pixels ));\
nengel@2 56 pixels+=line_size;\
nengel@2 57 block +=line_size;\
nengel@2 58 }\
nengel@2 59 }\
nengel@2 60 static void OPNAME ## _pixels4_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 61 int i;\
nengel@2 62 for(i=0; i<h; i++){\
nengel@2 63 OP(*((uint32_t*)(block )), AV_RN32(pixels ));\
nengel@2 64 pixels+=line_size;\
nengel@2 65 block +=line_size;\
nengel@2 66 }\
nengel@2 67 }\
nengel@2 68 static void OPNAME ## _pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 69 int i;\
nengel@2 70 for(i=0; i<h; i++){\
nengel@2 71 OP(*((uint32_t*)(block )), AV_RN32(pixels ));\
nengel@2 72 OP(*((uint32_t*)(block+4)), AV_RN32(pixels+4));\
nengel@2 73 pixels+=line_size;\
nengel@2 74 block +=line_size;\
nengel@2 75 }\
nengel@2 76 }\
nengel@2 77 static inline void OPNAME ## _no_rnd_pixels8_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 78 OPNAME ## _pixels8_c(block, pixels, line_size, h);\
nengel@2 79 }\
nengel@2 80 \
nengel@2 81 static inline void OPNAME ## _no_rnd_pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 82 int src_stride1, int src_stride2, int h){\
nengel@2 83 int i;\
nengel@2 84 for(i=0; i<h; i++){\
nengel@2 85 uint32_t a,b;\
nengel@2 86 a= AV_RN32(&src1[i*src_stride1 ]);\
nengel@2 87 b= AV_RN32(&src2[i*src_stride2 ]);\
nengel@2 88 OP(*((uint32_t*)&dst[i*dst_stride ]), no_rnd_avg32(a, b));\
nengel@2 89 a= AV_RN32(&src1[i*src_stride1+4]);\
nengel@2 90 b= AV_RN32(&src2[i*src_stride2+4]);\
nengel@2 91 OP(*((uint32_t*)&dst[i*dst_stride+4]), no_rnd_avg32(a, b));\
nengel@2 92 }\
nengel@2 93 }\
nengel@2 94 \
nengel@2 95 static inline void OPNAME ## _pixels8_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 96 int src_stride1, int src_stride2, int h){\
nengel@2 97 int i;\
nengel@2 98 for(i=0; i<h; i++){\
nengel@2 99 uint32_t a,b;\
nengel@2 100 a= AV_RN32(&src1[i*src_stride1 ]);\
nengel@2 101 b= AV_RN32(&src2[i*src_stride2 ]);\
nengel@2 102 OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
nengel@2 103 a= AV_RN32(&src1[i*src_stride1+4]);\
nengel@2 104 b= AV_RN32(&src2[i*src_stride2+4]);\
nengel@2 105 OP(*((uint32_t*)&dst[i*dst_stride+4]), rnd_avg32(a, b));\
nengel@2 106 }\
nengel@2 107 }\
nengel@2 108 \
nengel@2 109 static inline void OPNAME ## _pixels4_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 110 int src_stride1, int src_stride2, int h){\
nengel@2 111 int i;\
nengel@2 112 for(i=0; i<h; i++){\
nengel@2 113 uint32_t a,b;\
nengel@2 114 a= AV_RN32(&src1[i*src_stride1 ]);\
nengel@2 115 b= AV_RN32(&src2[i*src_stride2 ]);\
nengel@2 116 OP(*((uint32_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
nengel@2 117 }\
nengel@2 118 }\
nengel@2 119 \
nengel@2 120 static inline void OPNAME ## _pixels2_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 121 int src_stride1, int src_stride2, int h){\
nengel@2 122 int i;\
nengel@2 123 for(i=0; i<h; i++){\
nengel@2 124 uint32_t a,b;\
nengel@2 125 a= AV_RN16(&src1[i*src_stride1 ]);\
nengel@2 126 b= AV_RN16(&src2[i*src_stride2 ]);\
nengel@2 127 OP(*((uint16_t*)&dst[i*dst_stride ]), rnd_avg32(a, b));\
nengel@2 128 }\
nengel@2 129 }\
nengel@2 130 \
nengel@2 131 static inline void OPNAME ## _pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 132 int src_stride1, int src_stride2, int h){\
nengel@2 133 OPNAME ## _pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\
nengel@2 134 OPNAME ## _pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\
nengel@2 135 }\
nengel@2 136 \
nengel@2 137 static inline void OPNAME ## _no_rnd_pixels16_l2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, \
nengel@2 138 int src_stride1, int src_stride2, int h){\
nengel@2 139 OPNAME ## _no_rnd_pixels8_l2(dst , src1 , src2 , dst_stride, src_stride1, src_stride2, h);\
nengel@2 140 OPNAME ## _no_rnd_pixels8_l2(dst+8, src1+8, src2+8, dst_stride, src_stride1, src_stride2, h);\
nengel@2 141 }\
nengel@2 142 \
nengel@2 143 static inline void OPNAME ## _no_rnd_pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 144 OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
nengel@2 145 }\
nengel@2 146 \
nengel@2 147 static inline void OPNAME ## _pixels8_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 148 OPNAME ## _pixels8_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
nengel@2 149 }\
nengel@2 150 \
nengel@2 151 static inline void OPNAME ## _no_rnd_pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 152 OPNAME ## _no_rnd_pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
nengel@2 153 }\
nengel@2 154 \
nengel@2 155 static inline void OPNAME ## _pixels8_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 156 OPNAME ## _pixels8_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
nengel@2 157 }\
nengel@2 158 \
nengel@2 159 static inline void OPNAME ## _pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
nengel@2 160 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
nengel@2 161 int i;\
nengel@2 162 for(i=0; i<h; i++){\
nengel@2 163 uint32_t a, b, c, d, l0, l1, h0, h1;\
nengel@2 164 a= AV_RN32(&src1[i*src_stride1]);\
nengel@2 165 b= AV_RN32(&src2[i*src_stride2]);\
nengel@2 166 c= AV_RN32(&src3[i*src_stride3]);\
nengel@2 167 d= AV_RN32(&src4[i*src_stride4]);\
nengel@2 168 l0= (a&0x03030303UL)\
nengel@2 169 + (b&0x03030303UL)\
nengel@2 170 + 0x02020202UL;\
nengel@2 171 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 172 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 173 l1= (c&0x03030303UL)\
nengel@2 174 + (d&0x03030303UL);\
nengel@2 175 h1= ((c&0xFCFCFCFCUL)>>2)\
nengel@2 176 + ((d&0xFCFCFCFCUL)>>2);\
nengel@2 177 OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 178 a= AV_RN32(&src1[i*src_stride1+4]);\
nengel@2 179 b= AV_RN32(&src2[i*src_stride2+4]);\
nengel@2 180 c= AV_RN32(&src3[i*src_stride3+4]);\
nengel@2 181 d= AV_RN32(&src4[i*src_stride4+4]);\
nengel@2 182 l0= (a&0x03030303UL)\
nengel@2 183 + (b&0x03030303UL)\
nengel@2 184 + 0x02020202UL;\
nengel@2 185 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 186 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 187 l1= (c&0x03030303UL)\
nengel@2 188 + (d&0x03030303UL);\
nengel@2 189 h1= ((c&0xFCFCFCFCUL)>>2)\
nengel@2 190 + ((d&0xFCFCFCFCUL)>>2);\
nengel@2 191 OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 192 }\
nengel@2 193 }\
nengel@2 194 \
nengel@2 195 static inline void OPNAME ## _pixels4_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 196 OPNAME ## _pixels4_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
nengel@2 197 }\
nengel@2 198 \
nengel@2 199 static inline void OPNAME ## _pixels4_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 200 OPNAME ## _pixels4_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
nengel@2 201 }\
nengel@2 202 \
nengel@2 203 static inline void OPNAME ## _pixels2_x2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 204 OPNAME ## _pixels2_l2(block, pixels, pixels+1, line_size, line_size, line_size, h);\
nengel@2 205 }\
nengel@2 206 \
nengel@2 207 static inline void OPNAME ## _pixels2_y2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
nengel@2 208 OPNAME ## _pixels2_l2(block, pixels, pixels+line_size, line_size, line_size, line_size, h);\
nengel@2 209 }\
nengel@2 210 \
nengel@2 211 static inline void OPNAME ## _no_rnd_pixels8_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
nengel@2 212 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
nengel@2 213 int i;\
nengel@2 214 for(i=0; i<h; i++){\
nengel@2 215 uint32_t a, b, c, d, l0, l1, h0, h1;\
nengel@2 216 a= AV_RN32(&src1[i*src_stride1]);\
nengel@2 217 b= AV_RN32(&src2[i*src_stride2]);\
nengel@2 218 c= AV_RN32(&src3[i*src_stride3]);\
nengel@2 219 d= AV_RN32(&src4[i*src_stride4]);\
nengel@2 220 l0= (a&0x03030303UL)\
nengel@2 221 + (b&0x03030303UL)\
nengel@2 222 + 0x01010101UL;\
nengel@2 223 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 224 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 225 l1= (c&0x03030303UL)\
nengel@2 226 + (d&0x03030303UL);\
nengel@2 227 h1= ((c&0xFCFCFCFCUL)>>2)\
nengel@2 228 + ((d&0xFCFCFCFCUL)>>2);\
nengel@2 229 OP(*((uint32_t*)&dst[i*dst_stride]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 230 a= AV_RN32(&src1[i*src_stride1+4]);\
nengel@2 231 b= AV_RN32(&src2[i*src_stride2+4]);\
nengel@2 232 c= AV_RN32(&src3[i*src_stride3+4]);\
nengel@2 233 d= AV_RN32(&src4[i*src_stride4+4]);\
nengel@2 234 l0= (a&0x03030303UL)\
nengel@2 235 + (b&0x03030303UL)\
nengel@2 236 + 0x01010101UL;\
nengel@2 237 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 238 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 239 l1= (c&0x03030303UL)\
nengel@2 240 + (d&0x03030303UL);\
nengel@2 241 h1= ((c&0xFCFCFCFCUL)>>2)\
nengel@2 242 + ((d&0xFCFCFCFCUL)>>2);\
nengel@2 243 OP(*((uint32_t*)&dst[i*dst_stride+4]), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 244 }\
nengel@2 245 }\
nengel@2 246 static inline void OPNAME ## _pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
nengel@2 247 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
nengel@2 248 OPNAME ## _pixels8_l4(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
nengel@2 249 OPNAME ## _pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
nengel@2 250 }\
nengel@2 251 static inline void OPNAME ## _no_rnd_pixels16_l4(uint8_t *dst, const uint8_t *src1, uint8_t *src2, uint8_t *src3, uint8_t *src4,\
nengel@2 252 int dst_stride, int src_stride1, int src_stride2,int src_stride3,int src_stride4, int h){\
nengel@2 253 OPNAME ## _no_rnd_pixels8_l4(dst , src1 , src2 , src3 , src4 , dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
nengel@2 254 OPNAME ## _no_rnd_pixels8_l4(dst+8, src1+8, src2+8, src3+8, src4+8, dst_stride, src_stride1, src_stride2, src_stride3, src_stride4, h);\
nengel@2 255 }\
nengel@2 256 \
nengel@2 257 static inline void OPNAME ## _pixels2_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
nengel@2 258 {\
nengel@2 259 int i, a0, b0, a1, b1;\
nengel@2 260 a0= pixels[0];\
nengel@2 261 b0= pixels[1] + 2;\
nengel@2 262 a0 += b0;\
nengel@2 263 b0 += pixels[2];\
nengel@2 264 \
nengel@2 265 pixels+=line_size;\
nengel@2 266 for(i=0; i<h; i+=2){\
nengel@2 267 a1= pixels[0];\
nengel@2 268 b1= pixels[1];\
nengel@2 269 a1 += b1;\
nengel@2 270 b1 += pixels[2];\
nengel@2 271 \
nengel@2 272 block[0]= (a1+a0)>>2; /* FIXME non put */\
nengel@2 273 block[1]= (b1+b0)>>2;\
nengel@2 274 \
nengel@2 275 pixels+=line_size;\
nengel@2 276 block +=line_size;\
nengel@2 277 \
nengel@2 278 a0= pixels[0];\
nengel@2 279 b0= pixels[1] + 2;\
nengel@2 280 a0 += b0;\
nengel@2 281 b0 += pixels[2];\
nengel@2 282 \
nengel@2 283 block[0]= (a1+a0)>>2;\
nengel@2 284 block[1]= (b1+b0)>>2;\
nengel@2 285 pixels+=line_size;\
nengel@2 286 block +=line_size;\
nengel@2 287 }\
nengel@2 288 }\
nengel@2 289 \
nengel@2 290 static inline void OPNAME ## _pixels4_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
nengel@2 291 {\
nengel@2 292 int i;\
nengel@2 293 const uint32_t a= AV_RN32(pixels );\
nengel@2 294 const uint32_t b= AV_RN32(pixels+1);\
nengel@2 295 uint32_t l0= (a&0x03030303UL)\
nengel@2 296 + (b&0x03030303UL)\
nengel@2 297 + 0x02020202UL;\
nengel@2 298 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 299 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 300 uint32_t l1,h1;\
nengel@2 301 \
nengel@2 302 pixels+=line_size;\
nengel@2 303 for(i=0; i<h; i+=2){\
nengel@2 304 uint32_t a= AV_RN32(pixels );\
nengel@2 305 uint32_t b= AV_RN32(pixels+1);\
nengel@2 306 l1= (a&0x03030303UL)\
nengel@2 307 + (b&0x03030303UL);\
nengel@2 308 h1= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 309 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 310 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 311 pixels+=line_size;\
nengel@2 312 block +=line_size;\
nengel@2 313 a= AV_RN32(pixels );\
nengel@2 314 b= AV_RN32(pixels+1);\
nengel@2 315 l0= (a&0x03030303UL)\
nengel@2 316 + (b&0x03030303UL)\
nengel@2 317 + 0x02020202UL;\
nengel@2 318 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 319 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 320 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 321 pixels+=line_size;\
nengel@2 322 block +=line_size;\
nengel@2 323 }\
nengel@2 324 }\
nengel@2 325 \
nengel@2 326 static inline void OPNAME ## _pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
nengel@2 327 {\
nengel@2 328 int j;\
nengel@2 329 for(j=0; j<2; j++){\
nengel@2 330 int i;\
nengel@2 331 const uint32_t a= AV_RN32(pixels );\
nengel@2 332 const uint32_t b= AV_RN32(pixels+1);\
nengel@2 333 uint32_t l0= (a&0x03030303UL)\
nengel@2 334 + (b&0x03030303UL)\
nengel@2 335 + 0x02020202UL;\
nengel@2 336 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 337 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 338 uint32_t l1,h1;\
nengel@2 339 \
nengel@2 340 pixels+=line_size;\
nengel@2 341 for(i=0; i<h; i+=2){\
nengel@2 342 uint32_t a= AV_RN32(pixels );\
nengel@2 343 uint32_t b= AV_RN32(pixels+1);\
nengel@2 344 l1= (a&0x03030303UL)\
nengel@2 345 + (b&0x03030303UL);\
nengel@2 346 h1= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 347 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 348 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 349 pixels+=line_size;\
nengel@2 350 block +=line_size;\
nengel@2 351 a= AV_RN32(pixels );\
nengel@2 352 b= AV_RN32(pixels+1);\
nengel@2 353 l0= (a&0x03030303UL)\
nengel@2 354 + (b&0x03030303UL)\
nengel@2 355 + 0x02020202UL;\
nengel@2 356 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 357 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 358 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 359 pixels+=line_size;\
nengel@2 360 block +=line_size;\
nengel@2 361 }\
nengel@2 362 pixels+=4-line_size*(h+1);\
nengel@2 363 block +=4-line_size*h;\
nengel@2 364 }\
nengel@2 365 }\
nengel@2 366 \
nengel@2 367 static inline void OPNAME ## _no_rnd_pixels8_xy2_c(uint8_t *block, const uint8_t *pixels, int line_size, int h)\
nengel@2 368 {\
nengel@2 369 int j;\
nengel@2 370 for(j=0; j<2; j++){\
nengel@2 371 int i;\
nengel@2 372 const uint32_t a= AV_RN32(pixels );\
nengel@2 373 const uint32_t b= AV_RN32(pixels+1);\
nengel@2 374 uint32_t l0= (a&0x03030303UL)\
nengel@2 375 + (b&0x03030303UL)\
nengel@2 376 + 0x01010101UL;\
nengel@2 377 uint32_t h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 378 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 379 uint32_t l1,h1;\
nengel@2 380 \
nengel@2 381 pixels+=line_size;\
nengel@2 382 for(i=0; i<h; i+=2){\
nengel@2 383 uint32_t a= AV_RN32(pixels );\
nengel@2 384 uint32_t b= AV_RN32(pixels+1);\
nengel@2 385 l1= (a&0x03030303UL)\
nengel@2 386 + (b&0x03030303UL);\
nengel@2 387 h1= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 388 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 389 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 390 pixels+=line_size;\
nengel@2 391 block +=line_size;\
nengel@2 392 a= AV_RN32(pixels );\
nengel@2 393 b= AV_RN32(pixels+1);\
nengel@2 394 l0= (a&0x03030303UL)\
nengel@2 395 + (b&0x03030303UL)\
nengel@2 396 + 0x01010101UL;\
nengel@2 397 h0= ((a&0xFCFCFCFCUL)>>2)\
nengel@2 398 + ((b&0xFCFCFCFCUL)>>2);\
nengel@2 399 OP(*((uint32_t*)block), h0+h1+(((l0+l1)>>2)&0x0F0F0F0FUL));\
nengel@2 400 pixels+=line_size;\
nengel@2 401 block +=line_size;\
nengel@2 402 }\
nengel@2 403 pixels+=4-line_size*(h+1);\
nengel@2 404 block +=4-line_size*h;\
nengel@2 405 }\
nengel@2 406 }\
nengel@2 407 \
nengel@2 408 CALL_2X_PIXELS(OPNAME ## _pixels16_c , OPNAME ## _pixels8_c , 8)\
nengel@2 409
nengel@2 410 #define op_avg(a, b) a = rnd_avg32(a, b)
nengel@2 411
nengel@2 412 #define op_put(a, b) a = b
nengel@2 413
nengel@2 414 PIXOP2(avg, op_avg)
nengel@2 415 PIXOP2(put, op_put)
nengel@2 416 #undef op_avg
nengel@2 417 #undef op_put
nengel@2 418
nengel@2 419
nengel@2 420 #define H264_CHROMA_MC(OPNAME, OP)\
nengel@2 421 static void OPNAME ## h264_chroma_mc2_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
nengel@2 422 const int A=(8-x)*(8-y);\
nengel@2 423 const int B=( x)*(8-y);\
nengel@2 424 const int C=(8-x)*( y);\
nengel@2 425 const int D=( x)*( y);\
nengel@2 426 int i;\
nengel@2 427 \
nengel@2 428 assert(x<8 && y<8 && x>=0 && y>=0);\
nengel@2 429 \
nengel@2 430 if(D){\
nengel@2 431 for(i=0; i<h; i++){\
nengel@2 432 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
nengel@2 433 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
nengel@2 434 dst+= stride;\
nengel@2 435 src+= stride;\
nengel@2 436 }\
nengel@2 437 }else{\
nengel@2 438 const int E= B+C;\
nengel@2 439 const int step= C ? stride : 1;\
nengel@2 440 for(i=0; i<h; i++){\
nengel@2 441 OP(dst[0], (A*src[0] + E*src[step+0]));\
nengel@2 442 OP(dst[1], (A*src[1] + E*src[step+1]));\
nengel@2 443 dst+= stride;\
nengel@2 444 src+= stride;\
nengel@2 445 }\
nengel@2 446 }\
nengel@2 447 }\
nengel@2 448 \
nengel@2 449 static void OPNAME ## h264_chroma_mc4_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
nengel@2 450 const int A=(8-x)*(8-y);\
nengel@2 451 const int B=( x)*(8-y);\
nengel@2 452 const int C=(8-x)*( y);\
nengel@2 453 const int D=( x)*( y);\
nengel@2 454 int i;\
nengel@2 455 \
nengel@2 456 assert(x<8 && y<8 && x>=0 && y>=0);\
nengel@2 457 \
nengel@2 458 if(D){\
nengel@2 459 for(i=0; i<h; i++){\
nengel@2 460 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
nengel@2 461 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
nengel@2 462 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
nengel@2 463 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
nengel@2 464 dst+= stride;\
nengel@2 465 src+= stride;\
nengel@2 466 }\
nengel@2 467 }else{\
nengel@2 468 const int E= B+C;\
nengel@2 469 const int step= C ? stride : 1;\
nengel@2 470 for(i=0; i<h; i++){\
nengel@2 471 OP(dst[0], (A*src[0] + E*src[step+0]));\
nengel@2 472 OP(dst[1], (A*src[1] + E*src[step+1]));\
nengel@2 473 OP(dst[2], (A*src[2] + E*src[step+2]));\
nengel@2 474 OP(dst[3], (A*src[3] + E*src[step+3]));\
nengel@2 475 dst+= stride;\
nengel@2 476 src+= stride;\
nengel@2 477 }\
nengel@2 478 }\
nengel@2 479 }\
nengel@2 480 \
nengel@2 481 static void OPNAME ## h264_chroma_mc8_c(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int x, int y){\
nengel@2 482 const int A=(8-x)*(8-y);\
nengel@2 483 const int B=( x)*(8-y);\
nengel@2 484 const int C=(8-x)*( y);\
nengel@2 485 const int D=( x)*( y);\
nengel@2 486 int i;\
nengel@2 487 \
nengel@2 488 assert(x<8 && y<8 && x>=0 && y>=0);\
nengel@2 489 \
nengel@2 490 if(D){\
nengel@2 491 for(i=0; i<h; i++){\
nengel@2 492 OP(dst[0], (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1]));\
nengel@2 493 OP(dst[1], (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2]));\
nengel@2 494 OP(dst[2], (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3]));\
nengel@2 495 OP(dst[3], (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4]));\
nengel@2 496 OP(dst[4], (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5]));\
nengel@2 497 OP(dst[5], (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6]));\
nengel@2 498 OP(dst[6], (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7]));\
nengel@2 499 OP(dst[7], (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8]));\
nengel@2 500 dst+= stride;\
nengel@2 501 src+= stride;\
nengel@2 502 }\
nengel@2 503 }else{\
nengel@2 504 const int E= B+C;\
nengel@2 505 const int step= C ? stride : 1;\
nengel@2 506 for(i=0; i<h; i++){\
nengel@2 507 OP(dst[0], (A*src[0] + E*src[step+0]));\
nengel@2 508 OP(dst[1], (A*src[1] + E*src[step+1]));\
nengel@2 509 OP(dst[2], (A*src[2] + E*src[step+2]));\
nengel@2 510 OP(dst[3], (A*src[3] + E*src[step+3]));\
nengel@2 511 OP(dst[4], (A*src[4] + E*src[step+4]));\
nengel@2 512 OP(dst[5], (A*src[5] + E*src[step+5]));\
nengel@2 513 OP(dst[6], (A*src[6] + E*src[step+6]));\
nengel@2 514 OP(dst[7], (A*src[7] + E*src[step+7]));\
nengel@2 515 dst+= stride;\
nengel@2 516 src+= stride;\
nengel@2 517 }\
nengel@2 518 }\
nengel@2 519 }
nengel@2 520
nengel@2 521 #define op_avg(a, b) a = (((a)+(((b) + 32)>>6)+1)>>1)
nengel@2 522 #define op_put(a, b) a = (((b) + 32)>>6)
nengel@2 523
nengel@2 524 H264_CHROMA_MC(put_ , op_put)
nengel@2 525 H264_CHROMA_MC(avg_ , op_avg)
nengel@2 526 #undef op_avg
nengel@2 527 #undef op_put
nengel@2 528
nengel@2 529
nengel@2 530 #define H264_LOWPASS(OPNAME, OP, OP2) \
nengel@2 531 static av_unused void OPNAME ## h264_qpel2_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 532 const int h=2;\
nengel@2 533 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 534 int i;\
nengel@2 535 for(i=0; i<h; i++)\
nengel@2 536 {\
nengel@2 537 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));\
nengel@2 538 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));\
nengel@2 539 dst+=dstStride;\
nengel@2 540 src+=srcStride;\
nengel@2 541 }\
nengel@2 542 }\
nengel@2 543 \
nengel@2 544 static av_unused void OPNAME ## h264_qpel2_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 545 const int w=2;\
nengel@2 546 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 547 int i;\
nengel@2 548 for(i=0; i<w; i++)\
nengel@2 549 {\
nengel@2 550 const int srcB= src[-2*srcStride];\
nengel@2 551 const int srcA= src[-1*srcStride];\
nengel@2 552 const int src0= src[0 *srcStride];\
nengel@2 553 const int src1= src[1 *srcStride];\
nengel@2 554 const int src2= src[2 *srcStride];\
nengel@2 555 const int src3= src[3 *srcStride];\
nengel@2 556 const int src4= src[4 *srcStride];\
nengel@2 557 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
nengel@2 558 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
nengel@2 559 dst++;\
nengel@2 560 src++;\
nengel@2 561 }\
nengel@2 562 }\
nengel@2 563 \
nengel@2 564 static av_unused void OPNAME ## h264_qpel2_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
nengel@2 565 const int h=2;\
nengel@2 566 const int w=2;\
nengel@2 567 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 568 int i;\
nengel@2 569 src -= 2*srcStride;\
nengel@2 570 for(i=0; i<h+5; i++)\
nengel@2 571 {\
nengel@2 572 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);\
nengel@2 573 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);\
nengel@2 574 tmp+=tmpStride;\
nengel@2 575 src+=srcStride;\
nengel@2 576 }\
nengel@2 577 tmp -= tmpStride*(h+5-2);\
nengel@2 578 for(i=0; i<w; i++)\
nengel@2 579 {\
nengel@2 580 const int tmpB= tmp[-2*tmpStride];\
nengel@2 581 const int tmpA= tmp[-1*tmpStride];\
nengel@2 582 const int tmp0= tmp[0 *tmpStride];\
nengel@2 583 const int tmp1= tmp[1 *tmpStride];\
nengel@2 584 const int tmp2= tmp[2 *tmpStride];\
nengel@2 585 const int tmp3= tmp[3 *tmpStride];\
nengel@2 586 const int tmp4= tmp[4 *tmpStride];\
nengel@2 587 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
nengel@2 588 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
nengel@2 589 dst++;\
nengel@2 590 tmp++;\
nengel@2 591 }\
nengel@2 592 }\
nengel@2 593 static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 594 const int h=4;\
nengel@2 595 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 596 int i;\
nengel@2 597 for(i=0; i<h; i++)\
nengel@2 598 {\
nengel@2 599 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]));\
nengel@2 600 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]));\
nengel@2 601 OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]));\
nengel@2 602 OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]));\
nengel@2 603 dst+=dstStride;\
nengel@2 604 src+=srcStride;\
nengel@2 605 }\
nengel@2 606 }\
nengel@2 607 \
nengel@2 608 static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 609 const int w=4;\
nengel@2 610 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 611 int i;\
nengel@2 612 for(i=0; i<w; i++)\
nengel@2 613 {\
nengel@2 614 const int srcB= src[-2*srcStride];\
nengel@2 615 const int srcA= src[-1*srcStride];\
nengel@2 616 const int src0= src[0 *srcStride];\
nengel@2 617 const int src1= src[1 *srcStride];\
nengel@2 618 const int src2= src[2 *srcStride];\
nengel@2 619 const int src3= src[3 *srcStride];\
nengel@2 620 const int src4= src[4 *srcStride];\
nengel@2 621 const int src5= src[5 *srcStride];\
nengel@2 622 const int src6= src[6 *srcStride];\
nengel@2 623 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
nengel@2 624 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
nengel@2 625 OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
nengel@2 626 OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
nengel@2 627 dst++;\
nengel@2 628 src++;\
nengel@2 629 }\
nengel@2 630 }\
nengel@2 631 \
nengel@2 632 static void OPNAME ## h264_qpel4_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
nengel@2 633 const int h=4;\
nengel@2 634 const int w=4;\
nengel@2 635 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 636 int i;\
nengel@2 637 src -= 2*srcStride;\
nengel@2 638 for(i=0; i<h+5; i++)\
nengel@2 639 {\
nengel@2 640 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);\
nengel@2 641 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);\
nengel@2 642 tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5]);\
nengel@2 643 tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6]);\
nengel@2 644 tmp+=tmpStride;\
nengel@2 645 src+=srcStride;\
nengel@2 646 }\
nengel@2 647 tmp -= tmpStride*(h+5-2);\
nengel@2 648 for(i=0; i<w; i++)\
nengel@2 649 {\
nengel@2 650 const int tmpB= tmp[-2*tmpStride];\
nengel@2 651 const int tmpA= tmp[-1*tmpStride];\
nengel@2 652 const int tmp0= tmp[0 *tmpStride];\
nengel@2 653 const int tmp1= tmp[1 *tmpStride];\
nengel@2 654 const int tmp2= tmp[2 *tmpStride];\
nengel@2 655 const int tmp3= tmp[3 *tmpStride];\
nengel@2 656 const int tmp4= tmp[4 *tmpStride];\
nengel@2 657 const int tmp5= tmp[5 *tmpStride];\
nengel@2 658 const int tmp6= tmp[6 *tmpStride];\
nengel@2 659 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
nengel@2 660 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
nengel@2 661 OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
nengel@2 662 OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
nengel@2 663 dst++;\
nengel@2 664 tmp++;\
nengel@2 665 }\
nengel@2 666 }\
nengel@2 667 \
nengel@2 668 static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 669 const int h=8;\
nengel@2 670 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 671 int i;\
nengel@2 672 for(i=0; i<h; i++)\
nengel@2 673 {\
nengel@2 674 OP(dst[0], (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]));\
nengel@2 675 OP(dst[1], (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]));\
nengel@2 676 OP(dst[2], (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]));\
nengel@2 677 OP(dst[3], (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]));\
nengel@2 678 OP(dst[4], (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]));\
nengel@2 679 OP(dst[5], (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]));\
nengel@2 680 OP(dst[6], (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]));\
nengel@2 681 OP(dst[7], (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]));\
nengel@2 682 dst+=dstStride;\
nengel@2 683 src+=srcStride;\
nengel@2 684 }\
nengel@2 685 }\
nengel@2 686 \
nengel@2 687 static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 688 const int w=8;\
nengel@2 689 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 690 int i;\
nengel@2 691 for(i=0; i<w; i++)\
nengel@2 692 {\
nengel@2 693 const int srcB= src[-2*srcStride];\
nengel@2 694 const int srcA= src[-1*srcStride];\
nengel@2 695 const int src0= src[0 *srcStride];\
nengel@2 696 const int src1= src[1 *srcStride];\
nengel@2 697 const int src2= src[2 *srcStride];\
nengel@2 698 const int src3= src[3 *srcStride];\
nengel@2 699 const int src4= src[4 *srcStride];\
nengel@2 700 const int src5= src[5 *srcStride];\
nengel@2 701 const int src6= src[6 *srcStride];\
nengel@2 702 const int src7= src[7 *srcStride];\
nengel@2 703 const int src8= src[8 *srcStride];\
nengel@2 704 const int src9= src[9 *srcStride];\
nengel@2 705 const int src10=src[10*srcStride];\
nengel@2 706 OP(dst[0*dstStride], (src0+src1)*20 - (srcA+src2)*5 + (srcB+src3));\
nengel@2 707 OP(dst[1*dstStride], (src1+src2)*20 - (src0+src3)*5 + (srcA+src4));\
nengel@2 708 OP(dst[2*dstStride], (src2+src3)*20 - (src1+src4)*5 + (src0+src5));\
nengel@2 709 OP(dst[3*dstStride], (src3+src4)*20 - (src2+src5)*5 + (src1+src6));\
nengel@2 710 OP(dst[4*dstStride], (src4+src5)*20 - (src3+src6)*5 + (src2+src7));\
nengel@2 711 OP(dst[5*dstStride], (src5+src6)*20 - (src4+src7)*5 + (src3+src8));\
nengel@2 712 OP(dst[6*dstStride], (src6+src7)*20 - (src5+src8)*5 + (src4+src9));\
nengel@2 713 OP(dst[7*dstStride], (src7+src8)*20 - (src6+src9)*5 + (src5+src10));\
nengel@2 714 dst++;\
nengel@2 715 src++;\
nengel@2 716 }\
nengel@2 717 }\
nengel@2 718 \
nengel@2 719 static void OPNAME ## h264_qpel8_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
nengel@2 720 const int h=8;\
nengel@2 721 const int w=8;\
nengel@2 722 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\
nengel@2 723 int i;\
nengel@2 724 src -= 2*srcStride;\
nengel@2 725 for(i=0; i<h+5; i++)\
nengel@2 726 {\
nengel@2 727 tmp[0]= (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3 ]);\
nengel@2 728 tmp[1]= (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4 ]);\
nengel@2 729 tmp[2]= (src[2]+src[3])*20 - (src[1 ]+src[4])*5 + (src[0 ]+src[5 ]);\
nengel@2 730 tmp[3]= (src[3]+src[4])*20 - (src[2 ]+src[5])*5 + (src[1 ]+src[6 ]);\
nengel@2 731 tmp[4]= (src[4]+src[5])*20 - (src[3 ]+src[6])*5 + (src[2 ]+src[7 ]);\
nengel@2 732 tmp[5]= (src[5]+src[6])*20 - (src[4 ]+src[7])*5 + (src[3 ]+src[8 ]);\
nengel@2 733 tmp[6]= (src[6]+src[7])*20 - (src[5 ]+src[8])*5 + (src[4 ]+src[9 ]);\
nengel@2 734 tmp[7]= (src[7]+src[8])*20 - (src[6 ]+src[9])*5 + (src[5 ]+src[10]);\
nengel@2 735 tmp+=tmpStride;\
nengel@2 736 src+=srcStride;\
nengel@2 737 }\
nengel@2 738 tmp -= tmpStride*(h+5-2);\
nengel@2 739 for(i=0; i<w; i++)\
nengel@2 740 {\
nengel@2 741 const int tmpB= tmp[-2*tmpStride];\
nengel@2 742 const int tmpA= tmp[-1*tmpStride];\
nengel@2 743 const int tmp0= tmp[0 *tmpStride];\
nengel@2 744 const int tmp1= tmp[1 *tmpStride];\
nengel@2 745 const int tmp2= tmp[2 *tmpStride];\
nengel@2 746 const int tmp3= tmp[3 *tmpStride];\
nengel@2 747 const int tmp4= tmp[4 *tmpStride];\
nengel@2 748 const int tmp5= tmp[5 *tmpStride];\
nengel@2 749 const int tmp6= tmp[6 *tmpStride];\
nengel@2 750 const int tmp7= tmp[7 *tmpStride];\
nengel@2 751 const int tmp8= tmp[8 *tmpStride];\
nengel@2 752 const int tmp9= tmp[9 *tmpStride];\
nengel@2 753 const int tmp10=tmp[10*tmpStride];\
nengel@2 754 OP2(dst[0*dstStride], (tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3));\
nengel@2 755 OP2(dst[1*dstStride], (tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4));\
nengel@2 756 OP2(dst[2*dstStride], (tmp2+tmp3)*20 - (tmp1+tmp4)*5 + (tmp0+tmp5));\
nengel@2 757 OP2(dst[3*dstStride], (tmp3+tmp4)*20 - (tmp2+tmp5)*5 + (tmp1+tmp6));\
nengel@2 758 OP2(dst[4*dstStride], (tmp4+tmp5)*20 - (tmp3+tmp6)*5 + (tmp2+tmp7));\
nengel@2 759 OP2(dst[5*dstStride], (tmp5+tmp6)*20 - (tmp4+tmp7)*5 + (tmp3+tmp8));\
nengel@2 760 OP2(dst[6*dstStride], (tmp6+tmp7)*20 - (tmp5+tmp8)*5 + (tmp4+tmp9));\
nengel@2 761 OP2(dst[7*dstStride], (tmp7+tmp8)*20 - (tmp6+tmp9)*5 + (tmp5+tmp10));\
nengel@2 762 dst++;\
nengel@2 763 tmp++;\
nengel@2 764 }\
nengel@2 765 }\
nengel@2 766 \
nengel@2 767 static void OPNAME ## h264_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 768 OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
nengel@2 769 OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
nengel@2 770 src += 8*srcStride;\
nengel@2 771 dst += 8*dstStride;\
nengel@2 772 OPNAME ## h264_qpel8_v_lowpass(dst , src , dstStride, srcStride);\
nengel@2 773 OPNAME ## h264_qpel8_v_lowpass(dst+8, src+8, dstStride, srcStride);\
nengel@2 774 }\
nengel@2 775 \
nengel@2 776 static void OPNAME ## h264_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
nengel@2 777 OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
nengel@2 778 OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
nengel@2 779 src += 8*srcStride;\
nengel@2 780 dst += 8*dstStride;\
nengel@2 781 OPNAME ## h264_qpel8_h_lowpass(dst , src , dstStride, srcStride);\
nengel@2 782 OPNAME ## h264_qpel8_h_lowpass(dst+8, src+8, dstStride, srcStride);\
nengel@2 783 }\
nengel@2 784 \
nengel@2 785 static void OPNAME ## h264_qpel16_hv_lowpass(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
nengel@2 786 OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
nengel@2 787 OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
nengel@2 788 src += 8*srcStride;\
nengel@2 789 dst += 8*dstStride;\
nengel@2 790 OPNAME ## h264_qpel8_hv_lowpass(dst , tmp , src , dstStride, tmpStride, srcStride);\
nengel@2 791 OPNAME ## h264_qpel8_hv_lowpass(dst+8, tmp+8, src+8, dstStride, tmpStride, srcStride);\
nengel@2 792 }\
nengel@2 793
nengel@2 794 #define H264_MC(OPNAME, SIZE) \
nengel@2 795 static void OPNAME ## h264_qpel ## SIZE ## _mc00_c (uint8_t *dst, uint8_t *src, int stride){\
nengel@2 796 OPNAME ## pixels ## SIZE ## _c(dst, src, stride, SIZE);\
nengel@2 797 }\
nengel@2 798 \
nengel@2 799 static void OPNAME ## h264_qpel ## SIZE ## _mc10_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 800 uint8_t half[SIZE*SIZE];\
nengel@2 801 put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
nengel@2 802 OPNAME ## pixels ## SIZE ## _l2(dst, src, half, stride, stride, SIZE, SIZE);\
nengel@2 803 }\
nengel@2 804 \
nengel@2 805 static void OPNAME ## h264_qpel ## SIZE ## _mc20_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 806 OPNAME ## h264_qpel ## SIZE ## _h_lowpass(dst, src, stride, stride);\
nengel@2 807 }\
nengel@2 808 \
nengel@2 809 static void OPNAME ## h264_qpel ## SIZE ## _mc30_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 810 uint8_t half[SIZE*SIZE];\
nengel@2 811 put_h264_qpel ## SIZE ## _h_lowpass(half, src, SIZE, stride);\
nengel@2 812 OPNAME ## pixels ## SIZE ## _l2(dst, src+1, half, stride, stride, SIZE, SIZE);\
nengel@2 813 }\
nengel@2 814 \
nengel@2 815 static void OPNAME ## h264_qpel ## SIZE ## _mc01_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 816 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 817 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 818 uint8_t half[SIZE*SIZE];\
nengel@2 819 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 820 put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
nengel@2 821 OPNAME ## pixels ## SIZE ## _l2(dst, full_mid, half, stride, SIZE, SIZE, SIZE);\
nengel@2 822 }\
nengel@2 823 \
nengel@2 824 static void OPNAME ## h264_qpel ## SIZE ## _mc02_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 825 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 826 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 827 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 828 OPNAME ## h264_qpel ## SIZE ## _v_lowpass(dst, full_mid, stride, SIZE);\
nengel@2 829 }\
nengel@2 830 \
nengel@2 831 static void OPNAME ## h264_qpel ## SIZE ## _mc03_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 832 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 833 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 834 uint8_t half[SIZE*SIZE];\
nengel@2 835 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 836 put_h264_qpel ## SIZE ## _v_lowpass(half, full_mid, SIZE, SIZE);\
nengel@2 837 OPNAME ## pixels ## SIZE ## _l2(dst, full_mid+SIZE, half, stride, SIZE, SIZE, SIZE);\
nengel@2 838 }\
nengel@2 839 \
nengel@2 840 static void OPNAME ## h264_qpel ## SIZE ## _mc11_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 841 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 842 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 843 uint8_t halfH[SIZE*SIZE];\
nengel@2 844 uint8_t halfV[SIZE*SIZE];\
nengel@2 845 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
nengel@2 846 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 847 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 848 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
nengel@2 849 }\
nengel@2 850 \
nengel@2 851 static void OPNAME ## h264_qpel ## SIZE ## _mc31_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 852 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 853 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 854 uint8_t halfH[SIZE*SIZE];\
nengel@2 855 uint8_t halfV[SIZE*SIZE];\
nengel@2 856 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
nengel@2 857 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
nengel@2 858 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 859 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
nengel@2 860 }\
nengel@2 861 \
nengel@2 862 static void OPNAME ## h264_qpel ## SIZE ## _mc13_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 863 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 864 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 865 uint8_t halfH[SIZE*SIZE];\
nengel@2 866 uint8_t halfV[SIZE*SIZE];\
nengel@2 867 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
nengel@2 868 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 869 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 870 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
nengel@2 871 }\
nengel@2 872 \
nengel@2 873 static void OPNAME ## h264_qpel ## SIZE ## _mc33_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 874 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 875 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 876 uint8_t halfH[SIZE*SIZE];\
nengel@2 877 uint8_t halfV[SIZE*SIZE];\
nengel@2 878 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
nengel@2 879 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
nengel@2 880 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 881 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfV, stride, SIZE, SIZE, SIZE);\
nengel@2 882 }\
nengel@2 883 \
nengel@2 884 static void OPNAME ## h264_qpel ## SIZE ## _mc22_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 885 int16_t tmp[SIZE*(SIZE+5)];\
nengel@2 886 OPNAME ## h264_qpel ## SIZE ## _hv_lowpass(dst, tmp, src, stride, SIZE, stride);\
nengel@2 887 }\
nengel@2 888 \
nengel@2 889 static void OPNAME ## h264_qpel ## SIZE ## _mc21_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 890 int16_t tmp[SIZE*(SIZE+5)];\
nengel@2 891 uint8_t halfH[SIZE*SIZE];\
nengel@2 892 uint8_t halfHV[SIZE*SIZE];\
nengel@2 893 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src, SIZE, stride);\
nengel@2 894 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
nengel@2 895 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
nengel@2 896 }\
nengel@2 897 \
nengel@2 898 static void OPNAME ## h264_qpel ## SIZE ## _mc23_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 899 int16_t tmp[SIZE*(SIZE+5)];\
nengel@2 900 uint8_t halfH[SIZE*SIZE];\
nengel@2 901 uint8_t halfHV[SIZE*SIZE];\
nengel@2 902 put_h264_qpel ## SIZE ## _h_lowpass(halfH, src + stride, SIZE, stride);\
nengel@2 903 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
nengel@2 904 OPNAME ## pixels ## SIZE ## _l2(dst, halfH, halfHV, stride, SIZE, SIZE, SIZE);\
nengel@2 905 }\
nengel@2 906 \
nengel@2 907 static void OPNAME ## h264_qpel ## SIZE ## _mc12_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 908 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 909 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 910 int16_t tmp[SIZE*(SIZE+5)];\
nengel@2 911 uint8_t halfV[SIZE*SIZE];\
nengel@2 912 uint8_t halfHV[SIZE*SIZE];\
nengel@2 913 copy_block ## SIZE (full, src - stride*2, SIZE, stride, SIZE + 5);\
nengel@2 914 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 915 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
nengel@2 916 OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
nengel@2 917 }\
nengel@2 918 \
nengel@2 919 static void OPNAME ## h264_qpel ## SIZE ## _mc32_c(uint8_t *dst, uint8_t *src, int stride){\
nengel@2 920 uint8_t full[SIZE*(SIZE+5)];\
nengel@2 921 uint8_t * const full_mid= full + SIZE*2;\
nengel@2 922 int16_t tmp[SIZE*(SIZE+5)];\
nengel@2 923 uint8_t halfV[SIZE*SIZE];\
nengel@2 924 uint8_t halfHV[SIZE*SIZE];\
nengel@2 925 copy_block ## SIZE (full, src - stride*2 + 1, SIZE, stride, SIZE + 5);\
nengel@2 926 put_h264_qpel ## SIZE ## _v_lowpass(halfV, full_mid, SIZE, SIZE);\
nengel@2 927 put_h264_qpel ## SIZE ## _hv_lowpass(halfHV, tmp, src, SIZE, SIZE, stride);\
nengel@2 928 OPNAME ## pixels ## SIZE ## _l2(dst, halfV, halfHV, stride, SIZE, SIZE, SIZE);\
nengel@2 929 }\
nengel@2 930
nengel@2 931 #define op_avg(a, b) a = (((a)+cm[((b) + 16)>>5]+1)>>1)
nengel@2 932 #define op_put(a, b) a = cm[((b) + 16)>>5]
nengel@2 933 #define op2_avg(a, b) a = (((a)+cm[((b) + 512)>>10]+1)>>1)
nengel@2 934 #define op2_put(a, b) a = cm[((b) + 512)>>10]
nengel@2 935
nengel@2 936 H264_LOWPASS(put_ , op_put, op2_put)
nengel@2 937 H264_LOWPASS(avg_ , op_avg, op2_avg)
nengel@2 938 H264_MC(put_, 2)
nengel@2 939 H264_MC(put_, 4)
nengel@2 940 H264_MC(put_, 8)
nengel@2 941 H264_MC(put_, 16)
nengel@2 942 H264_MC(avg_, 4)
nengel@2 943 H264_MC(avg_, 8)
nengel@2 944 H264_MC(avg_, 16)
nengel@2 945
nengel@2 946 #undef op_avg
nengel@2 947 #undef op_put
nengel@2 948 #undef op2_avg
nengel@2 949 #undef op2_put
nengel@2 950
nengel@2 951 static void clear_block_c(DCTELEM *block)
nengel@2 952 {
nengel@2 953 memset(block, 0, sizeof(DCTELEM)*64);
nengel@2 954 }
nengel@2 955
nengel@2 956 /**
nengel@2 957 * memset(blocks, 0, sizeof(DCTELEM)*6*64)
nengel@2 958 */
nengel@2 959 static void clear_blocks_c(DCTELEM *blocks)
nengel@2 960 {
nengel@2 961 memset(blocks, 0, sizeof(DCTELEM)*6*64);
nengel@2 962 }
nengel@2 963
nengel@2 964 static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
nengel@2 965
nengel@2 966 /* init static data */
nengel@2 967 av_cold void dsputil_static_init(void)
nengel@2 968 {
nengel@2 969 int i;
nengel@2 970
nengel@2 971 for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;
nengel@2 972 for(i=0;i<MAX_NEG_CROP;i++) {
nengel@2 973 ff_cropTbl[i] = 0;
nengel@2 974 ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;
nengel@2 975 }
nengel@2 976
nengel@2 977 for(i=0;i<512;i++) {
nengel@2 978 ff_squareTbl[i] = (i - 256) * (i - 256);
nengel@2 979 }
nengel@2 980 }
nengel@2 981
nengel@2 982 int ff_check_alignment(void){
nengel@2 983 static int did_fail=0;
nengel@2 984 DECLARE_ALIGNED(16, int, aligned);
nengel@2 985
nengel@2 986 if((intptr_t)&aligned & 15){
nengel@2 987 if(!did_fail){
nengel@2 988 #if HAVE_MMX || HAVE_ALTIVEC
nengel@2 989 av_log(AV_LOG_ERROR,
nengel@2 990 "Compiler did not align stack variables. Libavcodec has been miscompiled\n"
nengel@2 991 "and may be very slow or crash. This is not a bug in libavcodec,\n"
nengel@2 992 "but in the compiler. You may try recompiling using gcc >= 4.2.\n"
nengel@2 993 "Do not report crashes to FFmpeg developers.\n");
nengel@2 994 #endif
nengel@2 995 did_fail=1;
nengel@2 996 }
nengel@2 997 return -1;
nengel@2 998 }
nengel@2 999 return 0;
nengel@2 1000 }
nengel@2 1001
nengel@2 1002 av_cold void dsputil_init(DSPContext* c)
nengel@2 1003 {
nengel@2 1004 (void) avg_pixels2_c; // kill a warning, avg_pixels2_c is a macro created function.
nengel@2 1005 ff_check_alignment();
nengel@2 1006 dsputil_static_init();
nengel@2 1007
nengel@2 1008 c->idct_put= ff_simple_idct_put;
nengel@2 1009 c->idct_add= ff_simple_idct_add;
nengel@2 1010 c->idct = ff_simple_idct;
nengel@2 1011
nengel@2 1012 c->clear_block = clear_block_c;
nengel@2 1013 c->clear_blocks = clear_blocks_c;
nengel@2 1014
nengel@2 1015 #define dspfunc(PFX, IDX, NUM) \
nengel@2 1016 c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_c; \
nengel@2 1017 c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_c; \
nengel@2 1018 c->PFX ## _pixels_tab[IDX][ 2] = PFX ## NUM ## _mc20_c; \
nengel@2 1019 c->PFX ## _pixels_tab[IDX][ 3] = PFX ## NUM ## _mc30_c; \
nengel@2 1020 c->PFX ## _pixels_tab[IDX][ 4] = PFX ## NUM ## _mc01_c; \
nengel@2 1021 c->PFX ## _pixels_tab[IDX][ 5] = PFX ## NUM ## _mc11_c; \
nengel@2 1022 c->PFX ## _pixels_tab[IDX][ 6] = PFX ## NUM ## _mc21_c; \
nengel@2 1023 c->PFX ## _pixels_tab[IDX][ 7] = PFX ## NUM ## _mc31_c; \
nengel@2 1024 c->PFX ## _pixels_tab[IDX][ 8] = PFX ## NUM ## _mc02_c; \
nengel@2 1025 c->PFX ## _pixels_tab[IDX][ 9] = PFX ## NUM ## _mc12_c; \
nengel@2 1026 c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_c; \
nengel@2 1027 c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_c; \
nengel@2 1028 c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_c; \
nengel@2 1029 c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_c; \
nengel@2 1030 c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_c; \
nengel@2 1031 c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_c
nengel@2 1032
nengel@2 1033
nengel@2 1034 dspfunc(put_h264_qpel, 0, 16);
nengel@2 1035 dspfunc(put_h264_qpel, 1, 8);
nengel@2 1036 dspfunc(put_h264_qpel, 2, 4);
nengel@2 1037 dspfunc(put_h264_qpel, 3, 2);
nengel@2 1038 dspfunc(avg_h264_qpel, 0, 16);
nengel@2 1039 dspfunc(avg_h264_qpel, 1, 8);
nengel@2 1040 dspfunc(avg_h264_qpel, 2, 4);
nengel@2 1041
nengel@2 1042 #undef dspfunc
nengel@2 1043 c->put_h264_chroma_pixels_tab[0]= put_h264_chroma_mc8_c;
nengel@2 1044 c->put_h264_chroma_pixels_tab[1]= put_h264_chroma_mc4_c;
nengel@2 1045 c->put_h264_chroma_pixels_tab[2]= put_h264_chroma_mc2_c;
nengel@2 1046 c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_c;
nengel@2 1047 c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_c;
nengel@2 1048 c->avg_h264_chroma_pixels_tab[2]= avg_h264_chroma_mc2_c;
nengel@2 1049
nengel@2 1050
nengel@2 1051 c->prefetch= just_return;
nengel@2 1052
nengel@2 1053 if (HAVE_MMX) dsputil_init_mmx (c);
nengel@2 1054 if (ARCH_ARM) dsputil_init_arm (c);
nengel@2 1055 if (HAVE_ALTIVEC) dsputil_init_ppc (c); //fixme PPC prefetch
nengel@2 1056 }
nengel@2 1057