⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitstream.c

📁 dsp上用c语言实现的aac音频算法的编解码器代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    /* 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 + -