/*
* Copyright ( c ) 2002 - 2004 Michael Niedermayer < michaelni @ gmx . at >
*
* This file is part of FFmpeg .
*
* FFmpeg is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2 . 1 of the License , or ( at your option ) any later version .
*
* FFmpeg is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
#include <stdint.h>
#include "config.h"
#include "mathops.h"
#if CONFIG_ME_CMP || CONFIG_MPEGVIDEOENCDSP
/* (i - 256) * (i - 256) */
const uint32_t ff_square_tab[512 ] = {
65536 , 65025 , 64516 , 64009 , 63504 , 63001 , 62500 , 62001 , 61504 , 61009 , 60516 , 60025 , 59536 , 59049 , 58564 , 58081 ,
57600 , 57121 , 56644 , 56169 , 55696 , 55225 , 54756 , 54289 , 53824 , 53361 , 52900 , 52441 , 51984 , 51529 , 51076 , 50625 ,
50176 , 49729 , 49284 , 48841 , 48400 , 47961 , 47524 , 47089 , 46656 , 46225 , 45796 , 45369 , 44944 , 44521 , 44100 , 43681 ,
43264 , 42849 , 42436 , 42025 , 41616 , 41209 , 40804 , 40401 , 40000 , 39601 , 39204 , 38809 , 38416 , 38025 , 37636 , 37249 ,
36864 , 36481 , 36100 , 35721 , 35344 , 34969 , 34596 , 34225 , 33856 , 33489 , 33124 , 32761 , 32400 , 32041 , 31684 , 31329 ,
30976 , 30625 , 30276 , 29929 , 29584 , 29241 , 28900 , 28561 , 28224 , 27889 , 27556 , 27225 , 26896 , 26569 , 26244 , 25921 ,
25600 , 25281 , 24964 , 24649 , 24336 , 24025 , 23716 , 23409 , 23104 , 22801 , 22500 , 22201 , 21904 , 21609 , 21316 , 21025 ,
20736 , 20449 , 20164 , 19881 , 19600 , 19321 , 19044 , 18769 , 18496 , 18225 , 17956 , 17689 , 17424 , 17161 , 16900 , 16641 ,
16384 , 16129 , 15876 , 15625 , 15376 , 15129 , 14884 , 14641 , 14400 , 14161 , 13924 , 13689 , 13456 , 13225 , 12996 , 12769 ,
12544 , 12321 , 12100 , 11881 , 11664 , 11449 , 11236 , 11025 , 10816 , 10609 , 10404 , 10201 , 10000 , 9801 , 9604 , 9409 ,
9216 , 9025 , 8836 , 8649 , 8464 , 8281 , 8100 , 7921 , 7744 , 7569 , 7396 , 7225 , 7056 , 6889 , 6724 , 6561 ,
6400 , 6241 , 6084 , 5929 , 5776 , 5625 , 5476 , 5329 , 5184 , 5041 , 4900 , 4761 , 4624 , 4489 , 4356 , 4225 ,
4096 , 3969 , 3844 , 3721 , 3600 , 3481 , 3364 , 3249 , 3136 , 3025 , 2916 , 2809 , 2704 , 2601 , 2500 , 2401 ,
2304 , 2209 , 2116 , 2025 , 1936 , 1849 , 1764 , 1681 , 1600 , 1521 , 1444 , 1369 , 1296 , 1225 , 1156 , 1089 ,
1024 , 961 , 900 , 841 , 784 , 729 , 676 , 625 , 576 , 529 , 484 , 441 , 400 , 361 , 324 , 289 ,
256 , 225 , 196 , 169 , 144 , 121 , 100 , 81 , 64 , 49 , 36 , 25 , 16 , 9 , 4 , 1 ,
0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 , 100 , 121 , 144 , 169 , 196 , 225 ,
256 , 289 , 324 , 361 , 400 , 441 , 484 , 529 , 576 , 625 , 676 , 729 , 784 , 841 , 900 , 961 ,
1024 , 1089 , 1156 , 1225 , 1296 , 1369 , 1444 , 1521 , 1600 , 1681 , 1764 , 1849 , 1936 , 2025 , 2116 , 2209 ,
2304 , 2401 , 2500 , 2601 , 2704 , 2809 , 2916 , 3025 , 3136 , 3249 , 3364 , 3481 , 3600 , 3721 , 3844 , 3969 ,
4096 , 4225 , 4356 , 4489 , 4624 , 4761 , 4900 , 5041 , 5184 , 5329 , 5476 , 5625 , 5776 , 5929 , 6084 , 6241 ,
6400 , 6561 , 6724 , 6889 , 7056 , 7225 , 7396 , 7569 , 7744 , 7921 , 8100 , 8281 , 8464 , 8649 , 8836 , 9025 ,
9216 , 9409 , 9604 , 9801 , 10000 , 10201 , 10404 , 10609 , 10816 , 11025 , 11236 , 11449 , 11664 , 11881 , 12100 , 12321 ,
12544 , 12769 , 12996 , 13225 , 13456 , 13689 , 13924 , 14161 , 14400 , 14641 , 14884 , 15129 , 15376 , 15625 , 15876 , 16129 ,
16384 , 16641 , 16900 , 17161 , 17424 , 17689 , 17956 , 18225 , 18496 , 18769 , 19044 , 19321 , 19600 , 19881 , 20164 , 20449 ,
20736 , 21025 , 21316 , 21609 , 21904 , 22201 , 22500 , 22801 , 23104 , 23409 , 23716 , 24025 , 24336 , 24649 , 24964 , 25281 ,
25600 , 25921 , 26244 , 26569 , 26896 , 27225 , 27556 , 27889 , 28224 , 28561 , 28900 , 29241 , 29584 , 29929 , 30276 , 30625 ,
30976 , 31329 , 31684 , 32041 , 32400 , 32761 , 33124 , 33489 , 33856 , 34225 , 34596 , 34969 , 35344 , 35721 , 36100 , 36481 ,
36864 , 37249 , 37636 , 38025 , 38416 , 38809 , 39204 , 39601 , 40000 , 40401 , 40804 , 41209 , 41616 , 42025 , 42436 , 42849 ,
43264 , 43681 , 44100 , 44521 , 44944 , 45369 , 45796 , 46225 , 46656 , 47089 , 47524 , 47961 , 48400 , 48841 , 49284 , 49729 ,
50176 , 50625 , 51076 , 51529 , 51984 , 52441 , 52900 , 53361 , 53824 , 54289 , 54756 , 55225 , 55696 , 56169 , 56644 , 57121 ,
57600 , 58081 , 58564 , 59049 , 59536 , 60025 , 60516 , 61009 , 61504 , 62001 , 62500 , 63001 , 63504 , 64009 , 64516 , 65025 ,
};
#endif
/* a*inverse[b]>>32 == a/b for all 0<=a<=16909558 && 2<=b<=256
* for a>16909558, is an overestimate by less than 1 part in 1<<24 */
const uint32_t ff_inverse[257 ]={
0 , 4294967295 U,2147483648 U,1431655766 , 1073741824 , 858993460 , 715827883 , 613566757 ,
536870912 , 477218589 , 429496730 , 390451573 , 357913942 , 330382100 , 306783379 , 286331154 ,
268435456 , 252645136 , 238609295 , 226050911 , 214748365 , 204522253 , 195225787 , 186737709 ,
178956971 , 171798692 , 165191050 , 159072863 , 153391690 , 148102321 , 143165577 , 138547333 ,
134217728 , 130150525 , 126322568 , 122713352 , 119304648 , 116080198 , 113025456 , 110127367 ,
107374183 , 104755300 , 102261127 , 99882961 , 97612894 , 95443718 , 93368855 , 91382283 ,
89478486 , 87652394 , 85899346 , 84215046 , 82595525 , 81037119 , 79536432 , 78090315 ,
76695845 , 75350304 , 74051161 , 72796056 , 71582789 , 70409300 , 69273667 , 68174085 ,
67108864 , 66076420 , 65075263 , 64103990 , 63161284 , 62245903 , 61356676 , 60492498 ,
59652324 , 58835169 , 58040099 , 57266231 , 56512728 , 55778797 , 55063684 , 54366675 ,
53687092 , 53024288 , 52377650 , 51746594 , 51130564 , 50529028 , 49941481 , 49367441 ,
48806447 , 48258060 , 47721859 , 47197443 , 46684428 , 46182445 , 45691142 , 45210183 ,
44739243 , 44278014 , 43826197 , 43383509 , 42949673 , 42524429 , 42107523 , 41698712 ,
41297763 , 40904451 , 40518560 , 40139882 , 39768216 , 39403370 , 39045158 , 38693400 ,
38347923 , 38008561 , 37675152 , 37347542 , 37025581 , 36709123 , 36398028 , 36092163 ,
35791395 , 35495598 , 35204650 , 34918434 , 34636834 , 34359739 , 34087043 , 33818641 ,
33554432 , 33294321 , 33038210 , 32786010 , 32537632 , 32292988 , 32051995 , 31814573 ,
31580642 , 31350127 , 31122952 , 30899046 , 30678338 , 30460761 , 30246249 , 30034737 ,
29826162 , 29620465 , 29417585 , 29217465 , 29020050 , 28825284 , 28633116 , 28443493 ,
28256364 , 28071682 , 27889399 , 27709467 , 27531842 , 27356480 , 27183338 , 27012373 ,
26843546 , 26676816 , 26512144 , 26349493 , 26188825 , 26030105 , 25873297 , 25718368 ,
25565282 , 25414008 , 25264514 , 25116768 , 24970741 , 24826401 , 24683721 , 24542671 ,
24403224 , 24265352 , 24129030 , 23994231 , 23860930 , 23729102 , 23598722 , 23469767 ,
23342214 , 23216040 , 23091223 , 22967740 , 22845571 , 22724695 , 22605092 , 22486740 ,
22369622 , 22253717 , 22139007 , 22025474 , 21913099 , 21801865 , 21691755 , 21582751 ,
21474837 , 21367997 , 21262215 , 21157475 , 21053762 , 20951060 , 20849356 , 20748635 ,
20648882 , 20550083 , 20452226 , 20355296 , 20259280 , 20164166 , 20069941 , 19976593 ,
19884108 , 19792477 , 19701685 , 19611723 , 19522579 , 19434242 , 19346700 , 19259944 ,
19173962 , 19088744 , 19004281 , 18920561 , 18837576 , 18755316 , 18673771 , 18592933 ,
18512791 , 18433337 , 18354562 , 18276457 , 18199014 , 18122225 , 18046082 , 17970575 ,
17895698 , 17821442 , 17747799 , 17674763 , 17602325 , 17530479 , 17459217 , 17388532 ,
17318417 , 17248865 , 17179870 , 17111424 , 17043522 , 16976156 , 16909321 , 16843010 ,
16777216
};
const uint8_t ff_sqrt_tab[256 ]={
0 , 16 , 23 , 28 , 32 , 36 , 40 , 43 , 46 , 48 , 51 , 54 , 56 , 58 , 60 , 62 , 64 , 66 , 68 , 70 , 72 , 74 , 76 , 77 , 79 , 80 , 82 , 84 , 85 , 87 , 88 , 90 ,
91 , 92 , 94 , 95 , 96 , 98 , 99 ,100 ,102 ,103 ,104 ,105 ,107 ,108 ,109 ,110 ,111 ,112 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,123 ,124 ,125 ,126 ,127 ,
128 ,129 ,130 ,131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,139 ,140 ,141 ,142 ,143 ,144 ,144 ,145 ,146 ,147 ,148 ,149 ,150 ,151 ,151 ,152 ,153 ,154 ,155 ,156 ,156 ,
157 ,158 ,159 ,160 ,160 ,161 ,162 ,163 ,164 ,164 ,165 ,166 ,167 ,168 ,168 ,169 ,170 ,171 ,171 ,172 ,173 ,174 ,174 ,175 ,176 ,176 ,177 ,178 ,179 ,179 ,180 ,181 ,
182 ,182 ,183 ,184 ,184 ,185 ,186 ,186 ,187 ,188 ,188 ,189 ,190 ,190 ,191 ,192 ,192 ,193 ,194 ,194 ,195 ,196 ,196 ,197 ,198 ,198 ,199 ,200 ,200 ,201 ,202 ,202 ,
203 ,204 ,204 ,205 ,205 ,206 ,207 ,207 ,208 ,208 ,209 ,210 ,210 ,211 ,212 ,212 ,213 ,213 ,214 ,215 ,215 ,216 ,216 ,217 ,218 ,218 ,219 ,219 ,220 ,220 ,221 ,222 ,
222 ,223 ,223 ,224 ,224 ,225 ,226 ,226 ,227 ,227 ,228 ,228 ,229 ,230 ,230 ,231 ,231 ,232 ,232 ,233 ,233 ,234 ,235 ,235 ,236 ,236 ,237 ,237 ,238 ,238 ,239 ,239 ,
240 ,240 ,241 ,242 ,242 ,243 ,243 ,244 ,244 ,245 ,245 ,246 ,246 ,247 ,247 ,248 ,248 ,249 ,249 ,250 ,250 ,251 ,251 ,252 ,252 ,253 ,253 ,254 ,254 ,255 ,255 ,255
};
#define times4(x) x, x, x, x
#define times1024(x) times4(times4(times4(times4(times4(x)))))
const uint8_t ff_crop_tab[256 + 2 * MAX_NEG_CROP] = {
times1024(0 x00),
0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x0A,0 x0B,0 x0C,0 x0D,0 x0E,0 x0F,
0 x10,0 x11,0 x12,0 x13,0 x14,0 x15,0 x16,0 x17,0 x18,0 x19,0 x1A,0 x1B,0 x1C,0 x1D,0 x1E,0 x1F,
0 x20,0 x21,0 x22,0 x23,0 x24,0 x25,0 x26,0 x27,0 x28,0 x29,0 x2A,0 x2B,0 x2C,0 x2D,0 x2E,0 x2F,
0 x30,0 x31,0 x32,0 x33,0 x34,0 x35,0 x36,0 x37,0 x38,0 x39,0 x3A,0 x3B,0 x3C,0 x3D,0 x3E,0 x3F,
0 x40,0 x41,0 x42,0 x43,0 x44,0 x45,0 x46,0 x47,0 x48,0 x49,0 x4A,0 x4B,0 x4C,0 x4D,0 x4E,0 x4F,
0 x50,0 x51,0 x52,0 x53,0 x54,0 x55,0 x56,0 x57,0 x58,0 x59,0 x5A,0 x5B,0 x5C,0 x5D,0 x5E,0 x5F,
0 x60,0 x61,0 x62,0 x63,0 x64,0 x65,0 x66,0 x67,0 x68,0 x69,0 x6A,0 x6B,0 x6C,0 x6D,0 x6E,0 x6F,
0 x70,0 x71,0 x72,0 x73,0 x74,0 x75,0 x76,0 x77,0 x78,0 x79,0 x7A,0 x7B,0 x7C,0 x7D,0 x7E,0 x7F,
0 x80,0 x81,0 x82,0 x83,0 x84,0 x85,0 x86,0 x87,0 x88,0 x89,0 x8A,0 x8B,0 x8C,0 x8D,0 x8E,0 x8F,
0 x90,0 x91,0 x92,0 x93,0 x94,0 x95,0 x96,0 x97,0 x98,0 x99,0 x9A,0 x9B,0 x9C,0 x9D,0 x9E,0 x9F,
0 xA0,0 xA1,0 xA2,0 xA3,0 xA4,0 xA5,0 xA6,0 xA7,0 xA8,0 xA9,0 xAA,0 xAB,0 xAC,0 xAD,0 xAE,0 xAF,
0 xB0,0 xB1,0 xB2,0 xB3,0 xB4,0 xB5,0 xB6,0 xB7,0 xB8,0 xB9,0 xBA,0 xBB,0 xBC,0 xBD,0 xBE,0 xBF,
0 xC0,0 xC1,0 xC2,0 xC3,0 xC4,0 xC5,0 xC6,0 xC7,0 xC8,0 xC9,0 xCA,0 xCB,0 xCC,0 xCD,0 xCE,0 xCF,
0 xD0,0 xD1,0 xD2,0 xD3,0 xD4,0 xD5,0 xD6,0 xD7,0 xD8,0 xD9,0 xDA,0 xDB,0 xDC,0 xDD,0 xDE,0 xDF,
0 xE0,0 xE1,0 xE2,0 xE3,0 xE4,0 xE5,0 xE6,0 xE7,0 xE8,0 xE9,0 xEA,0 xEB,0 xEC,0 xED,0 xEE,0 xEF,
0 xF0,0 xF1,0 xF2,0 xF3,0 xF4,0 xF5,0 xF6,0 xF7,0 xF8,0 xF9,0 xFA,0 xFB,0 xFC,0 xFD,0 xFE,0 xFF,
times1024(0 xFF)
};
const uint8_t ff_zigzag_direct[64 ] = {
0 , 1 , 8 , 16 , 9 , 2 , 3 , 10 ,
17 , 24 , 32 , 25 , 18 , 11 , 4 , 5 ,
12 , 19 , 26 , 33 , 40 , 48 , 41 , 34 ,
27 , 20 , 13 , 6 , 7 , 14 , 21 , 28 ,
35 , 42 , 49 , 56 , 57 , 50 , 43 , 36 ,
29 , 22 , 15 , 23 , 30 , 37 , 44 , 51 ,
58 , 59 , 52 , 45 , 38 , 31 , 39 , 46 ,
53 , 60 , 61 , 54 , 47 , 55 , 62 , 63
};
const uint8_t ff_zigzag_scan[16 +1 ] = {
0 + 0 * 4 , 1 + 0 * 4 , 0 + 1 * 4 , 0 + 2 * 4 ,
1 + 1 * 4 , 2 + 0 * 4 , 3 + 0 * 4 , 2 + 1 * 4 ,
1 + 2 * 4 , 0 + 3 * 4 , 1 + 3 * 4 , 2 + 2 * 4 ,
3 + 1 * 4 , 3 + 2 * 4 , 2 + 3 * 4 , 3 + 3 * 4 ,
};
const uint8_t ff_log2_run[41 ] = {
0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 ,
2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 ,
4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 ,
8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 ,
24 ,
};
Messung V0.5 in Prozent C=94 H=96 G=94