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

📄 xa_gsm.c

📁 uclinux下mplayer的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                 * 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 (S, LARcr, wt, s)XA_GSM_STATE * S;word    * LARcr;        /* received log area ratios [0..7] IN  */word    * wt;           /* received d [0..159]             IN  */word    * s;            /* signal   s [0..159]            OUT  */{        word            * LARpp_j       = S->LARpp[ S->j     ];        word            * LARpp_j_1     = S->LARpp[ S->j ^=1 ];        word            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(S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s)XA_GSM_STATE	*S;word		*LARcr;		/* [0..7]		IN	*/word		*Ncr;		/* [0..3] 		IN 	*/word		*bcr;		/* [0..3]		IN	*/word		*Mcr;		/* [0..3] 		IN 	*/word		*xmaxcr;	/* [0..3]		IN 	*/word		*xMcr;		/* [0..13*4]		IN	*/word		*s;		/* [0..159]		OUT 	*/{  int		j, k;  word		erp[40], wt[160];  word		*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. ****-------------------------------------------------------------------****/void XA_MSGSM_Decoder(unsigned char *ibuf,unsigned short *obuf){ word sr;  word  LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];	  sr = *ibuf++;  LARc[0] = sr & 0x3f;  sr >>= 6;  sr |= (word)*ibuf++ << 2;  LARc[1] = sr & 0x3f;  sr >>= 6;  sr |= (word)*ibuf++ << 4;  LARc[2] = sr & 0x1f;  sr >>= 5;  LARc[3] = sr & 0x1f;  sr >>= 5;  sr |= (word)*ibuf++ << 2;  LARc[4] = sr & 0xf;  sr >>= 4;  LARc[5] = sr & 0xf;  sr >>= 4;  sr |= (word)*ibuf++ << 2;			/* 5 */  LARc[6] = sr & 0x7;  sr >>= 3;  LARc[7] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 4;  Nc[0] = sr & 0x7f;  sr >>= 7;  bc[0] = sr & 0x3;  sr >>= 2;  Mc[0] = sr & 0x3;  sr >>= 2;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[3] = sr & 0x7;  sr >>= 3;  xmc[4] = sr & 0x7;  sr >>= 3;  xmc[5] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[11] = sr & 0x7;  sr >>= 3;  xmc[12] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 4;  Nc[1] = sr & 0x7f;  sr >>= 7;  bc[1] = sr & 0x3;  sr >>= 2;  Mc[1] = sr & 0x3;  sr >>= 2;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[16] = sr & 0x7;  sr >>= 3;  xmc[17] = sr & 0x7;  sr >>= 3;  xmc[18] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[24] = sr & 0x7;  sr >>= 3;  xmc[25] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 4;			/* 20 */  Nc[2] = sr & 0x7f;  sr >>= 7;  bc[2] = sr & 0x3;  sr >>= 2;  Mc[2] = sr & 0x3;  sr >>= 2;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[29] = sr & 0x7;  sr >>= 3;  xmc[30] = sr & 0x7;  sr >>= 3;  xmc[31] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[37] = sr & 0x7;  sr >>= 3;  xmc[38] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 4;  Nc[3] = sr & 0x7f;  sr >>= 7;  bc[3] = sr & 0x3;  sr >>= 2;  Mc[3] = sr & 0x3;  sr >>= 2;  sr |= (word)*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 |= (word)*ibuf++ << 2;			/* 30 */  xmc[42] = sr & 0x7;  sr >>= 3;  xmc[43] = sr & 0x7;  sr >>= 3;  xmc[44] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*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 |= (word)*ibuf++ << 4;			/* 1 */  LARc[0] = sr & 0x3f;  sr >>= 6;  LARc[1] = sr & 0x3f;  sr >>= 6;  sr = *ibuf++;  LARc[2] = sr & 0x1f;  sr >>= 5;  sr |= (word)*ibuf++ << 3;  LARc[3] = sr & 0x1f;  sr >>= 5;  LARc[4] = sr & 0xf;  sr >>= 4;  sr |= (word)*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 |= (word)*ibuf++ << 1;  bc[0] = sr & 0x3;  sr >>= 2;  Mc[0] = sr & 0x3;  sr >>= 2;  sr |= (word)*ibuf++ << 5;  xmaxc[0] = sr & 0x3f;  sr >>= 6;  xmc[0] = sr & 0x7;  sr >>= 3;  xmc[1] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;			/* 10 */  xmc[7] = sr & 0x7;  sr >>= 3;  xmc[8] = sr & 0x7;  sr >>= 3;  xmc[9] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 1;  bc[1] = sr & 0x3;  sr >>= 2;  Mc[1] = sr & 0x3;  sr >>= 2;  sr |= (word)*ibuf++ << 5;  xmaxc[1] = sr & 0x3f;  sr >>= 6;  xmc[13] = sr & 0x7;  sr >>= 3;  xmc[14] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[20] = sr & 0x7;  sr >>= 3;  xmc[21] = sr & 0x7;  sr >>= 3;  xmc[22] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 1;			/* 20 */  bc[2] = sr & 0x3;  sr >>= 2;  Mc[2] = sr & 0x3;  sr >>= 2;  sr |= (word)*ibuf++ << 5;  xmaxc[2] = sr & 0x3f;  sr >>= 6;  xmc[26] = sr & 0x7;  sr >>= 3;  xmc[27] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 2;  xmc[33] = sr & 0x7;  sr >>= 3;  xmc[34] = sr & 0x7;  sr >>= 3;  xmc[35] = sr & 0x7;  sr >>= 3;  sr |= (word)*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 |= (word)*ibuf++ << 1;		  bc[3] = sr & 0x3;  sr >>= 2;  Mc[3] = sr & 0x3;  sr >>= 2;  sr |= (word)*ibuf++ << 5;  xmaxc[3] = sr & 0x3f;  sr >>= 6;  xmc[39] = sr & 0x7;  sr >>= 3;  xmc[40] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 1;  xmc[41] = sr & 0x7;  sr >>= 3;  xmc[42] = sr & 0x7;  sr >>= 3;  xmc[43] = sr & 0x7;  sr >>= 3;  sr = (word)*ibuf++;				/* 30 */  xmc[44] = sr & 0x7;  sr >>= 3;  xmc[45] = sr & 0x7;  sr >>= 3;  sr |= (word)*ibuf++ << 2;  xmc[46] = sr & 0x7;  sr >>= 3;  xmc[47] = sr & 0x7;  sr >>= 3;  xmc[48] = sr & 0x7;  sr >>= 3;  sr |= (word)*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;}#define GSM_MAGIC 0xdvoid XA_GSM_Decoder(unsigned char *ibuf,unsigned short *obuf){ word  LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];		/* Sanity */  if (((*ibuf >> 4) & 0x0F) != GSM_MAGIC)  { int i;    for(i=0;i<160;i++) obuf[i] = 0;//    *icnt = 33;//    *ocnt = 160;    return;  }  LARc[0]  = (*ibuf++ & 0xF) << 2;           /* 1 */  LARc[0] |= (*ibuf >> 6) & 0x3;  LARc[1]  = *ibuf++ & 0x3F;  LARc[2]  = (*ibuf >> 3) & 0x1F;  LARc[3]  = (*ibuf++ & 0x7) << 2;  LARc[3] |= (*ibuf >> 6) & 0x3;  LARc[4]  = (*ibuf >> 2) & 0xF;  LARc[5]  = (*ibuf++ & 0x3) << 2;  LARc[5] |= (*ibuf >> 6) & 0x3;  LARc[6]  = (*ibuf >> 3) & 0x7;  LARc[7]  = *ibuf++ & 0x7;  Nc[0]  = (*ibuf >> 1) & 0x7F;  bc[0]  = (*ibuf++ & 0x1) << 1;  bc[0] |= (*ibuf >> 7) & 0x1;  Mc[0]  = (*ibuf >> 5) & 0x3;  xmaxc[0]  = (*ibuf++ & 0x1F) << 1;  xmaxc[0] |= (*ibuf >> 7) & 0x1;  xmc[0]  = (*ibuf >> 4) & 0x7;  xmc[1]  = (*ibuf >> 1) & 0x7;  xmc[2]  = (*ibuf++ & 0x1) << 2;  xmc[2] |= (*ibuf >> 6) & 0x3;  xmc[3]  = (*ibuf >> 3) & 0x7;  xmc[4]  = *ibuf++ & 0x7;  xmc[5]  = (*ibuf >> 5) & 0x7;  xmc[6]  = (*ibuf >> 2) & 0x7;  xmc[7]  = (*ibuf++ & 0x3) << 1;            /* 10 */  xmc[7] |= (*ibuf >> 7) & 0x1;  xmc[8]  = (*ibuf >> 4) & 0x7;  xmc[9]  = (*ibuf >> 1) & 0x7;  xmc[10]  = (*ibuf++ & 0x1) << 2;  xmc[10] |= (*ibuf >> 6) & 0x3;  xmc[11]  = (*ibuf >> 3) & 0x7;  xmc[12]  = *ibuf++ & 0x7;  Nc[1]  = (*ibuf >> 1) & 0x7F;  bc[1]  = (*ibuf++ & 0x1) << 1;  bc[1] |= (*ibuf >> 7) & 0x1;  Mc[1]  = (*ibuf >> 5) & 0x3;  xmaxc[1]  = (*ibuf++ & 0x1F) << 1;  xmaxc[1] |= (*ibuf >> 7) & 0x1;  xmc[13]  = (*ibuf >> 4) & 0x7;  xmc[14]  = (*ibuf >> 1) & 0x7;  xmc[15]  = (*ibuf++ & 0x1) << 2;  xmc[15] |= (*ibuf >> 6) & 0x3;  xmc[16]  = (*ibuf >> 3) & 0x7;  xmc[17]  = *ibuf++ & 0x7;  xmc[18]  = (*ibuf >> 5) & 0x7;  xmc[19]  = (*ibuf >> 2) & 0x7;  xmc[20]  = (*ibuf++ & 0x3) << 1;  xmc[20] |= (*ibuf >> 7) & 0x1;  xmc[21]  = (*ibuf >> 4) & 0x7;  xmc[22]  = (*ibuf >> 1) & 0x7;  xmc[23]  = (*ibuf++ & 0x1) << 2;  xmc[23] |= (*ibuf >> 6) & 0x3;  xmc[24]  = (*ibuf >> 3) & 0x7;  xmc[25]  = *ibuf++ & 0x7;  Nc[2]  = (*ibuf >> 1) & 0x7F;  bc[2]  = (*ibuf++ & 0x1) << 1;             /* 20 */  bc[2] |= (*ibuf >> 7) & 0x1;  Mc[2]  = (*ibuf >> 5) & 0x3;  xmaxc[2]  = (*ibuf++ & 0x1F) << 1;  xmaxc[2] |= (*ibuf >> 7) & 0x1;  xmc[26]  = (*ibuf >> 4) & 0x7;  xmc[27]  = (*ibuf >> 1) & 0x7;  xmc[28]  = (*ibuf++ & 0x1) << 2;  xmc[28] |= (*ibuf >> 6) & 0x3;  xmc[29]  = (*ibuf >> 3) & 0x7;  xmc[30]  = *ibuf++ & 0x7;  xmc[31]  = (*ibuf >> 5) & 0x7;  xmc[32]  = (*ibuf >> 2) & 0x7;  xmc[33]  = (*ibuf++ & 0x3) << 1;  xmc[33] |= (*ibuf >> 7) & 0x1;  xmc[34]  = (*ibuf >> 4) & 0x7;  xmc[35]  = (*ibuf >> 1) & 0x7;  xmc[36]  = (*ibuf++ & 0x1) << 2;  xmc[36] |= (*ibuf >> 6) & 0x3;  xmc[37]  = (*ibuf >> 3) & 0x7;  xmc[38]  = *ibuf++ & 0x7;  Nc[3]  = (*ibuf >> 1) & 0x7F;  bc[3]  = (*ibuf++ & 0x1) << 1;  bc[3] |= (*ibuf >> 7) & 0x1;  Mc[3]  = (*ibuf >> 5) & 0x3;  xmaxc[3]  = (*ibuf++ & 0x1F) << 1;  xmaxc[3] |= (*ibuf >> 7) & 0x1;  xmc[39]  = (*ibuf >> 4) & 0x7;  xmc[40]  = (*ibuf >> 1) & 0x7;  xmc[41]  = (*ibuf++ & 0x1) << 2;  xmc[41] |= (*ibuf >> 6) & 0x3;  xmc[42]  = (*ibuf >> 3) & 0x7;  xmc[43]  = *ibuf++ & 0x7;                  /* 30  */  xmc[44]  = (*ibuf >> 5) & 0x7;  xmc[45]  = (*ibuf >> 2) & 0x7;  xmc[46]  = (*ibuf++ & 0x3) << 1;  xmc[46] |= (*ibuf >> 7) & 0x1;  xmc[47]  = (*ibuf >> 4) & 0x7;  xmc[48]  = (*ibuf >> 1) & 0x7;  xmc[49]  = (*ibuf++ & 0x1) << 2;  xmc[49] |= (*ibuf >> 6) & 0x3;  xmc[50]  = (*ibuf >> 3) & 0x7;  xmc[51]  = *ibuf & 0x7;                    /* 33 */  GSM_Decode(&gsm_state, LARc, Nc, bc, Mc, xmaxc, xmc, obuf);  /* Return number of source bytes consumed and output samples produced *///  *icnt = 33;//  *ocnt = 160;}

⌨️ 快捷键说明

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