summaryrefslogtreecommitdiff
path: root/libavcodec/ac3dsp.h
blob: bafbc8995e5b5b77cd2d1cee90b0ea69e70e5fb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * AC-3 DSP utils
 * Copyright (c) 2011 Justin Ruggles
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCODEC_AC3DSP_H
#define AVCODEC_AC3DSP_H

#include <stdint.h>

/**
 * Number of mantissa bits written for each bap value.
 * bap values with fractional bits are set to 0 and are calculated separately.
 */
extern const uint16_t ff_ac3_bap_bits[16];

typedef struct AC3DSPContext {
    /**
     * Set each encoded exponent in a block to the minimum of itself and the
     * exponents in the same frequency bin of up to 5 following blocks.
     * @param exp   pointer to the start of the current block of exponents.
     *              constraints: align 16
     * @param num_reuse_blocks  number of blocks that will reuse exponents from the current block.
     *                          constraints: range 0 to 5
     * @param nb_coefs  number of frequency coefficients.
     */
    void (*ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs);

    /**
     * Calculate the maximum MSB of the absolute value of each element in an
     * array of int16_t.
     * @param src input array
     *            constraints: align 16. values must be in range [-32767,32767]
     * @param len number of values in the array
     *            constraints: multiple of 16 greater than 0
     * @return    a value with the same MSB as max(abs(src[]))
     */
    int (*ac3_max_msb_abs_int16)(const int16_t *src, int len);

    /**
     * Left-shift each value in an array of int16_t by a specified amount.
     * @param src    input array
     *               constraints: align 16
     * @param len    number of values in the array
     *               constraints: multiple of 32 greater than 0
     * @param shift  left shift amount
     *               constraints: range [0,15]
     */
    void (*ac3_lshift_int16)(int16_t *src, unsigned int len, unsigned int shift);

    /**
     * Right-shift each value in an array of int32_t by a specified amount.
     * @param src    input array
     *               constraints: align 16
     * @param len    number of values in the array
     *               constraints: multiple of 16 greater than 0
     * @param shift  right shift amount
     *               constraints: range [0,31]
     */
    void (*ac3_rshift_int32)(int32_t *src, unsigned int len, unsigned int shift);

    /**
     * Convert an array of float in range [-1.0,1.0] to int32_t with range
     * [-(1<<24),(1<<24)]
     *
     * @param dst destination array of int32_t.
     *            constraints: 16-byte aligned
     * @param src source array of float.
     *            constraints: 16-byte aligned
     * @param len number of elements to convert.
     *            constraints: multiple of 32 greater than zero
     */
    void (*float_to_fixed24)(int32_t *dst, const float *src, unsigned int len);

    /**
     * Calculate bit allocation pointers.
     * The SNR is the difference between the masking curve and the signal.  AC-3
     * uses this value for each frequency bin to allocate bits.  The snroffset
     * parameter is a global adjustment to the SNR for all bins.
     *
     * @param[in]  mask       masking curve
     * @param[in]  psd        signal power for each frequency bin
     * @param[in]  start      starting bin location
     * @param[in]  end        ending bin location
     * @param[in]  snr_offset SNR adjustment
     * @param[in]  floor      noise floor
     * @param[in]  bap_tab    look-up table for bit allocation pointers
     * @param[out] bap        bit allocation pointers
     */
    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);

    /**
     * Update bap counts using the supplied array of bap.
     *
     * @param[out] mant_cnt   bap counts for 1 block
     * @param[in]  bap        array of bap, pointing to start coef bin
     * @param[in]  len        number of elements to process
     */
    void (*update_bap_counts)(uint16_t mant_cnt[16], uint8_t *bap, int len);

    /**
     * Calculate the number of bits needed to encode a set of mantissas.
     *
     * @param[in] mant_cnt    bap counts for all blocks
     * @return                mantissa bit count
     */
    int (*compute_mantissa_size)(uint16_t mant_cnt[6][16]);

    void (*extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs);

    void (*sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0,
                                       const int32_t *coef1, int len);

    void (*sum_square_butterfly_float)(float sum[4], const float *coef0,
                                       const float *coef1, int len);

    void (*downmix)(float **samples, float (*matrix)[2], int out_ch,
                    int in_ch, int len);
} AC3DSPContext;

void ff_ac3dsp_init    (AC3DSPContext *c, int bit_exact);
void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact);
void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact);
void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact);

#endif /* AVCODEC_AC3DSP_H */