GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/ac3enc_fixed.c Lines: 37 37 100.0 %
Date: 2019-11-22 03:34:36 Branches: 8 8 100.0 %

Line Branch Exec Source
1
/*
2
 * The simplest AC-3 encoder
3
 * Copyright (c) 2000 Fabrice Bellard
4
 * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
5
 * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
6
 *
7
 * This file is part of FFmpeg.
8
 *
9
 * FFmpeg is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
14
 * FFmpeg is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public
20
 * License along with FFmpeg; if not, write to the Free Software
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
 */
23
24
/**
25
 * @file
26
 * fixed-point AC-3 encoder.
27
 */
28
29
#define FFT_FLOAT 0
30
#undef CONFIG_AC3ENC_FLOAT
31
#include "internal.h"
32
#include "audiodsp.h"
33
#include "ac3enc.h"
34
#include "eac3enc.h"
35
36
#define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
37
#include "ac3enc_opts_template.c"
38
39
static const AVClass ac3enc_class = {
40
    .class_name = "Fixed-Point AC-3 Encoder",
41
    .item_name  = av_default_item_name,
42
    .option     = ac3_options,
43
    .version    = LIBAVUTIL_VERSION_INT,
44
};
45
46
/*
47
 * Normalize the input samples to use the maximum available precision.
48
 * This assumes signed 16-bit input samples.
49
 */
50
4344
static int normalize_samples(AC3EncodeContext *s)
51
{
52
4344
    int v = s->ac3dsp.ac3_max_msb_abs_int16(s->windowed_samples, AC3_WINDOW_SIZE);
53
4344
    v = 14 - av_log2(v);
54
4344
    if (v > 0)
55
3996
        s->ac3dsp.ac3_lshift_int16(s->windowed_samples, AC3_WINDOW_SIZE, v);
56
    /* +6 to right-shift from 31-bit to 25-bit */
57
4344
    return v + 6;
58
}
59
60
61
/*
62
 * Scale MDCT coefficients to 25-bit signed fixed-point.
63
 */
64
551
static void scale_coefficients(AC3EncodeContext *s)
65
{
66
    int blk, ch;
67
68
3857
    for (blk = 0; blk < s->num_blocks; blk++) {
69
3306
        AC3Block *block = &s->blocks[blk];
70
7650
        for (ch = 1; ch <= s->channels; ch++) {
71
4344
            s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS,
72
4344
                                       block->coeff_shift[ch]);
73
        }
74
    }
75
551
}
76
77
4152
static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4],
78
                                 const int32_t *coef0, const int32_t *coef1,
79
                                 int len)
80
{
81
4152
    s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len);
82
4152
}
83
84
/*
85
 * Clip MDCT coefficients to allowable range.
86
 */
87
1589
static void clip_coefficients(AudioDSPContext *adsp, int32_t *coef,
88
                              unsigned int len)
89
{
90
1589
    adsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
91
1589
}
92
93
94
/*
95
 * Calculate a single coupling coordinate.
96
 */
97
9704
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
98
{
99
9704
    if (energy_cpl <= COEF_MAX) {
100
7882
        return 1048576;
101
    } else {
102
1822
        uint64_t coord   = energy_ch / (energy_cpl >> 24);
103
1822
        uint32_t coord32 = FFMIN(coord, 1073741824);
104
1822
        coord32          = ff_sqrt(coord32) << 9;
105
1822
        return FFMIN(coord32, COEF_MAX);
106
    }
107
}
108
109
110
#include "ac3enc_template.c"
111
112
113
/**
114
 * Finalize MDCT and free allocated memory.
115
 *
116
 * @param s  AC-3 encoder private context
117
 */
118
4
av_cold void ff_ac3_fixed_mdct_end(AC3EncodeContext *s)
119
{
120
4
    ff_mdct_end(&s->mdct);
121
4
}
122
123
124
/**
125
 * Initialize MDCT tables.
126
 *
127
 * @param s  AC-3 encoder private context
128
 * @return   0 on success, negative error code on failure
129
 */
130
4
av_cold int ff_ac3_fixed_mdct_init(AC3EncodeContext *s)
131
{
132
4
    int ret = ff_mdct_init(&s->mdct, 9, 0, -1.0);
133
4
    s->mdct_window = ff_ac3_window;
134
4
    return ret;
135
}
136
137
138
4
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
139
{
140
4
    AC3EncodeContext *s = avctx->priv_data;
141
4
    s->fixed_point = 1;
142
4
    return ff_ac3_encode_init(avctx);
143
}
144
145
146
AVCodec ff_ac3_fixed_encoder = {
147
    .name            = "ac3_fixed",
148
    .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
149
    .type            = AVMEDIA_TYPE_AUDIO,
150
    .id              = AV_CODEC_ID_AC3,
151
    .priv_data_size  = sizeof(AC3EncodeContext),
152
    .init            = ac3_fixed_encode_init,
153
    .encode2         = ff_ac3_fixed_encode_frame,
154
    .close           = ff_ac3_encode_close,
155
    .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
156
                                                      AV_SAMPLE_FMT_NONE },
157
    .priv_class      = &ac3enc_class,
158
    .channel_layouts = ff_ac3_channel_layouts,
159
    .defaults        = ac3_defaults,
160
};