1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include <stdint.h> 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "mathops.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci/* a*inverse[b]>>32 == a/b for all 0<=a<=16909558 && 2<=b<=256 26cabdff1aSopenharmony_ci * for a>16909558, is an overestimate by less than 1 part in 1<<24 */ 27cabdff1aSopenharmony_ciconst uint32_t ff_inverse[257]={ 28cabdff1aSopenharmony_ci 0, 4294967295U,2147483648U,1431655766, 1073741824, 858993460, 715827883, 613566757, 29cabdff1aSopenharmony_ci 536870912, 477218589, 429496730, 390451573, 357913942, 330382100, 306783379, 286331154, 30cabdff1aSopenharmony_ci 268435456, 252645136, 238609295, 226050911, 214748365, 204522253, 195225787, 186737709, 31cabdff1aSopenharmony_ci 178956971, 171798692, 165191050, 159072863, 153391690, 148102321, 143165577, 138547333, 32cabdff1aSopenharmony_ci 134217728, 130150525, 126322568, 122713352, 119304648, 116080198, 113025456, 110127367, 33cabdff1aSopenharmony_ci 107374183, 104755300, 102261127, 99882961, 97612894, 95443718, 93368855, 91382283, 34cabdff1aSopenharmony_ci 89478486, 87652394, 85899346, 84215046, 82595525, 81037119, 79536432, 78090315, 35cabdff1aSopenharmony_ci 76695845, 75350304, 74051161, 72796056, 71582789, 70409300, 69273667, 68174085, 36cabdff1aSopenharmony_ci 67108864, 66076420, 65075263, 64103990, 63161284, 62245903, 61356676, 60492498, 37cabdff1aSopenharmony_ci 59652324, 58835169, 58040099, 57266231, 56512728, 55778797, 55063684, 54366675, 38cabdff1aSopenharmony_ci 53687092, 53024288, 52377650, 51746594, 51130564, 50529028, 49941481, 49367441, 39cabdff1aSopenharmony_ci 48806447, 48258060, 47721859, 47197443, 46684428, 46182445, 45691142, 45210183, 40cabdff1aSopenharmony_ci 44739243, 44278014, 43826197, 43383509, 42949673, 42524429, 42107523, 41698712, 41cabdff1aSopenharmony_ci 41297763, 40904451, 40518560, 40139882, 39768216, 39403370, 39045158, 38693400, 42cabdff1aSopenharmony_ci 38347923, 38008561, 37675152, 37347542, 37025581, 36709123, 36398028, 36092163, 43cabdff1aSopenharmony_ci 35791395, 35495598, 35204650, 34918434, 34636834, 34359739, 34087043, 33818641, 44cabdff1aSopenharmony_ci 33554432, 33294321, 33038210, 32786010, 32537632, 32292988, 32051995, 31814573, 45cabdff1aSopenharmony_ci 31580642, 31350127, 31122952, 30899046, 30678338, 30460761, 30246249, 30034737, 46cabdff1aSopenharmony_ci 29826162, 29620465, 29417585, 29217465, 29020050, 28825284, 28633116, 28443493, 47cabdff1aSopenharmony_ci 28256364, 28071682, 27889399, 27709467, 27531842, 27356480, 27183338, 27012373, 48cabdff1aSopenharmony_ci 26843546, 26676816, 26512144, 26349493, 26188825, 26030105, 25873297, 25718368, 49cabdff1aSopenharmony_ci 25565282, 25414008, 25264514, 25116768, 24970741, 24826401, 24683721, 24542671, 50cabdff1aSopenharmony_ci 24403224, 24265352, 24129030, 23994231, 23860930, 23729102, 23598722, 23469767, 51cabdff1aSopenharmony_ci 23342214, 23216040, 23091223, 22967740, 22845571, 22724695, 22605092, 22486740, 52cabdff1aSopenharmony_ci 22369622, 22253717, 22139007, 22025474, 21913099, 21801865, 21691755, 21582751, 53cabdff1aSopenharmony_ci 21474837, 21367997, 21262215, 21157475, 21053762, 20951060, 20849356, 20748635, 54cabdff1aSopenharmony_ci 20648882, 20550083, 20452226, 20355296, 20259280, 20164166, 20069941, 19976593, 55cabdff1aSopenharmony_ci 19884108, 19792477, 19701685, 19611723, 19522579, 19434242, 19346700, 19259944, 56cabdff1aSopenharmony_ci 19173962, 19088744, 19004281, 18920561, 18837576, 18755316, 18673771, 18592933, 57cabdff1aSopenharmony_ci 18512791, 18433337, 18354562, 18276457, 18199014, 18122225, 18046082, 17970575, 58cabdff1aSopenharmony_ci 17895698, 17821442, 17747799, 17674763, 17602325, 17530479, 17459217, 17388532, 59cabdff1aSopenharmony_ci 17318417, 17248865, 17179870, 17111424, 17043522, 16976156, 16909321, 16843010, 60cabdff1aSopenharmony_ci 16777216 61cabdff1aSopenharmony_ci}; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ciconst uint8_t ff_sqrt_tab[256]={ 64cabdff1aSopenharmony_ci 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, 65cabdff1aSopenharmony_ci 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, 66cabdff1aSopenharmony_ci128,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, 67cabdff1aSopenharmony_ci157,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, 68cabdff1aSopenharmony_ci182,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, 69cabdff1aSopenharmony_ci203,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, 70cabdff1aSopenharmony_ci222,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, 71cabdff1aSopenharmony_ci240,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 72cabdff1aSopenharmony_ci}; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci#define times4(x) x, x, x, x 75cabdff1aSopenharmony_ci#define times256(x) times4(times4(times4(times4(times4(x))))) 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ciconst uint8_t ff_crop_tab[256 + 2 * MAX_NEG_CROP] = { 78cabdff1aSopenharmony_citimes256(0x00), 79cabdff1aSopenharmony_ci0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, 80cabdff1aSopenharmony_ci0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, 81cabdff1aSopenharmony_ci0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, 82cabdff1aSopenharmony_ci0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, 83cabdff1aSopenharmony_ci0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, 84cabdff1aSopenharmony_ci0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, 85cabdff1aSopenharmony_ci0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, 86cabdff1aSopenharmony_ci0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, 87cabdff1aSopenharmony_ci0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, 88cabdff1aSopenharmony_ci0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, 89cabdff1aSopenharmony_ci0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, 90cabdff1aSopenharmony_ci0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, 91cabdff1aSopenharmony_ci0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, 92cabdff1aSopenharmony_ci0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, 93cabdff1aSopenharmony_ci0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, 94cabdff1aSopenharmony_ci0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, 95cabdff1aSopenharmony_citimes256(0xFF) 96cabdff1aSopenharmony_ci}; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ciconst uint8_t ff_zigzag_direct[64] = { 99cabdff1aSopenharmony_ci 0, 1, 8, 16, 9, 2, 3, 10, 100cabdff1aSopenharmony_ci 17, 24, 32, 25, 18, 11, 4, 5, 101cabdff1aSopenharmony_ci 12, 19, 26, 33, 40, 48, 41, 34, 102cabdff1aSopenharmony_ci 27, 20, 13, 6, 7, 14, 21, 28, 103cabdff1aSopenharmony_ci 35, 42, 49, 56, 57, 50, 43, 36, 104cabdff1aSopenharmony_ci 29, 22, 15, 23, 30, 37, 44, 51, 105cabdff1aSopenharmony_ci 58, 59, 52, 45, 38, 31, 39, 46, 106cabdff1aSopenharmony_ci 53, 60, 61, 54, 47, 55, 62, 63 107cabdff1aSopenharmony_ci}; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ciconst uint8_t ff_zigzag_scan[16+1] = { 110cabdff1aSopenharmony_ci 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4, 111cabdff1aSopenharmony_ci 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4, 112cabdff1aSopenharmony_ci 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4, 113cabdff1aSopenharmony_ci 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4, 114cabdff1aSopenharmony_ci}; 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ciconst uint8_t ff_log2_run[41] = { 117cabdff1aSopenharmony_ci 0, 0, 0, 0, 1, 1, 1, 1, 118cabdff1aSopenharmony_ci 2, 2, 2, 2, 3, 3, 3, 3, 119cabdff1aSopenharmony_ci 4, 4, 5, 5, 6, 6, 7, 7, 120cabdff1aSopenharmony_ci 8, 9, 10, 11, 12, 13, 14, 15, 121cabdff1aSopenharmony_ci16, 17, 18, 19, 20, 21, 22, 23, 122cabdff1aSopenharmony_ci24, 123cabdff1aSopenharmony_ci}; 124