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 "mathops.h"
29 
30 
31 enum channels {
35 };
36 
37 enum subbands {
38  LF, // Low Frequency (0-5.5 kHz)
39  MLF, // Medium-Low Frequency (5.5-11kHz)
40  MHF, // Medium-High Frequency (11-16.5kHz)
41  HF, // High Frequency (16.5-22kHz)
43 };
44 
45 #define NB_FILTERS 2
46 #define FILTER_TAPS 16
47 
48 typedef struct {
49  int pos;
51 } FilterSignal;
52 
53 typedef struct {
54  FilterSignal outer_filter_signal[NB_FILTERS];
55  FilterSignal inner_filter_signal[NB_FILTERS][NB_FILTERS];
56 } QMFAnalysis;
57 
58 typedef struct {
62 } Quantize;
63 
64 typedef struct {
69 
70 typedef struct {
71  int32_t prev_sign[2];
72  int32_t s_weight[2];
73  int32_t d_weight[24];
75  int32_t reconstructed_differences[48];
79 } Prediction;
80 
81 typedef struct {
85 
88  InvertQuantize invert_quantize[NB_SUBBANDS];
90 } Channel;
91 
92 typedef struct {
93  int hd;
97 } AptXContext;
98 
99 typedef const struct {
107 } ConstTables;
108 
110 
111 /* Rounded right shift with optionnal clipping */
112 #define RSHIFT_SIZE(size) \
113 av_always_inline \
114 static int##size##_t rshift##size(int##size##_t value, int shift) \
115 { \
116  int##size##_t rounding = (int##size##_t)1 << (shift - 1); \
117  int##size##_t mask = ((int##size##_t)1 << (shift + 1)) - 1; \
118  return ((value + rounding) >> shift) - ((value & mask) == rounding); \
119 } \
120 av_always_inline \
121 static int##size##_t rshift##size##_clip24(int##size##_t value, int shift) \
122 { \
123  return av_clip_intp2(rshift##size(value, shift), 23); \
124 }
125 RSHIFT_SIZE(32)
126 RSHIFT_SIZE(64)
127 
128 /*
129  * Convolution filter coefficients for the outer QMF of the QMF tree.
130  * The 2 sets are a mirror of each other.
131  */
133  {
134  730, -413, -9611, 43626, -121026, 269973, -585547, 2801966,
135  697128, -160481, 27611, 8478, -10043, 3511, 688, -897,
136  },
137  {
138  -897, 688, 3511, -10043, 8478, 27611, -160481, 697128,
139  2801966, -585547, 269973, -121026, 43626, -9611, -413, 730,
140  },
141 };
142 
143 /*
144  * Convolution filter coefficients for the inner QMF of the QMF tree.
145  * The 2 sets are a mirror of each other.
146  */
148  {
149  1033, -584, -13592, 61697, -171156, 381799, -828088, 3962579,
150  985888, -226954, 39048, 11990, -14203, 4966, 973, -1268,
151  },
152  {
153  -1268, 973, 4966, -14203, 11990, 39048, -226954, 985888,
154  3962579, -828088, 381799, -171156, 61697, -13592, -584, 1033,
155  },
156 };
157 
158 /*
159  * Push one sample into a circular signal buffer.
160  */
163 {
164  signal->buffer[signal->pos ] = sample;
165  signal->buffer[signal->pos+FILTER_TAPS] = sample;
166  signal->pos = (signal->pos + 1) & (FILTER_TAPS - 1);
167 }
168 
169 /*
170  * Compute the convolution of the signal with the coefficients, and reduce
171  * to 24 bits by applying the specified right shifting.
172  */
175  const int32_t coeffs[FILTER_TAPS],
176  int shift)
177 {
178  int32_t *sig = &signal->buffer[signal->pos];
179  int64_t e = 0;
180  int i;
181 
182  for (i = 0; i < FILTER_TAPS; i++)
183  e += MUL64(sig[i], coeffs[i]);
184 
185  return rshift64_clip24(e, shift);
186 }
187 
189 {
190  int32_t parity = channel->dither_parity;
191  int subband;
192 
193  for (subband = 0; subband < NB_SUBBANDS; subband++)
194  parity ^= channel->quantize[subband].quantized_sample;
195 
196  return parity & 1;
197 }
198 
199 /* For each sample, ensure that the parity of all subbands of all channels
200  * is 0 except once every 8 samples where the parity is forced to 1. */
202 {
205 
206  int eighth = *idx == 7;
207  *idx = (*idx + 1) & 7;
208 
209  return parity ^ eighth;
210 }
211 
214 
215 int ff_aptx_init(AVCodecContext *avctx);
216 
217 #endif /* AVCODEC_APTX_H */
Channel
Definition: aptx.h:81
Prediction
Definition: aptx.h:70
FILTER_TAPS
#define FILTER_TAPS
Definition: aptx.h:46
aptx_quantized_parity
static int32_t aptx_quantized_parity(Channel *channel)
Definition: aptx.h:188
AptXContext::hd
int hd
Definition: aptx.h:93
ConstTables::factor_max
int32_t factor_max
Definition: aptx.h:105
QMFAnalysis
Definition: aptx.h:53
Channel::qmf
QMFAnalysis qmf
Definition: aptx.h:86
subbands
subbands
Definition: aptx.h:37
AptXContext
Definition: aptx.h:92
ff_aptx_quant_tables
ConstTables ff_aptx_quant_tables[2][NB_SUBBANDS]
Definition: aptx.c:313
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:699
RIGHT
@ RIGHT
Definition: aptx.h:33
ff_aptx_init
int ff_aptx_init(AVCodecContext *avctx)
Definition: aptx.c:508
intreadwrite.h
ConstTables
Definition: aptx.h:99
Prediction::predicted_sample
int32_t predicted_sample
Definition: aptx.h:78
NB_CHANNELS
@ NB_CHANNELS
Definition: aptx.h:34
channels
channels
Definition: aptx.h:31
ConstTables::quantize_factor_select_offset
const int16_t * quantize_factor_select_offset
Definition: aptx.h:103
RSHIFT_SIZE
#define RSHIFT_SIZE(size)
Definition: aptx.h:112
Quantize::error
int32_t error
Definition: aptx.h:61
MLF
@ MLF
Definition: aptx.h:39
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:174
ConstTables::quantize_intervals
const int32_t * quantize_intervals
Definition: aptx.h:100
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:132
FilterSignal
Definition: aptx.h:48
InvertQuantize::factor_select
int32_t factor_select
Definition: aptx.h:66
NB_FILTERS
#define NB_FILTERS
Definition: aptx.h:45
ff_aptx_generate_dither
void ff_aptx_generate_dither(Channel *channel)
Definition: aptx.c:385
InvertQuantize::reconstructed_difference
int32_t reconstructed_difference
Definition: aptx.h:67
FilterSignal::buffer
int32_t buffer[2 *FILTER_TAPS]
Definition: aptx.h:50
shift
static int shift(int a, int b)
Definition: bonk.c:260
aptx_qmf_inner_coeffs
static const int32_t aptx_qmf_inner_coeffs[NB_FILTERS][FILTER_TAPS]
Definition: aptx.h:147
ff_aptx_invert_quantize_and_prediction
void ff_aptx_invert_quantize_and_prediction(Channel *channel, int hd)
Definition: aptx.c:497
sample
#define sample
Definition: flacdsp_template.c:44
parity
mcdeint parity
Definition: vf_mcdeint.c:266
prediction
static int64_t prediction(int delta, ChannelContext *c)
Definition: misc4.c:78
Prediction::pos
int32_t pos
Definition: aptx.h:74
AptXContext::sync_idx
int32_t sync_idx
Definition: aptx.h:95
LEFT
@ LEFT
Definition: aptx.h:32
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
Quantize::quantized_sample
int32_t quantized_sample
Definition: aptx.h:59
LF
@ LF
Definition: aptx.h:38
av_always_inline
#define av_always_inline
Definition: attributes.h:49
InvertQuantize::quantization_factor
int32_t quantization_factor
Definition: aptx.h:65
aptx_qmf_filter_signal_push
static av_always_inline void aptx_qmf_filter_signal_push(FilterSignal *signal, int32_t sample)
Definition: aptx.h:162
InvertQuantize
Definition: aptx.h:64
ConstTables::quantize_dither_factors
const int32_t * quantize_dither_factors
Definition: aptx.h:102
Prediction::previous_reconstructed_sample
int32_t previous_reconstructed_sample
Definition: aptx.h:76
avcodec.h
Channel::codeword_history
int32_t codeword_history
Definition: aptx.h:82
AptXContext::block_size
int block_size
Definition: aptx.h:94
HF
@ HF
Definition: aptx.h:41
AVCodecContext
main external API structure.
Definition: avcodec.h:398
Prediction::predicted_difference
int32_t predicted_difference
Definition: aptx.h:77
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:55
ConstTables::invert_quantize_dither_factors
const int32_t * invert_quantize_dither_factors
Definition: aptx.h:101
ConstTables::tables_size
int tables_size
Definition: aptx.h:104
MHF
@ MHF
Definition: aptx.h:40
Channel::dither_parity
int32_t dither_parity
Definition: aptx.h:83
int32_t
int32_t
Definition: audioconvert.c:56
FilterSignal::pos
int pos
Definition: aptx.h:49
Quantize::quantized_sample_parity_change
int32_t quantized_sample_parity_change
Definition: aptx.h:60
NB_SUBBANDS
@ NB_SUBBANDS
Definition: aptx.h:42
ConstTables::prediction_order
int32_t prediction_order
Definition: aptx.h:106
channel
channel
Definition: ebur128.h:39
Quantize
Definition: aptx.h:58
aptx_check_parity
static int aptx_check_parity(Channel channels[NB_CHANNELS], int32_t *idx)
Definition: aptx.h:201
dither
static const uint8_t dither[8][8]
Definition: vf_fspp.c:58