1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Bluetooth low-complexity, subband codec (SBC) 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org> 5cabdff1aSopenharmony_ci * Copyright (C) 2012-2014 Intel Corporation 6cabdff1aSopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 7cabdff1aSopenharmony_ci * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 8cabdff1aSopenharmony_ci * Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch> 9cabdff1aSopenharmony_ci * Copyright (C) 2005-2006 Brad Midgley <bmidgley@xmission.com> 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * This file is part of FFmpeg. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 14cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 16cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 19cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21cabdff1aSopenharmony_ci * Lesser General Public License for more details. 22cabdff1aSopenharmony_ci * 23cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 25cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci/** 29cabdff1aSopenharmony_ci * @file 30cabdff1aSopenharmony_ci * SBC common definitions for the encoder and decoder 31cabdff1aSopenharmony_ci */ 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#ifndef AVCODEC_SBC_H 34cabdff1aSopenharmony_ci#define AVCODEC_SBC_H 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#include <stddef.h> 37cabdff1aSopenharmony_ci#include <stdint.h> 38cabdff1aSopenharmony_ci#include "libavutil/crc.h" 39cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define MSBC_BLOCKS 15 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci/* sampling frequency */ 44cabdff1aSopenharmony_ci#define SBC_FREQ_16000 0x00 45cabdff1aSopenharmony_ci#define SBC_FREQ_32000 0x01 46cabdff1aSopenharmony_ci#define SBC_FREQ_44100 0x02 47cabdff1aSopenharmony_ci#define SBC_FREQ_48000 0x03 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci/* blocks */ 50cabdff1aSopenharmony_ci#define SBC_BLK_4 0x00 51cabdff1aSopenharmony_ci#define SBC_BLK_8 0x01 52cabdff1aSopenharmony_ci#define SBC_BLK_12 0x02 53cabdff1aSopenharmony_ci#define SBC_BLK_16 0x03 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci/* channel mode */ 56cabdff1aSopenharmony_ci#define SBC_MODE_MONO 0x00 57cabdff1aSopenharmony_ci#define SBC_MODE_DUAL_CHANNEL 0x01 58cabdff1aSopenharmony_ci#define SBC_MODE_STEREO 0x02 59cabdff1aSopenharmony_ci#define SBC_MODE_JOINT_STEREO 0x03 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci/* allocation method */ 62cabdff1aSopenharmony_ci#define SBC_AM_LOUDNESS 0x00 63cabdff1aSopenharmony_ci#define SBC_AM_SNR 0x01 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci/* subbands */ 66cabdff1aSopenharmony_ci#define SBC_SB_4 0x00 67cabdff1aSopenharmony_ci#define SBC_SB_8 0x01 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci/* synchronisation words */ 70cabdff1aSopenharmony_ci#define SBC_SYNCWORD 0x9C 71cabdff1aSopenharmony_ci#define MSBC_SYNCWORD 0xAD 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci/* extra bits of precision for the synthesis filter input data */ 74cabdff1aSopenharmony_ci#define SBCDEC_FIXED_EXTRA_BITS 2 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci/* 77cabdff1aSopenharmony_ci * Enforce 16 byte alignment for the data, which is supposed to be used 78cabdff1aSopenharmony_ci * with SIMD optimized code. 79cabdff1aSopenharmony_ci */ 80cabdff1aSopenharmony_ci#define SBC_ALIGN 16 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci/* This structure contains an unpacked SBC frame. 83cabdff1aSopenharmony_ci Yes, there is probably quite some unused space herein */ 84cabdff1aSopenharmony_cistruct sbc_frame { 85cabdff1aSopenharmony_ci uint8_t frequency; 86cabdff1aSopenharmony_ci uint8_t blocks; 87cabdff1aSopenharmony_ci enum { 88cabdff1aSopenharmony_ci MONO = SBC_MODE_MONO, 89cabdff1aSopenharmony_ci DUAL_CHANNEL = SBC_MODE_DUAL_CHANNEL, 90cabdff1aSopenharmony_ci STEREO = SBC_MODE_STEREO, 91cabdff1aSopenharmony_ci JOINT_STEREO = SBC_MODE_JOINT_STEREO 92cabdff1aSopenharmony_ci } mode; 93cabdff1aSopenharmony_ci uint8_t channels; 94cabdff1aSopenharmony_ci enum { 95cabdff1aSopenharmony_ci LOUDNESS = SBC_AM_LOUDNESS, 96cabdff1aSopenharmony_ci SNR = SBC_AM_SNR 97cabdff1aSopenharmony_ci } allocation; 98cabdff1aSopenharmony_ci uint8_t subbands; 99cabdff1aSopenharmony_ci uint8_t bitpool; 100cabdff1aSopenharmony_ci uint16_t codesize; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci /* bit number x set means joint stereo has been used in subband x */ 103cabdff1aSopenharmony_ci uint8_t joint; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci /* only the lower 4 bits of every element are to be used */ 106cabdff1aSopenharmony_ci DECLARE_ALIGNED(SBC_ALIGN, uint32_t, scale_factor)[2][8]; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci /* raw integer subband samples in the frame */ 109cabdff1aSopenharmony_ci DECLARE_ALIGNED(SBC_ALIGN, int32_t, sb_sample_f)[16][2][8]; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci /* modified subband samples */ 112cabdff1aSopenharmony_ci DECLARE_ALIGNED(SBC_ALIGN, int32_t, sb_sample)[16][2][8]; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci const AVCRC *crc_ctx; 115cabdff1aSopenharmony_ci}; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ciuint8_t ff_sbc_crc8(const AVCRC *crc_ctx, const uint8_t *data, size_t len); 118cabdff1aSopenharmony_civoid ff_sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8]); 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci#endif /* AVCODEC_SBC_H */ 121