Coverage Report

Created: 2025-09-17 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_aacpluscheck.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <stdio.h>
21
#include <string.h>
22
#include "ixheaacd_sbr_common.h"
23
#include "ixheaac_type_def.h"
24
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops16.h"
28
#include "ixheaac_basic_ops40.h"
29
#include "ixheaac_basic_ops.h"
30
31
#include "ixheaac_basic_op.h"
32
#include "ixheaacd_intrinsics.h"
33
#include "ixheaacd_bitbuffer.h"
34
#include "ixheaacd_defines.h"
35
36
#include "ixheaacd_pns.h"
37
38
#include "ixheaacd_aac_rom.h"
39
#include "ixheaacd_pulsedata.h"
40
#include "ixheaacd_drc_data_struct.h"
41
42
#include "ixheaacd_lt_predict.h"
43
#include "ixheaacd_cnst.h"
44
#include "ixheaacd_ec_defines.h"
45
#include "ixheaacd_ec_struct_def.h"
46
47
#include "ixheaacd_channelinfo.h"
48
#include "ixheaacd_drc_dec.h"
49
50
#include "ixheaacd_sbrdecoder.h"
51
#include "ixheaacd_sbr_payload.h"
52
#include "ixheaacd_audioobjtypes.h"
53
#include "ixheaacd_error_codes.h"
54
55
#define SBR_EXTENSION_MPEG SBR_EXTENSION
56
57
#define SBR_EXTENSION_CRC_MPEG SBR_EXTENSION_CRC
58
59
FLAG ixheaacd_check_for_sbr_payload(ia_bit_buf_struct *it_bit_buff,
60
                                    ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr,
61
                                    WORD16 prev_element, ia_drc_dec_struct *pstr_drc_dec,
62
                                    WORD32 object_type, WORD32 adtsheader, WORD32 cnt_bits,
63
                                    WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy,
64
                                    UWORD8 *mps_buffer, WORD32 *mps_header, WORD32 *mps_bytes,
65
131k
                                    WORD32 is_init, WORD32 *is_first, WORD32 ec_flag) {
66
131k
  FLAG ret = 0;
67
131k
  WORD32 count;
68
69
131k
  if (object_type == AOT_ER_AAC_ELD) {
70
80.5k
    count = it_bit_buff->cnt_bits >> 3;
71
80.5k
    if (adtsheader == 1) count = cnt_bits >> 3;
72
80.5k
  } else {
73
50.7k
    count = ixheaacd_read_bits_buf(it_bit_buff, 4);
74
75
50.7k
    if ((count - 15) == 0) {
76
6.46k
      WORD32 esc_count;
77
6.46k
      esc_count = ixheaacd_read_bits_buf(it_bit_buff, 8);
78
6.46k
      count = (esc_count + 14);
79
6.46k
    }
80
50.7k
  }
81
82
131k
  if (count > 0) {
83
124k
    WORD32 extension_type;
84
85
124k
    if (object_type == AOT_ER_AAC_ELD)
86
80.3k
      extension_type = ld_sbr_crc_flag ? SBR_EXTENSION_CRC : SBR_EXTENSION;
87
43.7k
    else
88
43.7k
      extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);
89
90
124k
    if (((count < MAXSBRBYTES)) &&
91
84.0k
        (((extension_type == SBR_EXTENSION)) || ((extension_type == SBR_EXTENSION_CRC))) &&
92
68.6k
        ((prev_element == SBR_ID_SCE) || (prev_element == SBR_ID_CPE) ||
93
10.3k
         sub_d(prev_element, SBR_ID_CCE) == 0)
94
95
124k
            ) {
96
67.6k
      WORD32 no_elements = pstr_stream_sbr->no_elements;
97
67.6k
      WORD32 byte_count;
98
67.6k
      ia_sbr_element_stream_struct *ptr_stream_sbr;
99
100
67.6k
      ret = 1;
101
102
67.6k
      ptr_stream_sbr = &pstr_stream_sbr->str_sbr_ele[no_elements];
103
104
67.6k
      if (ec_flag) {
105
0
        ptr_stream_sbr->size_payload = ptr_stream_sbr->size_payload_old;
106
0
        byte_count = ptr_stream_sbr->size_payload;
107
0
        ptr_stream_sbr->extension_type = ptr_stream_sbr->prev_extension_type;
108
0
        ptr_stream_sbr->sbr_ele_id = ptr_stream_sbr->prev_sbr_ele_id;
109
0
      }
110
111
67.6k
      if (ec_flag) {
112
0
        ptr_stream_sbr->size_payload_old = count;
113
0
        byte_count = ptr_stream_sbr->size_payload_old;
114
0
        ptr_stream_sbr->prev_extension_type = extension_type;
115
0
        ptr_stream_sbr->prev_sbr_ele_id = prev_element;
116
67.6k
      } else {
117
67.6k
        ptr_stream_sbr->size_payload = count;
118
67.6k
        byte_count = ptr_stream_sbr->size_payload;
119
67.6k
        ptr_stream_sbr->extension_type = extension_type;
120
67.6k
        ptr_stream_sbr->sbr_ele_id = prev_element;
121
67.6k
      }
122
67.6k
      pstr_stream_sbr->no_elements = no_elements + 1;
123
124
67.6k
      if (pstr_drc_dec) pstr_drc_dec->sbr_found = 1;
125
126
67.6k
      if (ec_flag) {
127
0
        memcpy(ptr_stream_sbr->ptr_sbr_data, ptr_stream_sbr->sbr_prev_data,
128
0
               sizeof(ptr_stream_sbr->sbr_prev_data));
129
0
      }
130
131
67.6k
      if (byte_count > 0 && sub_d(byte_count, MAXSBRBYTES) <= 0) {
132
67.6k
        WORD32 i;
133
67.6k
        WORD8 *ptr_sbr_data;
134
67.6k
        if (object_type != AOT_ER_AAC_ELD) {
135
28.0k
          if (ec_flag) {
136
0
            ptr_sbr_data = &ptr_stream_sbr->sbr_prev_data[1];
137
0
            ptr_stream_sbr->sbr_prev_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
138
28.0k
          } else {
139
28.0k
            ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
140
28.0k
            ptr_stream_sbr->ptr_sbr_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
141
28.0k
          }
142
39.5k
        } else {
143
39.5k
          if (ec_flag) {
144
0
            ptr_sbr_data = ptr_stream_sbr->sbr_prev_data;
145
39.5k
          } else {
146
39.5k
            ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
147
39.5k
          }
148
39.5k
        }
149
13.2M
        for (i = byte_count - 2; i >= 0; i--) {
150
13.1M
          *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
151
13.1M
          if (object_type == AOT_ER_AAC_ELD) {
152
12.9M
            if (adtsheader == 1) {
153
0
              cnt_bits = cnt_bits - 8;
154
0
            }
155
12.9M
          }
156
13.1M
        }
157
158
67.6k
        if (object_type == AOT_ER_AAC_ELD) {
159
39.5k
          *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
160
39.5k
          if (adtsheader == 1) {
161
0
            cnt_bits = cnt_bits - 8;
162
0
            if (cnt_bits > 0) {
163
0
              WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
164
0
              *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
165
0
              *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
166
0
              if (!ec_flag)
167
0
                ptr_stream_sbr->size_payload++;
168
0
              else
169
0
                ptr_stream_sbr->size_payload_old++;
170
0
            }
171
39.5k
          } else {
172
39.5k
            if (it_bit_buff->cnt_bits > 0) {
173
32.7k
              WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
174
32.7k
              *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
175
32.7k
              *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
176
32.7k
              if (!ec_flag)
177
32.7k
                ptr_stream_sbr->size_payload++;
178
0
              else
179
0
                ptr_stream_sbr->size_payload_old++;
180
32.7k
            }
181
39.5k
          }
182
39.5k
        }
183
67.6k
      }
184
185
67.6k
    } else if (extension_type == EXT_DYNAMIC_RANGE) {
186
514
      pstr_drc_dec->drc_element_found = 1;
187
514
      count -= ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
188
55.9k
    } else if (extension_type == EXT_SAC_DATA) {
189
11.9k
      WORD32 anc_type, anc_start, i, len = 0;
190
11.9k
      anc_type = ixheaacd_read_bits_buf(it_bit_buff, 2);
191
11.9k
      *mps_header = anc_type;
192
193
11.9k
      anc_start = ixheaacd_read_bits_buf(it_bit_buff, 1);
194
11.9k
      if (anc_start == 1) {
195
9.29k
        *mps_bytes = 0;
196
9.29k
      }
197
11.9k
      ixheaacd_read_bits_buf(it_bit_buff, 1);
198
199
11.9k
      if (anc_type == 1 && is_init == 0 && *is_first == 1) {
200
594
        len = ixheaacd_read_bits_buf(it_bit_buff, 1);
201
594
        len = ixheaacd_read_bits_buf(it_bit_buff, 7) + 1;
202
594
        ixheaacd_read_bidirection(it_bit_buff, -8);
203
594
      }
204
205
432k
      for (i = 0; i < count - 1; i++) {
206
420k
        mps_buffer[i + *mps_bytes] = ixheaacd_read_bits_buf(it_bit_buff, 8);
207
420k
      }
208
209
11.9k
      *mps_bytes += (count - 1);
210
11.9k
      if (anc_type == 1 && is_init == 0 && *is_first == 1) {
211
594
        if (*mps_bytes < len) {
212
1
          if (ec_flag) {
213
0
            *mps_bytes = 0;
214
0
          }
215
1
          longjmp(*(it_bit_buff->xaac_jmp_buf),
216
1
            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
217
1
        }
218
17.1k
        for (i = 0; i < count - 1; i++) {
219
16.5k
          mps_buffer[i] = mps_buffer[i + len];
220
16.5k
        }
221
593
        *mps_bytes = *mps_bytes - len;
222
593
      }
223
11.9k
      *is_first = 1;
224
44.0k
    } else {
225
44.0k
      ixheaacd_read_bits_buf(it_bit_buff, 4);
226
227
44.0k
      if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
228
10
        longjmp(*(it_bit_buff->xaac_jmp_buf),
229
10
                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
230
10
      }
231
44.0k
      it_bit_buff->ptr_read_next += count - 1;
232
44.0k
      it_bit_buff->cnt_bits -= ((count - 1) << 3);
233
44.0k
    }
234
124k
  }
235
131k
  return (ret);
236
131k
}