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]];
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]];
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]];
101 for (i = 0; i < 64; i++)
102 sum +=
FFABS(block[i]);
106 #define avg2(a, b) ((a + b + 1) >> 1)
107 #define avg4(a, b, c, d) ((a + b + c + d + 2) >> 2)
110 int line_size,
int h)
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]);
138 int line_size,
int h)
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]));
166 int line_size,
int h)
169 uint8_t *pix3 = pix2 + line_size;
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]));
196 int line_size,
int h)
199 uint8_t *pix3 = pix2 + line_size;
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]));
226 int line_size,
int h)
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]);
246 int line_size,
int h)
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]));
266 int line_size,
int h)
269 uint8_t *pix3 = pix2 + line_size;
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]));
288 int line_size,
int h)
291 uint8_t *pix3 = pix2 + line_size;
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]));
311 int score1 = 0, score2 = 0, x, y;
313 for (y = 0; y < h; y++) {
314 for (x = 0; x < 16; x++)
315 score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
317 for (x = 0; x < 15; x++)
318 score2 +=
FFABS(s1[x] - s1[x + stride] -
319 s1[x + 1] + s1[x + stride + 1]) -
320 FFABS(s2[x] - s2[x + stride] -
321 s2[x + 1] + s2[x + stride + 1]);
330 return score1 +
FFABS(score2) * 8;
335 int score1 = 0, score2 = 0, x, y;
337 for (y = 0; y < h; y++) {
338 for (x = 0; x < 8; x++)
339 score1 += (s1[x] - s2[x]) * (s1[x] - s2[x]);
341 for (x = 0; x < 7; x++)
342 score2 +=
FFABS(s1[x] - s1[x + stride] -
343 s1[x + 1] + s1[x + stride + 1]) -
344 FFABS(s2[x] - s2[x + stride] -
345 s2[x + 1] + s2[x + stride + 1]);
354 return score1 +
FFABS(score2) * 8;
367 memset(cmp, 0,
sizeof(
void *) * 6);
369 for (i = 0; i < 6; i++) {
370 switch (type & 0xFF) {
412 "internal error in cmp function selection\n");
417 #define BUTTERFLY2(o1, o2, i1, i2) \
421 #define BUTTERFLY1(x, y) \
430 #define BUTTERFLYA(x, y) (FFABS((x) + (y)) + FFABS((x) - (y)))
435 int i, temp[64], sum = 0;
439 for (i = 0; i < 8; i++) {
442 src[stride * i + 0] - dst[stride * i + 0],
443 src[stride * i + 1] - dst[stride * i + 1]);
445 src[stride * i + 2] - dst[stride * i + 2],
446 src[stride * i + 3] - dst[stride * i + 3]);
448 src[stride * i + 4] - dst[stride * i + 4],
449 src[stride * i + 5] - dst[stride * i + 5]);
451 src[stride * i + 6] - dst[stride * i + 6],
452 src[stride * i + 7] - dst[stride * i + 7]);
465 for (i = 0; i < 8; i++) {
476 sum +=
BUTTERFLYA(temp[8 * 0 + i], temp[8 * 4 + i]) +
477 BUTTERFLYA(temp[8 * 1 + i], temp[8 * 5 + i]) +
478 BUTTERFLYA(temp[8 * 2 + i], temp[8 * 6 + i]) +
487 int i, temp[64], sum = 0;
491 for (i = 0; i < 8; i++) {
494 src[stride * i + 0], src[stride * i + 1]);
496 src[stride * i + 2], src[stride * i + 3]);
498 src[stride * i + 4], src[stride * i + 5]);
500 src[stride * i + 6], src[stride * i + 7]);
513 for (i = 0; i < 8; i++) {
526 +
BUTTERFLYA(temp[8 * 1 + i], temp[8 * 5 + i])
527 +
BUTTERFLYA(temp[8 * 2 + i], temp[8 * 6 + i])
528 +
BUTTERFLYA(temp[8 * 3 + i], temp[8 * 7 + i]);
531 sum -=
FFABS(temp[8 * 0] + temp[8 * 4]);
551 const int s07 = SRC(0) + SRC(7); \
552 const int s16 = SRC(1) + SRC(6); \
553 const int s25 = SRC(2) + SRC(5); \
554 const int s34 = SRC(3) + SRC(4); \
555 const int a0 = s07 + s34; \
556 const int a1 = s16 + s25; \
557 const int a2 = s07 - s34; \
558 const int a3 = s16 - s25; \
559 const int d07 = SRC(0) - SRC(7); \
560 const int d16 = SRC(1) - SRC(6); \
561 const int d25 = SRC(2) - SRC(5); \
562 const int d34 = SRC(3) - SRC(4); \
563 const int a4 = d16 + d25 + (d07 + (d07 >> 1)); \
564 const int a5 = d07 - d34 - (d25 + (d25 >> 1)); \
565 const int a6 = d07 + d34 - (d16 + (d16 >> 1)); \
566 const int a7 = d16 - d25 + (d34 + (d34 >> 1)); \
568 DST(1, a4 + (a7 >> 2)); \
569 DST(2, a2 + (a3 >> 1)); \
570 DST(3, a5 + (a6 >> 2)); \
572 DST(5, a6 - (a5 >> 2)); \
573 DST(6, (a2 >> 1) - a3); \
574 DST(7, (a4 >> 2) - a7); \
585 #define SRC(x) dct[i][x]
586 #define DST(x, v) dct[i][x] = v
587 for (i = 0; i < 8; i++)
592 #define
SRC(x) dct[x][i]
593 #define DST(x, v) sum += FFABS(v)
594 for (i = 0; i < 8; i++)
603 uint8_t *src2,
int stride,
int h)
613 for (i = 0; i < 64; i++)
620 uint8_t *src2,
int stride,
int h)
623 int16_t *
const bak = temp + 64;
631 memcpy(bak, temp, 64 *
sizeof(int16_t));
638 for (i = 0; i < 64; i++)
639 sum += (temp[i] - bak[i]) * (temp[i] - bak[i]);
679 if (last >= start_i) {
681 for (i = start_i; i < last; i++) {
682 int j = scantable[i];
687 if ((level & (~127)) == 0)
697 level = temp[i] + 64;
701 if ((level & (~127)) == 0) {
716 distortion = s->
mecc.
sse[1](
NULL, lsrc2, lsrc1, 8, 8);
718 return distortion + ((bits * s->
qscale * s->
qscale * 109 + 64) >> 7);
751 if (last >= start_i) {
753 for (i = start_i; i < last; i++) {
754 int j = scantable[i];
759 if ((level & (~127)) == 0)
769 level = temp[i] + 64;
773 if ((level & (~127)) == 0)
782 #define VSAD_INTRA(size) \
783 static int vsad_intra ## size ## _c(MpegEncContext *c, \
784 uint8_t *s, uint8_t *dummy, \
787 int score = 0, x, y; \
789 for (y = 1; y < h; y++) { \
790 for (x = 0; x < size; x += 4) { \
791 score += FFABS(s[x] - s[x + stride]) + \
792 FFABS(s[x + 1] - s[x + stride + 1]) + \
793 FFABS(s[x + 2] - s[x + 2 + stride]) + \
794 FFABS(s[x + 3] - s[x + 3 + stride]); \
809 for (y = 1; y < h; y++) {
810 for (x = 0; x < 16; x++)
811 score +=
FFABS(s1[x] - s2[x] - s1[x + stride] + s2[x + stride]);
819 #define SQ(a) ((a) * (a))
820 #define VSSE_INTRA(size) \
821 static int vsse_intra ## size ## _c(MpegEncContext *c, \
822 uint8_t *s, uint8_t *dummy, \
825 int score = 0, x, y; \
827 for (y = 1; y < h; y++) { \
828 for (x = 0; x < size; x += 4) { \
829 score += SQ(s[x] - s[x + stride]) + \
830 SQ(s[x + 1] - s[x + stride + 1]) + \
831 SQ(s[x + 2] - s[x + stride + 2]) + \
832 SQ(s[x + 3] - s[x + stride + 3]); \
847 for (y = 1; y < h; y++) {
848 for (x = 0; x < 16; x++)
849 score +=
SQ(s1[x] - s2[x] - s1[x + stride] + s2[x + stride]);
857 #define WRAPPER8_16_SQ(name8, name16) \
858 static int name16(MpegEncContext *s, uint8_t *dst, uint8_t *src, \
863 score += name8(s, dst, src, stride, 8); \
864 score += name8(s, dst + 8, src + 8, stride, 8); \
868 score += name8(s, dst, src, stride, 8); \
869 score += name8(s, dst + 8, src + 8, stride, 8); \
889 for (i = 0; i < 512; i++)
907 #define SET_CMP_FUNC(name) \
908 c->name[0] = name ## 16_c; \
909 c->name[1] = name ## 8x8_c;
928 c->
vsad[4] = vsad_intra16_c;
929 c->
vsad[5] = vsad_intra8_c;
931 c->
vsse[4] = vsse_intra16_c;
932 c->
vsse[5] = vsse_intra8_c;
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
static int pix_abs16_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
av_cold void ff_me_cmp_init_ppc(MECmpContext *c, AVCodecContext *avctx)
int(* sum_abs_dctelem)(int16_t *block)
static int nsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
static int dct_sad8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int stride, int h)
void(* idct_add)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
uint8_t * intra_ac_vlc_length
#define UNI_AC_ENC_INDEX(run, level)
int(* me_cmp_func)(struct MpegEncContext *c, uint8_t *blk1, uint8_t *blk2, int line_size, int h)
uint32_t ff_square_tab[512]
Macro definitions for various function/variable attributes.
me_cmp_func hadamard8_diff[6]
static int quant_psnr8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int stride, int h)
static int pix_abs8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
static int sse16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
#define SET_CMP_FUNC(name)
me_cmp_func dct264_sad[6]
void(* diff_pixels)(int16_t *block, const uint8_t *s1, const uint8_t *s2, int stride)
#define BUTTERFLY2(o1, o2, i1, i2)
static int vsse16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
static int pix_abs8_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
static int hadamard8_intra8x8_c(MpegEncContext *s, uint8_t *src, uint8_t *dummy, int stride, int h)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int sse8_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
uint8_t * inter_ac_vlc_last_length
static int dct_max8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int stride, int h)
static int nsse8_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
static int vsad16_c(MpegEncContext *c, uint8_t *s1, uint8_t *s2, int stride, int h)
void av_log(void *avcl, int level, const char *fmt,...)
me_cmp_func pix_abs[2][4]
av_cold void ff_me_cmp_init_static(void)
uint8_t * intra_ac_vlc_last_length
static int pix_abs8_x2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
#define WRAPPER8_16_SQ(name8, name16)
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...
int block_last_index[12]
last non zero coefficient in block
void(* fdct)(int16_t *block)
static int zero_cmp(MpegEncContext *s, uint8_t *a, uint8_t *b, int stride, int h)
int ac_esc_length
num of bits needed to encode the longest esc
uint8_t * luma_dc_vlc_length
Libavcodec external API header.
static int bit8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int stride, int h)
void ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type)
main external API structure.
ScanTable intra_scantable
static int pix_abs8_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
uint8_t * inter_ac_vlc_length
av_cold void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx)
static int pix_abs16_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
static int hadamard8_diff8x8_c(MpegEncContext *s, uint8_t *dst, uint8_t *src, int stride, int h)
struct AVCodecContext * avctx
void(* dct_unquantize_inter)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
static int sse4_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
int(* fast_dct_quantize)(struct MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow)
static int pix_abs16_xy2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
static int sum_abs_dctelem_c(int16_t *block)
void(* dct_unquantize_intra)(struct MpegEncContext *s, int16_t *block, int n, int qscale)
me_cmp_func quant_psnr[6]
static void copy_block8(uint8_t *dst, const uint8_t *src, int dstStride, int srcStride, int h)
static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int stride, int h)
#define LOCAL_ALIGNED_16(t, v,...)
void ff_me_cmp_init_x86(MECmpContext *c, AVCodecContext *avctx)
static int pix_abs16_y2_c(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
void ff_simple_idct_8(int16_t *block)