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

📄 layer3.cpp

📁 一个自己编制的基于pocketPC的mp3播放器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* 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 + -