📄 ntt_bitpack.c
字号:
/*****************************************************************************//* This software module was originally developed by *//* Naoki Iwakami (NTT) *//* and edited by *//* Naoki Iwakami and Satoshi Miki (NTT) on 1996-05-01, *//* Naoki Iwakami (NTT) on 1996-08-27, *//* Naoki Iwakami (NTT) on 1996-12-06, *//* Naoki Iwakami (NTT) on 1997-04-18, *//* Naoki Iwakami (NTT) on 1997-08-25 *//* Takehiro Moriya (NTT) on 1998-07-16 *//* in the course of development 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 more *//* MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 Audio *//* standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio standards *//* free license to this software module or modifications thereof for use in *//* hardware or software products claiming conformance to the MPEG-2 NBC/ *//* MPEG-4 Audio standards. Those intending to use this software module in *//* hardware or software products are advised that this use may infringe *//* existing patents. The original developer of this software module and *//* his/her company, the subsequent editors and their companies, and ISO/IEC *//* have no liability for use of this software module or modifications *//* thereof in an implementation. Copyright is not released for non *//* MPEG-2 NBC/MPEG-4 Audio conforming products. The original developer *//* retains full right to use the code for his/her own purpose, assign or *//* donate the code to a third party and to inhibit third party from using *//* the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. *//* This copyright notice must be included in all copies or derivative works. *//* Copyright (c)1996. *//*****************************************************************************//* 06-dec-96 NI provided 6 kbit/s support *//* 18-apr-97 NI merged long, medium, & short sequences into one sequence *//* 25-aug-97 NI added bandwidth control */#include <stdio.h>#include "block.h" /* handler, defines, enums */#include "buffersHandle.h" /* handler, defines, enums */#include "interface.h" /* handler, defines, enums */#include "mod_bufHandle.h" /* handler, defines, enums */#include "resilienceHandle.h" /* handler, defines, enums */#include "tf_mainHandle.h" /* handler, defines, enums */#include "nok_ltp_common.h" /* structs */#include "tf_mainStruct.h" /* structs */#include "tns.h" /* structs */#include "bitstream.h"#include "ntt_conf.h"#include "all.h"#include "nok_ltp_enc.h"#include "ntt_nok_pred.h"int ntt_BitPack(ntt_INDEX *index, BsBitStream *stream){ /*--- Variables ---*/ int bitcount, itmp, isf, i_ch, idiv, iptop; unsigned int tns_present[MAX_TIME_CHANNELS]; unsigned int ltp_present[MAX_TIME_CHANNELS]; /* frame */ int nsf, n_ch; /* shape */ int vq_bits, ndiv, bits0, bits1, bits; /* Bark-scale envelope */ int fw_n_bit, fw_ndiv; int flag_pitch, flag_post; int bits1_p[ntt_N_DIV_P_MAX], length_p[ntt_N_DIV_P_MAX]; int bits0_p[ntt_N_DIV_P_MAX]; bitcount = 0; BsPutBit(stream, (unsigned int)index->bandlimit, 1); bitcount += 1; /*--- Set parameters ---*/ n_ch = index->numChannel; switch (index->w_type){ case ONLY_LONG_SEQUENCE: case LONG_START_SEQUENCE: case LONG_STOP_SEQUENCE: /* frame */ nsf = 1; BsPutBit(stream, (unsigned int)index->pitch_q, 1); bitcount += 1; /*--- Postprocess ---*/ BsPutBit(stream, (unsigned int)index->pf, 1); bitcount += 1; /* available bits */ vq_bits = index->nttDataBase->ntt_VQTOOL_BITS; /* Bark-scale envelope */ fw_n_bit = ntt_FW_N_BIT; fw_ndiv = ntt_FW_N_DIV; /* flags */ flag_pitch = index->pitch_q; flag_post = 1;/* ??? */ break; case EIGHT_SHORT_SEQUENCE: /* frame */ nsf = ntt_N_SHRT; /* shape */ vq_bits = index->nttDataBase->ntt_VQTOOL_BITS_S; /* Bark-scale envelope */ fw_n_bit = 0; fw_ndiv = 0; /* flags */ flag_pitch = 0; flag_post = 0; /* ???? */ break; default: break; } /* set bits for pitch */ if(index->pitch_q == 1){ ntt_vec_lenp( index->numChannel, bits1_p, length_p ); for ( idiv=0; idiv<ntt_N_DIV_PperCH*n_ch; idiv++ ){ bits0_p[idiv] = (bits1_p[idiv]+1)/2; bits1_p[idiv] /= 2; } } if(index->bandlimit == 1){ for (i_ch=0; i_ch<n_ch; i_ch++){ if (ntt_BLIM_BITS_H > 0){ BsPutBit(stream, (unsigned int)index->blim_h[i_ch], ntt_BLIM_BITS_H); bitcount += ntt_BLIM_BITS_H; } if (ntt_BLIM_BITS_L > 0){ BsPutBit(stream, (unsigned int)index->blim_l[i_ch], ntt_BLIM_BITS_L); bitcount += ntt_BLIM_BITS_L; } } } /*--- Pitch excitation ---*/ if (flag_pitch){ for ( idiv=0; idiv<ntt_N_DIV_PperCH*n_ch; idiv++ ){ BsPutBit(stream, (unsigned int)index->pls[idiv], bits0_p[idiv]);/*CB0*/ BsPutBit(stream, (unsigned int)index->pls[idiv+ntt_N_DIV_PperCH*n_ch], bits1_p[idiv]);/*CB1*/ bitcount += bits0_p[idiv] + bits1_p[idiv]; } for (i_ch=0; i_ch<n_ch; i_ch++){ BsPutBit(stream, (unsigned int)index->pit[i_ch], ntt_BASF_BIT); BsPutBit(stream, (unsigned int)index->pgain[i_ch], ntt_PGAIN_BIT); bitcount += ntt_BASF_BIT + ntt_PGAIN_BIT; } } /*--- Shape vector code ---*/ ndiv = (int)((vq_bits+ntt_MAXBIT*2-1)/(ntt_MAXBIT*2)); for ( idiv=0; idiv<ndiv; idiv++ ){ /* set bits */ bits = (vq_bits+ndiv-1-idiv)/ndiv; bits0 = (bits+1)/2; bits1 = bits/2; /* read stream */ BsPutBit(stream, (unsigned int)index->wvq[idiv], bits0); BsPutBit(stream, (unsigned int)index->wvq[idiv+ndiv], bits1); bitcount += bits0 + bits1; } /*--- Forward envelope code ---*/ if (fw_n_bit > 0){ for ( i_ch=0; i_ch<n_ch; i_ch++ ){ for ( isf=0; isf<nsf; isf++ ){ for ( idiv=0; idiv<fw_ndiv; idiv++ ){ itmp = idiv+(isf+i_ch*nsf)*fw_ndiv; BsPutBit(stream, (unsigned int)index->fw[itmp], fw_n_bit); bitcount += fw_n_bit; } } } for ( i_ch=0; i_ch<n_ch; i_ch++ ){ for ( isf=0; isf<nsf; isf++ ){ BsPutBit(stream, (unsigned int)index->fw_alf[i_ch*nsf+isf], ntt_FW_ARQ_NBIT); bitcount += ntt_FW_ARQ_NBIT; } } } /*--- Gain ---*/ if (nsf == 1){ for ( i_ch=0; i_ch<n_ch; i_ch++ ){ BsPutBit(stream, (unsigned int)index->pow[i_ch], ntt_GAIN_BITS); bitcount += ntt_GAIN_BITS; } } else{ for ( i_ch=0; i_ch<n_ch; i_ch++ ){ iptop = (nsf+1)*i_ch; BsPutBit(stream, (unsigned int)index->pow[iptop], ntt_GAIN_BITS); for ( isf=0; isf<nsf; isf++ ){ BsPutBit(stream, (unsigned int)index->pow[iptop+isf+1], ntt_SUB_GAIN_BITS); } bitcount += ntt_GAIN_BITS + ntt_SUB_GAIN_BITS * nsf; } } /*--- LSP ---*/ for ( i_ch=0; i_ch<n_ch; i_ch++ ){ /* pred. switch */ BsPutBit(stream, (unsigned int)index->lsp[i_ch][0], ntt_LSP_BIT0); /* first stage */ BsPutBit(stream, (unsigned int)index->lsp[i_ch][1], ntt_LSP_BIT1); /* second stage */ for ( itmp=0; itmp<ntt_LSP_SPLIT; itmp++ ) BsPutBit(stream, (unsigned int)index->lsp[i_ch][itmp+2], ntt_LSP_BIT2); bitcount += ntt_LSP_BIT0 + ntt_LSP_BIT1 + ntt_LSP_BIT2 * ntt_LSP_SPLIT; } return(bitcount);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -