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

📄 l3bitstream.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************
 * ISO MPEG Audio Subgroup Software Simulation Group (1996)
 * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
 *
 * $Id: l3bitstream.c,v 1.1 1996/02/14 04:04:23 rowlands Exp $
 *
 * $Log: l3bitstream.c,v $
 * Revision 1.1  1996/02/14 04:04:23  rowlands
 * Initial revision
 *
 * Received from Mike Coleman
 **********************************************************************/
/*
  Revision History:

  Date        Programmer                Comment
  ==========  ========================= ===============================
  1995/08/06  mc@fivebats.com           created
  1995/09/06  mc@fivebats.com           modified to use formatBitstream
*/

#include <stdlib.h>
#include "l3bitstream.h" /* the public interface */
#include "l3psy.h"
#include "mdct.h"
#include "loop.h"
#include "formatBitstream.h"
#include "huffman.h"
#include <assert.h>
#include "l3bitstream-pvt.h"

static int stereo = 1;
static frame_params *fr_ps  = NULL;
static Bit_stream_struc *bs = NULL;

BF_FrameData    *frameData    = NULL;
BF_FrameResults *frameResults = NULL;

int PartHoldersInitialized = 0;

BF_PartHolder *headerPH;
BF_PartHolder *frameSIPH;
BF_PartHolder *channelSIPH[ MAX_CHANNELS ];
BF_PartHolder *spectrumSIPH[ MAX_GRANULES ][ MAX_CHANNELS ];
BF_PartHolder *scaleFactorsPH[ MAX_GRANULES ][ MAX_CHANNELS ];
BF_PartHolder *codedDataPH[ MAX_GRANULES ][ MAX_CHANNELS ];
BF_PartHolder *userSpectrumPH[ MAX_GRANULES ][ MAX_CHANNELS ];
BF_PartHolder *userFrameDataPH;


void putMyBits( uint32 val, uint16 len )
{
    putbits( bs, val, len );
}

/*
  III_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).
  */

void
III_format_bitstream( int              bitsPerFrame,
		      frame_params     *in_fr_ps,
		      int              l3_enc[2][2][576],
		      III_side_info_t  *l3_side,
		      III_scalefac_t   *scalefac,
		      Bit_stream_struc *in_bs,
		      double           (*xr)[2][576],
		      char             *ancillary,
		      int              ancillary_bits )
{
    int gr, ch, i, mode_gr;
    fr_ps = in_fr_ps;
    bs = in_bs;
    stereo = fr_ps->stereo;
    mode_gr = (fr_ps->header->version == 1) ? 2 : 1;
    
    if ( frameData == NULL )
    {
	frameData = calloc( 1, sizeof(*frameData) );
	assert( frameData );
    }
    if ( frameResults == NULL )
    {
	frameResults = calloc( 1, sizeof(*frameData) );
	assert( frameData );
    }
    if ( !PartHoldersInitialized )
    {
	headerPH = BF_newPartHolder( 12 );
	frameSIPH = BF_newPartHolder( 12 );

	for ( ch = 0; ch < MAX_CHANNELS; ch++ )
	    channelSIPH[ch] = BF_newPartHolder( 8 );

	for ( gr = 0; gr < MAX_GRANULES; gr++ )	
	    for ( ch = 0; ch < MAX_CHANNELS; ch++ )
	    {
		spectrumSIPH[gr][ch]   = BF_newPartHolder( 32 );
		scaleFactorsPH[gr][ch] = BF_newPartHolder( 64 );
		codedDataPH[gr][ch]    = BF_newPartHolder( 576 );
		userSpectrumPH[gr][ch] = BF_newPartHolder( 4 );
	    }
	userFrameDataPH = BF_newPartHolder( 8 );
	PartHoldersInitialized = 1;
    }

#if 1
    for ( gr = 0; gr < mode_gr; gr++ )
	for ( ch =  0; ch < stereo; ch++ )
	{
	    int *pi = &l3_enc[gr][ch][0];
	    double *pr = &xr[gr][ch][0];
	    for ( i = 0; i < 576; i++, pr++, pi++ )
	    {
		if ( (*pr < 0) && (*pi > 0) )
		    *pi *= -1;
	    }
	}
#endif

    encodeSideInfo( l3_side );
    encodeMainData( l3_enc, l3_side, scalefac );
    write_ancillary_data( ancillary, ancillary_bits );

    if ( l3_side->resvDrain )
	drain_into_ancillary_data( l3_side->resvDrain );
    /*
      Put frameData together for the call
      to BitstreamFrame()
    */
    frameData->putbits     = putMyBits;
    frameData->frameLength = bitsPerFrame;
    frameData->nGranules   = mode_gr;
    frameData->nChannels   = stereo;
    frameData->header      = headerPH->part;
    frameData->frameSI     = frameSIPH->part;

    for ( ch = 0; ch < stereo; ch++ )
	frameData->channelSI[ch] = channelSIPH[ch]->part;

    for ( gr = 0; gr < mode_gr; gr++ )
	for ( ch = 0; ch < stereo; ch++ )
	{
	    frameData->spectrumSI[gr][ch]   = spectrumSIPH[gr][ch]->part;
	    frameData->scaleFactors[gr][ch] = scaleFactorsPH[gr][ch]->part;
	    frameData->codedData[gr][ch]    = codedDataPH[gr][ch]->part;
	    frameData->userSpectrum[gr][ch] = userSpectrumPH[gr][ch]->part;
	}
    frameData->userFrameData = userFrameDataPH->part;

    BF_BitstreamFrame( frameData, frameResults );

    /* we set this here -- it will be tested in the next loops iteration */
    l3_side->main_data_begin = frameResults->nextBackPtr;
}

