FFmpeg
aptx.h
Go to the documentation of this file.
1 /*
2  * Audio Processing Technology codec for Bluetooth (aptX)
3  *
4  * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVCODEC_APTX_H
24 #define AVCODEC_APTX_H
25 
26 #include "libavutil/intreadwrite.h"
27 #include "avcodec.h"
28 #include "internal.h"
29 #include "mathops.h"
30 #include "audio_frame_queue.h"
31 
32 
33 enum channels {
37 };
38 
39 enum subbands {
40  LF, // Low Frequency (0-5.5 kHz)
41  MLF, // Medium-Low Frequency (5.5-11kHz)
42  MHF, // Medium-High Frequency (11-16.5kHz)
43  HF, // High Frequency (16.5-22kHz)
45 };
46 
47 #define NB_FILTERS 2
48 #define FILTER_TAPS 16
49 
50 typedef struct {
51  int pos;
53 } FilterSignal;
54 
55 typedef struct {
56  FilterSignal outer_filter_signal[NB_FILTERS];
57  FilterSignal inner_filter_signal[NB_FILTERS][NB_FILTERS];
58 } QMFAnalysis;
59 
60 typedef struct {
64 } Quantize;
65 
66 typedef struct {
71 
72 typedef struct {
73  int32_t prev_sign[2];
74  int32_t s_weight[2];
75  int32_t d_weight[24];
77  int32_t reconstructed_differences[48];
81 } Prediction;
82 
83 typedef struct {
87 
90  InvertQuantize invert_quantize[NB_SUBBANDS];
91  Prediction prediction[NB_SUBBANDS];
92 } Channel;
93 
94 typedef struct {
95  int hd;
100 } AptXContext;
101 
102 typedef const struct {
110 } ConstTables;
111 
113 
114 /* Rounded right shift with optionnal clipping */
115 #define RSHIFT_SIZE(size) \
116 av_always_inline \
117 static int##size##_t rshift##size(int##size##_t value, int shift) \
118 { \
119  int##size##_t rounding = (int##size##_t)1 << (shift - 1); \
120  int##size##_t mask = ((int##size##_t)1 << (shift + 1)) - 1; \
121  return ((value + rounding) >> shift) - ((value & mask) == rounding); \
122 } \
123 av_always_inline \
124 static int##size##_t rshift##size##_clip24(int##size##_t value, int shift) \
125 { \
126  return av_clip_intp2(rshift##size(value, shift), 23); \
127 }
128 RSHIFT_SIZE(32)
129 RSHIFT_SIZE(64)
130 
131 /*
132  * Convolution filter coefficients for the outer QMF of the QMF tree.
133  * The 2 sets are a mirror of each other.
134  */
136  {
137  730, -413, -9611, 43626, -121026, 269973, -585547, 2801966,
138  697128, -160481, 27611, 8478, -10043, 3511, 688, -897,
139  },
140  {
141  -897, 688, 3511, -10043, 8478, 27611, -160481, 697128,
142  2801966, -585547, 269973, -121026, 43626, -9611, -413, 730,
143  },
144 };
145 
146 /*
147  * Convolution filter coefficients for the inner QMF of the QMF tree.
148  * The 2 sets are a mirror of each other.
149  */
151  {
152  1033, -584, -13592, 61697, -171156, 381799, -828088, 3962579,
153  985888, -226954, 39048, 11990, -14203, 4966, 973, -1268,
154  },
155  {
156  -1268, 973, 4966, -14203, 11990, 39048, -226954, 985888,
157  3962579, -828088, 381799, -171156, 61697, -13592, -584, 1033,
158  },
159 };
160 
161 /*
162  * Push one sample into a circular signal buffer.
163  */
166 {
167  signal->buffer[signal->pos ] = sample;
168  signal->buffer[signal->pos+FILTER_TAPS] = sample;
169  signal->pos = (signal->pos + 1) & (FILTER_TAPS - 1);
170 }
171 
172 /*
173  * Compute the convolution of the signal with the coefficients, and reduce
174  * to 24 bits by applying the specified right shifting.
175  */
178  const int32_t coeffs[FILTER_TAPS],
179  int shift)
180 {
181  int32_t *sig = &signal->buffer[signal->pos];
182  int64_t e = 0;
183  int i;
184 
185  for (i = 0; i < FILTER_TAPS; i++)
186  e += MUL64(sig[i], coeffs[i]);
187 
188  return rshift64_clip24(e, shift);
189 }
190 
192 {
193  int32_t parity = channel->dither_parity;
194  int subband;
195 
196  for (subband = 0; subband < NB_SUBBANDS; subband++)
197  parity ^= channel->quantize[subband].quantized_sample;
198 
199  return parity & 1;
200 }
201 
202 /* For each sample, ensure that the parity of all subbands of all channels
203  * is 0 except once every 8 samples where the parity is forced to 1. */
205 {
208 
209  int eighth = *idx == 7;
210  *idx = (*idx + 1) & 7;
211 
212  return parity ^ eighth;
213 }
214 
217 
218 int ff_aptx_init(AVCodecContext *avctx);
219 
220 #endif /* AVCODEC_APTX_H */
Channel
Definition: aptx.h:83
Prediction
Definition: aptx.h:72
FILTER_TAPS
#define FILTER_TAPS
Definition: aptx.h:48
aptx_quantized_parity
static int32_t aptx_quantized_parity(Channel *channel)
Definition: aptx.h:191
AptXContext::hd
int hd
Definition: aptx.h:95
ConstTables::factor_max
int32_t factor_max
Definition: aptx.h:108
QMFAnalysis
Definition: aptx.h:55
Channel::qmf
QMFAnalysis qmf
Definition: aptx.h:88
internal.h
subbands
subbands
Definition: aptx.h:39
AptXContext
Definition: aptx.h:94
ff_aptx_quant_tables
ConstTables ff_aptx_quant_tables[2][NB_SUBBANDS]
Definition: aptx.c:312
quantize
static int quantize(CinepakEncContext *s, int h, uint8_t *data[4], int linesize[4], int v1mode, strip_info *info, mb_encoding encoding)
Definition: cinepakenc.c:698
audio_frame_queue.h
RIGHT
@ RIGHT
Definition: aptx.h:35
ff_aptx_init
int ff_aptx_init(AVCodecContext *avctx)
Definition: aptx.c:507
intreadwrite.h
ConstTables
Definition: aptx.h:102
Prediction::predicted_sample
int32_t predicted_sample
Definition: aptx.h:80
NB_CHANNELS
@ NB_CHANNELS
Definition: aptx.h:36
AudioFrameQueue
Definition: audio_frame_queue.h:32
channels
channels
Definition: aptx.h:33
ConstTables::quantize_factor_select_offset
const int16_t * quantize_factor_select_offset
Definition: aptx.h:106
RSHIFT_SIZE
#define RSHIFT_SIZE(size)
Definition: aptx.h:115
Quantize::error
int32_t error
Definition: aptx.h:63
MLF
@ MLF
Definition: aptx.h:41
int32_t
int32_t
Definition: audio_convert.c:194
aptx_qmf_convolution
static av_always_inline int32_t aptx_qmf_convolution(FilterSignal *signal, const int32_t coeffs[FILTER_TAPS], int shift)
Definition: aptx.h:177
ConstTables::quantize_intervals
const int32_t * quantize_intervals
Definition: aptx.h:103
mathops.h
Prediction
Prediction
Definition: magicyuv.c:42
aptx_qmf_outer_coeffs
static const int32_t aptx_qmf_outer_coeffs[NB_FILTERS][FILTER_TAPS]
Definition: aptx.h:135
FilterSignal
Definition: aptx.h:50
InvertQuantize::factor_select
int32_t factor_select
Definition: aptx.h:68
NB_FILTERS
#define NB_FILTERS
Definition: aptx.h:47
ff_aptx_generate_dither
void ff_aptx_generate_dither(Channel *channel)
Definition: aptx.c:384
InvertQuantize::reconstructed_difference
int32_t reconstructed_difference
Definition: aptx.h:69
FilterSignal::buffer
int32_t buffer[2 *FILTER_TAPS]
Definition: aptx.h:52
aptx_qmf_inner_coeffs
static const int32_t aptx_qmf_inner_coeffs[NB_FILTERS][FILTER_TAPS]
Definition: aptx.h:150
ff_aptx_invert_quantize_and_prediction
void ff_aptx_invert_quantize_and_prediction(Channel *channel, int hd)
Definition: aptx.c:496
sample
#define sample
Definition: flacdsp_template.c:44
parity
mcdeint parity
Definition: vf_mcdeint.c:277
Prediction::pos
int32_t pos
Definition: aptx.h:76
AptXContext::sync_idx
int32_t sync_idx
Definition: aptx.h:97
LEFT
@ LEFT
Definition: aptx.h:34
AptXContext::afq
AudioFrameQueue afq
Definition: aptx.h:99
i
int i
Definition: input.c:407
Quantize::quantized_sample
int32_t quantized_sample
Definition: aptx.h:61
LF
@ LF
Definition: aptx.h:40
av_always_inline
#define av_always_inline
Definition: attributes.h:49
InvertQuantize::quantization_factor
int32_t quantization_factor
Definition: aptx.h:67
aptx_qmf_filter_signal_push
static av_always_inline void aptx_qmf_filter_signal_push(FilterSignal *signal, int32_t sample)
Definition: aptx.h:165
InvertQuantize
Definition: aptx.h:66
ConstTables::quantize_dither_factors
const int32_t * quantize_dither_factors
Definition: aptx.h:105
Prediction::previous_reconstructed_sample
int32_t previous_reconstructed_sample
Definition: aptx.h:78
avcodec.h
Channel::codeword_history
int32_t codeword_history
Definition: aptx.h:84
AptXContext::block_size
int block_size
Definition: aptx.h:96
HF
@ HF
Definition: aptx.h:43
AVCodecContext
main external API structure.
Definition: avcodec.h:536
Prediction::predicted_difference
int32_t predicted_difference
Definition: aptx.h:79
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
MUL64
#define MUL64(a, b)
Definition: mathops.h:54
ConstTables::invert_quantize_dither_factors
const int32_t * invert_quantize_dither_factors
Definition: aptx.h:104
ConstTables::tables_size
int tables_size
Definition: aptx.h:107
shift
static int shift(int a, int b)
Definition: sonic.c:82
MHF
@ MHF
Definition: aptx.h:42
Channel::dither_parity
int32_t dither_parity
Definition: aptx.h:85
FilterSignal::pos
int pos
Definition: aptx.h:51
Quantize::quantized_sample_parity_change
int32_t quantized_sample_parity_change
Definition: aptx.h:62
NB_SUBBANDS
@ NB_SUBBANDS
Definition: aptx.h:44
ConstTables::prediction_order
int32_t prediction_order
Definition: aptx.h:109
channel
channel
Definition: ebur128.h:39
Quantize
Definition: aptx.h:60
aptx_check_parity
static int aptx_check_parity(Channel channels[NB_CHANNELS], int32_t *idx)
Definition: aptx.h:204
dither
static const uint8_t dither[8][8]
Definition: vf_fspp.c:59