Home | History | Annotate | Download | only in decoder
      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 <string.h>
     21 #include "ixheaacd_sbr_common.h"
     22 #include <ixheaacd_type_def.h>
     23 #include "ixheaacd_constants.h"
     24 #include "ixheaacd_basic_ops32.h"
     25 #include "ixheaacd_basic_ops16.h"
     26 #include "ixheaacd_basic_ops40.h"
     27 #include "ixheaacd_basic_ops.h"
     28 #include "ixheaacd_bitbuffer.h"
     29 
     30 #include <ixheaacd_basic_op.h>
     31 #include "ixheaacd_intrinsics.h"
     32 
     33 #include "ixheaacd_defines.h"
     34 
     35 #include "ixheaacd_aac_rom.h"
     36 
     37 #include "ixheaacd_definitions.h"
     38 
     39 #include "ixheaacd_error_codes.h"
     40 
     41 #include "ixheaacd_pulsedata.h"
     42 
     43 #include "ixheaacd_pns.h"
     44 #include "ixheaacd_drc_data_struct.h"
     45 
     46 #include "ixheaacd_lt_predict.h"
     47 
     48 #include "ixheaacd_channelinfo.h"
     49 #include "ixheaacd_drc_dec.h"
     50 #include "ixheaacd_sbrdecoder.h"
     51 #include "ixheaacd_block.h"
     52 #include "ixheaacd_channel.h"
     53 
     54 #include "ixheaacd_sbr_payload.h"
     55 #include "ixheaacd_common_rom.h"
     56 
     57 #include <ixheaacd_type_def.h>
     58 
     59 #include "ixheaacd_sbrdecsettings.h"
     60 #include "ixheaacd_sbr_scale.h"
     61 #include "ixheaacd_env_extr_part.h"
     62 #include "ixheaacd_sbr_rom.h"
     63 #include "ixheaacd_stereo.h"
     64 #include "ixheaacd_lpp_tran.h"
     65 #include "ixheaacd_hybrid.h"
     66 #include "ixheaacd_ps_dec.h"
     67 
     68 #include "ixheaacd_env_extr.h"
     69 #include "ixheaacd_adts.h"
     70 #include "ixheaacd_audioobjtypes.h"
     71 #include "ixheaacd_memory_standards.h"
     72 
     73 #include "ixheaacd_latmdemux.h"
     74 
     75 #include "ixheaacd_aacdec.h"
     76 #include "ixheaacd_config.h"
     77 #include "ixheaacd_mps_polyphase.h"
     78 #include "ixheaacd_mps_dec.h"
     79 #include "ixheaacd_struct_def.h"
     80 
     81 #include "ixheaacd_multichannel.h"
     82 #include "ixheaacd_headerdecode.h"
     83 
     84 WORD32 ixheaacd_latm_au_chunk_length_info(
     85     struct ia_bit_buf_struct *it_bit_buff) {
     86   UWORD8 reading_done;
     87   WORD32 len = 0;
     88 
     89   do {
     90     UWORD32 tmp = ixheaacd_read_bits_buf(it_bit_buff, 8);
     91     reading_done = (tmp < 255);
     92 
     93     len += tmp;
     94 
     95   } while (reading_done == 0);
     96 
     97   len <<= 3;
     98 
     99   return len;
    100 }
    101 
    102 WORD32 ixheaacd_latm_payload_length_info(struct ia_bit_buf_struct *it_bit_buff,
    103                                          ixheaacd_latm_struct *latm_element) {
    104   WORD32 error_code = AAC_DEC_OK;
    105   UWORD32 prog, lay;
    106 
    107   if (latm_element->all_streams_same_time_framing == 1) {
    108     for (prog = 0; prog < latm_element->num_program; prog++) {
    109       for (lay = 0; lay < latm_element->num_layer; lay++) {
    110         ixheaacd_latm_layer_info *layer_info =
    111             &latm_element->layer_info[prog][lay];
    112 
    113         switch (layer_info->frame_len_type) {
    114           case 0:
    115             layer_info->frame_len_bits =
    116                 ixheaacd_latm_au_chunk_length_info(it_bit_buff);
    117             if (layer_info->frame_len_bits % 8 != 0) {
    118               error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    119               return error_code;
    120             }
    121 
    122             latm_element->frame_length = layer_info->frame_len_bits >> 3;
    123             latm_element->frame_length +=
    124                 (it_bit_buff->size - it_bit_buff->cnt_bits) >> 3;
    125             break;
    126 
    127           default:
    128             error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    129             return error_code;
    130         }
    131       }
    132     }
    133   } else {
    134     error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    135     return error_code;
    136   }
    137 
    138   return (error_code);
    139 }
    140 
    141 static UWORD32 ixheaacd_latm_get_value(ia_bit_buf_struct *it_bit_buff) {
    142   UWORD32 bytes_read;
    143 
    144   bytes_read = ixheaacd_read_bits_buf(it_bit_buff, 2) + 1;
    145 
    146   if (bytes_read <= 3)
    147     return ixheaacd_read_bits_buf(it_bit_buff, 8 * bytes_read);
    148   else
    149     return (ixheaacd_read_bits_buf(it_bit_buff, 24) << 24) +
    150            ixheaacd_read_bits_buf(it_bit_buff, 8);
    151 }
    152 
    153 WORD32 ixheaacd_latm_stream_mux_config(
    154     struct ia_bit_buf_struct *it_bit_buff, ixheaacd_latm_struct *latm_element,
    155     ia_aac_dec_state_struct *aac_state_struct,
    156     ia_sampling_rate_info_struct *sample_rate_info) {
    157   UWORD32 prog;
    158   UWORD32 lay;
    159   WORD32 bytes_consumed;
    160   WORD32 audio_mux_version_a;
    161   UWORD32 tara_buf_fullness;
    162   WORD32 error_code = AAC_DEC_OK;
    163   ixheaacd_latm_layer_info *layer_info = 0;
    164 
    165   latm_element->audio_mux_version = ixheaacd_read_bits_buf(it_bit_buff, 1);
    166 
    167   if (latm_element->audio_mux_version == 1)
    168     audio_mux_version_a = ixheaacd_read_bits_buf(it_bit_buff, 1);
    169   else
    170     audio_mux_version_a = 0;
    171 
    172   if (audio_mux_version_a == 0) {
    173     if (latm_element->audio_mux_version == 1) {
    174       tara_buf_fullness = ixheaacd_latm_get_value(it_bit_buff);
    175     }
    176     latm_element->all_streams_same_time_framing =
    177         ixheaacd_read_bits_buf(it_bit_buff, 1);
    178 
    179     latm_element->num_sub_frames = ixheaacd_read_bits_buf(it_bit_buff, 6) + 1;
    180 
    181     if (latm_element->num_sub_frames != 1) {
    182       error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    183       return error_code;
    184     }
    185 
    186     latm_element->num_program = ixheaacd_read_bits_buf(it_bit_buff, 4) + 1;
    187 
    188     for (prog = 0; prog < latm_element->num_program; prog++) {
    189       latm_element->num_layer = ixheaacd_read_bits_buf(it_bit_buff, 3) + 1;
    190 
    191       for (lay = 0; lay < latm_element->num_layer; lay++) {
    192         layer_info = &latm_element->layer_info[prog][lay];
    193         layer_info->frame_len_bits = 0;
    194 
    195         if ((prog == 0) && (lay == 0)) {
    196           WORD32 asc_len, pos;
    197 
    198           latm_element->use_same_config = 0;
    199 
    200           asc_len = (latm_element->audio_mux_version == 1)
    201                         ? ixheaacd_latm_get_value(it_bit_buff)
    202                         : 0;
    203           pos = it_bit_buff->size - it_bit_buff->cnt_bits;
    204 
    205           if (asc_len > it_bit_buff->size - 106 || asc_len > 2592) {
    206             error_code = IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
    207             return (error_code);
    208           }
    209 
    210           if ((error_code = ixheaacd_ga_hdr_dec(
    211                    aac_state_struct, it_bit_buff->cnt_bits, &bytes_consumed,
    212                    sample_rate_info, it_bit_buff)))
    213             return (error_code);
    214 
    215           if (asc_len) {
    216             asc_len -= (it_bit_buff->size - it_bit_buff->cnt_bits) - pos;
    217             ixheaacd_read_bidirection(it_bit_buff, asc_len);
    218           }
    219 
    220           layer_info->asc.aot = aac_state_struct->audio_object_type;
    221           layer_info->asc.channel_config = aac_state_struct->ch_config;
    222           layer_info->asc.samples_per_frame = aac_state_struct->frame_len_flag;
    223           layer_info->asc.sampling_freq = aac_state_struct->sampling_rate;
    224           layer_info->asc.samples_per_frame = aac_state_struct->frame_length;
    225         } else {
    226           latm_element->use_same_config =
    227               ixheaacd_read_bits_buf(it_bit_buff, 1);
    228 
    229           if (latm_element->use_same_config && (lay > 0)) {
    230             layer_info->asc = latm_element->layer_info[prog][lay - 1].asc;
    231           } else {
    232             if ((error_code = ixheaacd_ga_hdr_dec(
    233                      aac_state_struct, it_bit_buff->cnt_bits, &bytes_consumed,
    234                      sample_rate_info, it_bit_buff)))
    235               return (error_code);
    236           }
    237         }
    238 
    239         layer_info->frame_len_type = ixheaacd_read_bits_buf(it_bit_buff, 3);
    240 
    241         switch (layer_info->frame_len_type) {
    242           case 0:
    243             layer_info->buffer_fullness =
    244                 ixheaacd_read_bits_buf(it_bit_buff, 8);
    245 
    246             if (!latm_element->all_streams_same_time_framing) {
    247               if ((lay > 0) && layer_info->asc.aot == AOT_AAC_SCAL) {
    248               }
    249             }
    250             break;
    251 
    252           default:
    253             error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    254             return error_code;
    255         }
    256       }
    257     }
    258 
    259     latm_element->other_data_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
    260 
    261     if (latm_element->other_data_present) {
    262       if (latm_element->audio_mux_version == 1) {
    263         latm_element->other_data_length = ixheaacd_latm_get_value(it_bit_buff);
    264       } else {
    265         UWORD32 other_data_len;
    266         latm_element->other_data_length = 0;
    267         do {
    268           other_data_len = ixheaacd_read_bits_buf(it_bit_buff, 1);
    269           latm_element->other_data_length <<= 8;
    270           latm_element->other_data_length +=
    271               ixheaacd_read_bits_buf(it_bit_buff, 8);
    272         } while (other_data_len);
    273       }
    274     }
    275 
    276     latm_element->crc_check_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
    277 
    278     if (latm_element->crc_check_present) {
    279       latm_element->crc_check_sum = ixheaacd_read_bits_buf(it_bit_buff, 8);
    280     }
    281   } else {
    282     error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
    283   }
    284   return (error_code);
    285 }
    286 
    287 WORD32 ixheaacd_latm_audio_mux_element(
    288     struct ia_bit_buf_struct *it_bit_buff, ixheaacd_latm_struct *latm_element,
    289     ia_aac_dec_state_struct *aac_state_struct,
    290     ia_sampling_rate_info_struct *sample_rate_info) {
    291   UWORD32 i;
    292   WORD32 error_code = AAC_DEC_OK;
    293 
    294   ixheaacd_read_bits_buf(it_bit_buff, 13);
    295 
    296   latm_element->use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1);
    297 
    298   if (!latm_element->use_same_stream_mux) {
    299     if ((error_code = ixheaacd_latm_stream_mux_config(
    300              it_bit_buff, latm_element, aac_state_struct, sample_rate_info))) {
    301       return (error_code);
    302     }
    303   }
    304 
    305   for (i = 0; i < latm_element->num_sub_frames; i++) {
    306     if ((error_code =
    307              ixheaacd_latm_payload_length_info(it_bit_buff, latm_element))) {
    308       if (error_code != 0) return (error_code);
    309     }
    310   }
    311 
    312   return (error_code);
    313 }
    314