1 /*
2 * Copyright (C) 2004-2010 Michael Niedermayer <michaelni@gmx.at>
3 * Copyright (C) 2008 David Conrad
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
27
29 int max_allocated_lines, int line_width,
31 {
32 int i;
33
45 }
46
47 for (i = 0; i < max_allocated_lines; i++) {
50 for (i--; i >=0; i--)
55 }
56 }
57
59 return 0;
60 }
61
63 {
65
67 // av_assert1(!buf->line[line]);
69 return buf->
line[line];
70
74
76 }
77
79 {
81
84
85 buffer = buf->
line[line];
88 buf->
line[line] = NULL;
89 }
90
92 {
93 int i;
97 }
98
100 {
101 int i;
103
108 }
109
111 {
112 while ((unsigned)v > (unsigned)m) {
114 if (v < 0)
116 }
118 }
119
121 int dst_step, int src_step, int ref_step,
124 {
126 const int mirror_right = (width & 1) ^ highpass;
127 const int w = (width >> 1) - 1 + (highpass & width);
128 int i;
129
130 #define LIFT(src, ref, inv) ((src) + ((inv) ? -(ref) : +(ref)))
131 if (mirror_left) {
132 dst[0] =
LIFT(src[0], ((mul * 2 * ref[0] + add) >> shift), inverse);
133 dst += dst_step;
134 src += src_step;
135 }
136
137 for (i = 0; i < w; i++)
138 dst[i * dst_step] =
LIFT(src[i * src_step],
139 ((mul * (ref[i * ref_step] +
140 ref[(i + 1) * ref_step]) +
141 add) >> shift),
142 inverse);
143
144 if (mirror_right)
145 dst[w * dst_step] =
LIFT(src[w * src_step],
146 ((mul * 2 * ref[w * ref_step] + add) >> shift),
147 inverse);
148 }
149
151 int dst_step, int src_step, int ref_step,
154 {
156 const int mirror_right = (width & 1) ^ highpass;
157 const int w = (width >> 1) - 1 + (highpass & width);
158 int i;
159
161 #define LIFTS(src, ref, inv) \
162 ((inv) ? (src) + (((ref) + 4 * (src)) >> shift) \
163 : -((-16 * (src) + (ref) + add / \
164 4 + 1 + (5 << 25)) / (5 * 4) - (1 << 23)))
165 if (mirror_left) {
166 dst[0] =
LIFTS(src[0], mul * 2 * ref[0] + add, inverse);
167 dst += dst_step;
168 src += src_step;
169 }
170
171 for (i = 0; i < w; i++)
172 dst[i * dst_step] =
LIFTS(src[i * src_step],
173 mul * (ref[i * ref_step] +
174 ref[(i + 1) * ref_step]) + add,
175 inverse);
176
177 if (mirror_right)
178 dst[w * dst_step] =
LIFTS(src[w * src_step],
179 mul * 2 * ref[w * ref_step] + add,
180 inverse);
181 }
182
184 {
185 const int width2 = width >> 1;
186 int x;
187 const int w2 = (width + 1) >> 1;
188
189 for (x = 0; x < width2; x++) {
190 temp[x] = b[2 * x];
191 temp[x + w2] = b[2 * x + 1];
192 }
193 if (width & 1)
194 temp[x] = b[2 * x];
195 lift(b + w2, temp + w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0);
196 lift(b, temp, b + w2, 1, 1, 1, width, 1, 2, 2, 0, 0);
197 }
198
201 {
202 int i;
203
204 for (i = 0; i <
width; i++)
205 b1[i] -= (b0[i] + b2[i]) >> 1;
206 }
207
210 {
211 int i;
212
213 for (i = 0; i <
width; i++)
214 b1[i] += (b0[i] + b2[i] + 2) >> 2;
215 }
216
219 {
223
224 for (y = -2; y <
height; y += 2) {
227
228 if (y + 1 < (unsigned)height)
230 if (y + 2 < (unsigned)height)
232
233 if (y + 1 < (unsigned)height)
235 if (y + 0 < (unsigned)height)
237
238 b0 = b2;
239 b1 = b3;
240 }
241 }
242
244 {
245 const int w2 = (width + 1) >> 1;
246
247 lift(temp + w2, b + 1, b, 1, 2, 2, width,
W_AM,
W_AO,
W_AS, 1, 1);
248 liftS(temp, b, temp + w2, 1, 2, 1, width,
W_BM,
W_BO,
W_BS, 0, 0);
249 lift(b + w2, temp + w2, temp, 1, 1, 1, width,
W_CM,
W_CO,
W_CS, 1, 0);
250 lift(b, temp, b + w2, 1, 1, 1, width,
W_DM,
W_DO,
W_DS, 0, 0);
251 }
252
255 {
256 int i;
257
258 for (i = 0; i <
width; i++)
260 }
261
264 {
265 int i;
266
267 for (i = 0; i <
width; i++)
269 }
270
273 {
274 int i;
275
276 for (i = 0; i <
width; i++)
277 b1[i] = (16 * 4 * b1[i] - 4 * (b0[i] + b2[i]) +
W_BO * 5 + (5 << 27)) /
278 (5 * 16) - (1 << 23);
279 }
280
283 {
284 int i;
285
286 for (i = 0; i <
width; i++)
288 }
289
292 {
298
299 for (y = -4; y <
height; y += 2) {
302
303 if (y + 3 < (unsigned)height)
305 if (y + 4 < (unsigned)height)
307
308 if (y + 3 < (unsigned)height)
310 if (y + 2 < (unsigned)height)
312 if (y + 1 < (unsigned)height)
314 if (y + 0 < (unsigned)height)
316
317 b0 = b2;
318 b1 = b3;
319 b2 = b4;
320 b3 = b5;
321 }
322 }
323
325 int stride,
int type,
int decomposition_count)
326 {
328
329 for (level = 0; level < decomposition_count; level++) {
330 switch (type) {
333 width >> level, height >> level,
334 stride << level);
335 break;
338 width >> level, height >> level,
339 stride << level);
340 break;
341 }
342 }
343 }
344
346 {
347 const int width2 = width >> 1;
348 const int w2 = (width + 1) >> 1;
349 int x;
350
351 for (x = 0; x < width2; x++) {
352 temp[2 * x] = b[x];
353 temp[2 * x + 1] = b[x + w2];
354 }
355 if (width & 1)
356 temp[2 * x] = b[x];
357
358 b[0] = temp[0] - ((temp[1] + 1) >> 1);
359 for (x = 2; x < width - 1; x += 2) {
360 b[x] = temp[x] - ((temp[x - 1] + temp[x + 1] + 2) >> 2);
361 b[x - 1] = temp[x - 1] + ((b[x - 2] + b[x] + 1) >> 1);
362 }
363 if (width & 1) {
364 b[x] = temp[x] - ((temp[x - 1] + 1) >> 1);
365 b[x - 1] = temp[x - 1] + ((b[x - 2] + b[x] + 1) >> 1);
366 } else
367 b[x - 1] = temp[x - 1] + b[x - 2];
368 }
369
372 {
373 int i;
374
375 for (i = 0; i <
width; i++)
376 b1[i] += (b0[i] + b2[i]) >> 1;
377 }
378
381 {
382 int i;
383
384 for (i = 0; i <
width; i++)
385 b1[i] -= (b0[i] + b2[i] + 2) >> 2;
386 }
387
389 int height,
int stride_line)
390 {
392 mirror(-1 - 1, height - 1) * stride_line);
395 }
396
399 {
403 }
404
408 int stride_line)
409 {
411
415 mirror(y + 1, height - 1) *
416 stride_line);
418 mirror(y + 2, height - 1) *
419 stride_line);
420
421 if (y + 1 < (unsigned)height && y < (unsigned)height) {
422 int x;
423
424 for (x = 0; x <
width; x++) {
425 b2[x] -= (b1[x] + b3[x] + 2) >> 2;
426 b1[x] += (b0[x] + b2[x]) >> 1;
427 }
428 } else {
429 if (y + 1 < (
unsigned)
height)
431 if (y + 0 < (
unsigned)
height)
433 }
434
435 if (y - 1 < (
unsigned)
height)
437 if (y + 0 < (
unsigned)
height)
439
443 }
444
448 {
454
455 if (y + 1 < (unsigned)height)
457 if (y + 0 < (unsigned)height)
459
460 if (y - 1 < (unsigned)height)
462 if (y + 0 < (unsigned)height)
464
468 }
469
471 {
472 const int w2 = (width + 1) >> 1;
473 int x;
474
475 temp[0] = b[0] - ((3 * b[w2] + 2) >> 2);
476 for (x = 1; x < (width >> 1); x++) {
477 temp[2 * x] = b[x] - ((3 * (b[x + w2 - 1] + b[x + w2]) + 4) >> 3);
478 temp[2 * x - 1] = b[x + w2 - 1] - temp[2 * x - 2] - temp[2 * x];
479 }
480 if (width & 1) {
481 temp[2 * x] = b[x] - ((3 * b[x + w2 - 1] + 2) >> 2);
482 temp[2 * x - 1] = b[x + w2 - 1] - temp[2 * x - 2] - temp[2 * x];
483 } else
484 temp[2 * x - 1] = b[x + w2 - 1] - 2 * temp[2 * x - 2];
485
486 b[0] = temp[0] + ((2 * temp[0] + temp[1] + 4) >> 3);
487 for (x = 2; x < width - 1; x += 2) {
488 b[x] = temp[x] + ((4 * temp[x] + temp[x - 1] + temp[x + 1] + 8) >> 4);
489 b[x - 1] = temp[x - 1] + ((3 * (b[x - 2] + b[x])) >> 1);
490 }
491 if (width & 1) {
492 b[x] = temp[x] + ((2 * temp[x] + temp[x - 1] + 4) >> 3);
493 b[x - 1] = temp[x - 1] + ((3 * (b[x - 2] + b[x])) >> 1);
494 } else
495 b[x - 1] = temp[x - 1] + 3 * b[x - 2];
496 }
497
500 {
501 int i;
502
503 for (i = 0; i <
width; i++)
505 }
506
509 {
510 int i;
511
512 for (i = 0; i <
width; i++)
514 }
515
518 {
519 int i;
520
521 for (i = 0; i <
width; i++)
522 b1[i] += (
W_BM * (b0[i] + b2[i]) + 4 * b1[i] +
W_BO) >>
W_BS;
523 }
524
527 {
528 int i;
529
530 for (i = 0; i <
width; i++)
532 }
533
537 {
538 int i;
539
540 for (i = 0; i <
width; i++) {
543 b2[i] += (
W_BM * (b1[i] + b3[i]) + 4 * b2[i] +
W_BO) >>
W_BS;
545 }
546 }
547
549 int height,
int stride_line)
550 {
556 }
557
560 {
566 }
567
571 int stride_line)
572 {
574
580 mirror(y + 3, height - 1) *
581 stride_line);
583 mirror(y + 4, height - 1) *
584 stride_line);
585
586 if (y > 0 && y + 4 < height) {
588 } else {
589 if (y + 3 < (unsigned)height)
591 if (y + 2 < (unsigned)height)
593 if (y + 1 < (unsigned)height)
595 if (y + 0 < (unsigned)height)
597 }
598
599 if (y - 1 < (unsigned)height)
601 if (y + 0 < (unsigned)height)
603
609 }
610
614 {
622
623 if (y + 3 < (unsigned)height)
625 if (y + 2 < (unsigned)height)
627 if (y + 1 < (unsigned)height)
629 if (y + 0 < (unsigned)height)
631
632 if (y - 1 < (unsigned)height)
634 if (y + 0 < (unsigned)height)
636
642 }
643
645 int height,
int stride_line,
int type,
646 int decomposition_count)
647 {
649 for (level = decomposition_count - 1; level >= 0; level--) {
650 switch (type) {
653 stride_line << level);
654 break;
657 stride_line << level);
658 break;
659 }
660 }
661 }
662
666 int type,
int decomposition_count,
int y)
667 {
668 const int support = type == 1 ? 3 : 5;
670 if (type == 2)
671 return;
672
673 for (level = decomposition_count - 1; level >= 0; level--)
674 while (cs[level].y <=
FFMIN((y >> level) + support, height >> level)) {
675 switch (type) {
678 width >> level,
679 height >> level,
680 stride_line << level);
681 break;
684 width >> level,
685 height >> level,
686 stride_line << level);
687 break;
688 }
689 }
690 }
691
694 int decomposition_count)
695 {
697 for (level = decomposition_count - 1; level >= 0; level--) {
698 switch (type) {
701 stride << level);
702 break;
705 stride << level);
706 break;
707 }
708 }
709 }
710
714 int decomposition_count,
int y)
715 {
716 const int support = type == 1 ? 3 : 5;
718 if (type == 2)
719 return;
720
721 for (level = decomposition_count - 1; level >= 0; level--)
722 while (cs[level].y <=
FFMIN((y >> level) + support, height >> level)) {
723 switch (type) {
726 height >> level, stride << level);
727 break;
730 height >> level, stride << level);
731 break;
732 }
733 }
734 }
735
737 int stride,
int type,
int decomposition_count)
738 {
742 decomposition_count);
743 for (y = 0; y <
height; y += 4)
745 decomposition_count, y);
746 }
747
749 int w, int h, int type)
750 {
752 const int dec_count = w == 8 ? 3 : 4;
753 int tmp[32 * 32], tmp2[32];
755 static const int scale[2][2][4][4] = {
756 {
757 { // 9/7 8x8 dec=3
758 { 268, 239, 239, 213 },
759 { 0, 224, 224, 152 },
760 { 0, 135, 135, 110 },
761 },
762 { // 9/7 16x16 or 32x32 dec=4
763 { 344, 310, 310, 280 },
764 { 0, 320, 320, 228 },
765 { 0, 175, 175, 136 },
766 { 0, 129, 129, 102 },
767 }
768 },
769 {
770 { // 5/3 8x8 dec=3
771 { 275, 245, 245, 218 },
772 { 0, 230, 230, 156 },
773 { 0, 138, 138, 113 },
774 },
775 { // 5/3 16x16 or 32x32 dec=4
776 { 352, 317, 317, 286 },
777 { 0, 328, 328, 233 },
778 { 0, 180, 180, 140 },
779 { 0, 132, 132, 105 },
780 }
781 }
782 };
783
784 for (i = 0; i < h; i++) {
785 for (j = 0; j < w; j += 4) {
786 tmp[32 * i + j + 0] = (pix1[j + 0] - pix2[j + 0]) << 4;
787 tmp[32 * i + j + 1] = (pix1[j + 1] - pix2[j + 1]) << 4;
788 tmp[32 * i + j + 2] = (pix1[j + 2] - pix2[j + 2]) << 4;
789 tmp[32 * i + j + 3] = (pix1[j + 3] - pix2[j + 3]) << 4;
790 }
791 pix1 += line_size;
792 pix2 += line_size;
793 }
794
796
797 s = 0;
799 for (level = 0; level < dec_count; level++)
800 for (ori = level ? 1 : 0; ori < 4; ori++) {
802 int sx = (ori & 1) ? size : 0;
804 int sy = (ori & 2) ? stride >> 1 : 0;
805
806 for (i = 0; i <
size; i++)
807 for (j = 0; j <
size; j++) {
808 int v = tmp[sx + sy + i * stride + j] *
809 scale[type][dec_count - 3][
level][ori];
811 }
812 }
814 return s >> 9;
815 }
816
818 {
819 return w_c(v, pix1, pix2, line_size, 8, h, 1);
820 }
821
823 {
824 return w_c(v, pix1, pix2, line_size, 8, h, 0);
825 }
826
828 {
829 return w_c(v, pix1, pix2, line_size, 16, h, 1);
830 }
831
833 {
834 return w_c(v, pix1, pix2, line_size, 16, h, 0);
835 }
836
838 {
839 return w_c(v, pix1, pix2, line_size, 32, h, 1);
840 }
841
843 {
844 return w_c(v, pix1, pix2, line_size, 32, h, 0);
845 }
846
848 {
853 }
854
856 {
860
861 if (HAVE_MMX)
863 }
864
865