1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Common code between the AC-3 encoder and decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001, 2002 Fabrice Bellard 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Common code between the AC-3 encoder and decoder. 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#ifndef AVCODEC_AC3_H 28cabdff1aSopenharmony_ci#define AVCODEC_AC3_H 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include <math.h> 31cabdff1aSopenharmony_ci#include <stdint.h> 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include "ac3tab.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#ifndef USE_FIXED 36cabdff1aSopenharmony_ci#define USE_FIXED 0 37cabdff1aSopenharmony_ci#endif 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#if USE_FIXED 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define FFT_FLOAT 0 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#define FIXR(a) ((int)((a) * 0 + 0.5)) 44cabdff1aSopenharmony_ci#define FIXR12(a) ((int)((a) * 4096 + 0.5)) 45cabdff1aSopenharmony_ci#define FIXR15(a) ((int)((a) * 32768 + 0.5)) 46cabdff1aSopenharmony_ci#define ROUND15(x) ((x) + 16384) >> 15 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci#define AC3_RENAME(x) x ## _fixed 49cabdff1aSopenharmony_ci#define AC3_NORM(norm) (1<<24)/(norm) 50cabdff1aSopenharmony_ci#define AC3_MUL(a,b) ((((int64_t) (a)) * (b))>>12) 51cabdff1aSopenharmony_ci#define AC3_RANGE(x) ((x)|(((x)&128)<<1)) 52cabdff1aSopenharmony_ci#define AC3_HEAVY_RANGE(x) ((x)<<1) 53cabdff1aSopenharmony_ci#define AC3_DYNAMIC_RANGE(x) (x) 54cabdff1aSopenharmony_ci#define AC3_SPX_BLEND(x) (x) 55cabdff1aSopenharmony_ci#define AC3_DYNAMIC_RANGE1 0 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_citypedef int INTFLOAT; 58cabdff1aSopenharmony_citypedef unsigned int UINTFLOAT; 59cabdff1aSopenharmony_citypedef int16_t SHORTFLOAT; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci#else /* USE_FIXED */ 62cabdff1aSopenharmony_ci#include "libavutil/libm.h" 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci#define FIXR(x) ((float)(x)) 65cabdff1aSopenharmony_ci#define FIXR12(x) ((float)(x)) 66cabdff1aSopenharmony_ci#define FIXR15(x) ((float)(x)) 67cabdff1aSopenharmony_ci#define ROUND15(x) (x) 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci#define AC3_RENAME(x) x 70cabdff1aSopenharmony_ci#define AC3_NORM(norm) (1.0f/(norm)) 71cabdff1aSopenharmony_ci#define AC3_MUL(a,b) ((a) * (b)) 72cabdff1aSopenharmony_ci#define AC3_RANGE(x) (dynamic_range_tab[(x)]) 73cabdff1aSopenharmony_ci#define AC3_HEAVY_RANGE(x) (ff_ac3_heavy_dynamic_range_tab[(x)]) 74cabdff1aSopenharmony_ci#define AC3_DYNAMIC_RANGE(x) (powf(x, s->drc_scale)) 75cabdff1aSopenharmony_ci#define AC3_SPX_BLEND(x) (x)* (1.0f/32) 76cabdff1aSopenharmony_ci#define AC3_DYNAMIC_RANGE1 1.0f 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_citypedef float INTFLOAT; 79cabdff1aSopenharmony_citypedef float UINTFLOAT; 80cabdff1aSopenharmony_citypedef float SHORTFLOAT; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci#define AC3_LEVEL(x) ROUND15((x) * FIXR15(M_SQRT1_2)) 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci/* pre-defined gain values */ 87cabdff1aSopenharmony_ci#define LEVEL_PLUS_3DB M_SQRT2 88cabdff1aSopenharmony_ci#define LEVEL_PLUS_1POINT5DB 1.1892071150027209 89cabdff1aSopenharmony_ci#define LEVEL_MINUS_1POINT5DB 0.8408964152537145 90cabdff1aSopenharmony_ci#define LEVEL_MINUS_3DB M_SQRT1_2 91cabdff1aSopenharmony_ci#define LEVEL_MINUS_4POINT5DB 0.5946035575013605 92cabdff1aSopenharmony_ci#define LEVEL_MINUS_6DB 0.5000000000000000 93cabdff1aSopenharmony_ci#define LEVEL_MINUS_9DB 0.3535533905932738 94cabdff1aSopenharmony_ci#define LEVEL_ZERO 0.0000000000000000 95cabdff1aSopenharmony_ci#define LEVEL_ONE 1.0000000000000000 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_citypedef struct AC3BitAllocParameters { 98cabdff1aSopenharmony_ci int sr_code; 99cabdff1aSopenharmony_ci int sr_shift; 100cabdff1aSopenharmony_ci int slow_gain, slow_decay, fast_decay, db_per_bit, floor; 101cabdff1aSopenharmony_ci int cpl_fast_leak, cpl_slow_leak; 102cabdff1aSopenharmony_ci} AC3BitAllocParameters; 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci/** 105cabdff1aSopenharmony_ci * Calculate the log power-spectral density of the input signal. 106cabdff1aSopenharmony_ci * This gives a rough estimate of signal power in the frequency domain by using 107cabdff1aSopenharmony_ci * the spectral envelope (exponents). The psd is also separately grouped 108cabdff1aSopenharmony_ci * into critical bands for use in the calculating the masking curve. 109cabdff1aSopenharmony_ci * 128 units in psd = -6 dB. The dbknee parameter in AC3BitAllocParameters 110cabdff1aSopenharmony_ci * determines the reference level. 111cabdff1aSopenharmony_ci * 112cabdff1aSopenharmony_ci * @param[in] exp frequency coefficient exponents 113cabdff1aSopenharmony_ci * @param[in] start starting bin location 114cabdff1aSopenharmony_ci * @param[in] end ending bin location 115cabdff1aSopenharmony_ci * @param[out] psd signal power for each frequency bin 116cabdff1aSopenharmony_ci * @param[out] band_psd signal power for each critical band 117cabdff1aSopenharmony_ci */ 118cabdff1aSopenharmony_civoid ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, 119cabdff1aSopenharmony_ci int16_t *band_psd); 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci/** 122cabdff1aSopenharmony_ci * Calculate the masking curve. 123cabdff1aSopenharmony_ci * First, the excitation is calculated using parameters in s and the signal 124cabdff1aSopenharmony_ci * power in each critical band. The excitation is compared with a predefined 125cabdff1aSopenharmony_ci * hearing threshold table to produce the masking curve. If delta bit 126cabdff1aSopenharmony_ci * allocation information is provided, it is used for adjusting the masking 127cabdff1aSopenharmony_ci * curve, usually to give a closer match to a better psychoacoustic model. 128cabdff1aSopenharmony_ci * 129cabdff1aSopenharmony_ci * @param[in] s adjustable bit allocation parameters 130cabdff1aSopenharmony_ci * @param[in] band_psd signal power for each critical band 131cabdff1aSopenharmony_ci * @param[in] start starting bin location 132cabdff1aSopenharmony_ci * @param[in] end ending bin location 133cabdff1aSopenharmony_ci * @param[in] fast_gain fast gain (estimated signal-to-mask ratio) 134cabdff1aSopenharmony_ci * @param[in] is_lfe whether or not the channel being processed is the LFE 135cabdff1aSopenharmony_ci * @param[in] dba_mode delta bit allocation mode (none, reuse, or new) 136cabdff1aSopenharmony_ci * @param[in] dba_nsegs number of delta segments 137cabdff1aSopenharmony_ci * @param[in] dba_offsets location offsets for each segment 138cabdff1aSopenharmony_ci * @param[in] dba_lengths length of each segment 139cabdff1aSopenharmony_ci * @param[in] dba_values delta bit allocation for each segment 140cabdff1aSopenharmony_ci * @param[out] mask calculated masking curve 141cabdff1aSopenharmony_ci * @return returns 0 for success, non-zero for error 142cabdff1aSopenharmony_ci */ 143cabdff1aSopenharmony_ciint ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, 144cabdff1aSopenharmony_ci int start, int end, int fast_gain, int is_lfe, 145cabdff1aSopenharmony_ci int dba_mode, int dba_nsegs, uint8_t *dba_offsets, 146cabdff1aSopenharmony_ci uint8_t *dba_lengths, uint8_t *dba_values, 147cabdff1aSopenharmony_ci int16_t *mask); 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci#endif /* AVCODEC_AC3_H */ 150