1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Header file for hardcoded PCM tables 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#ifndef AVCODEC_PCM_TABLEGEN_H 24cabdff1aSopenharmony_ci#define AVCODEC_PCM_TABLEGEN_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci/* from g711.c by SUN microsystems (unrestricted use) */ 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ 32cabdff1aSopenharmony_ci#define QUANT_MASK (0xf) /* Quantization field mask. */ 33cabdff1aSopenharmony_ci#define NSEGS (8) /* Number of A-law segments. */ 34cabdff1aSopenharmony_ci#define SEG_SHIFT (4) /* Left shift for segment number. */ 35cabdff1aSopenharmony_ci#define SEG_MASK (0x70) /* Segment field mask. */ 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#define BIAS (0x84) /* Bias for linear code. */ 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define VIDC_SIGN_BIT (1) 40cabdff1aSopenharmony_ci#define VIDC_QUANT_MASK (0x1E) 41cabdff1aSopenharmony_ci#define VIDC_QUANT_SHIFT (1) 42cabdff1aSopenharmony_ci#define VIDC_SEG_SHIFT (5) 43cabdff1aSopenharmony_ci#define VIDC_SEG_MASK (0xE0) 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci/* alaw2linear() - Convert an A-law value to 16-bit linear PCM */ 46cabdff1aSopenharmony_cistatic av_cold int alaw2linear(unsigned char a_val) 47cabdff1aSopenharmony_ci{ 48cabdff1aSopenharmony_ci int t; 49cabdff1aSopenharmony_ci int seg; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci a_val ^= 0x55; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci t = a_val & QUANT_MASK; 54cabdff1aSopenharmony_ci seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT; 55cabdff1aSopenharmony_ci if(seg) t= (t + t + 1 + 32) << (seg + 2); 56cabdff1aSopenharmony_ci else t= (t + t + 1 ) << 3; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci return (a_val & SIGN_BIT) ? t : -t; 59cabdff1aSopenharmony_ci} 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_cistatic av_cold int ulaw2linear(unsigned char u_val) 62cabdff1aSopenharmony_ci{ 63cabdff1aSopenharmony_ci int t; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci /* Complement to obtain normal u-law value. */ 66cabdff1aSopenharmony_ci u_val = ~u_val; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci /* 69cabdff1aSopenharmony_ci * Extract and bias the quantization bits. Then 70cabdff1aSopenharmony_ci * shift up by the segment number and subtract out the bias. 71cabdff1aSopenharmony_ci */ 72cabdff1aSopenharmony_ci t = ((u_val & QUANT_MASK) << 3) + BIAS; 73cabdff1aSopenharmony_ci t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS); 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_cistatic av_cold int vidc2linear(unsigned char u_val) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci int t; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci /* 83cabdff1aSopenharmony_ci * Extract and bias the quantization bits. Then 84cabdff1aSopenharmony_ci * shift up by the segment number and subtract out the bias. 85cabdff1aSopenharmony_ci */ 86cabdff1aSopenharmony_ci t = (((u_val & VIDC_QUANT_MASK) >> VIDC_QUANT_SHIFT) << 3) + BIAS; 87cabdff1aSopenharmony_ci t <<= ((unsigned)u_val & VIDC_SEG_MASK) >> VIDC_SEG_SHIFT; 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci return (u_val & VIDC_SIGN_BIT) ? (BIAS - t) : (t - BIAS); 90cabdff1aSopenharmony_ci} 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci#if CONFIG_HARDCODED_TABLES 93cabdff1aSopenharmony_ci#define pcm_alaw_tableinit() 94cabdff1aSopenharmony_ci#define pcm_ulaw_tableinit() 95cabdff1aSopenharmony_ci#define pcm_vidc_tableinit() 96cabdff1aSopenharmony_ci#include "libavcodec/pcm_tables.h" 97cabdff1aSopenharmony_ci#else 98cabdff1aSopenharmony_ci/* 16384 entries per table */ 99cabdff1aSopenharmony_cistatic uint8_t linear_to_alaw[16384]; 100cabdff1aSopenharmony_cistatic uint8_t linear_to_ulaw[16384]; 101cabdff1aSopenharmony_cistatic uint8_t linear_to_vidc[16384]; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_cistatic av_cold void build_xlaw_table(uint8_t *linear_to_xlaw, 104cabdff1aSopenharmony_ci int (*xlaw2linear)(unsigned char), 105cabdff1aSopenharmony_ci int mask) 106cabdff1aSopenharmony_ci{ 107cabdff1aSopenharmony_ci int i, j, v, v1, v2; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci j = 1; 110cabdff1aSopenharmony_ci linear_to_xlaw[8192] = mask; 111cabdff1aSopenharmony_ci for(i=0;i<127;i++) { 112cabdff1aSopenharmony_ci v1 = xlaw2linear(i ^ mask); 113cabdff1aSopenharmony_ci v2 = xlaw2linear((i + 1) ^ mask); 114cabdff1aSopenharmony_ci v = (v1 + v2 + 4) >> 3; 115cabdff1aSopenharmony_ci for(;j<v;j+=1) { 116cabdff1aSopenharmony_ci linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80)); 117cabdff1aSopenharmony_ci linear_to_xlaw[8192 + j] = (i ^ mask); 118cabdff1aSopenharmony_ci } 119cabdff1aSopenharmony_ci } 120cabdff1aSopenharmony_ci for(;j<8192;j++) { 121cabdff1aSopenharmony_ci linear_to_xlaw[8192 - j] = (127 ^ (mask ^ 0x80)); 122cabdff1aSopenharmony_ci linear_to_xlaw[8192 + j] = (127 ^ mask); 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci linear_to_xlaw[0] = linear_to_xlaw[1]; 125cabdff1aSopenharmony_ci} 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_cistatic void pcm_alaw_tableinit(void) 128cabdff1aSopenharmony_ci{ 129cabdff1aSopenharmony_ci build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5); 130cabdff1aSopenharmony_ci} 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_cistatic void pcm_ulaw_tableinit(void) 133cabdff1aSopenharmony_ci{ 134cabdff1aSopenharmony_ci build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff); 135cabdff1aSopenharmony_ci} 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_cistatic void pcm_vidc_tableinit(void) 138cabdff1aSopenharmony_ci{ 139cabdff1aSopenharmony_ci build_xlaw_table(linear_to_vidc, vidc2linear, 0xff); 140cabdff1aSopenharmony_ci} 141cabdff1aSopenharmony_ci#endif /* CONFIG_HARDCODED_TABLES */ 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci#endif /* AVCODEC_PCM_TABLEGEN_H */ 144