void
III_FlushBitstream()
{
    assert( PartHoldersInitialized );
    BF_FlushBitstream( frameData, frameResults );
}

static unsigned slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
static unsigned slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };

static void
encodeMainData( int              l3_enc[2][2][576],
		III_side_info_t  *si,
		III_scalefac_t   *scalefac )
{
    int i, gr, ch, sfb, window, mode_gr;
    layer *info = fr_ps->header;

    if ( info->version == 1 )
	mode_gr = 2;
    else
	mode_gr = 1;

    for ( gr = 0; gr < mode_gr; gr++ )
	for ( ch = 0; ch < stereo; ch++ )
	    scaleFactorsPH[gr][ch]->part->nrEntries = 0;

    for ( gr = 0; gr < mode_gr; gr++ )
	for ( ch = 0; ch < stereo; ch++ )
	    codedDataPH[gr][ch]->part->nrEntries = 0;

    if ( info->version == 1 )
    {  /* MPEG 1 */
	for ( gr = 0; gr < 2; gr++ )
	{
	    for ( ch = 0; ch < stereo; ch++ )
	    {
		BF_PartHolder **pph = &scaleFactorsPH[gr][ch];		
		gr_info *gi = &(si->gr[gr].ch[ch].tt);
		unsigned slen1 = slen1_tab[ gi->scalefac_compress ];
		unsigned slen2 = slen2_tab[ gi->scalefac_compress ];
		int *ix = &l3_enc[gr][ch][0];

		if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
		{
		    if ( gi->mixed_block_flag )
		    {
			for ( sfb = 0; sfb < 8; sfb++ )
			    *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );

			for ( sfb = 3; sfb < 6; sfb++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );

			for ( sfb = 6; sfb < 12; sfb++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );

		    }
		    else
		    {
			for ( sfb = 0; sfb < 6; sfb++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );

			for ( sfb = 6; sfb < 12; sfb++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );
		    }
		}
		else
		{
		    if ( (gr == 0) || (si->scfsi[ch][0] == 0) )
			for ( sfb = 0; sfb < 6; sfb++ )
			    *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );

		    if ( (gr == 0) || (si->scfsi[ch][1] == 0) )
			for ( sfb = 6; sfb < 11; sfb++ )
			    *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );

		    if ( (gr == 0) || (si->scfsi[ch][2] == 0) )
			for ( sfb = 11; sfb < 16; sfb++ )
			    *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen2 );

		    if ( (gr == 0) || (si->scfsi[ch][3] == 0) )
			for ( sfb = 16; sfb < 21; sfb++ )
			    *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen2 );
		}
		Huffmancodebits( &codedDataPH[gr][ch], ix, gi );
	    } /* for ch */
	} /* for gr */
    }
    else
    {  /* MPEG 2 */
	gr = 0;
	for ( ch = 0; ch < stereo; ch++ )
	{
	    BF_PartHolder **pph = &scaleFactorsPH[gr][ch];		
	    gr_info *gi = &(si->gr[gr].ch[ch].tt);
	    int *ix = &l3_enc[gr][ch][0];
	    int sfb_partition;

	    assert( gi->sfb_partition_table );

	    if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
	    {
		if ( gi->mixed_block_flag )
		{
		    sfb_partition = 0;
		    for ( sfb = 0; sfb < 8; sfb++ )
			*pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], gi->slen[sfb_partition] );

		    for ( sfb = 3, sfb_partition = 1; 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++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen );
		    }
		}
		else
		{
		    for ( sfb = 0, sfb_partition = 0; 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++ )
			    for ( window = 0; window < 3; window++ )
				*pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen );
		    }
		}
	    }
	    else
	    {
		for ( sfb = 0, sfb_partition = 0; 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++ )
			*pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen );
		}
	    }
	    Huffmancodebits( &codedDataPH[gr][ch], ix, gi );
	} /* for ch */
    }
} /* main_data */

static unsigned int crc = 0;

