GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/ac3enc_fixed.c Lines: 33 35 94.3 %
Date: 2021-04-20 04:37:23 Branches: 6 8 75.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 AC3ENC_FLOAT 0
30
#define FFT_FLOAT 0
31
#define FFT_FIXED_32 1
32
#include "internal.h"
33
#include "audiodsp.h"
34
#include "ac3enc.h"
35
#include "eac3enc.h"
36
#include "kbdwin.h"
37
38
static const AVClass ac3enc_class = {
39
    .class_name = "Fixed-Point AC-3 Encoder",
40
    .item_name  = av_default_item_name,
41
    .option     = ff_ac3_enc_options,
42
    .version    = LIBAVUTIL_VERSION_INT,
43
};
44
45
4152
static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4],
46
                                 const int32_t *coef0, const int32_t *coef1,
47
                                 int len)
48
{
49
4152
    s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len);
50
4152
}
51
52
/*
53
 * Clip MDCT coefficients to allowable range.
54
 */
55
1038
static void clip_coefficients(AudioDSPContext *adsp, int32_t *coef,
56
                              unsigned int len)
57
{
58
1038
    adsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
59
1038
}
60
61
62
/*
63
 * Calculate a single coupling coordinate.
64
 */
65
9704
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
66
{
67
9704
    if (energy_cpl <= COEF_MAX) {
68
7882
        return 1048576;
69
    } else {
70
1822
        uint64_t coord   = energy_ch / (energy_cpl >> 24);
71
1822
        uint32_t coord32 = FFMIN(coord, 1073741824);
72
1822
        coord32          = ff_sqrt(coord32) << 9;
73
1822
        return FFMIN(coord32, COEF_MAX);
74
    }
75
}
76
77
78
#include "ac3enc_template.c"
79
80
81
/**
82
 * Finalize MDCT and free allocated memory.
83
 *
84
 * @param s  AC-3 encoder private context
85
 */
86
4
static av_cold void ac3_fixed_mdct_end(AC3EncodeContext *s)
87
{
88
4
    ff_mdct_end(&s->mdct);
89
4
}
90
91
/**
92
 * Initialize MDCT tables.
93
 *
94
 * @param s  AC-3 encoder private context
95
 * @return   0 on success, negative error code on failure
96
 */
97
4
static av_cold int ac3_fixed_mdct_init(AC3EncodeContext *s)
98
{
99
    float fwin[AC3_BLOCK_SIZE];
100
101
4
    int32_t *iwin = av_malloc_array(AC3_BLOCK_SIZE, sizeof(*iwin));
102
4
    if (!iwin)
103
        return AVERROR(ENOMEM);
104
105
4
    ff_kbd_window_init(fwin, 5.0, AC3_BLOCK_SIZE);
106
1028
    for (int i = 0; i < AC3_BLOCK_SIZE; i++)
107
1024
        iwin[i] = lrintf(fwin[i] * (1 << 22));
108
109
4
    s->mdct_window = iwin;
110
111
4
    s->fdsp = avpriv_alloc_fixed_dsp(s->avctx->flags & AV_CODEC_FLAG_BITEXACT);
112
4
    if (!s->fdsp)
113
        return AVERROR(ENOMEM);
114
115
4
    return ff_mdct_init(&s->mdct, 9, 0, -1.0);
116
}
117
118
119
4
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
120
{
121
4
    AC3EncodeContext *s = avctx->priv_data;
122
4
    s->fixed_point = 1;
123
4
    s->mdct_end                = ac3_fixed_mdct_end;
124
4
    s->mdct_init               = ac3_fixed_mdct_init;
125
4
    s->allocate_sample_buffers = allocate_sample_buffers;
126
4
    return ff_ac3_encode_init(avctx);
127
}
128
129
130
AVCodec ff_ac3_fixed_encoder = {
131
    .name            = "ac3_fixed",
132
    .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
133
    .type            = AVMEDIA_TYPE_AUDIO,
134
    .id              = AV_CODEC_ID_AC3,
135
    .priv_data_size  = sizeof(AC3EncodeContext),
136
    .init            = ac3_fixed_encode_init,
137
    .encode2         = ff_ac3_fixed_encode_frame,
138
    .close           = ff_ac3_encode_close,
139
    .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32P,
140
                                                      AV_SAMPLE_FMT_NONE },
141
    .priv_class      = &ac3enc_class,
142
    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
143
    .supported_samplerates = ff_ac3_sample_rate_tab,
144
    .channel_layouts = ff_ac3_channel_layouts,
145
    .defaults        = ff_ac3_enc_defaults,
146
};