📄 layer3.cpp
字号:
/* layer3.cpp Implementation of the layer III decoder 01/31/97 : Layer III routines adopted from the ISO MPEG Audio Subgroup Software Simulation Group's public c source for its MPEG audio decoder. These routines were in the file "decoder.c". Rearrangement of the routines as member functions of a layer III decoder object, and optimizations by Jeff Tsay (ctsay@pasteur.eecs.berkeley.edu). 04/14/97 : Several performance improvements. Inverse IMDCT moved to an external source file. No huffman tables needed, so no need for initialization. Put get_side_info() in this source file, and made one function inline for better speed and elegance. Also added support for mono decoding of stereo streams as well as downmixing. Bug fix in dequantize_samples(). 06/26/97 : Added MPEG2 LSF capability and made a few minor speedups. The optimized reording function must be fixed, so right now the one from 1.81 is used. */#include "stdafx.h"#include <math.h>#include "all.h"#include "l3type.h"#include "ibitstr.h"#include "obuffer.h"#include "bit_res.h"#include "header.h"#include "synfilt.h"#include "huffman.h"#include "layer3.h"#include "l3table.h"#include "inv_mdct.h"LayerIII_Decoder::LayerIII_Decoder(Ibitstream *stream0, Header *header0, SynthesisFilter *filtera, SynthesisFilter *filterb, Obuffer *buffer0, enum e_channels which_ch0){ stream = stream0; header = header0; filter1 = filtera; filter2 = filterb; buffer = buffer0; which_channels = which_ch0; frame_start = 0; channels = (header->mode() == single_channel) ? 1 : 2; max_gr = (header->version() == MPEG1) ? 2 : 1; sfreq = header->sample_frequency() + ((header->version() == MPEG1) ? 3 : 0); if (channels == 2) { switch (which_channels) { case left: case downmix: first_channel = last_channel = 0; break; case right: first_channel = last_channel = 1; break; case both: default: first_channel = 0; last_channel = 1; break; } } else { first_channel = last_channel = 0; } for(int32 ch=0;ch<2;ch++) for (int32 j=0; j<576; j++) prevblck[ch][j] = 0.0f; nonzero[0] = nonzero[1] = 576; br = new Bit_Reserve(); si = new III_side_info_t;}LayerIII_Decoder::~LayerIII_Decoder(){ delete br; delete si;}void LayerIII_Decoder::seek_notify(){ frame_start = 0; for(int32 ch=0;ch<2;ch++) for (int32 j=0; j<576; j++) prevblck[ch][j] = 0.0f; delete br; br = new Bit_Reserve;}bool LayerIII_Decoder::get_side_info()// Reads the side info from the stream, assuming the entire// frame has been read already.// Mono : 136 bits (= 17 bytes)// Stereo : 256 bits (= 32 bytes){ int32 ch, gr; if (header->version() == MPEG1) { si->main_data_begin = stream->get_bits(9); if (channels == 1) si->private_bits = stream->get_bits(5); else si->private_bits = stream->get_bits(3); for (ch=0; ch<(long)channels; ch++) { si->ch[ch].scfsi[0] = stream->get_bits(1); si->ch[ch].scfsi[1] = stream->get_bits(1); si->ch[ch].scfsi[2] = stream->get_bits(1); si->ch[ch].scfsi[3] = stream->get_bits(1); } for (gr=0; gr<2; gr++) { for (ch=0; ch<(long)channels; ch++) { si->ch[ch].gr[gr].part2_3_length = stream->get_bits(12); si->ch[ch].gr[gr].big_values = stream->get_bits(9); si->ch[ch].gr[gr].global_gain = stream->get_bits(8); si->ch[ch].gr[gr].scalefac_compress = stream->get_bits(4); si->ch[ch].gr[gr].window_switching_flag = stream->get_bits(1); if (si->ch[ch].gr[gr].window_switching_flag) { si->ch[ch].gr[gr].block_type = stream->get_bits(2); si->ch[ch].gr[gr].mixed_block_flag = stream->get_bits(1); si->ch[ch].gr[gr].table_select[0] = stream->get_bits(5); si->ch[ch].gr[gr].table_select[1] = stream->get_bits(5); si->ch[ch].gr[gr].subblock_gain[0] = stream->get_bits(3); si->ch[ch].gr[gr].subblock_gain[1] = stream->get_bits(3); si->ch[ch].gr[gr].subblock_gain[2] = stream->get_bits(3); // Set region_count parameters since they are implicit in this case. if (si->ch[ch].gr[gr].block_type == 0) { // Side info bad: block_type == 0 in split block return false; } else if (si->ch[ch].gr[gr].block_type == 2 && si->ch[ch].gr[gr].mixed_block_flag == 0) { si->ch[ch].gr[gr].region0_count = 8; } else { si->ch[ch].gr[gr].region0_count = 7; } si->ch[ch].gr[gr].region1_count = 20 - si->ch[ch].gr[gr].region0_count; } else { si->ch[ch].gr[gr].table_select[0] = stream->get_bits(5); si->ch[ch].gr[gr].table_select[1] = stream->get_bits(5); si->ch[ch].gr[gr].table_select[2] = stream->get_bits(5); si->ch[ch].gr[gr].region0_count = stream->get_bits(4); si->ch[ch].gr[gr].region1_count = stream->get_bits(3); si->ch[ch].gr[gr].block_type = 0; } si->ch[ch].gr[gr].preflag = stream->get_bits(1); si->ch[ch].gr[gr].scalefac_scale = stream->get_bits(1); si->ch[ch].gr[gr].count1table_select = stream->get_bits(1); } } } else { // MPEG-2 LSF si->main_data_begin = stream->get_bits(8); if (channels == 1) si->private_bits = stream->get_bits(1); else si->private_bits = stream->get_bits(2); for (ch=0; ch<(long)channels; ch++) { si->ch[ch].gr[0].part2_3_length = stream->get_bits(12); si->ch[ch].gr[0].big_values = stream->get_bits(9); si->ch[ch].gr[0].global_gain = stream->get_bits(8); si->ch[ch].gr[0].scalefac_compress = stream->get_bits(9); si->ch[ch].gr[0].window_switching_flag = stream->get_bits(1); if (si->ch[ch].gr[0].window_switching_flag) { si->ch[ch].gr[0].block_type = stream->get_bits(2); si->ch[ch].gr[0].mixed_block_flag = stream->get_bits(1); si->ch[ch].gr[0].table_select[0] = stream->get_bits(5); si->ch[ch].gr[0].table_select[1] = stream->get_bits(5); si->ch[ch].gr[0].subblock_gain[0] = stream->get_bits(3); si->ch[ch].gr[0].subblock_gain[1] = stream->get_bits(3); si->ch[ch].gr[0].subblock_gain[2] = stream->get_bits(3); // Set region_count parameters since they are implicit in this case. if (si->ch[ch].gr[0].block_type == 0) { // Side info bad: block_type == 0 in split block return false; } else if (si->ch[ch].gr[0].block_type == 2 && si->ch[ch].gr[0].mixed_block_flag == 0) { si->ch[ch].gr[0].region0_count = 8; } else { si->ch[ch].gr[0].region0_count = 7; si->ch[ch].gr[0].region1_count = 20 - si->ch[ch].gr[0].region0_count; } } else { si->ch[ch].gr[0].table_select[0] = stream->get_bits(5); si->ch[ch].gr[0].table_select[1] = stream->get_bits(5); si->ch[ch].gr[0].table_select[2] = stream->get_bits(5); si->ch[ch].gr[0].region0_count = stream->get_bits(4); si->ch[ch].gr[0].region1_count = stream->get_bits(3); si->ch[ch].gr[0].block_type = 0; } si->ch[ch].gr[0].scalefac_scale = stream->get_bits(1); si->ch[ch].gr[0].count1table_select = stream->get_bits(1); } // for(ch=0; ch<channels; ch++) } // if (header->version() == MPEG1) return true;}struct { int32 l[5]; int32 s[3];} sfbtable = {{0, 6, 11, 16, 21}, {0, 6, 12}};void LayerIII_Decoder::get_scale_factors(uint32 ch, uint32 gr){ int32 sfb, window; gr_info_s *gr_info = &(si->ch[ch].gr[gr]); int32 scale_comp = gr_info->scalefac_compress; int32 length0 = slen[0][scale_comp]; int32 length1 = slen[1][scale_comp]; if (gr_info->window_switching_flag && (gr_info->block_type == 2)) { if (gr_info->mixed_block_flag) { // MIXED for (sfb = 0; sfb < 8; sfb++) scalefac[ch].l[sfb] = br->hgetbits( slen[0][gr_info->scalefac_compress]); for (sfb = 3; sfb < 6; sfb++) for (window=0; window<3; window++) scalefac[ch].s[window][sfb] = br->hgetbits( slen[0][gr_info->scalefac_compress]); for (sfb = 6; sfb < 12; sfb++) for (window=0; window<3; window++) scalefac[ch].s[window][sfb] = br->hgetbits( slen[1][gr_info->scalefac_compress]); for (sfb=12,window=0; window<3; window++) scalefac[ch].s[window][sfb] = 0; } else { // SHORT scalefac[ch].s[0][0] = br->hgetbits(length0); scalefac[ch].s[1][0] = br->hgetbits(length0); scalefac[ch].s[2][0] = br->hgetbits(length0); scalefac[ch].s[0][1] = br->hgetbits(length0); scalefac[ch].s[1][1] = br->hgetbits(length0); scalefac[ch].s[2][1] = br->hgetbits(length0); scalefac[ch].s[0][2] = br->hgetbits(length0); scalefac[ch].s[1][2] = br->hgetbits(length0); scalefac[ch].s[2][2] = br->hgetbits(length0); scalefac[ch].s[0][3] = br->hgetbits(length0); scalefac[ch].s[1][3] = br->hgetbits(length0); scalefac[ch].s[2][3] = br->hgetbits(length0); scalefac[ch].s[0][4] = br->hgetbits(length0); scalefac[ch].s[1][4] = br->hgetbits(length0); scalefac[ch].s[2][4] = br->hgetbits(length0); scalefac[ch].s[0][5] = br->hgetbits(length0); scalefac[ch].s[1][5] = br->hgetbits(length0); scalefac[ch].s[2][5] = br->hgetbits(length0); scalefac[ch].s[0][6] = br->hgetbits(length1); scalefac[ch].s[1][6] = br->hgetbits(length1); scalefac[ch].s[2][6] = br->hgetbits(length1); scalefac[ch].s[0][7] = br->hgetbits(length1); scalefac[ch].s[1][7] = br->hgetbits(length1); scalefac[ch].s[2][7] = br->hgetbits(length1); scalefac[ch].s[0][8] = br->hgetbits(length1); scalefac[ch].s[1][8] = br->hgetbits(length1); scalefac[ch].s[2][8] = br->hgetbits(length1); scalefac[ch].s[0][9] = br->hgetbits(length1); scalefac[ch].s[1][9] = br->hgetbits(length1); scalefac[ch].s[2][9] = br->hgetbits(length1); scalefac[ch].s[0][10] = br->hgetbits(length1); scalefac[ch].s[1][10] = br->hgetbits(length1); scalefac[ch].s[2][10] = br->hgetbits(length1); scalefac[ch].s[0][11] = br->hgetbits(length1); scalefac[ch].s[1][11] = br->hgetbits(length1); scalefac[ch].s[2][11] = br->hgetbits(length1); scalefac[ch].s[0][12] = 0; scalefac[ch].s[1][12] = 0; scalefac[ch].s[2][12] = 0; } // SHORT } else { // LONG types 0,1,3 if ((si->ch[ch].scfsi[0] == 0) || (gr == 0)) { scalefac[ch].l[0] = br->hgetbits(length0); scalefac[ch].l[1] = br->hgetbits(length0); scalefac[ch].l[2] = br->hgetbits(length0); scalefac[ch].l[3] = br->hgetbits(length0); scalefac[ch].l[4] = br->hgetbits(length0); scalefac[ch].l[5] = br->hgetbits(length0); } if ((si->ch[ch].scfsi[1] == 0) || (gr == 0)) { scalefac[ch].l[6] = br->hgetbits(length0); scalefac[ch].l[7] = br->hgetbits(length0); scalefac[ch].l[8] = br->hgetbits(length0); scalefac[ch].l[9] = br->hgetbits(length0); scalefac[ch].l[10] = br->hgetbits(length0); } if ((si->ch[ch].scfsi[2] == 0) || (gr == 0)) { scalefac[ch].l[11] = br->hgetbits(length1); scalefac[ch].l[12] = br->hgetbits(length1); scalefac[ch].l[13] = br->hgetbits(length1); scalefac[ch].l[14] = br->hgetbits(length1); scalefac[ch].l[15] = br->hgetbits(length1); } if ((si->ch[ch].scfsi[3] == 0) || (gr == 0)) { scalefac[ch].l[16] = br->hgetbits(length1); scalefac[ch].l[17] = br->hgetbits(length1); scalefac[ch].l[18] = br->hgetbits(length1); scalefac[ch].l[19] = br->hgetbits(length1); scalefac[ch].l[20] = br->hgetbits(length1); } scalefac[ch].l[21] = 0; scalefac[ch].l[22] = 0; }}uint32 nr_of_sfb_block[6][3][4] = {{{ 6, 5, 5, 5} , { 9, 9, 9, 9} , { 6, 9, 9, 9}}, {{ 6, 5, 7, 3} , { 9, 9,12, 6} , { 6, 9,12, 6}}, {{11,10, 0, 0} , {18,18, 0, 0} , {15,18, 0, 0}}, {{ 7, 7, 7, 0} , {12,12,12, 0} , { 6,15,12, 0}}, {{ 6, 6, 6, 3} , {12, 9, 9, 6} , { 6,12, 9, 6}}, {{ 8, 8, 5, 0} , {15,12, 9, 0} , { 6,18, 9, 0}}};uint32 scalefac_buffer[54];void LayerIII_Decoder::get_LSF_scale_data(uint32 ch, uint32 gr){ uint32 new_slen[4]; uint32 scalefac_comp, int_scalefac_comp; uint32 mode_ext = header->mode_extension(); int32 m; int32 blocktypenumber, blocknumber; gr_info_s *gr_info = &(si->ch[ch].gr[gr]); scalefac_comp = gr_info->scalefac_compress; if (gr_info->block_type == 2) { if (gr_info->mixed_block_flag == 0) blocktypenumber = 1; else if (gr_info->mixed_block_flag == 1) blocktypenumber = 2; else blocktypenumber = 0; } else { blocktypenumber = 0; } if(!(((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) { if(scalefac_comp < 400) { new_slen[0] = (scalefac_comp >> 4) / 5 ; new_slen[1] = (scalefac_comp >> 4) % 5 ; new_slen[2] = (scalefac_comp & 0xF) >> 2 ; new_slen[3] = (scalefac_comp & 3); si->ch[ch].gr[gr].preflag = 0; blocknumber = 0; } else if (scalefac_comp < 500) { new_slen[0] = ((scalefac_comp - 400) >> 2) / 5 ; new_slen[1] = ((scalefac_comp - 400) >> 2) % 5 ; new_slen[2] = (scalefac_comp - 400 ) & 3 ; new_slen[3] = 0; si->ch[ch].gr[gr].preflag = 0; blocknumber = 1; } else if (scalefac_comp < 512) { new_slen[0] = (scalefac_comp - 500 ) / 3 ; new_slen[1] = (scalefac_comp - 500) % 3 ; new_slen[2] = 0; new_slen[3] = 0; si->ch[ch].gr[gr].preflag = 1; blocknumber = 2; } } if((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) { int_scalefac_comp = scalefac_comp >> 1; if (int_scalefac_comp < 180) { new_slen[0] = int_scalefac_comp / 36 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -