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

📄 bitstream.c

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