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

📄 sublay2.cpp

📁 VC++视频音频开发实用工程案例精选.rar配套光盘代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		crc->add_bits(channel2_scfsi, 2);
	 }
  }
}


void SubbandLayer2IntensityStereo::read_scalefactor(Ibitstream *stream, Header *header)
{
  if (allocation)
  {
	 SubbandLayer2::read_scalefactor(stream, header);
	 switch (channel2_scfsi)
	 {
		case 0:
		channel2_scalefactor1 = scalefactors[stream->get_bits(6)];
		channel2_scalefactor2 = scalefactors[stream->get_bits(6)];
		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
		break;

		case 1:
		channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream->get_bits (6)];
		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
		break;

		case 2:
		channel2_scalefactor1 = channel2_scalefactor2 =
		channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
		break;

		case 3:
		channel2_scalefactor1 = scalefactors[stream->get_bits(6)];
		channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream->get_bits (6)];
		break;
	 }
  }
}


bool SubbandLayer2IntensityStereo::put_next_sample (e_channels channels,
	SynthesisFilter *filter1, SynthesisFilter *filter2)
{
  if (allocation)
  {
	 register real sample = samples[samplenumber];

	 if (!groupingtable)
		sample = (sample + d) * c;
    if (channels == both)
    {
		register float sample2 = sample;
      if (groupnumber <= 4)
      {
	sample *= scalefactor1;
	sample2 *= channel2_scalefactor1;
		}
		else if (groupnumber <= 8)
		{
	sample *= scalefactor2;
	sample2 *= channel2_scalefactor2;
		}
		else
		{
	sample *= scalefactor3;
	sample2 *= channel2_scalefactor3;
		}
		filter1->input_sample(sample, subbandnumber);
      filter2->input_sample(sample2, subbandnumber);
    }
    else if (channels == left)
	 {
		if (groupnumber <= 4)
			sample *= scalefactor1;
      else if (groupnumber <= 8)
			sample *= scalefactor2;
		else
			sample *= scalefactor3;
		filter1->input_sample(sample, subbandnumber);
	 }
	 else
	 {
		if (groupnumber <= 4)
			sample *= channel2_scalefactor1;
		else if (groupnumber <= 8)
			sample *= channel2_scalefactor2;
		else
			sample *= channel2_scalefactor3;
		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(Ibitstream *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(Ibitstream *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(Ibitstream *stream, Header *header)
{
  SubbandLayer2::read_scalefactor(stream, header);
  if (channel2_allocation)
  {
	 switch (channel2_scfsi)
	 {
		case 0:
  	   channel2_scalefactor1 = scalefactors[stream->get_bits(6)];
	   channel2_scalefactor2 = scalefactors[stream->get_bits(6)];
	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
	   break;

		case 1:
	   channel2_scalefactor1 = channel2_scalefactor2 =
      						      scalefactors[stream->get_bits(6)];
	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
	   break;

		case 2:
	   channel2_scalefactor1 = channel2_scalefactor2 =
	   channel2_scalefactor3 = scalefactors[stream->get_bits(6)];
	   break;

		case 3:
	   channel2_scalefactor1 = scalefactors[stream->get_bits(6)];
	   channel2_scalefactor2 = channel2_scalefactor3 =
      							   scalefactors[stream->get_bits(6)];
  	   break;
	 }
	 prepare_sample_reading(header, channel2_allocation, &channel2_groupingtable,
                           &channel2_factor, &channel2_codelength, &channel2_c,
                           &channel2_d);
  }
}


bool SubbandLayer2Stereo::read_sampledata(Ibitstream *stream)
{
  bool returnvalue = SubbandLayer2::read_sampledata(stream);

  if (channel2_allocation)
	 if (channel2_groupingtable) {
		uint32 samplecode = stream->get_bits(channel2_codelength);
		// create requantized samples:
		samplecode += samplecode << 1;
		register real *target = channel2_samples;
		register const real *source = channel2_groupingtable + samplecode;
		*target++ = *source++;
		*target++ = *source++;
		*target = *source;
		// memcpy (channel2_samples, channel2_groupingtable + samplecode, 3 * sizeof (real));
    } else {
		channel2_samples[0] = real (stream->get_bits(channel2_codelength)) *
      							 channel2_factor - 1.0f;
		channel2_samples[1] = real (stream->get_bits(channel2_codelength)) *
      							 channel2_factor - 1.0f;
		channel2_samples[2] = real (stream->get_bits(channel2_codelength)) *
                            channel2_factor - 1.0f;
	 }

  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];

	 if (!channel2_groupingtable)
		sample = (sample + channel2_d) * channel2_c;

	 if (groupnumber <= 4)
		sample *= channel2_scalefactor1;
	 else if (groupnumber <= 8)
		sample *= channel2_scalefactor2;
	 else
		sample *= channel2_scalefactor3;
	 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 + -