00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef AVCODEC_PCM_TABLEGEN_H
00024 #define AVCODEC_PCM_TABLEGEN_H
00025
00026 #include <stdint.h>
00027 #include "libavutil/attributes.h"
00028
00029
00030
00031 #define SIGN_BIT (0x80)
00032 #define QUANT_MASK (0xf)
00033 #define NSEGS (8)
00034 #define SEG_SHIFT (4)
00035 #define SEG_MASK (0x70)
00036
00037 #define BIAS (0x84)
00038
00039
00040
00041
00042
00043 static av_cold int alaw2linear(unsigned char a_val)
00044 {
00045 int t;
00046 int seg;
00047
00048 a_val ^= 0x55;
00049
00050 t = a_val & QUANT_MASK;
00051 seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
00052 if(seg) t= (t + t + 1 + 32) << (seg + 2);
00053 else t= (t + t + 1 ) << 3;
00054
00055 return (a_val & SIGN_BIT) ? t : -t;
00056 }
00057
00058 static av_cold int ulaw2linear(unsigned char u_val)
00059 {
00060 int t;
00061
00062
00063 u_val = ~u_val;
00064
00065
00066
00067
00068
00069 t = ((u_val & QUANT_MASK) << 3) + BIAS;
00070 t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
00071
00072 return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS);
00073 }
00074
00075 #if CONFIG_HARDCODED_TABLES
00076 #define pcm_alaw_tableinit()
00077 #define pcm_ulaw_tableinit()
00078 #include "libavcodec/pcm_tables.h"
00079 #else
00080
00081 static uint8_t linear_to_alaw[16384];
00082 static uint8_t linear_to_ulaw[16384];
00083
00084 static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw,
00085 int (*xlaw2linear)(unsigned char),
00086 int mask)
00087 {
00088 int i, j, v, v1, v2;
00089
00090 j = 0;
00091 for(i=0;i<128;i++) {
00092 if (i != 127) {
00093 v1 = xlaw2linear(i ^ mask);
00094 v2 = xlaw2linear((i + 1) ^ mask);
00095 v = (v1 + v2 + 4) >> 3;
00096 } else {
00097 v = 8192;
00098 }
00099 for(;j<v;j++) {
00100 linear_to_xlaw[8192 + j] = (i ^ mask);
00101 if (j > 0)
00102 linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80));
00103 }
00104 }
00105 linear_to_xlaw[0] = linear_to_xlaw[1];
00106 }
00107
00108 static void pcm_alaw_tableinit(void)
00109 {
00110 build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
00111 }
00112
00113 static void pcm_ulaw_tableinit(void)
00114 {
00115 build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
00116 }
00117 #endif
00118
00119 #endif