www.pudn.com > aacenc.rar > aac_se_enc.c


/********************************************************************* 
 * 
 * AAC计数模型 
 * 
  
**********************************************************************/ 
 
#include "aac_se_enc.h" 
#include "aac_qc.h" 
 
int max_pred_sfb; 
 
/*****************************************************************************/ 
/* WriteAACFillBits(...)                                                     */ 
/* 向比特流中写入fill_elements                      */ 
/*****************************************************************************/ 
int WriteAACFillBits(BsBitStream* ptrBs,  /* Pointer to bitstream */ 
		     int numBits)         /* Number of bits needed to fill */ 
{ 
  int numberOfBitsLeft=numBits; 
 
  /* Need at least (LEN_SE_ID + LEN_F_CNT) bits for a fill_element */ 
  int minNumberOfBits = LEN_SE_ID + LEN_F_CNT; 
  while (numberOfBitsLeft>=minNumberOfBits) { 
    int numberOfBytes; 
    int maxCount; 
 
    BsPutBit(ptrBs,ID_FIL,LEN_SE_ID);	/* Write fill_element ID */ 
    numberOfBitsLeft-=minNumberOfBits;	/* Subtract for ID,count */ 
 
    numberOfBytes=(int)(numberOfBitsLeft/LEN_BYTE); 
    maxCount = (1< maxNumberOfBytes ) ? 
	(maxNumberOfBytes) : (numberOfBytes); 
      escCount = numberOfBytes - maxCount; 
      BsPutBit(ptrBs,escCount,LEN_BYTE); 
      for (i=0;inum_window_groups; 
    maxSfb = quantInfoL->max_sfb; 
    if (writeFlag) { 
      BsPutBit(fixedStream,ms_info->is_present,LEN_MASK_PRES); 
      if (ms_info->is_present==1) { 
	int g; 
	int b; 
	for (g=0;gms_used[g*maxSfb+b],LEN_MASK); 
	  } 
	} 
      } 
    } 
    bit_count += LEN_MASK_PRES; 
    bit_count += (ms_info->is_present==1)*numWindows*maxSfb*LEN_MASK; 
  } 
   
  /* Write individual_channel_stream elements */ 
  bit_count += WriteICS(quantInfoL,commonWindow,fixedStream,writeFlag); 
  bit_count += WriteICS(quantInfoR,commonWindow,fixedStream,writeFlag); 
  
  return bit_count; 
} 
 
 
/*****************************************************************************/ 
/* WriteICS(...), write an individual_channel_stream element to the bitstream.*/ 
/*****************************************************************************/ 
int WriteICS(AACQuantInfo* quantInfo,    /* AACQuantInfo structure */ 
	     int commonWindow,           /* Common window flag */ 
	     BsBitStream* fixed_stream,  /* Pointer to bitstream */ 
	     int writeFlag)              /* 1 means write, 0 means count only */ 
{ 
  /* this function writes out an individual_channel_stream to the bitstream and */ 
  /* returns the number of bits written to the bitstream */ 
  int bit_count = 0; 
  int output_book_vector[SFB_NUM_MAX*2]; 
  writeFlag = ( writeFlag != 0 ); 
 
  /* Write the 8-bit global_gain */ 
  BsPutBit(fixed_stream,quantInfo->common_scalefac,writeFlag*LEN_GLOB_GAIN);   
  bit_count += LEN_GLOB_GAIN; 
 
  /* Write ics information */ 
  if (!commonWindow) { 
    bit_count += WriteICSInfo(quantInfo,fixed_stream,writeFlag); 
  } 
 
  /* Write section_data() information to the bitstream */ 
  bit_count += sort_book_numbers(quantInfo,output_book_vector,fixed_stream,writeFlag); 
 
  /* Write scale_factor_data() information */ 
  bit_count += write_scalefactor_bitstream(fixed_stream,writeFlag,quantInfo); 
 
  /* Write pulse_data() */ 
  bit_count += WritePulseData(quantInfo,fixed_stream,writeFlag); 
 
  /* Write TNS data */ 
  bit_count += WriteTNSData(quantInfo,fixed_stream,writeFlag); 
	 
  /* Write gain control data */ 
  bit_count += WriteGainControlData(quantInfo,fixed_stream,writeFlag); 
 
  /* Write out spectral_data() */ 
  bit_count += WriteSpectralData(quantInfo,fixed_stream,writeFlag); 
 
  /* Return number of bits */ 
  return(bit_count); 
} 
 
 
/*****************************************************************************/ 
/* WriteICSInfo(...), write individual_channel_stream information            */ 
/*  to the bitstream.                                                        */ 
/*****************************************************************************/ 
int WriteICSInfo(AACQuantInfo* quantInfo,    /* AACQuantInfo structure */ 
		 BsBitStream* fixed_stream,  /* Pointer to bitstream */ 
		 int writeFlag)              /* 1 means write, 0 means count only */ 
{ 
  int grouping_bits; 
  int max_sfb; 
  int bit_count = 0; 
 
  /* Compute number of scalefactor bands */ 
//  if (quantInfo->max_sfb*quantInfo->num_window_groups != quantInfo->nr_of_sfb) 
    //CommonExit(-1,"Wrong number of scalefactorbands"); 
  max_sfb =   quantInfo->max_sfb; 
 
  if (writeFlag) { 
    /* write out ics_info() information */ 
    BsPutBit(fixed_stream,0,LEN_ICS_RESERV);  /* reserved Bit*/ 
   
    /* Write out window sequence */ 
    BsPutBit(fixed_stream,quantInfo->block_type,LEN_WIN_SEQ);  /* short window */ 
 
    /* Write out window shape */  
    BsPutBit(fixed_stream,quantInfo->window_shape,LEN_WIN_SH);  /* window shape */ 
  } 
     
  bit_count += LEN_ICS_RESERV; 
  bit_count += LEN_WIN_SEQ; 
  bit_count += LEN_WIN_SH; 
 
  /* For short windows, write out max_sfb and scale_factor_grouping */ 
  if (quantInfo -> block_type == ONLY_SHORT_WINDOW){ 
    if (writeFlag) { 
      BsPutBit(fixed_stream,max_sfb,LEN_MAX_SFBS);  
      grouping_bits = find_grouping_bits(quantInfo->window_group_length,quantInfo->num_window_groups); 
      BsPutBit(fixed_stream,grouping_bits,MAX_SHORT_IN_LONG_BLOCK - 1);  /* the grouping bits */ 
    } 
    bit_count += LEN_MAX_SFBS; 
    bit_count += MAX_SHORT_IN_LONG_BLOCK - 1; 
  } 
 
  /* Otherwise, write out max_sfb and predictor data */ 
  else { /* block type is either start, stop, or long */ 
    if (writeFlag) { 
      BsPutBit(fixed_stream,max_sfb,LEN_MAX_SFBL); 
    } 
    bit_count += LEN_MAX_SFBL; 
    bit_count += WritePredictorData(quantInfo,fixed_stream,writeFlag); 
  } 
 
  return bit_count; 
} 
 
 
/*****************************************************************************/ 
/* WritePredictorData(...), write predictor data.                            */ 
/*****************************************************************************/ 
int WritePredictorData(AACQuantInfo* quantInfo,    /* AACQuantInfo structure */ 
		       BsBitStream* fixed_stream,  /* Pointer to bitstream */ 
		       int writeFlag)              /* 1 means write, 0 means count only */   
{ 
  int bit_count = 0; 
 
  /* Write global predictor data present */ 
  short predictorDataPresent = quantInfo->pred_global_flag; 
  int numBands = min(max_pred_sfb,quantInfo->nr_of_sfb); 
 
  if (writeFlag) { 
    BsPutBit(fixed_stream,predictorDataPresent,LEN_PRED_PRES);  /* predictor_data_present */ 
    if (predictorDataPresent) { 
      int b; 
/* Code segment added by JB */ 
      if (quantInfo->reset_group_number == -1) 
        BsPutBit(fixed_stream,0,LEN_PRED_RST); /* No prediction reset */ 
      else 
      { 
        BsPutBit(fixed_stream,1,LEN_PRED_RST); 
        BsPutBit(fixed_stream,(unsigned long)quantInfo->reset_group_number, 
          LEN_PRED_RSTGRP); 
      } 
/* End of code segment */ 
 
      for (b=0;bpred_sfb_flag[b],LEN_PRED_ENAB); 
      } 
    } 
  } 
  bit_count = LEN_PRED_PRES; 
  bit_count += (predictorDataPresent) ? 
    (LEN_PRED_RST +  
     ((quantInfo->reset_group_number)!=-1)*LEN_PRED_RSTGRP +  
     numBands*LEN_PRED_ENAB) : 0; 
  return bit_count; 
} 
 
