aboutsummaryrefslogtreecommitdiff
path: root/encoder/ixheaace_sbr_main.h
blob: e53b972424fe8db3715ff2a8c9f540457ebd8020 (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/******************************************************************************
 *                                                                            *
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */

#pragma once

#define IXHEAACE_MAX_PAYLOAD_SIZE (256)

enum { MONO = 1, STEREO = 2 };

typedef struct {
  WORD32 bit_rate;
  WORD32 num_channels;
  WORD32 sample_freq;
  WORD32 trans_fac;
  WORD32 standard_bitrate;
} ixheaace_str_codec_param;

typedef struct ixheaace_str_sbr_cfg {
  ixheaace_str_codec_param codec_settings;
  WORD32 send_header_data_time;
  WORD32 crc_sbr;
  WORD32 detect_missing_harmonics;
  WORD32 parametric_coding;

  WORD32 tran_thr;
  WORD32 noise_floor_offset;
  UWORD32 use_speech_config;

  WORD32 sbr_data_extra;
  WORD32 amp_res;
  WORD32 ana_max_level;
  WORD32 tran_fc;
  WORD32 tran_det_mode;
  WORD32 spread;
  WORD32 stat;
  WORD32 e;
  ixheaace_sbr_stereo_mode stereo_mode;
  WORD32 delta_t_across_frames;
  FLOAT32 df_edge_1st_env;
  FLOAT32 df_edge_incr;

  WORD32 sbr_invf_mode;
  WORD32 sbr_xpos_mode;
  WORD32 sbr_xpos_ctrl;
  WORD32 sbr_xpos_lvl;
  WORD32 start_freq;
  WORD32 stop_freq;

  WORD32 use_ps;
  WORD32 ps_mode;

  WORD32 freq_scale;
  WORD32 alter_scale;
  WORD32 sbr_noise_bands;

  WORD32 sbr_limiter_bands;
  WORD32 sbr_limiter_gains;
  WORD32 sbr_interpol_freq;
  WORD32 sbr_smoothing_length;
  WORD32 frame_flag_480;
  WORD32 frame_flag_960;
  WORD32 is_ld_sbr;
  WORD32 is_esbr;
  WORD32 sbr_pvc_rate;
  WORD32 sbr_ratio_idx;
  WORD32 sbr_pvc_active;
  WORD32 sbr_harmonic;
  WORD32 hq_esbr;
  ixheaace_sbr_codec_type sbr_codec;
} ixheaace_str_sbr_cfg, *ixheaace_pstr_sbr_cfg;

typedef struct ixheaace_str_sbr_enc *ixheaace_pstr_sbr_enc;

UWORD32
ixheaace_is_sbr_setting_available(UWORD32 bitrate, UWORD32 num_output_channels,
                                  UWORD32 sample_rate_input, UWORD32 *sample_rate_core,
                                  ixheaace_str_qmf_tabs *ptr_qmf_tab, WORD32 aot);

UWORD32 ixheaace_sbr_limit_bitrate(UWORD32 bit_rate, UWORD32 num_channels,
                                   UWORD32 core_sample_rate, ixheaace_str_qmf_tabs *ptr_qmf_tab,
                                   WORD32 aot);

VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD32 bit_rate,
                                  UWORD32 num_channels, UWORD32 fs_core, UWORD32 trans_fac,
                                  UWORD32 standard_bitrate, ixheaace_str_qmf_tabs *ptr_qmf_tab,
                                  WORD32 aot);

VOID ixheaace_initialize_sbr_defaults(ixheaace_pstr_sbr_cfg pstr_config);

IA_ERRORCODE
ixheaace_env_open(ixheaace_pstr_sbr_enc *pstr_env_encoder, ixheaace_pstr_sbr_cfg params,
                  WORD32 *core_bandwidth, WORD8 *spectral_band_replication_scratch_ptr,
                  ixheaace_str_sbr_tabs *pstr_sbr_tab, ixheaace_pstr_sbr_hdr_data *sbr_config);

VOID ixheaace_env_close(ixheaace_pstr_sbr_enc pstr_env_encoder);

WORD32
ixheaace_sbr_get_stop_freq_raw(ixheaace_pstr_sbr_enc ptr_env);

IA_ERRORCODE
ixheaace_env_encode_frame(ixheaace_pstr_sbr_enc ptr_env_encoder, FLOAT32 *samples,
                          FLOAT32 *core_buffer, UWORD32 time_sn_stride, UWORD8 *num_anc_bytes,
                          UWORD8 *anc_data, ixheaace_str_sbr_tabs *pstr_sbr_tab,
                          ixheaace_comm_tables *common_tab, UWORD8 *mps_data, WORD32 mps_bits,
                          WORD32 flag_framelength_small, WORD32 *usac_stat_bits);

VOID ixheaace_sbr_set_scratch_ptr(ixheaace_pstr_sbr_enc h_env_enc, VOID *scr);
WORD32 ixheaace_sbr_enc_pers_size(WORD32 num_chan, WORD32 use_ps, WORD32 harmonic_sbr);
WORD32 ixheaace_sbr_enc_scr_size(VOID);

VOID ixheaace_set_usac_sbr_params(ixheaace_pstr_sbr_enc h_env_enc, WORD32 usac_indep_flag,
                                  WORD32 sbr_pre_proc, WORD32 sbr_pvc_active, WORD32 sbr_pvc_mode,
                                  WORD32 inter_tes_active, WORD32 sbr_harmonic,
                                  WORD32 sbr_patching_mode);

FLOAT32 *ixheaace_get_hbe_resample_buffer(ixheaace_pstr_sbr_enc h_env_enc);

IA_ERRORCODE ixheaace_extract_sbr_envelope(FLOAT32 *ptr_in_time, FLOAT32 *ptr_core_buf,
                                           UWORD32 time_sn_stride,
                                           ixheaace_pstr_sbr_enc pstr_env_enc,
                                           ixheaace_str_sbr_tabs *ptr_sbr_tab,
                                           ixheaace_comm_tables *pstr_com_tab,
                                           WORD32 flag_framelength_small);
VOID ia_enhaacplus_enc_init_sbr_tabs(ixheaace_str_sbr_tabs *pstr_sbr_tabs);
VOID ia_enhaacplus_enc_get_shared_bufs(VOID *scr, WORD32 **shared_buf1, WORD32 **shared_buf2,
                                       WORD32 **shared_buf3, WORD8 **shared_buf4,
                                       WORD32 aacenc_blocksize);
VOID ia_enhaacplus_enc_get_scratch_bufs(VOID *scr, FLOAT32 **shared_buf1_ring,
                                        FLOAT32 **shared_buf2_ring);