FFmpeg
Loading...
Searching...
No Matches
ac3enc_float.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 * floating-point AC-3 encoder.
27 */
28
29#define AC3ENC_FLOAT 1
30#include "audiodsp.h"
31#include "ac3enc.h"
32#include "codec_internal.h"
33#include "eac3enc.h"
34#include "kbdwin.h"
35
36
37/*
38 * Scale MDCT coefficients from float to 24-bit fixed-point.
39 */
41{
42 int chan_size = AC3_MAX_COEFS * s->num_blocks;
43 int cpl = s->cpl_on;
44 s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + (chan_size * !cpl),
45 s->mdct_coef_buffer + (chan_size * !cpl),
46 chan_size * (s->channels + cpl));
47}
48
49
50/*
51 * Clip MDCT coefficients to allowable range.
52 */
53static void clip_coefficients(AudioDSPContext *adsp, float *coef,
54 unsigned int len)
55{
56 adsp->vector_clipf(coef, coef, len, COEF_MIN, COEF_MAX);
57}
58
59
60/*
61 * Calculate a single coupling coordinate.
62 */
63static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
64{
65 float coord = 0.125;
66 if (energy_cpl > 0)
67 coord *= sqrtf(energy_ch / energy_cpl);
68 return FFMIN(coord, COEF_MAX);
69}
70
71static void sum_square_butterfly(AC3EncodeContext *s, float sum[4],
72 const float *coef0, const float *coef1,
73 int len)
74{
75 s->ac3dsp.sum_square_butterfly_float(sum, coef0, coef1, len);
76}
77
78#include "ac3enc_template.c"
79
80/**
81 * Initialize MDCT tables.
82 *
83 * @param s AC-3 encoder private context
84 * @return 0 on success, negative error code on failure
85 */
87{
88 const float scale = -2.0 / AC3_WINDOW_SIZE;
89
90 ff_kbd_window_init(s->mdct_window_float, 5.0, AC3_BLOCK_SIZE);
91
92 return av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_MDCT, 0,
94}
95
96
98{
100 int ret;
101
102 s->encode_frame = encode_frame;
104 if (!s->fdsp)
105 return AVERROR(ENOMEM);
106
107 ret = ac3_float_mdct_init(s);
108 if (ret < 0)
109 return ret;
110
111 return ff_ac3_encode_init(avctx);
112}
113
#define AC3_BLOCK_SIZE
Definition ac3defs.h:30
#define AC3_WINDOW_SIZE
Definition ac3defs.h:33
#define AC3_MAX_COEFS
Definition ac3defs.h:29
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.
int ff_ac3_float_encode_init(AVCodecContext *avctx)
#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 void clip_coefficients(AudioDSPContext *adsp, float *coef, unsigned int len)
av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx)
static av_cold int ac3_float_mdct_init(AC3EncodeContext *s)
Initialize MDCT tables.
const FFCodec ff_ac3_encoder
static void scale_coefficients(AC3EncodeContext *s)
static void sum_square_butterfly(AC3EncodeContext *s, float sum[4], const float *coef0, const float *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
#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)
static __device__ float sqrtf(float a)
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_FLTP
float, planar
Definition samplefmt.h:66
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
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition float_dsp.c:135
#define FFMIN(a, b)
Definition macros.h:49
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_clipf)(float *dst, const float *src, int len, float min, float max)
Definition audiodsp.h:49
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_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition tx.h:68
int len