l3bitstream.c

来自「mp3 source code decoder & encoder」· C语言 代码 · 共 837 行 · 第 1/2 页

C
837
字号
/*
 * $Header: /MP3Stego/MP3Stego Encoder/l3bitstream.c 5     30/11/00 15:57 Fabienpe $
 */ 
#include <stdio.h>
#include <stdlib.h>

#include "../../stegolib/stego.h"

#include "l3bitstream.h" /* the public interface */
#include "l3psy.h"
#include "l3mdct.h"
#include "l3loop.h"
#include "formatBitstream.h" 
#include "huffman.h"
#include "bitstream.h"
#include "types.h"
#include "tables.h"
#include "error.h"

/*static int stereo = 1;*/
static bitstream_t *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;

static int encodeSideInfo(L3_side_info_t  *si);
static void encodeMainData(int l3_enc[2][2][576], L3_side_info_t  *si, L3_scalefac_t   *scalefac);
static void write_ancillary_data(char *theData, int lengthInBits);
static void drain_into_ancillary_data(int lengthInBits);
static void Huffmancodebits(BF_PartHolder **pph, int *ix, gr_info *gi);


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

/*
  L3_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
L3_format_bitstream(int        l3_enc[2][2][576],
		      L3_side_info_t   *l3_side,
		      L3_scalefac_t    *scalefac,
		      bitstream_t      *in_bs,
		      double           (*xr)[2][576],
		      char             *ancillary,
		      int              ancillary_bits)
{
    int gr, ch, i;
    bs = in_bs;
    
    if (frameData == NULL)
    {
		frameData = calloc(1, sizeof(*frameData));
		if (!frameData) ERROR("ENOMEM !");
    }
    if (frameResults == NULL)
    {
		frameResults = calloc(1, sizeof(*frameData));
		if (!frameData) ERROR("ENOMEM !!");
	}
	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;
    }

    for (gr = 0; gr < config.mpeg.mode_gr; gr++)
	for (ch =  0; ch < config.wave.channels; 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;
	    }
	}

    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 = config.mpeg.bits_per_frame;
    frameData->nGranules   = config.mpeg.mode_gr;
    frameData->nChannels   = config.wave.channels;
    frameData->header      = headerPH->part;
    frameData->frameSI     = frameSIPH->part;

    for (ch = 0; ch < config.wave.channels; ch++)
		frameData->channelSI[ch] = channelSIPH[ch]->part;

    for (gr = 0; gr < config.mpeg.mode_gr; gr++)
	for (ch = 0; ch < config.wave.channels; 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 L3_FlushBitstream()
{
    if (!PartHoldersInitialized) ERROR("Not properly initialised !!");
		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],
                           L3_side_info_t  *si,
                           L3_scalefac_t   *scalefac)
{
    int i, gr, ch, sfb, window;

    for (gr = 0; gr < config.mpeg.mode_gr; gr++)
	for (ch = 0; ch < config.wave.channels; ch++)
	    scaleFactorsPH[gr][ch]->part->nrEntries = 0;

    for (gr = 0; gr < config.mpeg.mode_gr; gr++)
	for (ch = 0; ch < config.wave.channels; ch++)
	    codedDataPH[gr][ch]->part->nrEntries = 0;

    if (config.mpeg.type==TYPE_MPEG_I)
    {  /* MPEG 1 */
		for (gr = 0; gr < 2; gr++)
		{
		for (ch = 0; ch < config.wave.channels; 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 < config.wave.channels; 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;

	    if (! gi->sfb_partition_table) ERROR("ERROR in part 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(L3_side_info_t  *si)
{
    int gr, ch, scfsi_band, region, window, bits_sent;
    
    headerPH->part->nrEntries = 0;
    headerPH = BF_addEntry(headerPH, 0xfff,                          12);
    headerPH = BF_addEntry(headerPH, config.mpeg.type,               1);
/* HEADER HARDCODED SHOULDN`T BE THIS WAY ! */
    headerPH = BF_addEntry(headerPH, 1/*config.mpeg.layr*/,          2);
    headerPH = BF_addEntry(headerPH, !config.mpeg.crc,               1);
    headerPH = BF_addEntry(headerPH, config.mpeg.bitrate_index,      4);
    headerPH = BF_addEntry(headerPH, config.mpeg.samplerate_index,   2);
    headerPH = BF_addEntry(headerPH, config.mpeg.padding,            1);
    headerPH = BF_addEntry(headerPH, config.mpeg.ext,                1);
    headerPH = BF_addEntry(headerPH, config.mpeg.mode,               2);
    headerPH = BF_addEntry(headerPH, config.mpeg.mode_ext,           2);
    headerPH = BF_addEntry(headerPH, config.mpeg.copyright,          1);
    headerPH = BF_addEntry(headerPH, config.mpeg.original,           1);
    headerPH = BF_addEntry(headerPH, config.mpeg.emph,               2);
    
    bits_sent = 32;

    if (config.mpeg.crc)
    {
	headerPH = BF_addEntry(headerPH, crc, 16);
	bits_sent += 16;
    }

    frameSIPH->part->nrEntries = 0;

    for (ch = 0; ch < config.wave.channels; ch++)
	channelSIPH[ch]->part->nrEntries = 0;

    for (gr = 0; gr < config.mpeg.mode_gr; gr++)
	for (ch = 0; ch < config.wave.channels; ch++)
	    spectrumSIPH[gr][ch]->part->nrEntries = 0;

    if (config.mpeg.type == TYPE_MPEG_I)
    {  /* MPEG1 */
	frameSIPH = BF_addEntry(frameSIPH, si->main_data_begin, 9);

	if (config.wave.channels == 2)
	    frameSIPH = BF_addEntry(frameSIPH, si->private_bits, 3);
	else
	    frameSIPH = BF_addEntry(frameSIPH, si->private_bits, 5);
	
	for (ch = 0; ch < config.wave.channels; 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 < config.wave.channels ; 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
		{
		    if (gi->block_type!=0) ERROR("ERROR; invalid blocktype");
		    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 (config.wave.channels == 2)
	    bits_sent += 256;
	else
	    bits_sent += 136;
    }
    else
    {  /* MPEG2 */
	frameSIPH = BF_addEntry(frameSIPH, si->main_data_begin, 8);

	if (config.wave.channels  == 2)
	    frameSIPH = BF_addEntry(frameSIPH, si->private_bits, 2);
	else
	    frameSIPH = BF_addEntry(frameSIPH, si->private_bits, 1);
	
	gr = 0;
	for (ch = 0; ch < config.wave.channels ; 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);

		    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
	    {	

⌨️ 快捷键说明

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