📄 config.c
字号:
/************************* MPEG-2 NBC Audio Decoder ************************** * *"This software module was originally developed byAT&T, Dolby Laboratories, Fraunhofer Gesellschaft IIS in the course ofdevelopment of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7,14496-1,2 and 3. This software module is an implementation of a part of one or moreMPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audiostandards free license to this software module or modifications thereof for use inhardware or software products claiming conformance to the MPEG-2 NBC/MPEG-4Audio standards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existing patents.The original developer of this software module and his/her company, the subsequenteditors and their companies, and ISO/IEC have no liability for use of this softwaremodule or modifications thereof in an implementation. Copyright is not released fornon MPEG-2 NBC/MPEG-4 Audio conforming products.The original developerretains full right to use the code for his/her own purpose, assign or donate thecode to a third party and to inhibit third party from using the code for nonMPEG-2 NBC/MPEG-4 Audio conforming products. This copyright notice mustbe included in all copies or derivative works."Copyright(c)1996. * * ****************************************************************************//* * $Id$ */#include "all.h"#include "bits.h"#include "util.h"static int ch_index(MC_Info *mip, int cpe, int tag);static int enter_chn(int cpe, int tag, char position, int common_window, MC_Info *mip);/* * adts_header */int get_adts_header(faacDecHandle hDecoder){ int sync = 0; ADTS_Header *p = &hDecoder->adts_header; faad_byte_align(&hDecoder->ld); sync = faad_showbits(&hDecoder->ld, 12); while (sync != 4096 - 1) { faad_flushbits(&hDecoder->ld, 8); if (faad_bits_done(&hDecoder->ld) != 0) { return -1; } sync = faad_showbits(&hDecoder->ld, 12); } faad_flushbits(&hDecoder->ld, 12); if (hDecoder->frameNum) { faad_getbits(&hDecoder->ld, 16); if (p->fixed.ID == 0) /* MPEG2 AAC doesn't have this */ faad_getbits(&hDecoder->ld, 2); } else { /* Syncword found, proceed to read in the fixed ADTS header */ p->fixed.ID = faad_get1bit(&hDecoder->ld); /* 0 -> MPEG4, 1 -> MPEG2 */ hDecoder->isMpeg4 = !p->fixed.ID; p->fixed.layer = faad_getbits(&hDecoder->ld, 2); p->fixed.protection_absent = faad_get1bit(&hDecoder->ld); hDecoder->mc_info.object_type = p->fixed.object_type = faad_getbits(&hDecoder->ld, 2); hDecoder->mc_info.sampling_rate_idx = p->fixed.sampling_rate_idx = faad_getbits(&hDecoder->ld, 4); p->fixed.private_bit = faad_get1bit(&hDecoder->ld); p->fixed.channel_configuration = faad_getbits(&hDecoder->ld, 3); p->fixed.original_copy = faad_get1bit(&hDecoder->ld); p->fixed.home = faad_get1bit(&hDecoder->ld); if (p->fixed.ID == 0) /* MPEG2 AAC doesn't have this */ p->fixed.emphasis = faad_getbits(&hDecoder->ld, 2); } /* ...and the variable ADTS header */ p->variable.copy_id_bit = faad_get1bit(&hDecoder->ld); p->variable.copy_id_start = faad_get1bit(&hDecoder->ld); p->variable.frame_length = faad_getbits(&hDecoder->ld, 13); p->variable.buffer_fullness = faad_getbits(&hDecoder->ld, 11); p->variable.raw_blocks = faad_getbits(&hDecoder->ld, 2); /* ADTS error check (ignored) */ if(!p->fixed.protection_absent) faad_getbits(&hDecoder->ld, 16); return 0;}/* * adif_header */int get_adif_header(faacDecHandle hDecoder){ int i, n, tag, select_status; ProgConfig tmp_config; ADIF_Header *p = &hDecoder->adif_header; /* adif header */ for (i=0; i<LEN_ADIF_ID; i++) p->adif_id[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE); p->adif_id[i] = 0; /* null terminated string */ /* copyright string */ if ((p->copy_id_present = faad_getbits(&hDecoder->ld, LEN_COPYRT_PRES)) == 1) { for (i=0; i<LEN_COPYRT_ID; i++) p->copy_id[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE); p->copy_id[i] = 0; /* null terminated string */ } p->original_copy = faad_getbits(&hDecoder->ld, LEN_ORIG); p->home = faad_getbits(&hDecoder->ld, LEN_HOME); p->bitstream_type = faad_getbits(&hDecoder->ld, LEN_BS_TYPE); p->bitrate = faad_getbits(&hDecoder->ld, LEN_BIT_RATE); /* program config elements */ select_status = -1; n = faad_getbits(&hDecoder->ld, LEN_NUM_PCE) + 1; for (i=0; i<n; i++) { tmp_config.buffer_fullness = (p->bitstream_type == 0) ? faad_getbits(&hDecoder->ld, LEN_ADIF_BF) : 0; tag = get_prog_config(hDecoder, &tmp_config); if (hDecoder->current_program < 0) hDecoder->current_program = tag; /* default is first prog */ if (hDecoder->current_program == tag) { CopyMemory(&hDecoder->prog_config, &tmp_config, sizeof(hDecoder->prog_config)); select_status = 1; } } return select_status;}/* * program configuration element */static void get_ele_list(faacDecHandle hDecoder, EleList *p, int enable_cpe){ int i, j; for (i=0, j=p->num_ele; i<j; i++) { if (enable_cpe) p->ele_is_cpe[i] = faad_getbits(&hDecoder->ld, LEN_ELE_IS_CPE); else p->ele_is_cpe[i] = 0; /* sdb */ p->ele_tag[i] = faad_getbits(&hDecoder->ld, LEN_TAG); }}int get_prog_config(faacDecHandle hDecoder, ProgConfig *p){ int i, j, tag; tag = faad_getbits(&hDecoder->ld, LEN_TAG); p->object_type = faad_getbits(&hDecoder->ld, LEN_OBJECTTYPE); p->sampling_rate_idx = faad_getbits(&hDecoder->ld, LEN_SAMP_IDX); p->front.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE); p->side.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE); p->back.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_ELE); p->lfe.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_LFE); p->data.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_DAT); p->coupling.num_ele = faad_getbits(&hDecoder->ld, LEN_NUM_CCE); if ((p->mono_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1) p->mono_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_TAG); if ((p->stereo_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1) p->stereo_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_TAG); if ((p->matrix_mix.present = faad_getbits(&hDecoder->ld, LEN_MIX_PRES)) == 1) { p->matrix_mix.ele_tag = faad_getbits(&hDecoder->ld, LEN_MMIX_IDX); p->matrix_mix.pseudo_enab = faad_getbits(&hDecoder->ld, LEN_PSUR_ENAB); } get_ele_list(hDecoder, &p->front, 1); get_ele_list(hDecoder, &p->side, 1); get_ele_list(hDecoder, &p->back, 1); get_ele_list(hDecoder, &p->lfe, 0); get_ele_list(hDecoder, &p->data, 0); get_ele_list(hDecoder, &p->coupling, 1); /* * if this is a MPEG4 file and the PCE is inside a raw_data_block() * this should be aligned to beginning of raw_data_block() boundary, * not byte boundary (FIXME!!!) */ faad_byte_align(&hDecoder->ld); j = faad_getbits(&hDecoder->ld, LEN_COMMENT_BYTES); for (i=0; i<j; i++) p->comments[i] = (char)faad_getbits(&hDecoder->ld, LEN_BYTE); p->comments[i] = 0; /* null terminator for string */ /* activate new program configuration if appropriate */ if (hDecoder->current_program < 0) hDecoder->current_program = tag; /* always select new program */ if (tag == hDecoder->current_program) { /* enter configuration into MC_Info structure */ if ((hDecoder->pceChannels = enter_mc_info(hDecoder, &hDecoder->mc_info, p)) < 0) return -1; /* inhibit default configuration */ hDecoder->default_config = 0; } return tag;}/* enter program configuration into MC_Info structure * only configures for channels specified in all.h */int enter_mc_info(faacDecHandle hDecoder, MC_Info *mip, ProgConfig *pcp){ int i, j, cpe, tag, cw; EleList *elp; MIXdown *mxp; int channels = 0; /* reset channel counts */ mip->nch = 0; mip->nfch = 0; mip->nfsce = 0; mip->nsch = 0; mip->nbch = 0; mip->nlch = 0; mip->ncch = 0; /* object type and sampling rate * re-configure if new sampling rate */ mip->object_type = pcp->object_type; if (mip->sampling_rate_idx != pcp->sampling_rate_idx) { mip->sampling_rate_idx = pcp->sampling_rate_idx; infoinit(hDecoder, &samp_rate_info[mip->sampling_rate_idx]); } cw = 0; /* changed later */ /* front elements, center out */ elp = &pcp->front; /* count number of leading SCE's */ for (i=0, j=elp->num_ele; i<j; i++) { if (elp->ele_is_cpe[i]) break; mip->nfsce++; } for (i=0, j=elp->num_ele; i<j; i++) { cpe = elp->ele_is_cpe[i]; tag = elp->ele_tag[i]; if (enter_chn(cpe, tag, 'f', cw, mip) < 0) return(-1); if (cpe) channels+=2; else channels++; } /* side elements, left to right then front to back */ elp = &pcp->side; for (i=0, j=elp->num_ele; i<j; i++) { cpe = elp->ele_is_cpe[i]; tag = elp->ele_tag[i]; if (enter_chn(cpe, tag, 's', cw, mip) < 0) return(-1); if (cpe) channels+=2; else channels++; } /* back elements, outside to center */ elp = &pcp->back; for (i=0, j=elp->num_ele; i<j; i++) { cpe = elp->ele_is_cpe[i]; tag = elp->ele_tag[i]; if (enter_chn(cpe, tag, 'b', cw, mip) < 0) return(-1); if (cpe) channels+=2; else channels++; } /* lfe elements */ elp = &pcp->lfe; for (i=0, j=elp->num_ele; i<j; i++) { cpe = elp->ele_is_cpe[i]; tag = elp->ele_tag[i]; if (enter_chn(cpe, tag, 'l', cw, mip) < 0) return(-1); if (cpe) channels+=2; else channels++; } /* coupling channel elements */ elp = &pcp->coupling; for (i=0, j=elp->num_ele; i<j; i++) mip->cch_tag[i] = elp->ele_tag[i]; mip->ncch = j; channels += j; /* mono mixdown elements */ mxp = &pcp->mono_mix; if (mxp->present) {/* CommonWarning("Unanticipated mono mixdown channel"); */ return(-1); } /* stereo mixdown elements */ mxp = &pcp->stereo_mix; if (mxp->present) {/* CommonWarning("Unanticipated stereo mixdown channel"); */ return(-1); } /* matrix mixdown elements */ mxp = &pcp->matrix_mix; if (mxp->present) {/* CommonWarning("Unanticipated matrix mixdown channel"); */ return(-1); } /* save to check future consistency */ if (!check_mc_info(hDecoder, mip, 1)) return -1; return channels;}/* translate prog config or default config * into to multi-channel info structure * returns index of channel in MC_Info */static int enter_chn(int cpe, int tag, char position, int common_window, MC_Info *mip)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -