⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aac_enc_api_int.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 3 页
字号:
      used_bits += enc_channel_pair_element(&cpe,
          state_com->chInfo[ch].element_instance_tag, pBS, 0, 0);
      save_bits = (used_bits + 1) >> 1;
    }

    lim_bits = (29491 * max_bits_in_buf) >> 15; /* 0.9 in Q15 */

    if (bits_in_buf > lim_bits) {
      available_bits += bits_in_buf - lim_bits;
      bits_from_buffer = lim_bits;
    } else {
      available_bits = available_bits - (available_bits >> 3);
      bits_from_buffer = bits_in_buf;
    }

    available_bits -= used_bits;

    available_bits /= procCh;
    com_additional_bits = 0;

    for (i = 0; i < procCh; i++) {
      additional_bits[i] =
        state->psychoacoustic_block[ch+i].curr_frame_PE - 1400;

      additional_bits[i] = (additional_bits[i] * 3) >> 2;

      if (additional_bits[i] < 0) {
        additional_bits[i] = 0;
      } else if (additional_bits[i] > (available_bits + (available_bits >> 1))) {
        additional_bits[i] = available_bits + (available_bits >> 1);
      } else if ((ics[i].windows_sequence == EIGHT_SHORT_SEQUENCE) &&
                  (additional_bits[i] < (available_bits >> 1))) {
        additional_bits[i] = available_bits >> 1;
      }
      com_additional_bits += additional_bits[i];
    }

    if (bits_from_buffer > 0) {
      if (com_additional_bits > bits_from_buffer) {
        norm_bits = (bits_from_buffer * 32768) / com_additional_bits;
        for (i = 0; i < procCh; i++) {
          additional_bits[i] = (additional_bits[i] * norm_bits) >> 15;
        }
      } else {
        for (i = 0; i < procCh; i++) {
          additional_bits[i] = 0;
        }
      }
    }

    for (i = 0; i < procCh; i++) {
      Ipp32s index = state->psychoacoustic_block_com.nb_prev_index;

      quantization_block.available_bits =
        available_bits + additional_bits[i];

      //quantization_block.available_bits =
      //  (state_com->chInfo[ch].mean_bits - used_bits) /procCh;

      if (state->psychoacoustic_block[ch].stereo_mode[index] == AAC_MS_STEREO) {
        if (i == 0) {
          Ipp32s coeff = (state->psychoacoustic_block[ch].ms_coef[index] /* in Q4 */ - 8)
            * state->ms_mul /* in Q11*/ ;

          if (coeff > 32768) coeff = 32768;
          else if (coeff < -32768) coeff = -32768;
          //else if (coeff < 0) coeff = 0;

          ms_add_bits = additional_bits[0];
          if (additional_bits[0] > additional_bits[1])
            ms_add_bits = additional_bits[1];

          /* Some bits should be remained (50) */
          ms_add_bits += (available_bits - 50);
          if (ms_add_bits < 0) ms_add_bits = 0;

          ms_add_bits = (ms_add_bits * coeff) >> 15;
          quantization_block.available_bits += ms_add_bits;
        } else {
          quantization_block.available_bits -= ms_add_bits;
        }
      }

      if (quantization_block.available_bits > (768 * 8 - save_bits)) {
        quantization_block.available_bits = 768 * 8 - save_bits;
      } else if (quantization_block.available_bits < 0) {
        quantization_block.available_bits = 0;
      }

      quantization_block.common_scalefactor_update =
        &(state_com->chInfo[ch+i].common_scalefactor_update);
      quantization_block.last_frame_common_scalefactor =
        &(state_com->chInfo[ch+i].last_frame_common_scalefactor);

      ics[i].num_window_groups = 1;
      ics[i].len_window_group[0] = 1;

      win_seq = ics[i].windows_sequence;

      if (win_seq == EIGHT_SHORT_SEQUENCE) {
        p_smr = state->psychoacoustic_block[ch+i].smr_short[index];
      } else {
        p_smr = state->psychoacoustic_block[ch+i].smr_long[index];
      }
      quantization_block.ns_mode = state->psychoacoustic_block_com.ns_mode;

      quantization_block.sfb_width_scale =
        state->psychoacoustic_block_com.sfb_width_longScale;

      p_mdct_line = mdct_line[i];

      /* Ipp16s block interleave */
      if (win_seq == EIGHT_SHORT_SEQUENCE) {
        Ipp32s *len_window_group = ics[i].len_window_group;
        Ipp32s *scale_factor_grouping = ics[i].scale_factor_grouping;
        Ipp32s *tmp_sfb_offset = state_com->sfb_offset[win_seq];
        Ipp32s num_window_groups = 1;
        Ipp32s max_sfb = ics[i].max_sfb;
        Ipp16s *ptrIn = mdct_line[i];
        Ipp16s *ptrOut = mdct_line_i;
        Ipp32s g, sfb, w, ind, max_len;

        for (j = 0; j < 7; j++) {
          if (scale_factor_grouping[j] == 0) {
            len_window_group[num_window_groups] = 1;
            num_window_groups++;
          } else {
            len_window_group[num_window_groups - 1]++;
          }
        }
        ics[i].num_window_groups = num_window_groups;
        max_len = 1;

        sfb_offset[0] = 0;
        ind = 1;

        for (g = 0; g < num_window_groups; g++) {
          for (sfb = 0; sfb < max_sfb; sfb++) {
            Ipp32s sfb_start = tmp_sfb_offset[sfb];
            Ipp32s sfb_end = tmp_sfb_offset[sfb+1];
            Ipp32s sfb_width = sfb_end - sfb_start;

            sfb_offset[ind] = sfb_offset[ind - 1] +
              sfb_width * len_window_group[g];
            ind++;

            if (max_len < len_window_group[g])
              max_len = len_window_group[g];

            for (j = 0; j < len_window_group[g]; j++) {
              for (w = 0; w < sfb_width; w++) {
                *ptrOut = ptrIn[w + sfb_start + 128 * j];
                  ptrOut++;
              }
            }
          }
          ptrIn += 128 * len_window_group[g];
        }

        if (quantization_block.ns_mode) {
          ptrSmrOut = smr_short_i;
          ptrSmrIn = p_smr;
          for (g = 0; g < num_window_groups; g++) {
            for (sfb = 0; sfb < max_sfb; sfb++) {
              for (j = 0; j < len_window_group[g]; j++) {
                *ptrSmrOut = ptrSmrIn[sfb + MAX_SFB_SHORT * j];
                ptrSmrOut++;
              }
            }
            ptrSmrIn += MAX_SFB_SHORT * len_window_group[g];
          }
          p_smr = smr_short_i;
        }

        ics[i].sfb_offset = sfb_offset;
        p_mdct_line = mdct_line_i;

        if (max_len == 1) {
          quantization_block.sfb_width_scale =
            state->psychoacoustic_block_com.sfb_width_shortScale;
        } else if (max_len == 2) {
          quantization_block.sfb_width_scale =
            state->psychoacoustic_block_com.sfb_width_shortScale + 1;
        } else if (max_len <= 4) {
          quantization_block.sfb_width_scale =
            state->psychoacoustic_block_com.sfb_width_shortScale + 2;
        } else {
          quantization_block.sfb_width_scale =
            state->psychoacoustic_block_com.sfb_width_shortScale + 3;
        }
      }

      aaciencQuantization(&quantization_block, &ics[i],
                          p_mdct_line, p_mdct_line_pred[i],
                          mdct_scaleFactor[i], p_smr);

      if (state_com->audioObjectType == AOT_AAC_LTP) {
        if (win_seq != EIGHT_SHORT_SEQUENCE) {
          ics[i].predictor_data_present = ics[i].ltp_data_present;
          if (ics[i].predictor_data_present) {
            for (sfb = 0; sfb < max_sfb_pred; sfb++) {
              if (!ics[i].ltp_long_used[sfb]) {
                Ipp32s begin = ics[i].sfb_offset[sfb];
                Ipp32s end = ics[i].sfb_offset[sfb+1];

                for (j = begin; j < end; j++) {
                  predictedSpectrum[i][j] = 0;
                }
              }
            }
          }
        }
      }
    }

    if (state_com->audioObjectType == AOT_AAC_LTP) {
      Ipp32s *predSpectrum[2];
      Ipp16s *ltp_buff[2];
      Ipp32s *ltp_overlap[2];
      Ipp32s prev_window_shape[2];

      for (i = 0; i < procCh; i++) {
        predSpectrum[i] = predictedSpectrum[i];
        ltp_buff[i] = state->ltp_buff[ch+i];
        ltp_overlap[i] = state->ltp_overlap[ch+i];
        prev_window_shape[i] = state_com->chInfo[ch+i].prev_window_shape;
      }

      aaciencLtpBufferUpdate(ltp_buff, ltp_overlap, predSpectrum, &cpe,
                             state_com->sfb_offset[EIGHT_SHORT_SEQUENCE],
                             prev_window_shape, procCh);
    }

    for (i = 0; i < procCh; i++) {
      state_com->chInfo[ch+i].prev_window_shape = win_shape;
    }

    GET_BITS_COUNT(pBS, save_bits)

    /* Put bits into bitstream */
    if (state_com->chInfo[ch].element_id == ID_SCE) {
      PUT_BITS(pBS,ID_SCE,3);
      enc_single_channel_element(&sce, state_com->chInfo[ch].element_instance_tag,
                                 pBS, 1, pCrcSaveTable);
      pCrcSaveTable++;
    } else if (state_com->chInfo[ch].element_id == ID_LFE) {
      PUT_BITS(pBS,ID_LFE,3);
      enc_single_channel_element(&sce, state_com->chInfo[ch].element_instance_tag,
                                 pBS, 1, pCrcSaveTable);
      pCrcSaveTable++;
    } else {
      if (cpe.common_window) {
        if (state_com->audioObjectType == AOT_AAC_LTP) {
          if (ics[1].predictor_data_present) {
            ics[0].predictor_data_present = 1;
          }
        }
      }
      PUT_BITS(pBS,ID_CPE,3);
      enc_channel_pair_element(&cpe, state_com->chInfo[ch].element_instance_tag,
                               pBS, 1, pCrcSaveTable);
      pCrcSaveTable += 2;
    }

    GET_BITS_COUNT(pBS, used_bits)
    used_bits -= save_bits;

    state_com->chInfo[ch].bits_in_buf +=
      state_com->chInfo[ch].mean_bits - used_bits;

    if (state_com->chInfo[ch].bits_in_buf > state_com->chInfo[ch].max_bits_in_buf)
      state_com->chInfo[ch].bits_in_buf = state_com->chInfo[ch].max_bits_in_buf;
  }

  PUT_BITS(pBS,ID_END,3);
  SAVE_BITSTREAM(pBS)
  Byte_alignment(pBS);

  state_com->m_buff_prev_index++;
  if (state_com->m_buff_prev_index == 3)
    state_com->m_buff_prev_index = 0;

  state_com->m_buff_curr_index++;
  if (state_com->m_buff_curr_index == 3)
    state_com->m_buff_curr_index = 0;

  state_com->m_buff_next_index++;
  if (state_com->m_buff_next_index == 3)
    state_com->m_buff_next_index = 0;

  state->psychoacoustic_block_com.prev_prev_f_r_index = state_com->m_buff_prev_index;
  state->psychoacoustic_block_com.prev_f_r_index = state_com->m_buff_curr_index;
  state->psychoacoustic_block_com.current_f_r_index = state_com->m_buff_next_index;

  state->psychoacoustic_block_com.nb_curr_index++;
  state->psychoacoustic_block_com.nb_curr_index &= 1;

  state->psychoacoustic_block_com.nb_prev_index++;
  state->psychoacoustic_block_com.nb_prev_index &= 1;

  GET_BITS_COUNT(pBS, (*encodedBytes))
  *encodedBytes >>= 3;
  state_com->m_frame_number++;

  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencFillProgramConfigElement(sProgram_config_element* p_data,
                                          Ipp32s element_instance_tag,
                                          AACEnc *state)
{
  Ipp32s ret = fill_program_config_element(p_data, element_instance_tag,
    &(state->com));
  if (ret < 0) return AAC_BAD_PARAMETER;
  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencClose(AACEnc *state)
{
  if (state == NULL)
    return AAC_OK;

  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencGetCrcSaveTable(sCrcSaveTable **crcSaveTable,
                                 AACEnc *state)
{
  if (!state)
    return AAC_NULL_PTR;

  if (!crcSaveTable)
    return AAC_NULL_PTR;

  *crcSaveTable = state->com.crcSaveTable;
  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencGetSampleFrequencyIndex(Ipp32s *freq_index,
                                         AACEnc *state)
{
  if (!state)
    return AAC_NULL_PTR;

  *freq_index = state->com.sampling_frequency_index;
  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencGetNumEncodedFrames(Ipp32s *m_frame_number,
                                     AACEnc *state)
{
  if (!state)
    return AAC_NULL_PTR;

  *m_frame_number = state->com.m_frame_number;
  return AAC_OK;
}

/********************************************************************/

AACStatus aaciencGetDuration(Ipp32f *p_duration,
                             AACEnc *state)
{
  Ipp32f  duration;

  duration = (Ipp32f)(state->com.m_frame_number) * 1024;
  *p_duration = duration / (Ipp32f)(state->com.m_sampling_frequency);

  return AAC_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -