MP3解码详解(还清高高手指点)2

本文档深入探讨了MP3解码过程,包括decode_info和III_get_side_info函数的实现,涉及位流处理、帧头解析、侧信息获取等关键步骤。通过对解码过程的分析,有助于理解MP3音频编码的原理。
摘要由CSDN通过智能技术生成

接下来是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();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值