Blame view

ffmpeg-4.2.2/libavcodec/sbcdsp.h 3.47 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  /*
   * Bluetooth low-complexity, subband codec (SBC)
   *
   * Copyright (C) 2017  Aurelien Jacobs <aurel@gnuage.org>
   * Copyright (C) 2008-2010  Nokia Corporation
   * Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
   * Copyright (C) 2004-2005  Henryk Ploetz <henryk@ploetzli.ch>
   * Copyright (C) 2005-2006  Brad Midgley <bmidgley@xmission.com>
   *
   * This file is part of FFmpeg.
   *
   * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  /**
   * @file
   * SBC basic "building bricks"
   */
  
  #ifndef AVCODEC_SBCDSP_H
  #define AVCODEC_SBCDSP_H
  
  #include "sbc.h"
  #include "sbcdsp_data.h"
  
  #define SCALE_OUT_BITS 15
  #define SBC_X_BUFFER_SIZE 328
  
  typedef struct sbc_dsp_context SBCDSPContext;
  
  struct sbc_dsp_context {
      int position;
      /* Number of consecutive blocks handled by the encoder */
      uint8_t increment;
      DECLARE_ALIGNED(SBC_ALIGN, int16_t, X)[2][SBC_X_BUFFER_SIZE];
      void (*sbc_analyze_4)(const int16_t *in, int32_t *out, const int16_t *consts);
      void (*sbc_analyze_8)(const int16_t *in, int32_t *out, const int16_t *consts);
      /* Polyphase analysis filter for 4 subbands configuration,
       * it handles "increment" blocks at once */
      void (*sbc_analyze_4s)(SBCDSPContext *s,
                             int16_t *x, int32_t *out, int out_stride);
      /* Polyphase analysis filter for 8 subbands configuration,
       * it handles "increment" blocks at once */
      void (*sbc_analyze_8s)(SBCDSPContext *s,
                             int16_t *x, int32_t *out, int out_stride);
      /* Process input data (deinterleave, endian conversion, reordering),
       * depending on the number of subbands and input data byte order */
      int (*sbc_enc_process_input_4s)(int position, const uint8_t *pcm,
                                      int16_t X[2][SBC_X_BUFFER_SIZE],
                                      int nsamples, int nchannels);
      int (*sbc_enc_process_input_8s)(int position, const uint8_t *pcm,
                                      int16_t X[2][SBC_X_BUFFER_SIZE],
                                      int nsamples, int nchannels);
      /* Scale factors calculation */
      void (*sbc_calc_scalefactors)(int32_t sb_sample_f[16][2][8],
                                    uint32_t scale_factor[2][8],
                                    int blocks, int channels, int subbands);
      /* Scale factors calculation with joint stereo support */
      int (*sbc_calc_scalefactors_j)(int32_t sb_sample_f[16][2][8],
                                     uint32_t scale_factor[2][8],
                                     int blocks, int subbands);
  };
  
  /*
   * Initialize pointers to the functions which are the basic "building bricks"
   * of SBC codec. Best implementation is selected based on target CPU
   * capabilities.
   */
  void ff_sbcdsp_init(SBCDSPContext *s);
  
  void ff_sbcdsp_init_arm(SBCDSPContext *s);
  void ff_sbcdsp_init_x86(SBCDSPContext *s);
  
  #endif /* AVCODEC_SBCDSP_H */