📄 bitstream.c
字号:
/* Set window-dependent TNS parameters */ if (coderInfo->block_type == ONLY_SHORT_WINDOW) { numWindows = MAX_SHORT_WINDOWS; 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 */ bits += (numWindows * len_tns_nfilt); for (w=0;w<numWindows;w++) { TnsWindowData* windowDataPtr = &tnsInfoPtr->windowData[w]; int numFilters = windowDataPtr->numFilters; if (writeFlag) { PutBit(bitStream,numFilters,len_tns_nfilt); /* n_filt[] = 0 */ } if (numFilters) { bits += LEN_TNS_COEFF_RES; resInBits = windowDataPtr->coefResolution; if (writeFlag) { PutBit(bitStream,resInBits-DEF_TNS_RES_OFFSET,LEN_TNS_COEFF_RES); } bits += numFilters * (len_tns_length+len_tns_order); for (filtNumber=0;filtNumber<numFilters;filtNumber++) { TnsFilterData* tnsFilterPtr=&windowDataPtr->tnsFilter[filtNumber]; int order = tnsFilterPtr->order; if (writeFlag) { PutBit(bitStream,tnsFilterPtr->length,len_tns_length); PutBit(bitStream,order,len_tns_order); } if (order) { bits += (LEN_TNS_DIRECTION + LEN_TNS_COMPRESS); if (writeFlag) { PutBit(bitStream,tnsFilterPtr->direction,LEN_TNS_DIRECTION); PutBit(bitStream,tnsFilterPtr->coefCompress,LEN_TNS_COMPRESS); } bitsToTransmit = resInBits - tnsFilterPtr->coefCompress; bits += order * bitsToTransmit; if (writeFlag) { int i; for (i=1;i<=order;i++) { unsignedIndex = (unsigned int) (tnsFilterPtr->index[i])&(~(~0<<bitsToTransmit)); PutBit(bitStream,unsignedIndex,bitsToTransmit); } } } } } } return bits;}static int WriteGainControlData(CoderInfo *coderInfo, BitStream *bitStream, int writeFlag){ int bits = 0; if (writeFlag) { PutBit(bitStream, 0, LEN_GAIN_PRES); } bits += LEN_GAIN_PRES; return bits;}static int WriteSpectralData(CoderInfo *coderInfo, BitStream *bitStream, int writeFlag){ int i, bits = 0; /* set up local pointers to data and len */ /* data array contains data to be written */ /* len array contains lengths of data words */ int* data = coderInfo->data; int* len = coderInfo->len; if (writeFlag) { for(i = 0; i < coderInfo->spectral_count; i++) { if (len[i] > 0) { /* only send out non-zero codebook data */ PutBit(bitStream, data[i], len[i]); /* write data */ bits += len[i]; } } } else { for(i = 0; i < coderInfo->spectral_count; i++) { bits += len[i]; } } return bits;}static int WriteAACFillBits(BitStream* bitStream, int numBits, int writeFlag){ 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; if (writeFlag) { PutBit(bitStream, ID_FIL, LEN_SE_ID); /* Write fill_element ID */ } numberOfBitsLeft -= minNumberOfBits; /* Subtract for ID,count */ numberOfBytes = (int)(numberOfBitsLeft/LEN_BYTE); maxCount = (1<<LEN_F_CNT) - 1; /* Max count without escaping */ /* if we have less than maxCount bytes, write them now */ if (numberOfBytes < maxCount) { int i; if (writeFlag) { PutBit(bitStream, numberOfBytes, LEN_F_CNT); for (i = 0; i < numberOfBytes; i++) { PutBit(bitStream, 0, LEN_BYTE); } } /* otherwise, we need to write an escape count */ } else { int maxEscapeCount, maxNumberOfBytes, escCount; int i; if (writeFlag) { PutBit(bitStream, maxCount, LEN_F_CNT); } maxEscapeCount = (1<<LEN_BYTE) - 1; /* Max escape count */ maxNumberOfBytes = maxCount + maxEscapeCount; numberOfBytes = (numberOfBytes > maxNumberOfBytes ) ? (maxNumberOfBytes) : (numberOfBytes); escCount = numberOfBytes - maxCount; if (writeFlag) { PutBit(bitStream, escCount, LEN_BYTE); for (i = 0; i < numberOfBytes-1; i++) { PutBit(bitStream, 0, LEN_BYTE); } } } numberOfBitsLeft -= LEN_BYTE*numberOfBytes; } return numberOfBitsLeft;}static int FindGroupingBits(CoderInfo *coderInfo){ /* This function inputs the grouping information and outputs the seven bit 'grouping_bits' field that the AAC decoder expects. */ int grouping_bits = 0; int tmp[8]; int i, j; int index = 0; for(i = 0; i < coderInfo->num_window_groups; i++){ for (j = 0; j < coderInfo->window_group_length[i]; j++){ tmp[index++] = i; } } for(i = 1; i < 8; i++){ grouping_bits = grouping_bits << 1; if(tmp[i] == tmp[i-1]) { grouping_bits++; } } return grouping_bits;}/* size in bytes! */BitStream *OpenBitStream(int size, unsigned char *buffer){/* printf("%d\n", sizeof(BitStream)); bitStream = AllocMemory(sizeof(BitStream));
*/ g_bitStream->size = size;#ifdef DRM /* skip first byte for CRC */ g_bitStream->numBit = 8; g_bitStream->currentBit = 8;#else g_bitStream->numBit = 0; g_bitStream->currentBit = 0;#endif g_bitStream->data = buffer; SetMemory(g_bitStream->data, 0, size); return g_bitStream;}int CloseBitStream(BitStream *bitStream){ int bytes = bit2byte(bitStream->numBit);/* FreeMemory(bitStream); */ return bytes;}static int BufferNumBit(BitStream *bitStream){ return bitStream->numBit;}static int WriteByte(BitStream *bitStream, unsigned int data, int numBit){ int numUsed,idx; idx = (bitStream->currentBit / BYTE_NUMBIT) % bitStream->size; numUsed = bitStream->currentBit % BYTE_NUMBIT;#ifndef DRM if (numUsed == 0) bitStream->data[idx] = 0;#endif bitStream->data[idx] |= (data & ((1<<numBit)-1)) << (BYTE_NUMBIT-numUsed-numBit); bitStream->currentBit += numBit; bitStream->numBit = bitStream->currentBit; return 0;}int PutBit(BitStream *bitStream, unsigned int data, int numBit){ int num,maxNum,curNum; unsigned int bits; if (numBit == 0) return 0; /* write bits in packets according to buffer byte boundaries */ num = 0; maxNum = BYTE_NUMBIT - bitStream->currentBit % BYTE_NUMBIT; while (num < numBit) { curNum = min(numBit-num,maxNum); bits = data>>(numBit-num-curNum); if (WriteByte(bitStream, bits, curNum)) { return 1; } num += curNum; maxNum = BYTE_NUMBIT; } return 0;}static int ByteAlign(BitStream *bitStream, int writeFlag, int bitsSoFar){ int len, i,j; if (writeFlag) { len = BufferNumBit(bitStream); } else { len = bitsSoFar; } j = (8 - (len%8))%8; if ((len % 8) == 0) j = 0; if (writeFlag) { for( i=0; i<j; i++ ) { PutBit(bitStream, 0, 1); } } return j;}#ifdef DRM/* **************************************************************************** The following code was written by Volker Fischer (c) 2004 The GNU Lesser General Public License as published by the Free Software Foundation applies to this code. *****************************************************************************/#define LEN_PRESORT_CODEBOOK 22static const unsigned short PresortedCodebook_VCB11[] = {11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1};static const int maxCwLen[32] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, 49, 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, 29, 29, 29, 29, 33, 33, 33, 37, 37, 41}; /* 8.5.3.3.3.1 */typedef struct { /* segment parameters */ unsigned int left; /* left start of free space in segment */ unsigned int right; /* right position of free space in segment */ unsigned int len; /* length of free space in segment */} segment_t;typedef struct { /* codeword parameters */ unsigned int cw_offset; /* offset in actual codeword data vector */ unsigned short window; /* which window belongs to this codeword */ unsigned short cb; /* codebook */ unsigned short num_sl_cw; /* number of spectral lines per codeword */ unsigned int cw_nr; /* codeword number in the window */ unsigned short cw_len; /* codeword lenght */ unsigned short num_data; /* number of data cells for codeword */} cw_info_t;static int PutBitHcr(BitStream *bitStream, unsigned int curpos, unsigned int data, int numBit){ /* data can be written at an arbitrary position in the bitstream */ bitStream->currentBit = curpos; return PutBit(bitStream, data, numBit);}static int rewind_word(int W, int len){ /* rewind len (max. 32) bits so that the MSB becomes LSB */ short i; int tmp_W = 0; for (i = 0; i < len; i++) { tmp_W <<= 1; if (W & (1<<i)) tmp_W |= 1; } return tmp_W;}static int WriteReorderedSpectralData(CoderInfo *coderInfo, BitStream *bitStream, int writeFlag){ int i, j; int cursegmsize, accsegmsize = 0; int segmcnt = 0; int startbitpos; segment_t segment[FRAME_LEN]; int* window_group_length = coderInfo->window_group_length; int* sfb_offset = coderInfo->sfb_offset; cw_info_t cw_info[FRAME_LEN]; cw_info_t cw_info_preso[FRAME_LEN]; int num_cw = coderInfo->cur_cw; int window_cw_cnt[MAX_SHORT_WINDOWS] = {0,0,0,0,0,0,0,0}; int presort, set, num_sets; unsigned short cur_cb, cw_cnt; short is_backwards; int diff, tmp_data, cw_part_cnt, cur_cw_part; int cur_cw_len, cur_data; int sfb_cnt, win_cnt, acc_win_cnt, win_grp_cnt; int coeff_cnt, last_sfb, cur_sfb_len; /* set up local pointers to data and len */ /* data array contains data to be written */ /* len array contains lengths of data words */ int* data = coderInfo->data; int* len = coderInfo->len; int* num_data = coderInfo->num_data_cw; if (writeFlag) { /* build offset table */ cur_data = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -