FFmpeg
sbc.h
Go to the documentation of this file.
1 /*
2  * Bluetooth low-complexity, subband codec (SBC)
3  *
4  * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org>
5  * Copyright (C) 2012-2014 Intel Corporation
6  * Copyright (C) 2008-2010 Nokia Corporation
7  * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
8  * Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch>
9  * Copyright (C) 2005-2006 Brad Midgley <bmidgley@xmission.com>
10  *
11  * This file is part of FFmpeg.
12  *
13  * FFmpeg is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Lesser General Public
15  * License as published by the Free Software Foundation; either
16  * version 2.1 of the License, or (at your option) any later version.
17  *
18  * FFmpeg is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  * Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public
24  * License along with FFmpeg; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26  */
27 
28 /**
29  * @file
30  * SBC common definitions for the encoder and decoder
31  */
32 
33 #ifndef AVCODEC_SBC_H
34 #define AVCODEC_SBC_H
35 
36 #include "avcodec.h"
37 #include "libavutil/crc.h"
38 #include "libavutil/mem_internal.h"
39 
40 #define MSBC_BLOCKS 15
41 
42 /* sampling frequency */
43 #define SBC_FREQ_16000 0x00
44 #define SBC_FREQ_32000 0x01
45 #define SBC_FREQ_44100 0x02
46 #define SBC_FREQ_48000 0x03
47 
48 /* blocks */
49 #define SBC_BLK_4 0x00
50 #define SBC_BLK_8 0x01
51 #define SBC_BLK_12 0x02
52 #define SBC_BLK_16 0x03
53 
54 /* channel mode */
55 #define SBC_MODE_MONO 0x00
56 #define SBC_MODE_DUAL_CHANNEL 0x01
57 #define SBC_MODE_STEREO 0x02
58 #define SBC_MODE_JOINT_STEREO 0x03
59 
60 /* allocation method */
61 #define SBC_AM_LOUDNESS 0x00
62 #define SBC_AM_SNR 0x01
63 
64 /* subbands */
65 #define SBC_SB_4 0x00
66 #define SBC_SB_8 0x01
67 
68 /* synchronisation words */
69 #define SBC_SYNCWORD 0x9C
70 #define MSBC_SYNCWORD 0xAD
71 
72 /* extra bits of precision for the synthesis filter input data */
73 #define SBCDEC_FIXED_EXTRA_BITS 2
74 
75 /*
76  * Enforce 16 byte alignment for the data, which is supposed to be used
77  * with SIMD optimized code.
78  */
79 #define SBC_ALIGN 16
80 
81 /* This structure contains an unpacked SBC frame.
82  Yes, there is probably quite some unused space herein */
83 struct sbc_frame {
84  uint8_t frequency;
85  uint8_t blocks;
86  enum {
91  } mode;
92  uint8_t channels;
93  enum {
96  } allocation;
97  uint8_t subbands;
98  uint8_t bitpool;
99  uint16_t codesize;
100 
101  /* bit number x set means joint stereo has been used in subband x */
102  uint8_t joint;
103 
104  /* only the lower 4 bits of every element are to be used */
106 
107  /* raw integer subband samples in the frame */
109 
110  /* modified subband samples */
112 
113  const AVCRC *crc_ctx;
114 };
115 
116 uint8_t ff_sbc_crc8(const AVCRC *crc_ctx, const uint8_t *data, size_t len);
117 void ff_sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8]);
118 
119 #endif /* AVCODEC_SBC_H */
sbc_frame::MONO
@ MONO
Definition: sbc.h:87
mem_internal.h
AVCRC
uint32_t AVCRC
Definition: crc.h:47
sbc_frame::allocation
enum sbc_frame::@129 allocation
data
const char data[16]
Definition: mxf.c:142
sbc_frame::subbands
uint8_t subbands
Definition: sbc.h:97
crc.h
sbc_frame::scale_factor
uint32_t scale_factor[2][8]
Definition: sbc.h:105
sbc_frame::bitpool
uint8_t bitpool
Definition: sbc.h:98
bits
uint8_t bits
Definition: vp3data.h:141
sbc_frame::JOINT_STEREO
@ JOINT_STEREO
Definition: sbc.h:90
SBC_AM_SNR
#define SBC_AM_SNR
Definition: sbc.h:62
SBC_MODE_STEREO
#define SBC_MODE_STEREO
Definition: sbc.h:57
SBC_AM_LOUDNESS
#define SBC_AM_LOUDNESS
Definition: sbc.h:61
SBC_ALIGN
#define SBC_ALIGN
Definition: sbc.h:79
sbc_frame::DUAL_CHANNEL
@ DUAL_CHANNEL
Definition: sbc.h:88
sbc_frame::channels
uint8_t channels
Definition: sbc.h:92
sbc_frame::mode
enum sbc_frame::@128 mode
SBC_MODE_MONO
#define SBC_MODE_MONO
Definition: sbc.h:55
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:117
sbc_frame
Definition: sbc.h:83
sbc_frame::joint
uint8_t joint
Definition: sbc.h:102
ff_sbc_calculate_bits
void ff_sbc_calculate_bits(const struct sbc_frame *frame, int(*bits)[8])
Definition: sbc.c:79
len
int len
Definition: vorbis_enc_data.h:452
avcodec.h
sbc_frame::crc_ctx
const AVCRC * crc_ctx
Definition: sbc.h:113
sbc_frame::LOUDNESS
@ LOUDNESS
Definition: sbc.h:94
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
sbc_frame::frequency
uint8_t frequency
Definition: sbc.h:84
sbc_frame::SNR
@ SNR
Definition: sbc.h:95
ff_sbc_crc8
uint8_t ff_sbc_crc8(const AVCRC *crc_ctx, const uint8_t *data, size_t len)
Definition: sbc.c:55
sbc_frame::STEREO
@ STEREO
Definition: sbc.h:89
sbc_frame::blocks
uint8_t blocks
Definition: sbc.h:85
SBC_MODE_DUAL_CHANNEL
#define SBC_MODE_DUAL_CHANNEL
Definition: sbc.h:56
int32_t
int32_t
Definition: audioconvert.c:56
sbc_frame::sb_sample
int32_t sb_sample[16][2][8]
Definition: sbc.h:111
SBC_MODE_JOINT_STEREO
#define SBC_MODE_JOINT_STEREO
Definition: sbc.h:58
sbc_frame::sb_sample_f
int32_t sb_sample_f[16][2][8]
Definition: sbc.h:108
sbc_frame::codesize
uint16_t codesize
Definition: sbc.h:99