GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/ac3dec_fixed.c Lines: 40 65 61.5 %
Date: 2019-11-20 04:07:19 Branches: 9 18 50.0 %

Line Branch Exec 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
#define FFT_FLOAT 0
51
#define USE_FIXED 1
52
#define FFT_FIXED_32 1
53
#include "ac3dec.h"
54
55
56
static const int end_freq_inv_tab[8] =
57
{
58
    50529027, 44278013, 39403370, 32292987, 27356480, 23729101, 20951060, 18755316
59
};
60
61
7008
static void scale_coefs (
62
    int32_t *dst,
63
    const int32_t *src,
64
    int dynrng,
65
    int len)
66
{
67
    int i, shift;
68
    unsigned mul, round;
69
    int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
70
71
7008
    mul = (dynrng & 0x1f) + 0x20;
72
7008
    shift = 4 - (sign_extend(dynrng, 9) >> 5);
73
7008
    if (shift > 0 ) {
74
7008
      round = 1 << (shift-1);
75
231264
      for (i=0; i<len; i+=8) {
76
77
224256
          temp = src[i] * mul;
78
224256
          temp1 = src[i+1] * mul;
79
224256
          temp = temp + round;
80
224256
          temp2 = src[i+2] * mul;
81
82
224256
          temp1 = temp1 + round;
83
224256
          dst[i] = temp >> shift;
84
224256
          temp3 = src[i+3] * mul;
85
224256
          temp2 = temp2 + round;
86
87
224256
          dst[i+1] = temp1 >> shift;
88
224256
          temp4 = src[i + 4] * mul;
89
224256
          temp3 = temp3 + round;
90
224256
          dst[i+2] = temp2 >> shift;
91
92
224256
          temp5 = src[i+5] * mul;
93
224256
          temp4 = temp4 + round;
94
224256
          dst[i+3] = temp3 >> shift;
95
224256
          temp6 = src[i+6] * mul;
96
97
224256
          dst[i+4] = temp4 >> shift;
98
224256
          temp5 = temp5 + round;
99
224256
          temp7 = src[i+7] * mul;
100
224256
          temp6 = temp6 + round;
101
102
224256
          dst[i+5] = temp5 >> shift;
103
224256
          temp7 = temp7 + round;
104
224256
          dst[i+6] = temp6 >> shift;
105
224256
          dst[i+7] = temp7 >> shift;
106
107
      }
108
    } else {
109
      shift = -shift;
110
      for (i=0; i<len; i+=8) {
111
112
          temp = src[i] * mul;
113
          temp1 = src[i+1] * mul;
114
          temp2 = src[i+2] * mul;
115
116
          dst[i] = temp << shift;
117
          temp3 = src[i+3] * mul;
118
119
          dst[i+1] = temp1 << shift;
120
          temp4 = src[i + 4] * mul;
121
          dst[i+2] = temp2 << shift;
122
123
          temp5 = src[i+5] * mul;
124
          dst[i+3] = temp3 << shift;
125
          temp6 = src[i+6] * mul;
126
127
          dst[i+4] = temp4 << shift;
128
          temp7 = src[i+7] * mul;
129
130
          dst[i+5] = temp5 << shift;
131
          dst[i+6] = temp6 << shift;
132
          dst[i+7] = temp7 << shift;
133
134
      }
135
    }
136
7008
}
137
138
/**
139
 * Downmix samples from original signal to stereo or mono (this is for 16-bit samples
140
 * and fixed point decoder - original (for 32-bit samples) is in ac3dsp.c).
141
 */
142
1
static void ac3_downmix_c_fixed16(int16_t **samples, int16_t **matrix,
143
                                  int out_ch, int in_ch, int len)
144
{
145
    int i, j;
146
    int v0, v1;
147
1
    if (out_ch == 2) {
148
        for (i = 0; i < len; i++) {
149
            v0 = v1 = 0;
150
            for (j = 0; j < in_ch; j++) {
151
                v0 += samples[j][i] * matrix[0][j];
152
                v1 += samples[j][i] * matrix[1][j];
153
            }
154
            samples[0][i] = (v0+2048)>>12;
155
            samples[1][i] = (v1+2048)>>12;
156
        }
157
1
    } else if (out_ch == 1) {
158
257
        for (i = 0; i < len; i++) {
159
256
            v0 = 0;
160
1280
            for (j = 0; j < in_ch; j++)
161
1024
                v0 += samples[j][i] * matrix[0][j];
162
256
            samples[0][i] = (v0+2048)>>12;
163
        }
164
    }
165
1
}
166
167
#include "eac3dec.c"
168
#include "ac3dec.c"
169
170
static const AVOption options[] = {
171
    { "cons_noisegen", "enable consistent noise generation", OFFSET(consistent_noise_generation), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, PAR },
172
    { "drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), AV_OPT_TYPE_FLOAT, {.dbl = 1.0}, 0.0, 6.0, PAR },
173
    { "heavy_compr", "enable heavy dynamic range compression", OFFSET(heavy_compression), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, PAR },
174
    { NULL},
175
};
176
177
static const AVClass ac3_decoder_class = {
178
    .class_name = "Fixed-Point AC-3 Decoder",
179
    .item_name  = av_default_item_name,
180
    .option     = options,
181
    .version    = LIBAVUTIL_VERSION_INT,
182
};
183
184
AVCodec ff_ac3_fixed_decoder = {
185
    .name           = "ac3_fixed",
186
    .type           = AVMEDIA_TYPE_AUDIO,
187
    .id             = AV_CODEC_ID_AC3,
188
    .priv_data_size = sizeof (AC3DecodeContext),
189
    .init           = ac3_decode_init,
190
    .close          = ac3_decode_end,
191
    .decode         = ac3_decode_frame,
192
    .capabilities   = AV_CODEC_CAP_DR1,
193
    .long_name      = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
194
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
195
                                                      AV_SAMPLE_FMT_NONE },
196
    .priv_class     = &ac3_decoder_class,
197
};