📄 bitstream.c
字号:
if (hEncoder->config.mpegVersion == 1) 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 int)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 int 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -