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

📄 ac3_dec_api_fp.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
    *decodedBytes >>= 3;
  } else {
    *decodedBytes = state->syncinfo.frame_size * 2;
  }

  state->m_frame_number++;
  return AC3_OK;
}

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

AC3Status GetSynch(sBitsreamBuffer *pBS,
                   Ipp32s inDataSize)
{
  Ipp32s syncw, tmp;

  inDataSize *= 8;

  GET_BITS_COUNT(pBS, tmp)
  tmp = inDataSize - tmp;

  if (tmp < 16)
    return AC3_NOT_FIND_SYNCWORD;

  GET_BITS(pBS, syncw, 16, Ipp32s)
  for (;;) {
    if ((syncw & 0xffff) == 0x0b77)
      break;

    GET_BITS_COUNT(pBS, tmp)
    tmp = inDataSize - tmp;

    if (tmp < 8)
      return AC3_NOT_FIND_SYNCWORD;

    GET_BITS(pBS, tmp, 8, Ipp32s)
    syncw = (syncw << 8) | tmp;
  }

  return AC3_OK;
}

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

AC3Status ac3decSetOutAcmod(Ipp32s out_acmod,
                            AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((out_acmod < 0) || (out_acmod > 8))
    return AC3_FLAGS_ERROR;

  state->as_input = 0;
  if (8 == out_acmod) {
    state->as_input = 1;
    state->out_acmod = 7; /* Doesn't matter */
  } else {
    state->out_acmod = out_acmod;
  }

  state->nChannelOut = NFCHANS[state->out_acmod] +
                       state->outlfeon;
  return AC3_OK;
}

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

AC3Status ac3decSetOuLfeOn(Ipp32s outlfeon,
                           AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((outlfeon < 0) || (outlfeon > 1))
    return AC3_FLAGS_ERROR;

  state->outlfeon = outlfeon;
  state->nChannelOut = NFCHANS[state->out_acmod] +
                       state->outlfeon;
  return AC3_OK;
}

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

AC3Status ac3decSetDualMonoMode(Ipp32s dualmonomode,
                                AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((dualmonomode < 0) || (dualmonomode > 3))
    return AC3_FLAGS_ERROR;

  state->dualmonomode = dualmonomode;
  return AC3_OK;
}

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

AC3Status ac3decSetDrcScaleLow(Ipp32f drc_scaleLow,
                               AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((drc_scaleLow < 0) || (drc_scaleLow > 1))
    return AC3_FLAGS_ERROR;

  state->drc_scaleLow = drc_scaleLow;
  return AC3_OK;
}

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

AC3Status ac3decSetDrcScaleHigh(Ipp32f drc_scaleHigh,
                                AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((drc_scaleHigh < 0) || (drc_scaleHigh > 1))
    return AC3_FLAGS_ERROR;

  state->drc_scaleHigh = drc_scaleHigh;
  return AC3_OK;
}

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

AC3Status ac3decSetOutCompMod(Ipp32s out_compmod,
                              AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((out_compmod < 0) || (out_compmod > 3))
    return AC3_FLAGS_ERROR;

  state->out_compmod = out_compmod;
  return AC3_OK;
}

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

AC3Status ac3decSetKaraokeCapable(Ipp32s karaokeCapable,
                                  AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((karaokeCapable < -1) || (karaokeCapable > 3))
    return AC3_FLAGS_ERROR;

  state->karaokeCapable = karaokeCapable;
  return AC3_OK;
}

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

AC3Status ac3decSetCrcMute(Ipp32s crc_mute,
                           AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if ((crc_mute < 0) || (crc_mute > 1))
    return AC3_FLAGS_ERROR;

  state->crc_mute = crc_mute;
  return AC3_OK;
}

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

AC3Status ac3decSetGainScale(Ipp32f gainScale,
                             AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  if (gainScale < 0)
    return AC3_FLAGS_ERROR;

  state->gainScale = gainScale;
  return AC3_OK;
}

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

AC3Status ac3decGetNumChannelOut(Ipp32s *nChannelOut,
                                 AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  *nChannelOut = state->nChannelOut;

  return AC3_OK;
}

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

AC3Status ac3decGetSampleFrequency(Ipp32s *SampleRate,
                                   AC3Dec *state)
{
  if (!state)
    return AC3_NULL_PTR;

  *SampleRate = state->syncinfo.SampleRate;

  return AC3_OK;
}

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


AC3Status ac3decGetInfo(cAudioCodecParams *a_info,
                        AC3Dec *state)
{
  if (!a_info)
    return AC3_NULL_PTR;

  a_info->m_SuggestedInputSize = AC3_FRAME_SIZE;
  a_info->m_SuggestedOutputSize = 6 * (256 * 6) * sizeof(Ipp16s);
  a_info->m_info_in.stream_type = AC3_AUD;
  a_info->m_info_out.stream_type = PCM_AUD;
  a_info->m_info_in.channels = state->nChannelOut;
  a_info->m_info_out.channels = state->nChannelOut;
  a_info->is_valid = 0;

  if (!state)
    return AC3_OK;

  if (state->m_frame_number > 0) {
    a_info->m_info_in.bitPerSample = 0;
    a_info->m_info_out.bitPerSample = 16;

    a_info->m_info_in.bitrate = state->syncinfo.bit_rate * 1000;
    a_info->m_info_out.bitrate = 0;

    a_info->m_info_in.sample_frequency = state->syncinfo.SampleRate;
    a_info->m_info_out.sample_frequency = state->syncinfo.SampleRate;

    a_info->m_frame_num = state->m_frame_number;
    a_info->is_valid = 1;

    switch (state->bsi.acmod) {
      case ACMOD_0:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_10:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        break;
      case ACMOD_20:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_30:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_21:
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_CENTER;
        break;
      case ACMOD_31:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_CENTER;
        break;
      case ACMOD_22:
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
        break;
      case ACMOD_32:
        a_info->m_info_in.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_LEFT;
        a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
        break;
      default:
        break;
    }
    if (state->bsi.lfeon) {
      a_info->m_info_in.channel_mask |= AC3_CHANNEL_LOW_FREQUENCY;
    }

    switch (state->out_acmod) {
      case ACMOD_0:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_10:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        break;
      case ACMOD_20:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_30:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        break;
      case ACMOD_21:
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_CENTER;
        break;
      case ACMOD_31:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_CENTER;
        break;
      case ACMOD_22:
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
        break;
      case ACMOD_32:
        a_info->m_info_out.channel_mask  = AC3_CHANNEL_FRONT_CENTER;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_LEFT;
        a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
        break;
      default:
        break;
    }
    if (state->outlfeon) {
      a_info->m_info_out.channel_mask |= AC3_CHANNEL_LOW_FREQUENCY;
    }
  }
  return AC3_OK;
}

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

AC3Status ac3decGetDuration(Ipp32f *p_duration,
                            AC3Dec *state)
{
  Ipp32f  duration;

  duration = (Ipp32f)(state->m_frame_number) * 6 * 256;
  *p_duration = duration / (Ipp32f)(state->syncinfo.SampleRate);

  return AC3_OK;
}

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

⌨️ 快捷键说明

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