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