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