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

📄 gsm.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 2 页
字号:
        STEP(     94,   -8,  19223 );        STEP(  -1792,   -8,  17476 );        STEP(   -341,   -4,  31454 );        STEP(  -1144,   -4,  29708 );        /* NOTE: the addition of *MIC is used to restore         *       the sign of *LARc.         */}/* 4.2.9 *//* Computation of the quantized reflection coefficients  *//* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8] *//* *  Within each frame of 160 analyzed speech samples the short term *  analysis and synthesis filters operate with four different sets of *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) *  and the actual set of decoded LARs (LARpp(j)) * * (Initial value: LARpp(j-1)[1..8] = 0.) */static void Coefficients_0_12 (register int16_t * LARpp_j_1,register int16_t * LARpp_j,register int16_t * LARp){        register int    i;        register int32_t ltmp;        for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {                *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));                *LARp = GSM_ADD( *LARp,  SASR( *LARpp_j_1, 1));        }}static void Coefficients_13_26 (register int16_t * LARpp_j_1,register int16_t * LARpp_j,register int16_t * LARp){        register int i;        register int32_t ltmp;        for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {                *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));        }}static void Coefficients_27_39 (register int16_t * LARpp_j_1,register int16_t * LARpp_j,register int16_t * LARp){        register int i;        register int32_t ltmp;        for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {                *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));                *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));        }}static void Coefficients_40_159 (register int16_t * LARpp_j,register int16_t * LARp){        register int i;        for (i = 1; i <= 8; i++, LARp++, LARpp_j++)                *LARp = *LARpp_j;}/* 4.2.9.2 */static void LARp_to_rp (register int16_t * LARp)  /* [0..7] IN/OUT  *//* *  The input of this procedure is the interpolated LARp[0..7] array. *  The reflection coefficients, rp[i], are used in the analysis *  filter and in the synthesis filter. */{        register int            i;        register int16_t           temp;        register int32_t       ltmp;        for (i = 1; i <= 8; i++, LARp++) {                /* temp = GSM_ABS( *LARp );                 *                 * if (temp < 11059) temp <<= 1;                 * else if (temp < 20070) temp += 11059;                 * else temp = GSM_ADD( temp >> 2, 26112 );                 *                 * *LARp = *LARp < 0 ? -temp : temp;                 */                if (*LARp < 0) {                        temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);                        *LARp = - ((temp < 11059) ? temp << 1                                : ((temp < 20070) ? temp + 11059                                :  GSM_ADD( temp >> 2, 26112 )));                } else {                        temp  = *LARp;                        *LARp =    (temp < 11059) ? temp << 1                                : ((temp < 20070) ? temp + 11059                                :  GSM_ADD( temp >> 2, 26112 ));                }        }}/**** */static void Gsm_Short_Term_Synthesis_Filter (XAGSMstate * S,int16_t    * LARcr,        /* received log area ratios [0..7] IN  */int16_t    * wt,           /* received d [0..159]             IN  */int16_t    * s)            /* signal   s [0..159]            OUT  */{        int16_t            * LARpp_j       = S->LARpp[ S->j     ];        int16_t            * LARpp_j_1     = S->LARpp[ S->j ^=1 ];        int16_t            LARp[8];#undef  FILTER#if     defined(FAST) && defined(USE_FLOAT_MUL)#       define  FILTER  (* (S->fast                     \                           ? Fast_Short_term_synthesis_filtering        \                           : Short_term_synthesis_filtering     ))#else#       define  FILTER  Short_term_synthesis_filtering#endif        Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );        Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );        LARp_to_rp( LARp );        FILTER( S, LARp, 13, wt, s );        Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);        LARp_to_rp( LARp );        FILTER( S, LARp, 14, wt + 13, s + 13 );        Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);        LARp_to_rp( LARp );        FILTER( S, LARp, 13, wt + 27, s + 27 );        Coefficients_40_159( LARpp_j, LARp );        LARp_to_rp( LARp );        FILTER(S, LARp, 120, wt + 40, s + 40);}static void GSM_Decode(XAGSMstate	*S,int16_t		*LARcr,		/* [0..7]		IN	*/int16_t		*Ncr,		/* [0..3] 		IN 	*/int16_t		*bcr,		/* [0..3]		IN	*/int16_t		*Mcr,		/* [0..3] 		IN 	*/int16_t		*xmaxcr,	/* [0..3]		IN 	*/int16_t		*xMcr,		/* [0..13*4]		IN	*/int16_t		*s)		/* [0..159]		OUT 	*/{  int		j, k;  int16_t		erp[40], wt[160];  int16_t		*drp = S->dp0 + 120;  for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13)   {    Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );    Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );    for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];  }  Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );  Postprocessing(S, s);}/****-------------------------------------------------------------------**** **** Podlipec:  For AVI/WAV files GSM 6.10 combines two 33 bytes frames **** into one 65 byte frame. ****-------------------------------------------------------------------****/static void XA_MSGSM_Decoder(XAGSMstate *gsm_state,const unsigned char *ibuf,unsigned short *obuf){ int16_t sr;  int16_t  LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];	  sr = *ibuf++;  LARc[0] = sr & 0x3f;  sr >>= 6;  sr |= (int16_t)*ibuf++ << 2;  LARc[1] = sr & 0x3f;  sr >>= 6;  sr |= (int16_t)*ibuf++ << 4;  LARc[2] = sr & 0x1f;  sr >>= 5;  LARc[3] = sr & 0x1f;  sr >>= 5;  sr |= (int16_t)*ibuf++ << 2;  LARc[4] = sr & 0xf;  sr >>= 4;  LARc[5] = sr & 0xf;  sr >>= 4;  sr |= (int16_t)*ibuf++ << 2;			/* 5 */  LARc[6] = sr & 0x7;  sr >>= 3;  LARc[7] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 4;  Nc[0] = sr & 0x7f;  sr >>= 7;  bc[0] = sr & 0x3;  sr >>= 2;  Mc[0] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 1;  xmaxc[0] = sr & 0x3f;  sr >>= 6;  xmc[0] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[1] = sr & 0x7;  sr >>= 3;  xmc[2] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[3] = sr & 0x7;  sr >>= 3;  xmc[4] = sr & 0x7;  sr >>= 3;  xmc[5] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;			/* 10 */  xmc[6] = sr & 0x7;  sr >>= 3;  xmc[7] = sr & 0x7;  sr >>= 3;  xmc[8] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[9] = sr & 0x7;  sr >>= 3;  xmc[10] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[11] = sr & 0x7;  sr >>= 3;  xmc[12] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 4;  Nc[1] = sr & 0x7f;  sr >>= 7;  bc[1] = sr & 0x3;  sr >>= 2;  Mc[1] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 1;  xmaxc[1] = sr & 0x3f;  sr >>= 6;  xmc[13] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;				/* 15 */  xmc[14] = sr & 0x7;  sr >>= 3;  xmc[15] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[16] = sr & 0x7;  sr >>= 3;  xmc[17] = sr & 0x7;  sr >>= 3;  xmc[18] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[19] = sr & 0x7;  sr >>= 3;  xmc[20] = sr & 0x7;  sr >>= 3;  xmc[21] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[22] = sr & 0x7;  sr >>= 3;  xmc[23] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[24] = sr & 0x7;  sr >>= 3;  xmc[25] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 4;			/* 20 */  Nc[2] = sr & 0x7f;  sr >>= 7;  bc[2] = sr & 0x3;  sr >>= 2;  Mc[2] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 1;  xmaxc[2] = sr & 0x3f;  sr >>= 6;  xmc[26] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[27] = sr & 0x7;  sr >>= 3;  xmc[28] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[29] = sr & 0x7;  sr >>= 3;  xmc[30] = sr & 0x7;  sr >>= 3;  xmc[31] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[32] = sr & 0x7;  sr >>= 3;  xmc[33] = sr & 0x7;  sr >>= 3;  xmc[34] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;				/* 25 */  xmc[35] = sr & 0x7;  sr >>= 3;  xmc[36] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[37] = sr & 0x7;  sr >>= 3;  xmc[38] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 4;  Nc[3] = sr & 0x7f;  sr >>= 7;  bc[3] = sr & 0x3;  sr >>= 2;  Mc[3] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 1;  xmaxc[3] = sr & 0x3f;  sr >>= 6;  xmc[39] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[40] = sr & 0x7;  sr >>= 3;  xmc[41] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;			/* 30 */  xmc[42] = sr & 0x7;  sr >>= 3;  xmc[43] = sr & 0x7;  sr >>= 3;  xmc[44] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[45] = sr & 0x7;  sr >>= 3;  xmc[46] = sr & 0x7;  sr >>= 3;  xmc[47] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[48] = sr & 0x7;  sr >>= 3;  xmc[49] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[50] = sr & 0x7;  sr >>= 3;  xmc[51] = sr & 0x7;  sr >>= 3;  GSM_Decode(gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf);/*  carry = sr & 0xf;  sr = carry;*/  /* 2nd frame */  sr &= 0xf;  sr |= (int16_t)*ibuf++ << 4;			/* 1 */  LARc[0] = sr & 0x3f;  sr >>= 6;  LARc[1] = sr & 0x3f;  sr >>= 6;  sr = *ibuf++;  LARc[2] = sr & 0x1f;  sr >>= 5;  sr |= (int16_t)*ibuf++ << 3;  LARc[3] = sr & 0x1f;  sr >>= 5;  LARc[4] = sr & 0xf;  sr >>= 4;  sr |= (int16_t)*ibuf++ << 2;  LARc[5] = sr & 0xf;  sr >>= 4;  LARc[6] = sr & 0x7;  sr >>= 3;  LARc[7] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;				/* 5 */  Nc[0] = sr & 0x7f;  sr >>= 7;  sr |= (int16_t)*ibuf++ << 1;  bc[0] = sr & 0x3;  sr >>= 2;  Mc[0] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 5;  xmaxc[0] = sr & 0x3f;  sr >>= 6;  xmc[0] = sr & 0x7;  sr >>= 3;  xmc[1] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[2] = sr & 0x7;  sr >>= 3;  xmc[3] = sr & 0x7;  sr >>= 3;  xmc[4] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[5] = sr & 0x7;  sr >>= 3;  xmc[6] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;			/* 10 */  xmc[7] = sr & 0x7;  sr >>= 3;  xmc[8] = sr & 0x7;  sr >>= 3;  xmc[9] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[10] = sr & 0x7;  sr >>= 3;  xmc[11] = sr & 0x7;  sr >>= 3;  xmc[12] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  Nc[1] = sr & 0x7f;  sr >>= 7;  sr |= (int16_t)*ibuf++ << 1;  bc[1] = sr & 0x3;  sr >>= 2;  Mc[1] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 5;  xmaxc[1] = sr & 0x3f;  sr >>= 6;  xmc[13] = sr & 0x7;  sr >>= 3;  xmc[14] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;			/* 15 */  xmc[15] = sr & 0x7;  sr >>= 3;  xmc[16] = sr & 0x7;  sr >>= 3;  xmc[17] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[18] = sr & 0x7;  sr >>= 3;  xmc[19] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[20] = sr & 0x7;  sr >>= 3;  xmc[21] = sr & 0x7;  sr >>= 3;  xmc[22] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[23] = sr & 0x7;  sr >>= 3;  xmc[24] = sr & 0x7;  sr >>= 3;  xmc[25] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  Nc[2] = sr & 0x7f;  sr >>= 7;  sr |= (int16_t)*ibuf++ << 1;			/* 20 */  bc[2] = sr & 0x3;  sr >>= 2;  Mc[2] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 5;  xmaxc[2] = sr & 0x3f;  sr >>= 6;  xmc[26] = sr & 0x7;  sr >>= 3;  xmc[27] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;	  xmc[28] = sr & 0x7;  sr >>= 3;  xmc[29] = sr & 0x7;  sr >>= 3;  xmc[30] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  xmc[31] = sr & 0x7;  sr >>= 3;  xmc[32] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[33] = sr & 0x7;  sr >>= 3;  xmc[34] = sr & 0x7;  sr >>= 3;  xmc[35] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;			/* 25 */  xmc[36] = sr & 0x7;  sr >>= 3;  xmc[37] = sr & 0x7;  sr >>= 3;  xmc[38] = sr & 0x7;  sr >>= 3;  sr = *ibuf++;  Nc[3] = sr & 0x7f;  sr >>= 7;  sr |= (int16_t)*ibuf++ << 1;		  bc[3] = sr & 0x3;  sr >>= 2;  Mc[3] = sr & 0x3;  sr >>= 2;  sr |= (int16_t)*ibuf++ << 5;  xmaxc[3] = sr & 0x3f;  sr >>= 6;  xmc[39] = sr & 0x7;  sr >>= 3;  xmc[40] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[41] = sr & 0x7;  sr >>= 3;  xmc[42] = sr & 0x7;  sr >>= 3;  xmc[43] = sr & 0x7;  sr >>= 3;  sr = (int16_t)*ibuf++;				/* 30 */  xmc[44] = sr & 0x7;  sr >>= 3;  xmc[45] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 2;  xmc[46] = sr & 0x7;  sr >>= 3;  xmc[47] = sr & 0x7;  sr >>= 3;  xmc[48] = sr & 0x7;  sr >>= 3;  sr |= (int16_t)*ibuf++ << 1;  xmc[49] = sr & 0x7;  sr >>= 3;  xmc[50] = sr & 0x7;  sr >>= 3;  xmc[51] = sr & 0x7;  sr >>= 3;  GSM_Decode(gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, &obuf[160]);  /* Return number of source bytes consumed and output samples produced *///  *icnt = 65;		//  *ocnt = 320;  return;}static int gsm_decode_frame(AVCodecContext *avctx,			    void *data, int *data_size,			    uint8_t *buf, int buf_size){    XAGSMstate *s = avctx->priv_data;    XA_MSGSM_Decoder(s,buf,data);    *data_size=320*2;    return 65;}AVCodec msgsm_decoder = {     "msgsm",                CODEC_TYPE_AUDIO,       CODEC_ID_GSM_MS,                     sizeof(XAGSMstate),      gsm_decode_init,	    NULL,                   NULL,                   gsm_decode_frame,   };

⌨️ 快捷键说明

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