Libav
me_cmp.c
Go to the documentation of this file.
1 /*
2  * This file is part of Libav.
3  *
4  * Libav is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * Libav is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with Libav; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/attributes.h"
20 #include "avcodec.h"
21 #include "copy_block.h"
22 #include "simple_idct.h"
23 #include "me_cmp.h"
24 #include "mpegvideo.h"
25 #include "config.h"
26 
27 uint32_t ff_square_tab[512] = { 0, };
28 
29 static int sse4_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
30  ptrdiff_t stride, int h)
31 {
32  int s = 0, i;
33  uint32_t *sq = ff_square_tab + 256;
34 
35  for (i = 0; i < h; i++) {
36  s += sq[pix1[0] - pix2[0]];
37  s += sq[pix1[1] - pix2[1]];
38  s += sq[pix1[2] - pix2[2]];
39  s += sq[pix1[3] - pix2[3]];
40  pix1 += stride;
41  pix2 += stride;
42  }
43  return s;
44 }
45 
46 static int sse8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
47  ptrdiff_t stride, int h)
48 {
49  int s = 0, i;
50  uint32_t *sq = ff_square_tab + 256;
51 
52  for (i = 0; i < h; i++) {
53  s += sq[pix1[0] - pix2[0]];
54  s += sq[pix1[1] - pix2[1]];
55  s += sq[pix1[2] - pix2[2]];
56  s += sq[pix1[3] - pix2[3]];
57  s += sq[pix1[4] - pix2[4]];
58  s += sq[pix1[5] - pix2[5]];
59  s += sq[pix1[6] - pix2[6]];
60  s += sq[pix1[7] - pix2[7]];
61  pix1 += stride;
62  pix2 += stride;
63  }
64  return s;
65 }
66 
67 static int sse16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
68  ptrdiff_t stride, int h)
69 {
70  int s = 0, i;
71  uint32_t *sq = ff_square_tab + 256;
72 
73  for (i = 0; i < h; i++) {
74  s += sq[pix1[0] - pix2[0]];
75  s += sq[pix1[1] - pix2[1]];
76  s += sq[pix1[2] - pix2[2]];
77  s += sq[pix1[3] - pix2[3]];
78  s += sq[pix1[4] - pix2[4]];
79  s += sq[pix1[5] - pix2[5]];
80  s += sq[pix1[6] - pix2[6]];
81  s += sq[pix1[7] - pix2[7]];
82  s += sq[pix1[8] - pix2[8]];
83  s += sq[pix1[9] - pix2[9]];
84  s += sq[pix1[10] - pix2[10]];
85  s += sq[pix1[11] - pix2[11]];
86  s += sq[pix1[12] - pix2[12]];
87  s += sq[pix1[13] - pix2[13]];
88  s += sq[pix1[14] - pix2[14]];
89  s += sq[pix1[15] - pix2[15]];
90 
91  pix1 += stride;
92  pix2 += stride;
93  }
94  return s;
95 }
96 
97 static int sum_abs_dctelem_c(int16_t *block)
98 {
99  int sum = 0, i;
100 
101  for (i = 0; i < 64; i++)
102  sum += FFABS(block[i]);
103  return sum;
104 }
105 
106 #define avg2(a, b) ((a + b + 1) >> 1)
107 #define avg4(a, b, c, d) ((a + b + c + d + 2) >> 2)
108 
109 static inline int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
110  ptrdiff_t stride, int h)
111 {
112  int s = 0, i;
113 
114  for (i = 0; i < h; i++) {
115  s += abs(pix1[0] - pix2[0]);
116  s += abs(pix1[1] - pix2[1]);
117  s += abs(pix1[2] - pix2[2]);
118  s += abs(pix1[3] - pix2[3]);
119  s += abs(pix1[4] - pix2[4]);
120  s += abs(pix1[5] - pix2[5]);
121  s += abs(pix1[6] - pix2[6]);
122  s += abs(pix1[7] - pix2[7]);
123  s += abs(pix1[8] - pix2[8]);
124  s += abs(pix1[9] - pix2[9]);
125  s += abs(pix1[10] - pix2[10]);
126  s += abs(pix1[11] - pix2[11]);
127  s += abs(pix1[12] - pix2[12]);
128  s += abs(pix1[13] - pix2[13]);
129  s += abs(pix1[14] - pix2[14]);
130  s += abs(pix1[15] - pix2[15]);
131  pix1 += stride;
132  pix2 += stride;
133  }
134  return s;
135 }
136 
137 static int pix_abs16_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
138  ptrdiff_t stride, int h)
139 {
140  int s = 0, i;
141 
142  for (i = 0; i < h; i++) {
143  s += abs(pix1[0] - avg2(pix2[0], pix2[1]));
144  s += abs(pix1[1] - avg2(pix2[1], pix2[2]));
145  s += abs(pix1[2] - avg2(pix2[2], pix2[3]));
146  s += abs(pix1[3] - avg2(pix2[3], pix2[4]));
147  s += abs(pix1[4] - avg2(pix2[4], pix2[5]));
148  s += abs(pix1[5] - avg2(pix2[5], pix2[6]));
149  s += abs(pix1[6] - avg2(pix2[6], pix2[7]));
150  s += abs(pix1[7] - avg2(pix2[7], pix2[8]));
151  s += abs(pix1[8] - avg2(pix2[8], pix2[9]));
152  s += abs(pix1[9] - avg2(pix2[9], pix2[10]));
153  s += abs(pix1[10] - avg2(pix2[10], pix2[11]));
154  s += abs(pix1[11] - avg2(pix2[11], pix2[12]));
155  s += abs(pix1[12] - avg2(pix2[12], pix2[13]));
156  s += abs(pix1[13] - avg2(pix2[13], pix2[14]));
157  s += abs(pix1[14] - avg2(pix2[14], pix2[15]));
158  s += abs(pix1[15] - avg2(pix2[15], pix2[16]));
159  pix1 += stride;
160  pix2 += stride;
161  }
162  return s;
163 }
164 
165 static int pix_abs16_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
166  ptrdiff_t stride, int h)
167 {
168  int s = 0, i;
169  uint8_t *pix3 = pix2 + stride;
170 
171  for (i = 0; i < h; i++) {
172  s += abs(pix1[0] - avg2(pix2[0], pix3[0]));
173  s += abs(pix1[1] - avg2(pix2[1], pix3[1]));
174  s += abs(pix1[2] - avg2(pix2[2], pix3[2]));
175  s += abs(pix1[3] - avg2(pix2[3], pix3[3]));
176  s += abs(pix1[4] - avg2(pix2[4], pix3[4]));
177  s += abs(pix1[5] - avg2(pix2[5], pix3[5]));
178  s += abs(pix1[6] - avg2(pix2[6], pix3[6]));
179  s += abs(pix1[7] - avg2(pix2[7], pix3[7]));
180  s += abs(pix1[8] - avg2(pix2[8], pix3[8]));
181  s += abs(pix1[9] - avg2(pix2[9], pix3[9]));
182  s += abs(pix1[10] - avg2(pix2[10], pix3[10]));
183  s += abs(pix1[11] - avg2(pix2[11], pix3[11]));
184  s += abs(pix1[12] - avg2(pix2[12], pix3[12]));
185  s += abs(pix1[13] - avg2(pix2[13], pix3[13]));
186  s += abs(pix1[14] - avg2(pix2[14], pix3[14]));
187  s += abs(pix1[15] - avg2(pix2[15], pix3[15]));
188  pix1 += stride;
189  pix2 += stride;
190  pix3 += stride;
191  }
192  return s;
193 }
194 
195 static int pix_abs16_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
196  ptrdiff_t stride, int h)
197 {
198  int s = 0, i;
199  uint8_t *pix3 = pix2 + stride;
200 
201  for (i = 0; i < h; i++) {
202  s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1]));
203  s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2]));
204  s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3]));
205  s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4]));
206  s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5]));
207  s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6]));
208  s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7]));
209  s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8]));
210  s += abs(pix1[8] - avg4(pix2[8], pix2[9], pix3[8], pix3[9]));
211  s += abs(pix1[9] - avg4(pix2[9], pix2[10], pix3[9], pix3[10]));
212  s += abs(pix1[10] - avg4(pix2[10], pix2[11], pix3[10], pix3[11]));
213  s += abs(pix1[11] - avg4(pix2[11], pix2[12], pix3[11], pix3[12]));
214  s += abs(pix1[12] - avg4(pix2[12], pix2[13], pix3[12], pix3[13]));
215  s += abs(pix1[13] - avg4(pix2[13], pix2[14], pix3[13], pix3[14]));
216  s += abs(pix1[14] - avg4(pix2[14], pix2[15], pix3[14], pix3[15]));
217  s += abs(pix1[15] - avg4(pix2[15], pix2[16], pix3[15], pix3[16]));
218  pix1 += stride;
219  pix2 += stride;
220  pix3 += stride;
221  }
222  return s;
223 }
224 
225 static inline int pix_abs8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
226  ptrdiff_t stride, int h)
227 {
228  int s = 0, i;
229 
230  for (i = 0; i < h; i++) {
231  s += abs(pix1[0] - pix2[0]);
232  s += abs(pix1[1] - pix2[1]);
233  s += abs(pix1[2] - pix2[2]);
234  s += abs(pix1[3] - pix2[3]);
235  s += abs(pix1[4] - pix2[4]);
236  s += abs(pix1[5] - pix2[5]);
237  s += abs(pix1[6] - pix2[6]);
238  s += abs(pix1[7] - pix2[7]);
239  pix1 += stride;
240  pix2 += stride;
241  }
242  return s;
243 }
244 
245 static int pix_abs8_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
246  ptrdiff_t stride, int h)
247 {
248  int s = 0, i;
249 
250  for (i = 0; i < h; i++) {
251  s += abs(pix1[0] - avg2(pix2[0], pix2[1]));
252  s += abs(pix1[1] - avg2(pix2[1], pix2[2]));
253  s += abs(pix1[2] - avg2(pix2[2], pix2[3]));
254  s += abs(pix1[3] - avg2(pix2[3], pix2[4]));
255  s += abs(pix1[4] - avg2(pix2[4], pix2[5]));
256  s += abs(pix1[5] - avg2(pix2[5], pix2[6]));
257  s += abs(pix1[6] - avg2(pix2[6], pix2[7]));
258  s += abs(pix1[7] - avg2(pix2[7], pix2[8]));
259  pix1 += stride;
260  pix2 += stride;
261  }
262  return s;
263 }
264 
265 static int pix_abs8_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
266  ptrdiff_t stride, int h)
267 {
268  int s = 0, i;
269  uint8_t *pix3 = pix2 + stride;
270 
271  for (i = 0; i < h; i++) {
272  s += abs(pix1[0] - avg2(pix2[0], pix3[0]));
273  s += abs(pix1[1] - avg2(pix2[1], pix3[1]));
274  s += abs(pix1[2] - avg2(pix2[2], pix3[2]));
275  s += abs(pix1[3] - avg2(pix2[3], pix3[3]));
276  s += abs(pix1[4] - avg2(pix2[4], pix3[4]));
277  s += abs(pix1[5] - avg2(pix2[5], pix3[5]));
278  s += abs(pix1[6] - avg2(pix2[6], pix3[6]));
279  s += abs(pix1[7] - avg2(pix2[7], pix3[7]));
280  pix1 += stride;
281  pix2 += stride;
282  pix3 += stride;
283  }
284  return s;
285 }
286 
287 static int pix_abs8_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
288  ptrdiff_t stride, int h)
289 {
290  int s = 0, i;
291  uint8_t *pix3 = pix2 + stride;
292 
293  for (i = 0; i < h; i++) {
294  s += abs(pix1[0] - avg4(pix2[0], pix2[1], pix3[0], pix3[1]));
295  s += abs(pix1[1] - avg4(pix2[1], pix2[2], pix3[1], pix3[2]));
296  s += abs(pix1[2] - avg4(pix2[2], pix2[3], pix3[2], pix3[3]));
297  s += abs(pix1[3] - avg4(pix2[3], pix2[4], pix3[3], pix3[4]));
298  s += abs(pix1[4] - avg4(pix2[4], pix2[5], pix3[4], pix3[5]));
299  s += abs(pix1[5] - avg4(pix2[5], pix2[6], pix3[5], pix3[6]));
300  s += abs(pix1[6] - avg4(pix2[6], pix2[7], pix3[6], pix3[7]));
301  s += abs(pix1[7] - avg4(pix2[7], pix2[8], pix3[7], pix3[8]));
302  pix1 += stride;
303  pix2 += stride;
304  pix3 += stride;
305  }
306  return s;
307 }
308 
309 static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
310  ptrdiff_t stride, int h)
311 {
312  int score1 = 0, score2 = 0, x, y;
313 
314  for (y = 0; y < h; y++) {
315  for (x = 0; x < 16; x++)
316  score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
317  if (y + 1 < h) {
318  for (x = 0; x < 15; x++)
319  score2 += FFABS(s1[x] - s1[x + stride] -
320  s1[x + 1] + s1[x + stride + 1]) -
321  FFABS(s2[x] - s2[x + stride] -
322  s2[x + 1] + s2[x + stride + 1]);
323  }
324  s1 += stride;
325  s2 += stride;
326  }
327 
328  if (c)
329  return score1 + FFABS(score2) * c->avctx->nsse_weight;
330  else
331  return score1 + FFABS(score2) * 8;
332 }
333 
334 static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
335  ptrdiff_t stride, int h)
336 {
337  int score1 = 0, score2 = 0, x, y;
338 
339  for (y = 0; y < h; y++) {
340  for (x = 0; x < 8; x++)
341  score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
342  if (y + 1 < h) {
343  for (x = 0; x < 7; x++)
344  score2 += FFABS(s1[x] - s1[x + stride] -
345  s1[x + 1] + s1[x + stride + 1]) -
346  FFABS(s2[x] - s2[x + stride] -
347  s2[x + 1] + s2[x + stride + 1]);
348  }
349  s1 += stride;
350  s2 += stride;
351  }
352 
353  if (c)
354  return score1 + FFABS(score2) * c->avctx->nsse_weight;
355  else
356  return score1 + FFABS(score2) * 8;
357 }
358 
360  ptrdiff_t stride, int h)
361 {
362  return 0;
363 }
364 
366 {
367  int i;
368 
369  memset(cmp, 0, sizeof(void *) * 6);
370 
371  for (i = 0; i < 6; i++) {
372  switch (type & 0xFF) {
373  case FF_CMP_SAD:
374  cmp[i] = c->sad[i];
375  break;
376  case FF_CMP_SATD:
377  cmp[i] = c->hadamard8_diff[i];
378  break;
379  case FF_CMP_SSE:
380  cmp[i] = c->sse[i];
381  break;
382  case FF_CMP_DCT:
383  cmp[i] = c->dct_sad[i];
384  break;
385  case FF_CMP_DCT264:
386  cmp[i] = c->dct264_sad[i];
387  break;
388  case FF_CMP_DCTMAX:
389  cmp[i] = c->dct_max[i];
390  break;
391  case FF_CMP_PSNR:
392  cmp[i] = c->quant_psnr[i];
393  break;
394  case FF_CMP_BIT:
395  cmp[i] = c->bit[i];
396  break;
397  case FF_CMP_RD:
398  cmp[i] = c->rd[i];
399  break;
400  case FF_CMP_VSAD:
401  cmp[i] = c->vsad[i];
402  break;
403  case FF_CMP_VSSE:
404  cmp[i] = c->vsse[i];
405  break;
406  case FF_CMP_ZERO:
407  cmp[i] = zero_cmp;
408  break;
409  case FF_CMP_NSSE:
410  cmp[i] = c->nsse[i];
411  break;
412  default:
414  "internal error in cmp function selection\n");
415  }
416  }
417 }
418 
419 #define BUTTERFLY2(o1, o2, i1, i2) \
420  o1 = (i1) + (i2); \
421  o2 = (i1) - (i2);
422 
423 #define BUTTERFLY1(x, y) \
424  { \
425  int a, b; \
426  a = x; \
427  b = y; \
428  x = a + b; \
429  y = a - b; \
430  }
431 
432 #define BUTTERFLYA(x, y) (FFABS((x) + (y)) + FFABS((x) - (y)))
433 
435  uint8_t *src, ptrdiff_t stride, int h)
436 {
437  int i, temp[64], sum = 0;
438 
439  assert(h == 8);
440 
441  for (i = 0; i < 8; i++) {
442  // FIXME: try pointer walks
443  BUTTERFLY2(temp[8 * i + 0], temp[8 * i + 1],
444  src[stride * i + 0] - dst[stride * i + 0],
445  src[stride * i + 1] - dst[stride * i + 1]);
446  BUTTERFLY2(temp[8 * i + 2], temp[8 * i + 3],
447  src[stride * i + 2] - dst[stride * i + 2],
448  src[stride * i + 3] - dst[stride * i + 3]);
449  BUTTERFLY2(temp[8 * i + 4], temp[8 * i + 5],
450  src[stride * i + 4] - dst[stride * i + 4],
451  src[stride * i + 5] - dst[stride * i + 5]);
452  BUTTERFLY2(temp[8 * i + 6], temp[8 * i + 7],
453  src[stride * i + 6] - dst[stride * i + 6],
454  src[stride * i + 7] - dst[stride * i + 7]);
455 
456  BUTTERFLY1(temp[8 * i + 0], temp[8 * i + 2]);
457  BUTTERFLY1(temp[8 * i + 1], temp[8 * i + 3]);
458  BUTTERFLY1(temp[8 * i + 4], temp[8 * i + 6]);
459  BUTTERFLY1(temp[8 * i + 5], temp[8 * i + 7]);
460 
461  BUTTERFLY1(temp[8 * i + 0], temp[8 * i + 4]);
462  BUTTERFLY1(temp[8 * i + 1], temp[8 * i + 5]);
463  BUTTERFLY1(temp[8 * i + 2], temp[8 * i + 6]);
464  BUTTERFLY1(temp[8 * i + 3], temp[8 * i + 7]);
465  }
466 
467  for (i = 0; i < 8; i++) {
468  BUTTERFLY1(temp[8 * 0 + i], temp[8 * 1 + i]);
469  BUTTERFLY1(temp[8 * 2 + i], temp[8 * 3 + i]);
470  BUTTERFLY1(temp[8 * 4 + i], temp[8 * 5 + i]);
471  BUTTERFLY1(temp[8 * 6 + i], temp[8 * 7 + i]);
472 
473  BUTTERFLY1(temp[8 * 0 + i], temp[8 * 2 + i]);
474  BUTTERFLY1(temp[8 * 1 + i], temp[8 * 3 + i]);
475  BUTTERFLY1(temp[8 * 4 + i], temp[8 * 6 + i]);
476  BUTTERFLY1(temp[8 * 5 + i], temp[8 * 7 + i]);
477 
478  sum += BUTTERFLYA(temp[8 * 0 + i], temp[8 * 4 + i]) +
479  BUTTERFLYA(temp[8 * 1 + i], temp[8 * 5 + i]) +
480  BUTTERFLYA(temp[8 * 2 + i], temp[8 * 6 + i]) +
481  BUTTERFLYA(temp[8 * 3 + i], temp[8 * 7 + i]);
482  }
483  return sum;
484 }
485 
487  uint8_t *dummy, ptrdiff_t stride, int h)
488 {
489  int i, temp[64], sum = 0;
490 
491  assert(h == 8);
492 
493  for (i = 0; i < 8; i++) {
494  // FIXME: try pointer walks
495  BUTTERFLY2(temp[8 * i + 0], temp[8 * i + 1],
496  src[stride * i + 0], src[stride * i + 1]);
497  BUTTERFLY2(temp[8 * i + 2], temp[8 * i + 3],
498  src[stride * i + 2], src[stride * i + 3]);
499  BUTTERFLY2(temp[8 * i + 4], temp[8 * i + 5],
500  src[stride * i + 4], src[stride * i + 5]);
501  BUTTERFLY2(temp[8 * i + 6], temp[8 * i + 7],
502  src[stride * i + 6], src[stride * i + 7]);
503 
504  BUTTERFLY1(temp[8 * i + 0], temp[8 * i + 2]);
505  BUTTERFLY1(temp[8 * i + 1], temp[8 * i + 3]);
506  BUTTERFLY1(temp[8 * i + 4], temp[8 * i + 6]);
507  BUTTERFLY1(temp[8 * i + 5], temp[8 * i + 7]);
508 
509  BUTTERFLY1(temp[8 * i + 0], temp[8 * i + 4]);
510  BUTTERFLY1(temp[8 * i + 1], temp[8 * i + 5]);
511  BUTTERFLY1(temp[8 * i + 2], temp[8 * i + 6]);
512  BUTTERFLY1(temp[8 * i + 3], temp[8 * i + 7]);
513  }
514 
515  for (i = 0; i < 8; i++) {
516  BUTTERFLY1(temp[8 * 0 + i], temp[8 * 1 + i]);
517  BUTTERFLY1(temp[8 * 2 + i], temp[8 * 3 + i]);
518  BUTTERFLY1(temp[8 * 4 + i], temp[8 * 5 + i]);
519  BUTTERFLY1(temp[8 * 6 + i], temp[8 * 7 + i]);
520 
521  BUTTERFLY1(temp[8 * 0 + i], temp[8 * 2 + i]);
522  BUTTERFLY1(temp[8 * 1 + i], temp[8 * 3 + i]);
523  BUTTERFLY1(temp[8 * 4 + i], temp[8 * 6 + i]);
524  BUTTERFLY1(temp[8 * 5 + i], temp[8 * 7 + i]);
525 
526  sum +=
527  BUTTERFLYA(temp[8 * 0 + i], temp[8 * 4 + i])
528  + BUTTERFLYA(temp[8 * 1 + i], temp[8 * 5 + i])
529  + BUTTERFLYA(temp[8 * 2 + i], temp[8 * 6 + i])
530  + BUTTERFLYA(temp[8 * 3 + i], temp[8 * 7 + i]);
531  }
532 
533  sum -= FFABS(temp[8 * 0] + temp[8 * 4]); // -mean
534 
535  return sum;
536 }
537 
539  uint8_t *src2, ptrdiff_t stride, int h)
540 {
541  LOCAL_ALIGNED_16(int16_t, temp, [64]);
542 
543  assert(h == 8);
544 
545  s->pdsp.diff_pixels(temp, src1, src2, stride);
546  s->fdsp.fdct(temp);
547  return s->mecc.sum_abs_dctelem(temp);
548 }
549 
550 #if CONFIG_GPL
551 #define DCT8_1D \
552  { \
553  const int s07 = SRC(0) + SRC(7); \
554  const int s16 = SRC(1) + SRC(6); \
555  const int s25 = SRC(2) + SRC(5); \
556  const int s34 = SRC(3) + SRC(4); \
557  const int a0 = s07 + s34; \
558  const int a1 = s16 + s25; \
559  const int a2 = s07 - s34; \
560  const int a3 = s16 - s25; \
561  const int d07 = SRC(0) - SRC(7); \
562  const int d16 = SRC(1) - SRC(6); \
563  const int d25 = SRC(2) - SRC(5); \
564  const int d34 = SRC(3) - SRC(4); \
565  const int a4 = d16 + d25 + (d07 + (d07 >> 1)); \
566  const int a5 = d07 - d34 - (d25 + (d25 >> 1)); \
567  const int a6 = d07 + d34 - (d16 + (d16 >> 1)); \
568  const int a7 = d16 - d25 + (d34 + (d34 >> 1)); \
569  DST(0, a0 + a1); \
570  DST(1, a4 + (a7 >> 2)); \
571  DST(2, a2 + (a3 >> 1)); \
572  DST(3, a5 + (a6 >> 2)); \
573  DST(4, a0 - a1); \
574  DST(5, a6 - (a5 >> 2)); \
575  DST(6, (a2 >> 1) - a3); \
576  DST(7, (a4 >> 2) - a7); \
577  }
578 
579 static int dct264_sad8x8_c(MpegEncContext *s, uint8_t *src1,
580  uint8_t *src2, ptrdiff_t stride, int h)
581 {
582  int16_t dct[8][8];
583  int i, sum = 0;
584 
585  s->pdsp.diff_pixels(dct[0], src1, src2, stride);
586 
587 #define SRC(x) dct[i][x]
588 #define DST(x, v) dct[i][x] = v
589  for (i = 0; i < 8; i++)
590  DCT8_1D
591 #undef SRC
592 #undef DST
593 
594 #define SRC(x) dct[x][i]
595 #define DST(x, v) sum += FFABS(v)
596  for (i = 0; i < 8; i++)
597  DCT8_1D
598 #undef SRC
599 #undef DST
600  return sum;
601 }
602 #endif
603 
605  uint8_t *src2, ptrdiff_t stride, int h)
606 {
607  LOCAL_ALIGNED_16(int16_t, temp, [64]);
608  int sum = 0, i;
609 
610  assert(h == 8);
611 
612  s->pdsp.diff_pixels(temp, src1, src2, stride);
613  s->fdsp.fdct(temp);
614 
615  for (i = 0; i < 64; i++)
616  sum = FFMAX(sum, FFABS(temp[i]));
617 
618  return sum;
619 }
620 
622  uint8_t *src2, ptrdiff_t stride, int h)
623 {
624  LOCAL_ALIGNED_16(int16_t, temp, [64 * 2]);
625  int16_t *const bak = temp + 64;
626  int sum = 0, i;
627 
628  assert(h == 8);
629  s->mb_intra = 0;
630 
631  s->pdsp.diff_pixels(temp, src1, src2, stride);
632 
633  memcpy(bak, temp, 64 * sizeof(int16_t));
634 
635  s->block_last_index[0 /* FIXME */] =
636  s->fast_dct_quantize(s, temp, 0 /* FIXME */, s->qscale, &i);
637  s->dct_unquantize_inter(s, temp, 0, s->qscale);
638  ff_simple_idct_8(temp); // FIXME
639 
640  for (i = 0; i < 64; i++)
641  sum += (temp[i] - bak[i]) * (temp[i] - bak[i]);
642 
643  return sum;
644 }
645 
646 static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2,
647  ptrdiff_t stride, int h)
648 {
649  const uint8_t *scantable = s->intra_scantable.permutated;
650  LOCAL_ALIGNED_16(int16_t, temp, [64]);
651  LOCAL_ALIGNED_16(uint8_t, lsrc1, [64]);
652  LOCAL_ALIGNED_16(uint8_t, lsrc2, [64]);
653  int i, last, run, bits, level, distortion, start_i;
654  const int esc_length = s->ac_esc_length;
655  uint8_t *length, *last_length;
656 
657  assert(h == 8);
658 
659  copy_block8(lsrc1, src1, 8, stride, 8);
660  copy_block8(lsrc2, src2, 8, stride, 8);
661 
662  s->pdsp.diff_pixels(temp, lsrc1, lsrc2, 8);
663 
664  s->block_last_index[0 /* FIXME */] =
665  last =
666  s->fast_dct_quantize(s, temp, 0 /* FIXME */, s->qscale, &i);
667 
668  bits = 0;
669 
670  if (s->mb_intra) {
671  start_i = 1;
672  length = s->intra_ac_vlc_length;
673  last_length = s->intra_ac_vlc_last_length;
674  bits += s->luma_dc_vlc_length[temp[0] + 256]; // FIXME: chroma
675  } else {
676  start_i = 0;
677  length = s->inter_ac_vlc_length;
678  last_length = s->inter_ac_vlc_last_length;
679  }
680 
681  if (last >= start_i) {
682  run = 0;
683  for (i = start_i; i < last; i++) {
684  int j = scantable[i];
685  level = temp[j];
686 
687  if (level) {
688  level += 64;
689  if ((level & (~127)) == 0)
690  bits += length[UNI_AC_ENC_INDEX(run, level)];
691  else
692  bits += esc_length;
693  run = 0;
694  } else
695  run++;
696  }
697  i = scantable[last];
698 
699  level = temp[i] + 64;
700 
701  assert(level - 64);
702 
703  if ((level & (~127)) == 0) {
704  bits += last_length[UNI_AC_ENC_INDEX(run, level)];
705  } else
706  bits += esc_length;
707  }
708 
709  if (last >= 0) {
710  if (s->mb_intra)
711  s->dct_unquantize_intra(s, temp, 0, s->qscale);
712  else
713  s->dct_unquantize_inter(s, temp, 0, s->qscale);
714  }
715 
716  s->idsp.idct_add(lsrc2, 8, temp);
717 
718  distortion = s->mecc.sse[1](NULL, lsrc2, lsrc1, 8, 8);
719 
720  return distortion + ((bits * s->qscale * s->qscale * 109 + 64) >> 7);
721 }
722 
723 static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2,
724  ptrdiff_t stride, int h)
725 {
726  const uint8_t *scantable = s->intra_scantable.permutated;
727  LOCAL_ALIGNED_16(int16_t, temp, [64]);
728  int i, last, run, bits, level, start_i;
729  const int esc_length = s->ac_esc_length;
730  uint8_t *length, *last_length;
731 
732  assert(h == 8);
733 
734  s->pdsp.diff_pixels(temp, src1, src2, stride);
735 
736  s->block_last_index[0 /* FIXME */] =
737  last =
738  s->fast_dct_quantize(s, temp, 0 /* FIXME */, s->qscale, &i);
739 
740  bits = 0;
741 
742  if (s->mb_intra) {
743  start_i = 1;
744  length = s->intra_ac_vlc_length;
745  last_length = s->intra_ac_vlc_last_length;
746  bits += s->luma_dc_vlc_length[temp[0] + 256]; // FIXME: chroma
747  } else {
748  start_i = 0;
749  length = s->inter_ac_vlc_length;
750  last_length = s->inter_ac_vlc_last_length;
751  }
752 
753  if (last >= start_i) {
754  run = 0;
755  for (i = start_i; i < last; i++) {
756  int j = scantable[i];
757  level = temp[j];
758 
759  if (level) {
760  level += 64;
761  if ((level & (~127)) == 0)
762  bits += length[UNI_AC_ENC_INDEX(run, level)];
763  else
764  bits += esc_length;
765  run = 0;
766  } else
767  run++;
768  }
769  i = scantable[last];
770 
771  level = temp[i] + 64;
772 
773  assert(level - 64);
774 
775  if ((level & (~127)) == 0)
776  bits += last_length[UNI_AC_ENC_INDEX(run, level)];
777  else
778  bits += esc_length;
779  }
780 
781  return bits;
782 }
783 
784 #define VSAD_INTRA(size) \
785 static int vsad_intra ## size ## _c(MpegEncContext *c, \
786  uint8_t *s, uint8_t *dummy, \
787  ptrdiff_t stride, int h) \
788 { \
789  int score = 0, x, y; \
790  \
791  for (y = 1; y < h; y++) { \
792  for (x = 0; x < size; x += 4) { \
793  score += FFABS(s[x] - s[x + stride]) + \
794  FFABS(s[x + 1] - s[x + stride + 1]) + \
795  FFABS(s[x + 2] - s[x + 2 + stride]) + \
796  FFABS(s[x + 3] - s[x + 3 + stride]); \
797  } \
798  s += stride; \
799  } \
800  \
801  return score; \
802 }
803 VSAD_INTRA(8)
804 VSAD_INTRA(16)
805 
806 static int vsad16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
807  ptrdiff_t stride, int h)
808 {
809  int score = 0, x, y;
810 
811  for (y = 1; y < h; y++) {
812  for (x = 0; x < 16; x++)
813  score += FFABS(s1[x] - s2[x] - s1[x + stride] + s2[x + stride]);
814  s1 += stride;
815  s2 += stride;
816  }
817 
818  return score;
819 }
820 
821 #define SQ(a) ((a) * (a))
822 #define VSSE_INTRA(size) \
823 static int vsse_intra ## size ## _c(MpegEncContext *c, \
824  uint8_t *s, uint8_t *dummy, \
825  ptrdiff_t stride, int h) \
826 { \
827  int score = 0, x, y; \
828  \
829  for (y = 1; y < h; y++) { \
830  for (x = 0; x < size; x += 4) { \
831  score += SQ(s[x] - s[x + stride]) + \
832  SQ(s[x + 1] - s[x + stride + 1]) + \
833  SQ(s[x + 2] - s[x + stride + 2]) + \
834  SQ(s[x + 3] - s[x + stride + 3]); \
835  } \
836  s += stride; \
837  } \
838  \
839  return score; \
840 }
841 VSSE_INTRA(8)
842 VSSE_INTRA(16)
843 
844 static int vsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2,
845  ptrdiff_t stride, int h)
846 {
847  int score = 0, x, y;
848 
849  for (y = 1; y < h; y++) {
850  for (x = 0; x < 16; x++)
851  score += SQ(s1[x] - s2[x] - s1[x + stride] + s2[x + stride]);
852  s1 += stride;
853  s2 += stride;
854  }
855 
856  return score;
857 }
858 
859 #define WRAPPER8_16_SQ(name8, name16) \
860 static int name16(MpegEncContext *s, uint8_t *dst, uint8_t *src, \
861  ptrdiff_t stride, int h) \
862 { \
863  int score = 0; \
864  \
865  score += name8(s, dst, src, stride, 8); \
866  score += name8(s, dst + 8, src + 8, stride, 8); \
867  if (h == 16) { \
868  dst += 8 * stride; \
869  src += 8 * stride; \
870  score += name8(s, dst, src, stride, 8); \
871  score += name8(s, dst + 8, src + 8, stride, 8); \
872  } \
873  return score; \
874 }
875 
876 WRAPPER8_16_SQ(hadamard8_diff8x8_c, hadamard8_diff16_c)
877 WRAPPER8_16_SQ(hadamard8_intra8x8_c, hadamard8_intra16_c)
878 WRAPPER8_16_SQ(dct_sad8x8_c, dct_sad16_c)
879 #if CONFIG_GPL
880 WRAPPER8_16_SQ(dct264_sad8x8_c, dct264_sad16_c)
881 #endif
882 WRAPPER8_16_SQ(dct_max8x8_c, dct_max16_c)
883 WRAPPER8_16_SQ(quant_psnr8x8_c, quant_psnr16_c)
884 WRAPPER8_16_SQ(rd8x8_c, rd16_c)
885 WRAPPER8_16_SQ(bit8x8_c, bit16_c)
886 
888 {
889  int i;
890 
891  for (i = 0; i < 512; i++)
892  ff_square_tab[i] = (i - 256) * (i - 256);
893 }
894 
896 {
898 
899  /* TODO [0] 16 [1] 8 */
900  c->pix_abs[0][0] = pix_abs16_c;
901  c->pix_abs[0][1] = pix_abs16_x2_c;
902  c->pix_abs[0][2] = pix_abs16_y2_c;
903  c->pix_abs[0][3] = pix_abs16_xy2_c;
904  c->pix_abs[1][0] = pix_abs8_c;
905  c->pix_abs[1][1] = pix_abs8_x2_c;
906  c->pix_abs[1][2] = pix_abs8_y2_c;
907  c->pix_abs[1][3] = pix_abs8_xy2_c;
908 
909 #define SET_CMP_FUNC(name) \
910  c->name[0] = name ## 16_c; \
911  c->name[1] = name ## 8x8_c;
912 
913  SET_CMP_FUNC(hadamard8_diff)
914  c->hadamard8_diff[4] = hadamard8_intra16_c;
916  SET_CMP_FUNC(dct_sad)
917  SET_CMP_FUNC(dct_max)
918 #if CONFIG_GPL
919  SET_CMP_FUNC(dct264_sad)
920 #endif
921  c->sad[0] = pix_abs16_c;
922  c->sad[1] = pix_abs8_c;
923  c->sse[0] = sse16_c;
924  c->sse[1] = sse8_c;
925  c->sse[2] = sse4_c;
926  SET_CMP_FUNC(quant_psnr)
927  SET_CMP_FUNC(rd)
928  SET_CMP_FUNC(bit)
929  c->vsad[0] = vsad16_c;
930  c->vsad[4] = vsad_intra16_c;
931  c->vsad[5] = vsad_intra8_c;
932  c->vsse[0] = vsse16_c;
933  c->vsse[4] = vsse_intra16_c;
934  c->vsse[5] = vsse_intra8_c;
935  c->nsse[0] = nsse16_c;
936  c->nsse[1] = nsse8_c;
937 
938  if (ARCH_ARM)
939  ff_me_cmp_init_arm(c, avctx);
940  if (ARCH_PPC)
941  ff_me_cmp_init_ppc(c, avctx);
942  if (ARCH_X86)
943  ff_me_cmp_init_x86(c, avctx);
944 }
#define avg4(a, b, c, d)
Definition: me_cmp.c:107
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
Definition: me_cmp.c:895
av_cold void ff_me_cmp_init_ppc(MECmpContext *c, AVCodecContext *avctx)
Definition: me_cmp.c:747
IDCTDSPContext idsp
Definition: mpegvideo.h:221
static int dct_max8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, ptrdiff_t stride, int h)
Definition: me_cmp.c:604
int(* sum_abs_dctelem)(int16_t *block)
Definition: me_cmp.h:40
static int hadamard8_intra8x8_c(MpegEncContext *s, uint8_t *src, uint8_t *dummy, ptrdiff_t stride, int h)
Definition: me_cmp.c:486
#define FF_CMP_DCTMAX
Definition: avcodec.h:1841
#define BUTTERFLY1(x, y)
Definition: me_cmp.c:423
#define ARCH_PPC
Definition: config.h:24
#define DST(x, y)
Definition: vp9dsp.c:593
static int zero_cmp(MpegEncContext *s, uint8_t *a, uint8_t *b, ptrdiff_t stride, int h)
Definition: me_cmp.c:359
me_cmp_func dct_max[6]
Definition: me_cmp.h:52
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, ptrdiff_t stride, int h)
Definition: me_cmp.c:334
mpegvideo header.
void(* idct_add)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
Definition: idctdsp.h:77
uint8_t permutated[64]
Definition: idctdsp.h:31
uint8_t run
Definition: svq3.c:203
uint8_t * intra_ac_vlc_length
Definition: mpegvideo.h:304
#define UNI_AC_ENC_INDEX(run, level)
Definition: mpegvideo.h:309
int stride
Definition: mace.c:144
int qscale
QP.
Definition: mpegvideo.h:199
me_cmp_func dct_sad[6]
Definition: me_cmp.h:45
uint32_t ff_square_tab[512]
Definition: me_cmp.c:27
Macro definitions for various function/variable attributes.
static int vsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, ptrdiff_t stride, int h)
Definition: me_cmp.c:844
me_cmp_func hadamard8_diff[6]
Definition: me_cmp.h:44
static int dct_sad8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, ptrdiff_t stride, int h)
Definition: me_cmp.c:538
static int16_t block[64]
Definition: dct.c:97
static int pix_abs16_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:195
uint8_t bits
Definition: crc.c:252
uint8_t
#define av_cold
Definition: attributes.h:66
#define SET_CMP_FUNC(name)
static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, ptrdiff_t stride, int h)
Definition: me_cmp.c:646
#define b
Definition: input.c:52
#define FF_CMP_VSSE
Definition: avcodec.h:1839
me_cmp_func dct264_sad[6]
Definition: me_cmp.h:53
void(* diff_pixels)(int16_t *block, const uint8_t *s1, const uint8_t *s2, int stride)
Definition: pixblockdsp.h:30
me_cmp_func nsse[6]
Definition: me_cmp.h:51
int(* me_cmp_func)(struct MpegEncContext *c, uint8_t *blk1, uint8_t *blk2, ptrdiff_t stride, int h)
Definition: me_cmp.h:34
#define BUTTERFLY2(o1, o2, i1, i2)
Definition: me_cmp.c:419
static int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:109
#define avg2(a, b)
Definition: me_cmp.c:106
#define FF_CMP_SSE
Definition: avcodec.h:1831
#define src
Definition: vp8dsp.c:254
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:124
uint8_t * inter_ac_vlc_last_length
Definition: mpegvideo.h:307
#define ARCH_X86
Definition: config.h:33
static int sse4_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:29
PixblockDSPContext pdsp
Definition: mpegvideo.h:225
me_cmp_func pix_abs[2][4]
Definition: me_cmp.h:62
#define FFMAX(a, b)
Definition: common.h:64
av_cold void ff_me_cmp_init_static(void)
Definition: me_cmp.c:887
me_cmp_func bit[6]
Definition: me_cmp.h:47
uint8_t * intra_ac_vlc_last_length
Definition: mpegvideo.h:305
me_cmp_func vsse[6]
Definition: me_cmp.h:50
#define FF_CMP_BIT
Definition: avcodec.h:1835
#define ARCH_ARM
Definition: config.h:14
static int pix_abs8_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:287
me_cmp_func vsad[6]
Definition: me_cmp.h:49
#define FFABS(a)
Definition: common.h:61
void(* dct_unquantize_inter)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
Definition: mpegvideo.h:498
#define WRAPPER8_16_SQ(name8, name16)
Definition: me_cmp.c:859
void(* dct_unquantize_intra)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
Definition: mpegvideo.h:496
static av_always_inline int cmp(MpegEncContext *s, const int x, const int y, const int subx, const int suby, const int size, const int h, int ref_index, int src_index, me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags)
compares a block (either a full macroblock or a partition thereof) against a proposed motion-compensa...
Definition: motion_est.c:257
int block_last_index[12]
last non zero coefficient in block
Definition: mpegvideo.h:81
static int sse16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:67
void(* fdct)(int16_t *block)
Definition: fdctdsp.h:27
static int pix_abs8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:225
int ac_esc_length
num of bits needed to encode the longest esc
Definition: mpegvideo.h:303
#define FF_CMP_SAD
Definition: avcodec.h:1830
static int sse8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:46
NULL
Definition: eval.c:55
#define src1
Definition: h264pred.c:139
uint8_t * luma_dc_vlc_length
Definition: mpegvideo.h:308
me_cmp_func rd[6]
Definition: me_cmp.h:48
Libavcodec external API header.
#define FF_CMP_RD
Definition: avcodec.h:1836
void ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type)
Definition: me_cmp.c:365
static int vsad16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, ptrdiff_t stride, int h)
Definition: me_cmp.c:806
main external API structure.
Definition: avcodec.h:1409
ScanTable intra_scantable
Definition: mpegvideo.h:86
#define FF_CMP_NSSE
Definition: avcodec.h:1840
#define FF_CMP_SATD
Definition: avcodec.h:1832
FDCTDSPContext fdsp
Definition: mpegvideo.h:219
#define VSSE_INTRA(size)
Definition: me_cmp.c:822
#define FF_CMP_DCT
Definition: avcodec.h:1833
uint8_t * inter_ac_vlc_length
Definition: mpegvideo.h:306
static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, ptrdiff_t stride, int h)
Definition: me_cmp.c:309
av_cold void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx)
#define FF_CMP_PSNR
Definition: avcodec.h:1834
#define DCT8_1D(src, srcstride, dst, dststride)
Definition: h264dsp.c:91
#define FF_CMP_DCT264
Definition: avcodec.h:1842
#define SQ(a)
Definition: me_cmp.c:821
static int quant_psnr8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, ptrdiff_t stride, int h)
Definition: me_cmp.c:621
uint8_t level
Definition: svq3.c:204
me_cmp_func sad[6]
Definition: me_cmp.h:42
me_cmp_func sse[6]
Definition: me_cmp.h:43
#define FF_CMP_ZERO
Definition: avcodec.h:1837
MpegEncContext.
Definition: mpegvideo.h:76
struct AVCodecContext * avctx
Definition: mpegvideo.h:93
static int pix_abs8_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:265
int(* fast_dct_quantize)(struct MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow)
Definition: mpegvideo.h:501
MECmpContext mecc
Definition: mpegvideo.h:222
int nsse_weight
noise vs.
Definition: avcodec.h:2873
static int pix_abs16_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:137
#define BUTTERFLYA(x, y)
Definition: me_cmp.c:432
static int pix_abs8_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:245
#define FF_CMP_VSAD
Definition: avcodec.h:1838
static int pix_abs16_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t stride, int h)
Definition: me_cmp.c:165
static int sum_abs_dctelem_c(int16_t *block)
Definition: me_cmp.c:97
simple idct header.
me_cmp_func quant_psnr[6]
Definition: me_cmp.h:46
static void copy_block8(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, int h)
Definition: copy_block.h:36
#define LOCAL_ALIGNED_16(t, v,...)
Definition: internal.h:111
static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, ptrdiff_t stride, int h)
Definition: me_cmp.c:723
static int hadamard8_diff8x8_c(MpegEncContext *s, uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h)
Definition: me_cmp.c:434
void ff_me_cmp_init_x86(MECmpContext *c, AVCodecContext *avctx)
#define VSAD_INTRA(size)
Definition: me_cmp.c:784
void ff_simple_idct_8(int16_t *block)
#define SRC(x, y)