接下来是decode.c代码,代码绝代正确。本人使用很好
#include <math.h>
#include <stdlib.h>
#include "common.h"
#include "decode.h"
#include "huffman.h"
void decode_info(Bit_stream_struc *bs, frame_params *fr_ps)
{
layer *hdr = fr_ps->header;
hdr->version = get1bit(bs);
hdr->lay = 4-getbits(bs,2);
hdr->error_protection = !get1bit(bs); /* error protect. TRUE/FALSE */
hdr->bitrate_index = getbits(bs,4);
hdr->sampling_frequency = getbits(bs,2);
hdr->padding = get1bit(bs);
hdr->extension = get1bit(bs);
hdr->mode = getbits(bs,2);
hdr->mode_ext = getbits(bs,2);
hdr->copyright = get1bit(bs);
hdr->original = get1bit(bs);
hdr->emphasis = getbits(bs,2);
}
void III_get_side_info(Bit_stream_struc *bs, III_side_info_t *si, frame_params *fr_ps)
{
int ch, gr, i;
int stereo = fr_ps->stereo;
si->main_data_begin = getbits(bs, 9);
if (stereo == 1)
si->private_bits = getbits(bs,5);
else
si->private_bits = getbits(bs,3);
for (ch=0; ch<stereo; ch++)
for (i=0; i<4; i++)
si->ch[ch].scfsi[i] = get1bit(bs);
for (gr=0; gr<2; gr++) {
for (ch=0; ch<stereo; ch++) {
si->ch[ch].gr[gr].part2_3_length = getbits(bs, 12);
si->ch[ch].gr[gr].big_values = getbits(bs, 9);
si->ch[ch].gr[gr].global_gain = getbits(bs, 8);
si->ch[ch].gr[gr].scalefac_compress = getbits(bs, 4);
si->ch[ch].gr[gr].window_switching_flag = get1bit(bs);
if (si->ch[ch].gr[gr].window_switching_flag) {
si->ch[ch].gr[gr].block_type = getbits(bs, 2);
si->ch[ch].gr[gr].mixed_block_flag = get1bit(bs);
for (i=0; i<2; i++)
si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);
for (i=0; i<3; i++)
si->ch[ch].gr[gr].subblock_gain[i] = getbits(bs, 3);
/* Set region_count parameters since they are implicit in this case. */
if (si->ch[ch].gr[gr].block_type == 0) {
printf("Side info bad: block_type == 0 in split block.\n");
exit(0);
}
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; /* MI 9; */
else si->ch[ch].gr[gr].region0_count = 7; /* MI 8; */
si->ch[ch].gr[gr].region1_count = 20 - si->ch[ch].gr[gr].region0_count;
}
else {
for (i=0; i<3; i++)
si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);
si->ch[ch].gr[gr].region0_count = getbits(bs, 4);
si->ch[ch].gr[gr].region1_count = getbits(bs, 3);
si->ch[ch].gr[gr].block_type = 0;
}
si->ch[ch].gr[gr].preflag = get1bit(bs);
si->ch[ch].gr[gr].scalefac_scale = get1bit(bs);
si->ch[ch].gr[gr].count1table_select = get1bit(bs);
}
}
}
struct {
int l[5];
int s[3];
} sfbtable = {
{0, 6, 11, 16, 21},
{0, 6, 12}
};
int slen[2][16]={
{0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
{0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
};
struct {
int l[23];
int s[14];
} sfBandIndex[3]= {
{ {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
{0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
{ {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
{0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
{ {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
{0,4,8,12,16,22,30,42,58,78,104,138,180,192}}
};
void III_get_scale_factors(III_scalefac_t *scalefac, III_side_info_t *si, int gr, int ch, frame_params *fr_ps)
{
int sfb, i, window;
struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {
if (gr_info->mixed_block_flag) { /* MIXED */ /* NEW - ag 11/25 */
for (sfb = 0; sfb < 8; sfb++)
(*scalefac)[ch].l[sfb] = hgetbits(
slen[0][gr_info->scalefac_compress]);
for (sfb = 3; sfb < 6; sfb++)
for (window=0; window<3; window++)
(*scalefac)[ch].s[window][sfb] = hgetbits(
slen[0][gr_info->scalefac_compress]);
for (sfb = 6; sfb < 12; sfb++)
for (window=0; window<3; window++)
(*scalefac)[ch].s[window][sfb] = hgetbits(
slen[1][gr_info->scalefac_compress]);
for (sfb=12,window=0; window<3; window++)
(*scalefac)[ch].s[window][sfb] = 0;
}
else { /* SHORT*/
for (i=0; i<2; i++)
for (sfb = sfbtable.s[i]; sfb < sfbtable.s[i+1]; sfb++)
for (window=0; window<3; window++)
(*scalefac)[ch].s[window][sfb] = hgetbits(
slen[i][gr_info->scalefac_compress]);
for (sfb=12,window=0; window<3; window++)
(*scalefac)[ch].s[window][sfb] = 0;
}
}
else { /* LONG types 0,1,3 */
for (i=0; i<4; i++) {
if ((si->ch[ch].scfsi[i] == 0) || (gr == 0))
for (sfb = sfbtable.l[i]; sfb < sfbtable.l[i+1]; sfb++)
(*scalefac)[ch].l[sfb] = hgetbits(
slen[(i<2)?0:1][gr_info->scalefac_compress]);
}
(*scalefac)[ch].l[22] = 0;
}
}
/* Already declared in huffman.c
struct huffcodetab ht[HTN];
*/
int huffman_initialized = FALSE;
void initialize_huffman()
{
FILE *fi;
if (huffman_initialized) return;
if (!(fi = OpenTableFile("huffdec.txt") )) {
printf("Please check huffman table 'huffdec.txt'\n");
exit(1);
}
if (fi==NULL) {
fprintf(stderr,"decoder table open error\n");
exit(3);
}
if (read_decoder_table(fi) != HTN) {
fprintf(stderr,"decoder table read error\n");
exit(4);
}
huffman_initialized = TRUE;
}
void III_hufman_decode(long int is[SBLIMIT][SSLIMIT], III_side_info_t *si, int ch, int gr, int part2_start, frame_params *fr_ps)
{
int i, x, y;
int v, w;
struct huffcodetab *h;
int region1Start;
int region2Start;
int bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);
initialize_huffman();