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

📄 subband_layer_2.cc

📁 ac3的解码程序
💻 CC
📖 第 1 页 / 共 2 页
字号:
#ifdef DEBUG  if (samplenumber >= 3){    // don't call put_next_sample if the previvious call returned True;    cerr << "Illegal call to SubbandLayer2::put_next_sample()!\n";    exit (1);  }#endif  if (allocation && channels != right){    register real sample = (samples[samplenumber] + d) * c;    if (groupnumber <= 4)      sample *= scalefactors[scalefactor1];    else if (groupnumber <= 8)      sample *= scalefactors[scalefactor2];    else      sample *= scalefactors[scalefactor3];#ifdef DEBUG    if (sample < -1.0 || sample > 1.0)      cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]\n";      // this should never occur#endif    if (sample < -1.0E-7 || sample > 1.0E-7)      filter1->input_sample (sample, subbandnumber);  }  return (++samplenumber == 3) ? True : False;}/******************************//*** Intensity Stereo Class ***//******************************/SubbandLayer2IntensityStereo::SubbandLayer2IntensityStereo (uint32 subbandnumber): SubbandLayer2 (subbandnumber){}void SubbandLayer2IntensityStereo::read_scalefactor_selection (AudioStream *stream, Crc16 *crc){  if (allocation){    scfsi = stream->get_bits (2);    channel2_scfsi = stream->get_bits (2);    if (crc){      crc->add_bits (scfsi, 2);      crc->add_bits (channel2_scfsi, 2);    }  }}void SubbandLayer2IntensityStereo::read_scalefactor (AudioStream *stream, Header *header){  if (allocation){    SubbandLayer2::read_scalefactor (stream, header);    switch (channel2_scfsi)    {      case 0:	channel2_scalefactor1 = stream->get_bits (6);	channel2_scalefactor2 = stream->get_bits (6);	channel2_scalefactor3 = stream->get_bits (6);	break;      case 1:	channel2_scalefactor1 = channel2_scalefactor2 = stream->get_bits (6);	channel2_scalefactor3 = stream->get_bits (6);	break;      case 2:	channel2_scalefactor1 = channel2_scalefactor2 =	channel2_scalefactor3 = stream->get_bits (6);	break;      case 3:	channel2_scalefactor1 = stream->get_bits (6);	channel2_scalefactor2 = channel2_scalefactor3 = stream->get_bits (6);	break;    }    if (channel2_scalefactor1 == 63 || channel2_scalefactor2 == 63 || channel2_scalefactor3 == 63)      cerr << "WARNING: stream contains an illegal scalefactor!\n";	// MPEG-stream is corrupted!  }}bool SubbandLayer2IntensityStereo::put_next_sample (e_channels channels,	SynthesisFilter *filter1, SynthesisFilter *filter2){#ifdef DEBUG  if (samplenumber >= 3)  {    // don't call put_next_sample if the previvious call returned True;    cerr << "Illegal call to SubbandLayer2::put_next_sample()!\n";    exit (1);  }#endif  if (allocation)  {    register real sample = (samples[samplenumber] + d) * c;    if (channels == both)    {      register float sample2 = sample;      if (groupnumber <= 4)      {	sample *= scalefactors[scalefactor1];	sample2 *= scalefactors[channel2_scalefactor1];      }      else if (groupnumber <= 8)      {	sample *= scalefactors[scalefactor2];	sample2 *= scalefactors[channel2_scalefactor2];      }      else      {	sample *= scalefactors[scalefactor3];	sample2 *= scalefactors[channel2_scalefactor3];      }#ifdef DEBUG      if (sample < -1.0 || sample > 1.0 || sample2 < -1.0 || sample2 > 1.0)	cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]\n";	// this should never occur#endif      if (sample < -1.0E-7 || sample > 1.0E-7)	filter1->input_sample (sample, subbandnumber);      if (sample2 < -1.0E-7 || sample2 > 1.0E-7)	filter2->input_sample (sample2, subbandnumber);    }    else if (channels == left)    {      if (groupnumber <= 4)	sample *= scalefactors[scalefactor1];      else if (groupnumber <= 8)	sample *= scalefactors[scalefactor2];      else	sample *= scalefactors[scalefactor3];#ifdef DEBUG      if (sample < -1.0 || sample > 1.0)	cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]\n";	// this should never occur#endif      if (sample < -1.0E-7 || sample > 1.0E-7)	filter1->input_sample (sample, subbandnumber);    }    else    {      if (groupnumber <= 4)	sample *= scalefactors[channel2_scalefactor1];      else if (groupnumber <= 8)	sample *= scalefactors[channel2_scalefactor2];      else	sample *= scalefactors[channel2_scalefactor3];#ifdef DEBUG      if (sample < -1.0 || sample > 1.0)	cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]\n";	// this should never occur#endif      if (sample < -1.0E-7 || sample > 1.0E-7)	filter1->input_sample (sample, subbandnumber);    }  }  if (++samplenumber == 3)    return True;  else    return False;}/********************//*** Stereo Class ***//********************/SubbandLayer2Stereo::SubbandLayer2Stereo (uint32 subbandnumber): SubbandLayer2 (subbandnumber){}void SubbandLayer2Stereo::read_allocation (AudioStream *stream, Header *header, Crc16 *crc){  uint32 length = get_allocationlength (header);  allocation = stream->get_bits (length);  channel2_allocation = stream->get_bits (length);  if (crc)  {    crc->add_bits (allocation, length);    crc->add_bits (channel2_allocation, length);  }}void SubbandLayer2Stereo::read_scalefactor_selection (AudioStream *stream, Crc16 *crc){  if (allocation)  {    scfsi = stream->get_bits (2);    if (crc)      crc->add_bits (scfsi, 2);  }  if (channel2_allocation)  {    channel2_scfsi = stream->get_bits (2);    if (crc)      crc->add_bits (channel2_scfsi, 2);  }}void SubbandLayer2Stereo::read_scalefactor (AudioStream *stream, Header *header){  SubbandLayer2::read_scalefactor (stream, header);  if (channel2_allocation)  {    switch (channel2_scfsi)    {      case 0:	channel2_scalefactor1 = stream->get_bits (6);	channel2_scalefactor2 = stream->get_bits (6);	channel2_scalefactor3 = stream->get_bits (6);	break;      case 1:	channel2_scalefactor1 = channel2_scalefactor2 = stream->get_bits (6);	channel2_scalefactor3 = stream->get_bits (6);	break;      case 2:	channel2_scalefactor1 = channel2_scalefactor2 =	channel2_scalefactor3 = stream->get_bits (6);	break;      case 3:	channel2_scalefactor1 = stream->get_bits (6);	channel2_scalefactor2 = channel2_scalefactor3 = stream->get_bits (6);	break;    }    if (channel2_scalefactor1 == 63 || channel2_scalefactor2 == 63 || channel2_scalefactor3 == 63)      cerr << "WARNING: stream contains an illegal scalefactor!\n";	// MPEG-stream is corrupted!    prepare_sample_reading (header, channel2_allocation, &channel2_grouping,			    &channel2_quantizationsteps, &channel2_factor,			    &channel2_codelength, &channel2_c, &channel2_d);  }}bool SubbandLayer2Stereo::read_sampledata (AudioStream *stream){  bool returnvalue = SubbandLayer2::read_sampledata (stream);  if (channel2_allocation)    if (channel2_grouping)    {      uint32 samplecode = stream->get_bits (channel2_codelength);#ifdef DEBUG      if (samplecode == (1 << channel2_codelength) - 1)	cerr << "WARNING: stream contains an illegal subband sample!\n";  // MPEG-stream is corrupted!#endif      channel2_samples[0] = real (samplecode % channel2_quantizationsteps) * channel2_factor - 1.0;      samplecode /= channel2_quantizationsteps;      channel2_samples[1] = real (samplecode % channel2_quantizationsteps) * channel2_factor - 1.0;      samplecode /= channel2_quantizationsteps;      channel2_samples[2] = real (samplecode % channel2_quantizationsteps) * channel2_factor - 1.0;    }    else    {      channel2_samples[0] = real (stream->get_bits (channel2_codelength)) * channel2_factor - 1.0;#ifdef DEBUG      if (channel2_samples[0] == (1 << channel2_codelength) - 1)	cerr << "WARNING: stream contains an illegal subband sample!\n";  // MPEG-stream is corrupted!#endif      channel2_samples[1] = real (stream->get_bits (channel2_codelength)) * channel2_factor - 1.0;#ifdef DEBUG      if (channel2_samples[1] == (1 << channel2_codelength) - 1)	cerr << "WARNING: stream contains an illegal subband sample!\n";  // MPEG-stream is corrupted!#endif      channel2_samples[2] = real (stream->get_bits (channel2_codelength)) * channel2_factor - 1.0;#ifdef DEBUG      if (channel2_samples[2] == (1 << channel2_codelength) - 1)	cerr << "WARNING: stream contains an illegal subband sample!\n";  // MPEG-stream is corrupted!#endif    }  return returnvalue;}bool SubbandLayer2Stereo::put_next_sample (e_channels channels,					   SynthesisFilter *filter1, SynthesisFilter *filter2){  bool returnvalue = SubbandLayer2::put_next_sample (channels, filter1, filter2);  if (channel2_allocation && channels != left)  {    register real sample = (channel2_samples[samplenumber - 1] + channel2_d) * channel2_c;    if (groupnumber <= 4)      sample *= scalefactors[channel2_scalefactor1];    else if (groupnumber <= 8)      sample *= scalefactors[channel2_scalefactor2];    else      sample *= scalefactors[channel2_scalefactor3];#ifdef DEBUG    if (sample < -1.0 || sample > 1.0)      cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]\n";      // this should never occur#endif    if (sample < -1.0E-7 || sample > 1.0E-7)      if (channels == both)	filter2->input_sample (sample, subbandnumber);      else	filter1->input_sample (sample, subbandnumber);  }  return returnvalue;}

⌨️ 快捷键说明

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