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

📄 bitstream.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 3 页
字号:
    /* 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;    }    /* 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 long) (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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -