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

📄 bitstream.c

📁 MP3编码程序和资料
💻 C
📖 第 1 页 / 共 2 页
字号:
	    assert(-1 <= v && v <= 1);	}	ix += 4;	putbits2(gfp,huffbits + h->table[p], h->hlen[p]);	bits += h->hlen[p];    }#ifdef DEBUG    DEBUGF("%ld %d %d %d\n",gfc->bs.totbit -gegebo, gi->count1bits, gi->big_values, gi->count1);#endif    return bits;}/*  Implements the pseudocode of page 98 of the IS  */static INLINE intHuffmanCode(lame_global_flags *gfp, unsigned int table_select, int x, int y){  /*    lame_internal_flags *gfc=gfp->internal_flags;*/    unsigned int code, ext, xlen;    int cbits, xbits;    unsigned int signx, signy, linbits;    const struct huffcodetab *h;    cbits = 0;    xbits = 0;    code  = 0;    signx = signy = 0;    if (x < 0) {	signx++;	x = -x;    }    if (y < 0) {	signy++;	y = -y;    }    assert(table_select>0);    h = &(ht[table_select]);    linbits = h->xlen;    ext = signx;    xlen = h->xlen;    if (table_select > 15) {	/* use ESC-words */	if (x > 14) {	    int linbitsx = x - 15;	    assert(linbitsx <= h->linmax);	    ext |= linbitsx << 1;	    xbits = linbits;	    x = 15;	}	if (y > 14) {	    int linbitsy = y - 15;	    assert(linbitsy <= h->linmax);	    ext <<= linbits;	    ext |= linbitsy;	    xbits += linbits;	    y = 15;	}	xlen = 16;    }    if (x != 0) {	cbits--;    }    if (y != 0) {	ext <<= 1;	ext |= signy;	cbits--;    }    xbits -= cbits;    assert(x <= 15);    assert(y <= 15);    x = x * xlen + y;    code = h->table[x];    cbits += h->hlen[x];    assert(cbits <= 32);    assert(xbits <= 32);    putbits2(gfp,code, cbits);    putbits2(gfp, ext, xbits);    return cbits+xbits;}static intHuffmancodebits(lame_global_flags *gfp,unsigned int tableindex, int start, int end, int *ix){    int i,bits;    assert(tableindex < 32);    if (!tableindex) return 0;    bits=0;    for (i = start; i < end; i += 2) {      bits +=HuffmanCode(gfp,tableindex, ix[i], ix[i + 1]);    }    return bits;}/*  Note the discussion of huffmancodebits() on pages 28  and 29 of the IS, as well as the definitions of the side  information on pages 26 and 27.  */static intShortHuffmancodebits(lame_global_flags *gfp,int *ix, gr_info *gi){    lame_internal_flags *gfc=gfp->internal_flags;    int bits=0;    int region1Start, region2Start;        region1Start=3*gfc->scalefac_band.s[3];    if (region1Start > gi->big_values) 	region1Start = gi->big_values;    /* short blocks do not have a region2 */    region2Start=gi->big_values;    bits +=Huffmancodebits(gfp,gi->table_select[0], 0, region1Start, ix);    bits +=Huffmancodebits(gfp,gi->table_select[1], region1Start, region2Start, ix);    return bits;}static intLongHuffmancodebits(lame_global_flags *gfp,int *ix, gr_info *gi){    lame_internal_flags *gfc=gfp->internal_flags;    int i, bigvalues,bits=0;    int region1Start, region2Start;    bigvalues = gi->big_values;    assert(0 <= bigvalues && bigvalues <= 576);    i = gi->region0_count + 1;    assert(i < 23);    region1Start = gfc->scalefac_band.l[i];    i += gi->region1_count + 1;    assert(i < 23);    region2Start = gfc->scalefac_band.l[i];    if (region1Start > bigvalues)	region1Start = bigvalues;    if (region2Start > bigvalues)	region2Start = bigvalues;    bits +=Huffmancodebits(gfp,gi->table_select[0], 0, region1Start, ix);    bits +=Huffmancodebits(gfp,gi->table_select[1], region1Start, region2Start, ix);    bits +=Huffmancodebits(gfp,gi->table_select[2], region2Start, bigvalues, ix);    return bits;}static INLINE intwriteMainData(lame_global_flags *gfp,      int              l3_enc[2][2][576],  	III_scalefac_t   scalefac[2][2] ){    int gr, ch, sfb,data_bits,scale_bits,tot_bits=0;    lame_internal_flags *gfc=gfp->internal_flags;    III_side_info_t *l3_side;    l3_side = &gfc->l3_side;    if (gfp->version == 1) {	/* MPEG 1 */	for (gr = 0; gr < 2; gr++) {	    for (ch = 0; ch < gfc->stereo; ch++) {		gr_info *gi = &l3_side->gr[gr].ch[ch].tt;		int slen1 = slen1_tab[gi->scalefac_compress];		int slen2 = slen2_tab[gi->scalefac_compress];		data_bits=0;		scale_bits=0;#ifdef DEBUG		hogege = gfc->bs.totbit;#endif		if (gi->block_type == SHORT_TYPE) {		    for (sfb = 0; sfb < SBPSY_s; sfb++) {			int slen = sfb < 6 ? slen1 : slen2;			assert(scalefac[gr][ch].s[sfb][0]>=0);			assert(scalefac[gr][ch].s[sfb][1]>=0);			assert(scalefac[gr][ch].s[sfb][2]>=0);			putbits2(gfp,scalefac[gr][ch].s[sfb][0], slen);			putbits2(gfp,scalefac[gr][ch].s[sfb][1], slen);			putbits2(gfp,scalefac[gr][ch].s[sfb][2], slen);			scale_bits += 3*slen;		    }		    data_bits += ShortHuffmancodebits(gfp,l3_enc[gr][ch], gi);		} else {		    int i;		    for (i = 0; i < sizeof(scfsi_band) / sizeof(int) - 1;			 i++) {			if (gr != 0 && l3_side->scfsi[ch][i])			    continue;			for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1];			     sfb++) {			    assert(scalefac[gr][ch].l[sfb]>=0);			    putbits2(gfp,scalefac[gr][ch].l[sfb],				    sfb < 11 ? slen1 : slen2);			    scale_bits += sfb < 11 ? slen1 : slen2;			}		    }		    data_bits +=LongHuffmancodebits(gfp,l3_enc[gr][ch], gi);		}		data_bits +=huffman_coder_count1(gfp,l3_enc[gr][ch], gi);#ifdef DEBUG		DEBUGF("<%ld> ", gfc->bs.totbit-hogege);#endif		/* does bitcount in quantize.c agree with actual bit count?*/		assert(data_bits==gi->part2_3_length-gi->part2_length);		assert(scale_bits==gi->part2_length);		tot_bits += scale_bits + data_bits;	    } /* for ch */	} /* for gr */    } else {	/* MPEG 2 */	gr = 0;	for (ch = 0; ch < gfc->stereo; ch++) {	    gr_info *gi = &l3_side->gr[gr].ch[ch].tt;	    int i, sfb_partition;	    assert(gi->sfb_partition_table);	    data_bits = 0;	    scale_bits=0;	    sfb = 0;	    sfb_partition = 0;	    if (gi->block_type == SHORT_TYPE) {		for (; sfb_partition < 4; sfb_partition++) {		    int sfbs = gi->sfb_partition_table[sfb_partition] / 3;		    int slen = gi->slen[sfb_partition];		    for (i = 0; i < sfbs; i++, sfb++) {			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][0], 0U), slen);			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][1], 0U), slen);			putbits2(gfp,Max(scalefac[gr][ch].s[sfb][2], 0U), slen);			scale_bits += 3*slen;		    }		}		data_bits += ShortHuffmancodebits(gfp,l3_enc[gr][ch], gi);	    } else {		for (; sfb_partition < 4; sfb_partition++) {		    int sfbs = gi->sfb_partition_table[sfb_partition];		    int slen = gi->slen[sfb_partition];		    for (i = 0; i < sfbs; i++, sfb++) {			putbits2(gfp,Max(scalefac[gr][ch].l[sfb], 0U), slen);			scale_bits += slen;		    }		}		data_bits +=LongHuffmancodebits(gfp,l3_enc[gr][ch], gi);	    }	    data_bits +=huffman_coder_count1(gfp,l3_enc[gr][ch], gi);	    /* does bitcount in quantize.c agree with actual bit count?*/	    assert(data_bits==gi->part2_3_length-gi->part2_length);	    assert(scale_bits==gi->part2_length);	    tot_bits += scale_bits + data_bits;	} /* for ch */    } /* for gf */    return tot_bits;} /* main_data */voidflush_bitstream(lame_global_flags *gfp){  lame_internal_flags *gfc=gfp->internal_flags;  int flushbits,remaining_headers;  int bitsPerFrame, mean_bits;  int last_ptr,first_ptr;  first_ptr=gfc->w_ptr;           /* first header to add to bitstream */  last_ptr = gfc->h_ptr - 1;   /* last header to add to bitstream */  if (last_ptr==-1) last_ptr=MAX_HEADER_BUF-1;     /* add this many bits to bitstream so we can flush all headers */  flushbits = gfc->header[last_ptr].write_timing - gfc->bs.totbit;  if (flushbits >= 0) {    /* if flushbits >= 0, some headers have not yet been written */    /* reduce flushbits by the size of the headers */    remaining_headers= 1+last_ptr - first_ptr;    if (last_ptr < first_ptr)       remaining_headers= 1+last_ptr - first_ptr + MAX_HEADER_BUF;    flushbits -= remaining_headers*8*gfc->sideinfo_len;  }  /* finally, add some bits so that the last frame is complete   * these bits are not necessary to decode the last frame, but   * some decoders will ignore last frame if these bits are missing    */  getframebits(gfp,&bitsPerFrame,&mean_bits);  flushbits += bitsPerFrame;  if (flushbits<0) {#if 0    /* if flushbits < 0, this would mean that the buffer looks like:     * (data...)  last_header  (data...)  (extra data that should not be here...)     */    DEBUGF("last header write_timing = %i \n",gfc->header[last_ptr].write_timing);    DEBUGF("first header write_timing = %i \n",gfc->header[first_ptr].write_timing);    DEBUGF("bs.totbit:                 %i \n",gfc->bs.totbit);    DEBUGF("first_ptr, last_ptr        %i %i \n",first_ptr,last_ptr);    DEBUGF("remaining_headers =        %i \n",remaining_headers);    DEBUGF("bitsperframe:              %i \n",bitsPerFrame);    DEBUGF("sidelen:                   %i \n",gfc->sideinfo_len);#endif    ERRORF("strange error flushing buffer ... \n");  } else {    drain_into_ancillary(gfp,flushbits);  }  assert (gfc->header[last_ptr].write_timing + bitsPerFrame  == gfc->bs.totbit);}void add_dummy_vbrframe(lame_global_flags *gfp,int bitsPerFrame){  lame_internal_flags *gfc = gfp->internal_flags;  int bits;  gfc->header[gfc->h_ptr].ptr = 0;  memset(gfc->header[gfc->h_ptr].buf, 0, gfc->sideinfo_len);  bits = bitsPerFrame-8*gfc->sideinfo_len;  /* add one byte, cause header to be written */  putbits2(gfp,0,8);     /* setup for next header */  gfc->h_ptr = (gfc->h_ptr + 1) & (MAX_HEADER_BUF - 1);  gfc->header[gfc->h_ptr].write_timing = bitsPerFrame;  drain_into_ancillary(gfp,bits-8);}/*  format_bitstream()  This is called after a frame of audio has been quantized and coded.  It will write the encoded audio to the bitstream. Note that  from a layer3 encoder's perspective the bit stream is primarily  a series of main_data() blocks, with header and side information  inserted at the proper locations to maintain framing. (See Figure A.7  in the IS).  */intformat_bitstream(lame_global_flags *gfp, int bitsPerFrame,      int              l3_enc[2][2][576],  	III_scalefac_t   scalefac[2][2] ){    lame_internal_flags *gfc=gfp->internal_flags;    int bits;    III_side_info_t *l3_side;    l3_side = &gfc->l3_side;    drain_into_ancillary(gfp,l3_side->resvDrain_pre);    encodeSideInfo2(gfp,bitsPerFrame);    bits = 8*gfc->sideinfo_len;    bits+=writeMainData(gfp,l3_enc,scalefac);    drain_into_ancillary(gfp,l3_side->resvDrain_post);    bits += l3_side->resvDrain_post;    l3_side->main_data_begin += (bitsPerFrame-bits)/8;    if ((l3_side->main_data_begin * 8) != gfc->ResvSize ) {      ERRORF("bit reservoir error: \n"             "l3_side->main_data_begin: %i \n"             "Resvoir size:             %i \n"             "resv drain (post)         %i \n"             "resv drain (pre)          %i \n"             "header and sideinfo:      %i \n"             "data bits:                %i \n"             "total bits:               %i (remainder: %i) \n"             "bitsperframe:             %i \n",             8*l3_side->main_data_begin,             gfc->ResvSize,             l3_side->resvDrain_post,             l3_side->resvDrain_pre,             8*gfc->sideinfo_len,             bits-l3_side->resvDrain_post-8*gfc->sideinfo_len,             bits, bits % 8,             bitsPerFrame      );      gfc->ResvSize = l3_side->main_data_begin*8;    };    assert(gfc->bs.totbit % 8 == 0);    if (gfc->bs.totbit > 1000000000UL ) {      /* to avoid totbit overflow, (at 8h encoding at 128kbs) lets reset bit counter*/      int i;      for (i=0 ; i< MAX_HEADER_BUF ; ++i) 	gfc->header[i].write_timing -= gfc->bs.totbit;            gfc->bs.totbit=0;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -