?? subband_layer_2.cc
字號:
#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 + -