bitstream.c
来自「faac-1.25.rar音频编解码器demo」· C语言 代码 · 共 1,492 行 · 第 1/4 页
C
1,492 行
bits += ByteAlign(bitStream, writeFlag);
*/
#if 0 // Removed in corrigendum 14496-3:2002
if (hEncoder->config.mpegVersion == 0)
bits += 2; /* emphasis */
#endif
return bits;
}
static int WriteCPE(CoderInfo *coderInfoL,
CoderInfo *coderInfoR,
ChannelInfo *channelInfo,
BitStream* bitStream,
int objectType,
int writeFlag)
{
int bits = 0;
#ifndef DRM
if (writeFlag) {
/* write ID_CPE, single_element_channel() identifier */
PutBit(bitStream, ID_CPE, LEN_SE_ID);
/* write the element_identifier_tag */
PutBit(bitStream, channelInfo->tag, LEN_TAG);
/* common_window? */
PutBit(bitStream, channelInfo->common_window, LEN_COM_WIN);
}
bits += LEN_SE_ID;
bits += LEN_TAG;
bits += LEN_COM_WIN;
#endif
/* if common_window, write ics_info */
if (channelInfo->common_window) {
int numWindows, maxSfb;
bits += WriteICSInfo(coderInfoL, bitStream, objectType, channelInfo->common_window, writeFlag);
numWindows = coderInfoL->num_window_groups;
maxSfb = coderInfoL->max_sfb;
if (writeFlag) {
PutBit(bitStream, channelInfo->msInfo.is_present, LEN_MASK_PRES);
if (channelInfo->msInfo.is_present == 1) {
int g;
int b;
for (g=0;g<numWindows;g++) {
for (b=0;b<maxSfb;b++) {
PutBit(bitStream, channelInfo->msInfo.ms_used[g*maxSfb+b], LEN_MASK);
}
}
}
}
bits += LEN_MASK_PRES;
if (channelInfo->msInfo.is_present == 1)
bits += (numWindows*maxSfb*LEN_MASK);
}
/* Write individual_channel_stream elements */
bits += WriteICS(coderInfoL, bitStream, channelInfo->common_window, objectType, writeFlag);
bits += WriteICS(coderInfoR, bitStream, channelInfo->common_window, objectType, writeFlag);
return bits;
}
static int WriteSCE(CoderInfo *coderInfo,
ChannelInfo *channelInfo,
BitStream *bitStream,
int objectType,
int writeFlag)
{
int bits = 0;
#ifndef DRM
if (writeFlag) {
/* write Single Element Channel (SCE) identifier */
PutBit(bitStream, ID_SCE, LEN_SE_ID);
/* write the element identifier tag */
PutBit(bitStream, channelInfo->tag, LEN_TAG);
}
bits += LEN_SE_ID;
bits += LEN_TAG;
#endif
/* Write an Individual Channel Stream element */
bits += WriteICS(coderInfo, bitStream, 0, objectType, writeFlag);
return bits;
}
static int WriteLFE(CoderInfo *coderInfo,
ChannelInfo *channelInfo,
BitStream *bitStream,
int objectType,
int writeFlag)
{
int bits = 0;
if (writeFlag) {
/* write ID_LFE, lfe_element_channel() identifier */
PutBit(bitStream, ID_LFE, LEN_SE_ID);
/* write the element_identifier_tag */
PutBit(bitStream, channelInfo->tag, LEN_TAG);
}
bits += LEN_SE_ID;
bits += LEN_TAG;
/* Write an individual_channel_stream element */
bits += WriteICS(coderInfo, bitStream, 0, objectType, writeFlag);
return bits;
}
static int WriteICSInfo(CoderInfo *coderInfo,
BitStream *bitStream,
int objectType,
int common_window,
int writeFlag)
{
int grouping_bits;
int bits = 0;
if (writeFlag) {
/* write out ics_info() information */
PutBit(bitStream, 0, LEN_ICS_RESERV); /* reserved Bit*/
/* Write out window sequence */
PutBit(bitStream, coderInfo->block_type, LEN_WIN_SEQ); /* block type */
/* Write out window shape */
PutBit(bitStream, coderInfo->window_shape, LEN_WIN_SH); /* window shape */
}
bits += LEN_ICS_RESERV;
bits += LEN_WIN_SEQ;
bits += LEN_WIN_SH;
/* For short windows, write out max_sfb and scale_factor_grouping */
if (coderInfo->block_type == ONLY_SHORT_WINDOW){
if (writeFlag) {
PutBit(bitStream, coderInfo->max_sfb, LEN_MAX_SFBS);
grouping_bits = FindGroupingBits(coderInfo);
PutBit(bitStream, grouping_bits, MAX_SHORT_WINDOWS - 1); /* the grouping bits */
}
bits += LEN_MAX_SFBS;
bits += MAX_SHORT_WINDOWS - 1;
} else { /* Otherwise, write out max_sfb and predictor data */
if (writeFlag) {
PutBit(bitStream, coderInfo->max_sfb, LEN_MAX_SFBL);
}
bits += LEN_MAX_SFBL;
#ifdef DRM
}
if (writeFlag) {
PutBit(bitStream,coderInfo->tnsInfo.tnsDataPresent,LEN_TNS_PRES);
}
bits += LEN_TNS_PRES;
#endif
if (objectType == LTP)
{
bits++;
if(writeFlag)
PutBit(bitStream, coderInfo->ltpInfo.global_pred_flag, 1); /* Prediction Global used */
bits += WriteLTPPredictorData(coderInfo, bitStream, writeFlag);
if (common_window)
bits += WriteLTPPredictorData(coderInfo, bitStream, writeFlag);
} else {
bits++;
if (writeFlag)
PutBit(bitStream, coderInfo->pred_global_flag, LEN_PRED_PRES); /* predictor_data_present */
bits += WritePredictorData(coderInfo, bitStream, writeFlag);
}
#ifndef DRM
}
#endif
return bits;
}
static int WriteICS(CoderInfo *coderInfo,
BitStream *bitStream,
int commonWindow,
int objectType,
int writeFlag)
{
/* this function writes out an individual_channel_stream to the bitstream and */
/* returns the number of bits written to the bitstream */
int bits = 0;
#ifndef DRM
/* Write the 8-bit global_gain */
if (writeFlag)
PutBit(bitStream, coderInfo->global_gain, LEN_GLOB_GAIN);
bits += LEN_GLOB_GAIN;
#endif
/* Write ics information */
if (!commonWindow) {
bits += WriteICSInfo(coderInfo, bitStream, objectType, commonWindow, writeFlag);
}
#ifdef DRM
/* Write the 8-bit global_gain */
if (writeFlag)
PutBit(bitStream, coderInfo->global_gain, LEN_GLOB_GAIN);
bits += LEN_GLOB_GAIN;
#endif
bits += SortBookNumbers(coderInfo, bitStream, writeFlag);
bits += WriteScalefactors(coderInfo, bitStream, writeFlag);
#ifdef DRM
if (writeFlag) {
/* length_of_reordered_spectral_data */
PutBit(bitStream, coderInfo->iLenReordSpData, LEN_HCR_REORDSD);
/* length_of_longest_codeword */
PutBit(bitStream, coderInfo->iLenLongestCW, LEN_HCR_LONGCW);
}
bits += LEN_HCR_REORDSD + LEN_HCR_LONGCW;
#else
bits += WritePulseData(coderInfo, bitStream, writeFlag);
#endif
bits += WriteTNSData(coderInfo, bitStream, writeFlag);
#ifndef DRM
bits += WriteGainControlData(coderInfo, bitStream, writeFlag);
#endif
#ifdef DRM
/* DRM CRC calculation */
if (writeFlag)
calc_CRC(bitStream, bits);
bits += WriteReorderedSpectralData(coderInfo, bitStream, writeFlag);
#else
bits += WriteSpectralData(coderInfo, bitStream, writeFlag);
#endif
/* Return number of bits */
return bits;
}
static int WriteLTPPredictorData(CoderInfo *coderInfo, BitStream *bitStream, int writeFlag)
{
int i, last_band;
int bits;
LtpInfo *ltpInfo = &coderInfo->ltpInfo;
bits = 0;
if (ltpInfo->global_pred_flag)
{
if(writeFlag)
PutBit(bitStream, 1, 1); /* LTP used */
bits++;
switch(coderInfo->block_type)
{
case ONLY_LONG_WINDOW:
case LONG_SHORT_WINDOW:
case SHORT_LONG_WINDOW:
bits += LEN_LTP_LAG;
bits += LEN_LTP_COEF;
if(writeFlag)
{
PutBit(bitStream, ltpInfo->delay[0], LEN_LTP_LAG);
PutBit(bitStream, ltpInfo->weight_idx, LEN_LTP_COEF);
}
last_band = ((coderInfo->nr_of_sfb < MAX_LT_PRED_LONG_SFB) ?
coderInfo->nr_of_sfb : MAX_LT_PRED_LONG_SFB);
// last_band = coderInfo->nr_of_sfb;
bits += last_band;
if(writeFlag)
for (i = 0; i < last_band; i++)
PutBit(bitStream, ltpInfo->sfb_prediction_used[i], LEN_LTP_LONG_USED);
break;
default:
break;
}
}
return (bits);
}
static int WritePredictorData(CoderInfo *coderInfo,
BitStream *bitStream,
int writeFlag)
{
int bits = 0;
/* Write global predictor data present */
short predictorDataPresent = coderInfo->pred_global_flag;
int numBands = min(coderInfo->max_pred_sfb, coderInfo->nr_of_sfb);
if (writeFlag) {
if (predictorDataPresent) {
int b;
if (coderInfo->reset_group_number == -1) {
PutBit(bitStream, 0, LEN_PRED_RST); /* No prediction reset */
} else {
PutBit(bitStream, 1, LEN_PRED_RST);
PutBit(bitStream, (unsigned long)coderInfo->reset_group_number,
LEN_PRED_RSTGRP);
}
for (b=0;b<numBands;b++) {
PutBit(bitStream, coderInfo->pred_sfb_flag[b], LEN_PRED_ENAB);
}
}
}
bits += (predictorDataPresent) ?
(LEN_PRED_RST +
((coderInfo->reset_group_number)!=-1)*LEN_PRED_RSTGRP +
numBands*LEN_PRED_ENAB) : 0;
return bits;
}
static int WritePulseData(CoderInfo *coderInfo,
BitStream *bitStream,
int writeFlag)
{
int bits = 0;
if (writeFlag) {
PutBit(bitStream, 0, LEN_PULSE_PRES); /* no pulse_data_present */
}
bits += LEN_PULSE_PRES;
return bits;
}
static int WriteTNSData(CoderInfo *coderInfo,
BitStream *bitStream,
int writeFlag)
{
int bits = 0;
int numWindows;
int len_tns_nfilt;
int len_tns_length;
int len_tns_order;
int filtNumber;
int resInBits;
int bitsToTransmit;
unsigned long unsignedIndex;
int w;
TnsInfo* tnsInfoPtr = &coderInfo->tnsInfo;
#ifndef DRM
if (writeFlag) {
PutBit(bitStream,tnsInfoPtr->tnsDataPresent,LEN_TNS_PRES);
}
bits += LEN_TNS_PRES;
#endif
/* If TNS is not present, bail */
if (!tnsInfoPtr->tnsDataPresent) {
return bits;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?