FFmpeg
Loading...
Searching...
No Matches
ac3enc_fixed.c
Go to the documentation of this file.
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#include "audiodsp.h"
31#include "ac3enc.h"
32#include "codec_internal.h"
33#include "eac3enc.h"
34#include "kbdwin.h"
35
37 const int32_t *coef0, const int32_t *coef1,
38 int len)
39{
40 s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len);
41}
42
43/*
44 * Clip MDCT coefficients to allowable range.
45 */
46static void clip_coefficients(AudioDSPContext *adsp, int32_t *coef,
47 unsigned int len)
48{
49 adsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
50}
51
52
53/*
54 * Calculate a single coupling coordinate.
55 */
56static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
57{
58 if (energy_cpl <= COEF_MAX) {
59 return 1048576;
60 } else {
61 uint64_t coord = energy_ch / (energy_cpl >> 24);
62 uint32_t coord32 = FFMIN(coord, 1073741824);
63 coord32 = ff_sqrt(coord32) << 9;
64 return FFMIN(coord32, COEF_MAX);
65 }
66}
67
68#include "ac3enc_template.c"
69
70/**
71 * Initialize MDCT tables.
72 *
73 * @param s AC-3 encoder private context
74 * @return 0 on success, negative error code on failure
75 */
77{
78 float fwin[AC3_BLOCK_SIZE];
79 const float scale = -1.0f;
80
81 int32_t *iwin = s->mdct_window_fixed;
82
84 for (int i = 0; i < AC3_BLOCK_SIZE; i++)
85 iwin[i] = lrintf(fwin[i] * (1 << 22));
86
88 if (!s->fdsp)
89 return AVERROR(ENOMEM);
90
91 return av_tx_init(&s->tx, &s->tx_fn, AV_TX_INT32_MDCT, 0,
93}
94
95
97{
99 int ret;
100
101 s->fixed_point = 1;
102 s->encode_frame = encode_frame;
103
104 ret = ac3_fixed_mdct_init(avctx, s);
105 if (ret < 0)
106 return ret;
107
108 return ff_ac3_encode_init(avctx);
109}
110
111
#define AC3_BLOCK_SIZE
Definition ac3defs.h:30
av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
Finalize encoding and free any memory allocated by the encoder.
Definition ac3enc.c:2165
av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
Definition ac3enc.c:2490
const AVClass ff_ac3enc_class
Definition ac3enc.c:130
const AVChannelLayout ff_ac3_ch_layouts[19]
List of supported channel layouts.
Definition ac3enc.c:152
const FFCodecDefault ff_ac3_enc_defaults[]
Definition ac3enc.c:137
int ff_ac3_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition ac3enc.c:1981
AC-3 encoder & E-AC-3 encoder common header.
#define COEF_MAX
Definition ac3enc.h:64
#define COEF_MIN
Definition ac3enc.h:63
int64_t CoefSumType
Definition ac3enc.h:68
int32_t CoefType
Definition ac3enc.h:67
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
const FFCodec ff_ac3_fixed_encoder
static av_cold int ac3_fixed_mdct_init(AVCodecContext *avctx, AC3EncodeContext *s)
Initialize MDCT tables.
static void clip_coefficients(AudioDSPContext *adsp, int32_t *coef, unsigned int len)
static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
AC-3 encoder float/fixed template.
const int ff_ac3_sample_rate_tab[]
Definition ac3tab.c:96
int32_t
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define CODEC_SAMPLERATES_ARRAY(array)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define CODEC_SAMPLEFMTS(...)
#define CODEC_CH_LAYOUTS_ARRAY(array)
long long int64_t
Definition coverity.c:34
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
E-AC-3 encoder.
static int encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame, AVPacket *pkt)
Definition ffmpeg_enc.c:694
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition avcodec.h:322
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
Definition codec.h:84
@ AV_CODEC_ID_AC3
Definition codec_id.h:456
#define AVERROR(e)
Definition error.h:45
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_S32P
signed 32 bits, planar
Definition samplefmt.h:65
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
Generate a Kaiser-Bessel Derived Window.
Definition kbdwin.c:54
#define av_cold
Definition attributes.h:117
AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
Allocate and initialize a fixed DSP context.
Definition fixed_dsp.c:151
#define lrintf(x)
Definition libm_mips.h:72
#define FFMIN(a, b)
Definition macros.h:49
#define ff_sqrt
Definition mathops.h:220
AC-3 encoder private context.
Definition ac3enc.h:159
main external API structure.
Definition avcodec.h:443
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
void * priv_data
Definition avcodec.h:470
void(* vector_clip_int32)(int32_t *dst, const int32_t *src, int32_t min, int32_t max, unsigned int len)
Clip each element in an array of int32_t to a given minimum and maximum value.
Definition audiodsp.h:46
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition tx.c:903
@ AV_TX_INT32_MDCT
Definition tx.h:70
int len