/*****************************************************************************/ 
/* WritePulseData(...), write pulse data.                            */ 
/*****************************************************************************/ 
int WritePulseData(AACQuantInfo* quantInfo,    /* AACQuantInfo structure */ 
		   BsBitStream* fixed_stream,  /* Pointer to bitstream */ 
		   int writeFlag)              /* 1 means write, 0 means count only */ 
{ 
  int bit_count = 0; 
 
  /* Currently write no pulse data present */ 
  if (writeFlag) { 
    BsPutBit(fixed_stream,0,LEN_PULSE_PRES);  /* no prediction_data_present */ 
  } 
  bit_count = LEN_PULSE_PRES; 
  return bit_count; 
} 
 
/*****************************************************************************/ 
/* WriteTNSData(...), write TNS data.                            */ 
/*****************************************************************************/ 
int WriteTNSData(AACQuantInfo* quantInfo,    /* AACQuantInfo structure */ 
		 BsBitStream* fixed_stream,  /* Pointer to bitstream */ 
		 int writeFlag)              /* 1 means write, 0 means count only */  
{ 
  int bit_count = 0; 
  int numWindows = 1; 
  int len_tns_nfilt; 
  int len_tns_length; 
  int len_tns_order; 
  int filtNumber; 
  int resInBits; 
  int bitsToTransmit; 
  unsigned long unsignedIndex; 
  int w; 
 
  TNS_INFO* tnsInfoPtr = quantInfo->tnsInfo; 
 
  if (writeFlag) { 
    BsPutBit(fixed_stream,tnsInfoPtr->tnsDataPresent,LEN_TNS_PRES); 
  } 
  bit_count += LEN_TNS_PRES; 
 
  /* If TNS is not present, bail */ 
  if (!tnsInfoPtr->tnsDataPresent) { 
    return bit_count; 
  } 
 
  /* Set window-dependent TNS parameters */ 
  if (quantInfo->block_type == ONLY_SHORT_WINDOW) { 
    numWindows = MAX_SHORT_IN_LONG_BLOCK; 
    len_tns_nfilt = LEN_TNS_NFILTS; 
    len_tns_length = LEN_TNS_LENGTHS; 
    len_tns_order = LEN_TNS_ORDERS; 
  } else { 
    numWindows = 1; 
    len_tns_nfilt = LEN_TNS_NFILTL; 
    len_tns_length = LEN_TNS_LENGTHL; 
    len_tns_order = LEN_TNS_ORDERL; 
  } 
 
  /* Write TNS data */ 
  bit_count += numWindows * len_tns_nfilt; 
  for (w=0;wwindowData[w]; 
    int numFilters = windowDataPtr->numFilters; 
    if (writeFlag) { 
      BsPutBit(fixed_stream,numFilters,len_tns_nfilt); /* n_filt[] = 0 */ 
    } 
    if (numFilters) { 
      bit_count += LEN_TNS_COEFF_RES; 
      resInBits = windowDataPtr->coefResolution; 
      resInBits = windowDataPtr->coefResolution; 
      if (writeFlag) { 
	BsPutBit(fixed_stream,resInBits-DEF_TNS_RES_OFFSET,LEN_TNS_COEFF_RES); 
      } 
      bit_count += numFilters * (len_tns_length+len_tns_order); 
      for (filtNumber=0;filtNumbertnsFilter[filtNumber]; 
	int order = tnsFilterPtr->order; 
	if (writeFlag) { 
	  BsPutBit(fixed_stream,tnsFilterPtr->length,len_tns_length); 
	  BsPutBit(fixed_stream,order,len_tns_order); 
	} 
	if (order) { 
	  bit_count += (LEN_TNS_DIRECTION + LEN_TNS_COMPRESS); 
	  if (writeFlag) { 
	    BsPutBit(fixed_stream,tnsFilterPtr->direction,LEN_TNS_DIRECTION); 
	    BsPutBit(fixed_stream,tnsFilterPtr->coefCompress,LEN_TNS_COMPRESS); 
	  } 
          bitsToTransmit = resInBits - tnsFilterPtr->coefCompress; 
	  bit_count += order * bitsToTransmit; 
	  if (writeFlag) { 
	    int i; 
	    for (i=1;i<=order;i++) { 
	      unsignedIndex = (unsigned long) (tnsFilterPtr->index[i])&(~(~0<spectralCount; 
 
  /* set up local pointers to data and len */ 
  /* data array contains data to be written */ 
  /* len array contains lengths of data words */ 
  int* data = quantInfo -> data; 
  int* len = quantInfo -> len; 
 
  if (writeFlag) { 
    int i; 
    for(i=0;i 0) {  /* only send out non-zero codebook data */ 
	BsPutBit(fixed_stream,data[i],len[i]); /* write data */ 
	bit_count += len[i];                   /* update bit_count */ 
      } 
    } 
  } else { 
    int i; 
    for(i=0;i