FFmpeg
ac3dsp.h
Go to the documentation of this file.
1 /*
2  * AC-3 DSP functions
3  * Copyright (c) 2011 Justin Ruggles
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #ifndef AVCODEC_AC3DSP_H
23 #define AVCODEC_AC3DSP_H
24 
25 #include <stdint.h>
26 
27 /**
28  * Number of mantissa bits written for each bap value.
29  * bap values with fractional bits are set to 0 and are calculated separately.
30  */
31 extern const uint16_t ff_ac3_bap_bits[16];
32 
33 typedef struct AC3DSPContext {
34  /**
35  * Set each encoded exponent in a block to the minimum of itself and the
36  * exponents in the same frequency bin of up to 5 following blocks.
37  * @param exp pointer to the start of the current block of exponents.
38  * constraints: align 16
39  * @param num_reuse_blocks number of blocks that will reuse exponents from the current block.
40  * constraints: range 0 to 5
41  * @param nb_coefs number of frequency coefficients.
42  */
43  void (*ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs);
44 
45  /**
46  * Convert an array of float in range [-1.0,1.0] to int32_t with range
47  * [-(1<<24),(1<<24)]
48  *
49  * @param dst destination array of int32_t.
50  * constraints: 16-byte aligned
51  * @param src source array of float.
52  * constraints: 16-byte aligned
53  * @param len number of elements to convert.
54  * constraints: multiple of 32 greater than zero
55  */
56  void (*float_to_fixed24)(int32_t *dst, const float *src, unsigned int len);
57 
58  /**
59  * Calculate bit allocation pointers.
60  * The SNR is the difference between the masking curve and the signal. AC-3
61  * uses this value for each frequency bin to allocate bits. The snroffset
62  * parameter is a global adjustment to the SNR for all bins.
63  *
64  * @param[in] mask masking curve
65  * @param[in] psd signal power for each frequency bin
66  * @param[in] start starting bin location
67  * @param[in] end ending bin location
68  * @param[in] snr_offset SNR adjustment
69  * @param[in] floor noise floor
70  * @param[in] bap_tab look-up table for bit allocation pointers
71  * @param[out] bap bit allocation pointers
72  */
73  void (*bit_alloc_calc_bap)(int16_t *mask, int16_t *psd, int start, int end,
74  int snr_offset, int floor,
75  const uint8_t *bap_tab, uint8_t *bap);
76 
77  /**
78  * Update bap counts using the supplied array of bap.
79  *
80  * @param[out] mant_cnt bap counts for 1 block
81  * @param[in] bap array of bap, pointing to start coef bin
82  * @param[in] len number of elements to process
83  */
84  void (*update_bap_counts)(uint16_t mant_cnt[16], uint8_t *bap, int len);
85 
86  /**
87  * Calculate the number of bits needed to encode a set of mantissas.
88  *
89  * @param[in] mant_cnt bap counts for all blocks
90  * @return mantissa bit count
91  */
92  int (*compute_mantissa_size)(uint16_t mant_cnt[6][16]);
93 
94  void (*extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs);
95 
96  void (*sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0,
97  const int32_t *coef1, int len);
98 
99  void (*sum_square_butterfly_float)(float sum[4], const float *coef0,
100  const float *coef1, int len);
101 
104  void (*downmix)(float **samples, float **matrix, int len);
105  void (*downmix_fixed)(int32_t **samples, int16_t **matrix, int len);
106 } AC3DSPContext;
107 
108 void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact);
109 void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact);
110 void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact);
111 void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact);
112 
113 void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix,
114  int out_ch, int in_ch, int len);
115 void ff_ac3dsp_downmix_fixed(AC3DSPContext *c, int32_t **samples, int16_t **matrix,
116  int out_ch, int in_ch, int len);
117 
119 
120 #endif /* AVCODEC_AC3DSP_H */
nb_coefs
static int nb_coefs(int length, int level, uint64_t sn)
Definition: af_afwtdn.c:515
AC3DSPContext::in_channels
int in_channels
Definition: ac3dsp.h:103
AC3DSPContext::float_to_fixed24
void(* float_to_fixed24)(int32_t *dst, const float *src, unsigned int len)
Convert an array of float in range [-1.0,1.0] to int32_t with range [-(1<<24),(1<<24)].
Definition: ac3dsp.h:56
AC3DSPContext
Definition: ac3dsp.h:33
ff_ac3dsp_init_arm
void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp_init_arm.c:47
ff_ac3dsp_downmix
void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:343
ff_ac3_bap_bits
const uint16_t ff_ac3_bap_bits[16]
Number of mantissa bits written for each bap value.
Definition: ac3dsp.c:106
AC3DSPContext::ac3_exponent_min
void(* ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
Set each encoded exponent in a block to the minimum of itself and the exponents in the same frequency...
Definition: ac3dsp.h:43
AC3DSPContext::sum_square_butterfly_int32
void(* sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
Definition: ac3dsp.h:96
ff_ac3dsp_set_downmix_x86
void ff_ac3dsp_set_downmix_x86(AC3DSPContext *c)
Definition: ac3dsp_init.c:88
mask
static const uint16_t mask[17]
Definition: lzw.c:38
floor
static __device__ float floor(float a)
Definition: cuda_runtime.h:173
ff_ac3dsp_init
void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp.c:375
AC3DSPContext::sum_square_butterfly_float
void(* sum_square_butterfly_float)(float sum[4], const float *coef0, const float *coef1, int len)
Definition: ac3dsp.h:99
AC3DSPContext::compute_mantissa_size
int(* compute_mantissa_size)(uint16_t mant_cnt[6][16])
Calculate the number of bits needed to encode a set of mantissas.
Definition: ac3dsp.h:92
AC3DSPContext::extract_exponents
void(* extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs)
Definition: ac3dsp.h:94
bap_tab
static const uint8_t bap_tab[64]
Definition: dolby_e.c:590
ff_ac3dsp_init_mips
void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp_mips.c:403
src
#define src
Definition: vp8dsp.c:255
exp
int8_t exp
Definition: eval.c:72
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_ac3dsp_downmix_fixed
void ff_ac3dsp_downmix_fixed(AC3DSPContext *c, int32_t **samples, int16_t **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:316
AC3DSPContext::update_bap_counts
void(* update_bap_counts)(uint16_t mant_cnt[16], uint8_t *bap, int len)
Update bap counts using the supplied array of bap.
Definition: ac3dsp.h:84
ff_ac3dsp_init_x86
void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp_init.c:41
len
int len
Definition: vorbis_enc_data.h:426
AC3DSPContext::bit_alloc_calc_bap
void(* bit_alloc_calc_bap)(int16_t *mask, int16_t *psd, int start, int end, int snr_offset, int floor, const uint8_t *bap_tab, uint8_t *bap)
Calculate bit allocation pointers.
Definition: ac3dsp.h:73
AC3DSPContext::out_channels
int out_channels
Definition: ac3dsp.h:102
AC3DSPContext::downmix_fixed
void(* downmix_fixed)(int32_t **samples, int16_t **matrix, int len)
Definition: ac3dsp.h:105
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
AC3DSPContext::downmix
void(* downmix)(float **samples, float **matrix, int len)
Definition: ac3dsp.h:104
int32_t
int32_t
Definition: audioconvert.c:56
int
int
Definition: ffmpeg_filter.c:153