?? 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 <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)
{
uint32 ch;
int32 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<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<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<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 + -