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 
39 #define MSBC_BLOCKS 15
40 
41 /* sampling frequency */
42 #define SBC_FREQ_16000 0x00
43 #define SBC_FREQ_32000 0x01
44 #define SBC_FREQ_44100 0x02
45 #define SBC_FREQ_48000 0x03
46 
47 /* blocks */
48 #define SBC_BLK_4 0x00
49 #define SBC_BLK_8 0x01
50 #define SBC_BLK_12 0x02
51 #define SBC_BLK_16 0x03
52 
53 /* channel mode */
54 #define SBC_MODE_MONO 0x00
55 #define SBC_MODE_DUAL_CHANNEL 0x01
56 #define SBC_MODE_STEREO 0x02
57 #define SBC_MODE_JOINT_STEREO 0x03
58 
59 /* allocation method */
60 #define SBC_AM_LOUDNESS 0x00
61 #define SBC_AM_SNR 0x01
62 
63 /* subbands */
64 #define SBC_SB_4 0x00
65 #define SBC_SB_8 0x01
66 
67 /* synchronisation words */
68 #define SBC_SYNCWORD 0x9C
69 #define MSBC_SYNCWORD 0xAD
70 
71 /* extra bits of precision for the synthesis filter input data */
72 #define SBCDEC_FIXED_EXTRA_BITS 2
73 
74 /*
75  * Enforce 16 byte alignment for the data, which is supposed to be used
76  * with SIMD optimized code.
77  */
78 #define SBC_ALIGN 16
79 
80 /* This structure contains an unpacked SBC frame.
81  Yes, there is probably quite some unused space herein */
82 struct sbc_frame {
85  enum {
90  } mode;
92  enum {
95  } allocation;
98  uint16_t codesize;
99 
100  /* bit number x set means joint stereo has been used in subband x */
102 
103  /* only the lower 4 bits of every element are to be used */
105 
106  /* raw integer subband samples in the frame */
108 
109  /* modified subband samples */
111 
112  const AVCRC *crc_ctx;
113 };
114 
115 uint8_t ff_sbc_crc8(const AVCRC *crc_ctx, const uint8_t *data, size_t len);
116 void ff_sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8]);
117 
118 #endif /* AVCODEC_SBC_H */
uint8_t ff_sbc_crc8(const AVCRC *crc_ctx, const uint8_t *data, size_t len)
Definition: sbc.c:55
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
uint16_t codesize
Definition: sbc.h:98
int32_t sb_sample_f[16][2][8]
Definition: sbc.h:107
#define SBC_AM_LOUDNESS
Definition: sbc.h:60
uint8_t
Public header for CRC hash function implementation.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:112
#define SBC_MODE_MONO
Definition: sbc.h:54
uint32_t scale_factor[2][8]
Definition: sbc.h:104
uint8_t bitpool
Definition: sbc.h:97
uint8_t bits
Definition: vp3data.h:202
uint8_t channels
Definition: sbc.h:91
int32_t
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
#define SBC_MODE_JOINT_STEREO
Definition: sbc.h:57
Libavcodec external API header.
#define SBC_MODE_DUAL_CHANNEL
Definition: sbc.h:55
enum sbc_frame::@133 mode
uint8_t frequency
Definition: sbc.h:83
#define SBC_ALIGN
Definition: sbc.h:78
uint8_t joint
Definition: sbc.h:101
enum sbc_frame::@134 allocation
const AVCRC * crc_ctx
Definition: sbc.h:112
#define SBC_MODE_STEREO
Definition: sbc.h:56
void ff_sbc_calculate_bits(const struct sbc_frame *frame, int(*bits)[8])
Definition: sbc.c:79
int len
Definition: sbc.h:82
#define SBC_AM_SNR
Definition: sbc.h:61
uint8_t subbands
Definition: sbc.h:96
uint32_t AVCRC
Definition: crc.h:47
int32_t sb_sample[16][2][8]
Definition: sbc.h:110
uint8_t blocks
Definition: sbc.h:84