1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Header file for hardcoded shared mpegaudiodec tables 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de> 5cabdff1aSopenharmony_ci * Copyright (c) 2020 Andreas Rheinhardt <andreas.rheinhardt@gmail.com> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#ifndef AVCODEC_MPEGAUDIODEC_COMMON_TABLEGEN_H 25cabdff1aSopenharmony_ci#define AVCODEC_MPEGAUDIODEC_COMMON_TABLEGEN_H 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include <stdint.h> 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#define TABLE_4_3_SIZE ((8191 + 16)*4) 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#if CONFIG_HARDCODED_TABLES 32cabdff1aSopenharmony_ci#define mpegaudiodec_common_tableinit() 33cabdff1aSopenharmony_ci#include "libavcodec/mpegaudiodec_common_tables.h" 34cabdff1aSopenharmony_ci#else 35cabdff1aSopenharmony_ci#include <math.h> 36cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ciint8_t ff_table_4_3_exp [TABLE_4_3_SIZE]; 39cabdff1aSopenharmony_ciuint32_t ff_table_4_3_value[TABLE_4_3_SIZE]; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define FRAC_BITS 23 42cabdff1aSopenharmony_ci#define IMDCT_SCALAR 1.759 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_cistatic av_cold void mpegaudiodec_common_tableinit(void) 45cabdff1aSopenharmony_ci{ 46cabdff1aSopenharmony_ci static const double exp2_lut[4] = { 47cabdff1aSopenharmony_ci 1.00000000000000000000, /* 2 ^ (0 * 0.25) */ 48cabdff1aSopenharmony_ci 1.18920711500272106672, /* 2 ^ (1 * 0.25) */ 49cabdff1aSopenharmony_ci M_SQRT2 , /* 2 ^ (2 * 0.25) */ 50cabdff1aSopenharmony_ci 1.68179283050742908606, /* 2 ^ (3 * 0.25) */ 51cabdff1aSopenharmony_ci }; 52cabdff1aSopenharmony_ci double pow43_val = 0; 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci for (int i = 1; i < TABLE_4_3_SIZE; i++) { 55cabdff1aSopenharmony_ci double f, fm; 56cabdff1aSopenharmony_ci int e, m; 57cabdff1aSopenharmony_ci double value = i / 4; 58cabdff1aSopenharmony_ci if ((i & 3) == 0) 59cabdff1aSopenharmony_ci pow43_val = value / IMDCT_SCALAR * cbrt(value); 60cabdff1aSopenharmony_ci f = pow43_val * exp2_lut[i & 3]; 61cabdff1aSopenharmony_ci fm = frexp(f, &e); 62cabdff1aSopenharmony_ci m = llrint(fm * (1LL << 31)); 63cabdff1aSopenharmony_ci e += FRAC_BITS - 31 + 5 - 100; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci /* normalized to FRAC_BITS */ 66cabdff1aSopenharmony_ci ff_table_4_3_value[i] = m; 67cabdff1aSopenharmony_ci ff_table_4_3_exp [i] = -e; 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci} 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci#endif /* CONFIG_HARDCODED_TABLES */ 72cabdff1aSopenharmony_ci#endif /* AVCODEC_MPEGAUDIODEC_COMMON_TABLEGEN_H */ 73