static int encodeSideInfo( III_side_info_t  *si )
{
    int gr, ch, scfsi_band, region, window, bits_sent, mode_gr;
    layer *info = fr_ps->header;
    
    mode_gr =  (info->version == 1) ? 2 : 1;

    headerPH->part->nrEntries = 0;
    headerPH = BF_addEntry( headerPH, 0xfff,                    12 );
    headerPH = BF_addEntry( headerPH, info->version,            1 );
    headerPH = BF_addEntry( headerPH, 4 - info->lay,            2 );
    headerPH = BF_addEntry( headerPH, !info->error_protection,  1 );
    headerPH = BF_addEntry( headerPH, info->bitrate_index,      4 );
    headerPH = BF_addEntry( headerPH, info->sampling_frequency, 2 );
    headerPH = BF_addEntry( headerPH, info->padding,            1 );
    headerPH = BF_addEntry( headerPH, info->extension,          1 );
    headerPH = BF_addEntry( headerPH, info->mode,               2 );
    headerPH = BF_addEntry( headerPH, info->mode_ext,           2 );
    headerPH = BF_addEntry( headerPH, info->copyright,          1 );
    headerPH = BF_addEntry( headerPH, info->original,           1 );
    headerPH = BF_addEntry( headerPH, info->emphasis,           2 );
    
    bits_sent = 32;

    if ( fr_ps->header->error_protection )
    {
	headerPH = BF_addEntry( headerPH, crc, 16 );
	bits_sent += 16;
    }

    frameSIPH->part->nrEntries = 0;

    for (ch = 0; ch < stereo; ch++ )
	channelSIPH[ch]->part->nrEntries = 0;

    for ( gr = 0; gr < mode_gr; gr++ )
	for ( ch = 0; ch < stereo; ch++ )
	    spectrumSIPH[gr][ch]->part->nrEntries = 0;

    if ( info->version == 1 )
    {  /* MPEG1 */
	frameSIPH = BF_addEntry( frameSIPH, si->main_data_begin, 9 );

	if ( stereo == 2 )
	    frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 3 );
	else
	    frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 5 );
	
	for ( ch = 0; ch < stereo; ch++ )
	    for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ )
	    {
		BF_PartHolder **pph = &channelSIPH[ch];
		*pph = BF_addEntry( *pph, si->scfsi[ch][scfsi_band], 1 );
	    }

	for ( gr = 0; gr < 2; gr++ )
	    for ( ch = 0; ch < stereo; ch++ )
	    {
		BF_PartHolder **pph = &spectrumSIPH[gr][ch];
		gr_info *gi = &(si->gr[gr].ch[ch].tt);
		*pph = BF_addEntry( *pph, gi->part2_3_length,        12 );
		*pph = BF_addEntry( *pph, gi->big_values,            9 );
		*pph = BF_addEntry( *pph, gi->global_gain,           8 );
		*pph = BF_addEntry( *pph, gi->scalefac_compress,     4 );
		*pph = BF_addEntry( *pph, gi->window_switching_flag, 1 );

		if ( gi->window_switching_flag )
		{   
		    *pph = BF_addEntry( *pph, gi->block_type,       2 );
		    *pph = BF_addEntry( *pph, gi->mixed_block_flag, 1 );

		    for ( region = 0; region < 2; region++ )
			*pph = BF_addEntry( *pph, gi->table_select[region],  5 );
		    for ( window = 0; window < 3; window++ )
			*pph = BF_addEntry( *pph, gi->subblock_gain[window], 3 );
		}
		else
		{
		    assert( gi->block_type == 0 );
		    for ( region = 0; region < 3; region++ )
			*pph = BF_addEntry( *pph, gi->table_select[region], 5 );

		    *pph = BF_addEntry( *pph, gi->region0_count, 4 );
		    *pph = BF_addEntry( *pph, gi->region1_count, 3 );
		}

		*pph = BF_addEntry( *pph, gi->preflag,            1 );
		*pph = BF_addEntry( *pph, gi->scalefac_scale,     1 );
		*pph = BF_addEntry( *pph, gi->count1table_select, 1 );
	    }

	if ( stereo == 2 )
	    bits_sent += 256;
	else
	    bits_sent += 136;
    }
    else
    {  /* MPEG2 */
	frameSIPH = BF_addEntry( frameSIPH, si->main_data_begin, 8 );

	if ( stereo == 2 )
	    frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 2 );
	else
	    frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 1 );
	
	gr = 0;
	for ( ch = 0; ch < stereo; ch++ )
	{
	    BF_PartHolder **pph = &spectrumSIPH[gr][ch];
	    gr_info *gi = &(si->gr[gr].ch[ch].tt);
	    *pph = BF_addEntry( *pph, gi->part2_3_length,        12 );
	    *pph = BF_addEntry( *pph, gi->big_values,            9 );
	    *pph = BF_addEntry( *pph, gi->global_gain,           8 );
	    *pph = BF_addEntry( *pph, gi->scalefac_compress,     9 );
	    *pph = BF_addEntry( *pph, gi->window_switching_flag, 1 );

	    if ( gi->window_switching_flag )
	    {   
		*pph = BF_addEntry( *pph, gi->block_type,       2 );
		*pph = BF_addEntry( *pph, gi->mixed_block_flag, 1 );

⌨️ 快捷键说明

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