/src/ffmpeg/libavcodec/ac3dec_fixed.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2012 |
3 | | * MIPS Technologies, Inc., California. |
4 | | * |
5 | | * Redistribution and use in source and binary forms, with or without |
6 | | * modification, are permitted provided that the following conditions |
7 | | * are met: |
8 | | * 1. Redistributions of source code must retain the above copyright |
9 | | * notice, this list of conditions and the following disclaimer. |
10 | | * 2. Redistributions in binary form must reproduce the above copyright |
11 | | * notice, this list of conditions and the following disclaimer in the |
12 | | * documentation and/or other materials provided with the distribution. |
13 | | * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its |
14 | | * contributors may be used to endorse or promote products derived from |
15 | | * this software without specific prior written permission. |
16 | | * |
17 | | * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND |
18 | | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
19 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
20 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE |
21 | | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
22 | | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
23 | | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
24 | | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
25 | | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
26 | | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
27 | | * SUCH DAMAGE. |
28 | | * |
29 | | * Author: Stanislav Ocovaj (socovaj@mips.com) |
30 | | * |
31 | | * AC3 fixed-point decoder for MIPS platforms |
32 | | * |
33 | | * This file is part of FFmpeg. |
34 | | * |
35 | | * FFmpeg is free software; you can redistribute it and/or |
36 | | * modify it under the terms of the GNU Lesser General Public |
37 | | * License as published by the Free Software Foundation; either |
38 | | * version 2.1 of the License, or (at your option) any later version. |
39 | | * |
40 | | * FFmpeg is distributed in the hope that it will be useful, |
41 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
42 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
43 | | * Lesser General Public License for more details. |
44 | | * |
45 | | * You should have received a copy of the GNU Lesser General Public |
46 | | * License along with FFmpeg; if not, write to the Free Software |
47 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
48 | | */ |
49 | | |
50 | | #include "config_components.h" |
51 | 174k | #define USE_FIXED 1 |
52 | | #include "ac3dec.h" |
53 | | #include "codec_internal.h" |
54 | 12.8k | #define IMDCT_TYPE AV_TX_INT32_MDCT |
55 | | |
56 | | #include "ac3dec.h" |
57 | | |
58 | | static const int end_freq_inv_tab[8] = |
59 | | { |
60 | | 50529027, 44278013, 39403370, 32292987, 27356480, 23729101, 20951060, 18755316 |
61 | | }; |
62 | | |
63 | | static void scale_coefs ( |
64 | | int32_t *dst, |
65 | | const int32_t *src, |
66 | | int dynrng, |
67 | | int len) |
68 | 3.00M | { |
69 | 3.00M | int i, shift; |
70 | 3.00M | unsigned mul, round; |
71 | 3.00M | int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7; |
72 | | |
73 | 3.00M | mul = (dynrng & 0x1f) + 0x20; |
74 | 3.00M | shift = 4 - (sign_extend(dynrng, 9) >> 5); |
75 | 3.00M | if (shift > 0 ) { |
76 | 3.00M | round = 1 << (shift-1); |
77 | 99.2M | for (i=0; i<len; i+=8) { |
78 | | |
79 | 96.2M | temp = src[i] * mul; |
80 | 96.2M | temp1 = src[i+1] * mul; |
81 | 96.2M | temp = temp + round; |
82 | 96.2M | temp2 = src[i+2] * mul; |
83 | | |
84 | 96.2M | temp1 = temp1 + round; |
85 | 96.2M | dst[i] = temp >> shift; |
86 | 96.2M | temp3 = src[i+3] * mul; |
87 | 96.2M | temp2 = temp2 + round; |
88 | | |
89 | 96.2M | dst[i+1] = temp1 >> shift; |
90 | 96.2M | temp4 = src[i + 4] * mul; |
91 | 96.2M | temp3 = temp3 + round; |
92 | 96.2M | dst[i+2] = temp2 >> shift; |
93 | | |
94 | 96.2M | temp5 = src[i+5] * mul; |
95 | 96.2M | temp4 = temp4 + round; |
96 | 96.2M | dst[i+3] = temp3 >> shift; |
97 | 96.2M | temp6 = src[i+6] * mul; |
98 | | |
99 | 96.2M | dst[i+4] = temp4 >> shift; |
100 | 96.2M | temp5 = temp5 + round; |
101 | 96.2M | temp7 = src[i+7] * mul; |
102 | 96.2M | temp6 = temp6 + round; |
103 | | |
104 | 96.2M | dst[i+5] = temp5 >> shift; |
105 | 96.2M | temp7 = temp7 + round; |
106 | 96.2M | dst[i+6] = temp6 >> shift; |
107 | 96.2M | dst[i+7] = temp7 >> shift; |
108 | | |
109 | 96.2M | } |
110 | 3.00M | } else { |
111 | 966 | shift = -shift; |
112 | 966 | mul <<= shift; |
113 | 31.8k | for (i=0; i<len; i+=8) { |
114 | | |
115 | 30.9k | dst[i] = src[i ] * mul; |
116 | 30.9k | dst[i+1] = src[i+1] * mul; |
117 | 30.9k | dst[i+2] = src[i+2] * mul; |
118 | 30.9k | dst[i+3] = src[i+3] * mul; |
119 | 30.9k | dst[i+4] = src[i+4] * mul; |
120 | 30.9k | dst[i+5] = src[i+5] * mul; |
121 | 30.9k | dst[i+6] = src[i+6] * mul; |
122 | 30.9k | dst[i+7] = src[i+7] * mul; |
123 | 30.9k | } |
124 | 966 | } |
125 | 3.00M | } |
126 | | |
127 | | /** |
128 | | * Downmix samples from original signal to stereo or mono (this is for 16-bit samples |
129 | | * and fixed point decoder - original (for 32-bit samples) is in ac3dsp.c). |
130 | | */ |
131 | | static void ac3_downmix_c_fixed16(int16_t **samples, int16_t **matrix, |
132 | | int out_ch, int in_ch, int len) |
133 | 5.66k | { |
134 | 5.66k | int i, j; |
135 | 5.66k | int v0, v1; |
136 | 5.66k | if (out_ch == 2) { |
137 | 599k | for (i = 0; i < len; i++) { |
138 | 597k | v0 = v1 = 0; |
139 | 2.92M | for (j = 0; j < in_ch; j++) { |
140 | 2.32M | v0 += samples[j][i] * matrix[0][j]; |
141 | 2.32M | v1 += samples[j][i] * matrix[1][j]; |
142 | 2.32M | } |
143 | 597k | samples[0][i] = (v0+2048)>>12; |
144 | 597k | samples[1][i] = (v1+2048)>>12; |
145 | 597k | } |
146 | 3.33k | } else if (out_ch == 1) { |
147 | 857k | for (i = 0; i < len; i++) { |
148 | 854k | v0 = 0; |
149 | 3.13M | for (j = 0; j < in_ch; j++) |
150 | 2.27M | v0 += samples[j][i] * matrix[0][j]; |
151 | 854k | samples[0][i] = (v0+2048)>>12; |
152 | 854k | } |
153 | 3.33k | } |
154 | 5.66k | } |
155 | | |
156 | | #if CONFIG_EAC3_DECODER |
157 | | #include "eac3dec.c" |
158 | | #endif |
159 | | #include "ac3dec.c" |
160 | | |
161 | | static const AVOption options[] = { |
162 | | { "cons_noisegen", "enable consistent noise generation", OFFSET(consistent_noise_generation), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, PAR }, |
163 | | { "drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), AV_OPT_TYPE_FLOAT, {.dbl = 1.0}, 0.0, 6.0, PAR }, |
164 | | { "heavy_compr", "enable heavy dynamic range compression", OFFSET(heavy_compression), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, PAR }, |
165 | | { "downmix", "Request a specific channel layout from the decoder", OFFSET(downmix_layout), AV_OPT_TYPE_CHLAYOUT, {.str = NULL}, .flags = PAR }, |
166 | | { NULL}, |
167 | | }; |
168 | | |
169 | | static const AVClass ac3_decoder_class = { |
170 | | .class_name = "Fixed-Point AC-3 Decoder", |
171 | | .item_name = av_default_item_name, |
172 | | .option = options, |
173 | | .version = LIBAVUTIL_VERSION_INT, |
174 | | }; |
175 | | |
176 | | const FFCodec ff_ac3_fixed_decoder = { |
177 | | .p.name = "ac3_fixed", |
178 | | CODEC_LONG_NAME("ATSC A/52A (AC-3)"), |
179 | | .p.type = AVMEDIA_TYPE_AUDIO, |
180 | | .p.id = AV_CODEC_ID_AC3, |
181 | | .p.priv_class = &ac3_decoder_class, |
182 | | .priv_data_size = sizeof (AC3DecodeContext), |
183 | | .init = ac3_decode_init, |
184 | | .flush = ac3_decode_flush, |
185 | | .close = ac3_decode_end, |
186 | | FF_CODEC_DECODE_CB(ac3_decode_frame), |
187 | | .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | |
188 | | AV_CODEC_CAP_DR1, |
189 | | CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S16P), |
190 | | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, |
191 | | }; |