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

📄 ilbc_encode.c

📁 包含G723 G729 Gsm iLBC PCM音频编码的动态库
💻 C
📖 第 1 页 / 共 2 页
字号:
        
       if ( Nfor > 0 ) { 
            
     
    
    
           /* setup memory */ 
    
           memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); 
           memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,  
               STATE_LEN*sizeof(float)); 
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 
    
           /* loop over subframes to encode */ 
    
           for (subframe=0; subframe<Nfor; subframe++) { 
    
               /* encode subframe */ 
    
               iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES,  
                   gain_index+subcount*CB_NSTAGES,  
                   &residual[(start+1+subframe)*SUBL],  
                   mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],  
                   SUBL, CB_NSTAGES,  
                   &weightdenum[(start+1+subframe)*(LPC_FILTERORDER+1)], 
                   weightState, subcount+1); 
    
               /* construct decoded vector */ 
    
               iCBConstruct(&decresidual[(start+1+subframe)*SUBL],  
                   cb_index+subcount*CB_NSTAGES,  
                   gain_index+subcount*CB_NSTAGES,  
                   mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],  
                   SUBL, CB_NSTAGES); 
    
               /* update memory */ 
    
               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 
               memcpy(mem+CB_MEML-SUBL,  
                   &decresidual[(start+1+subframe)*SUBL],  
                   SUBL*sizeof(float)); 
               memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 
    
               subcount++; 
           } 
       } 
        
    
       /* backward prediction of subframes */ 
    
       Nback = start-1; 
    
        
       if ( Nback > 0 ) { 
                   
           /* create reverse order vectors */ 
    
           for (n=0; n<Nback; n++) { 
               for (k=0; k<SUBL; k++) { 
     
    
    
                   reverseResidual[n*SUBL+k] =  
                       residual[(start-1)*SUBL-1-n*SUBL-k]; 
                   reverseDecresidual[n*SUBL+k] =  
                       decresidual[(start-1)*SUBL-1-n*SUBL-k]; 
               } 
           } 
    
           /* setup memory */ 
    
           meml_gotten = SUBL*(iLBCenc_inst->nsub+1-start); 
    
            
           if ( meml_gotten > CB_MEML ) {  
               meml_gotten=CB_MEML; 
           } 
           for (k=0; k<meml_gotten; k++) {  
               mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; 
           }  
           memset(mem, 0, (CB_MEML-k)*sizeof(float)); 
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 
    
           /* loop over subframes to encode */ 
    
           for (subframe=0; subframe<Nback; subframe++) { 
                
               /* encode subframe */ 
    
               iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES,  
                   gain_index+subcount*CB_NSTAGES,  
                   &reverseResidual[subframe*SUBL],  
                   mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],  
                   SUBL, CB_NSTAGES,  
                   &weightdenum[(start-2-subframe)*(LPC_FILTERORDER+1)],  
                   weightState, subcount+1); 
    
               /* construct decoded vector */ 
    
               iCBConstruct(&reverseDecresidual[subframe*SUBL],  
                   cb_index+subcount*CB_NSTAGES,  
                   gain_index+subcount*CB_NSTAGES,  
                   mem+CB_MEML-memLfTbl[subcount],  
                   memLfTbl[subcount], SUBL, CB_NSTAGES); 
    
               /* update memory */ 
    
               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 
               memcpy(mem+CB_MEML-SUBL,  
                   &reverseDecresidual[subframe*SUBL], 
                   SUBL*sizeof(float)); 
               memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 
    
               subcount++; 
    
     
    
    
           } 
    
           /* get decoded residual from reversed vector */ 
    
           for (i=0; i<SUBL*Nback; i++) { 
               decresidual[SUBL*Nback - i - 1] =  
                   reverseDecresidual[i]; 
           } 
       } 
       /* end encoding part */ 
    
       /* adjust index */ 
       index_conv_enc(cb_index); 
    
       /* pack bytes */ 
    
       pbytes=bytes; 
       pos=0; 
    
       /* loop over the 3 ULP classes */ 
    
       for (ulp=0; ulp<3; ulp++) { 
        
           /* LSF */ 
           for (k=0; k<LSF_NSPLIT*iLBCenc_inst->lpc_n; k++) { 
               packsplit(&lsf_i[k], &firstpart, &lsf_i[k],  
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp],  
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp]+ 
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+1]+ 
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+2]); 
               dopack( &pbytes, firstpart,  
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], &pos); 
           } 
    
           /* Start block info */ 
    
           packsplit(&start, &firstpart, &start,  
               iLBCenc_inst->ULP_inst->start_bits[ulp],  
               iLBCenc_inst->ULP_inst->start_bits[ulp]+ 
               iLBCenc_inst->ULP_inst->start_bits[ulp+1]+ 
               iLBCenc_inst->ULP_inst->start_bits[ulp+2]); 
           dopack( &pbytes, firstpart,  
               iLBCenc_inst->ULP_inst->start_bits[ulp], &pos); 
    
           packsplit(&state_first, &firstpart, &state_first,  
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp],  
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp]+ 
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp+1]+ 
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp+2]); 
           dopack( &pbytes, firstpart,  
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp], &pos); 
    
           packsplit(&idxForMax, &firstpart, &idxForMax,  
     
    
    
               iLBCenc_inst->ULP_inst->scale_bits[ulp],  
               iLBCenc_inst->ULP_inst->scale_bits[ulp]+ 
               iLBCenc_inst->ULP_inst->scale_bits[ulp+1]+ 
               iLBCenc_inst->ULP_inst->scale_bits[ulp+2]); 
           dopack( &pbytes, firstpart,  
               iLBCenc_inst->ULP_inst->scale_bits[ulp], &pos); 
    
           for (k=0; k<iLBCenc_inst->state_short_len; k++) { 
               packsplit(idxVec+k, &firstpart, idxVec+k,  
                   iLBCenc_inst->ULP_inst->state_bits[ulp],  
                   iLBCenc_inst->ULP_inst->state_bits[ulp]+ 
                   iLBCenc_inst->ULP_inst->state_bits[ulp+1]+ 
                   iLBCenc_inst->ULP_inst->state_bits[ulp+2]); 
               dopack( &pbytes, firstpart,  
                   iLBCenc_inst->ULP_inst->state_bits[ulp], &pos); 
           } 
    
           /* 23/22 (20ms/30ms) sample block */ 
    
           for (k=0;k<CB_NSTAGES;k++) { 
               packsplit(extra_cb_index+k, &firstpart,  
                   extra_cb_index+k,  
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp],  
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp]+ 
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+1]+ 
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+2]); 
               dopack( &pbytes, firstpart,  
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp],  
                   &pos); 
           } 
    
           for (k=0;k<CB_NSTAGES;k++) { 
               packsplit(extra_gain_index+k, &firstpart,  
                   extra_gain_index+k,  
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp],  
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp]+ 
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+1]+ 
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+2]); 
               dopack( &pbytes, firstpart,  
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp],  
                   &pos); 
           } 
                
           /* The two/four (20ms/30ms) 40 sample sub blocks */ 
    
           for (i=0; i<iLBCenc_inst->nasub; i++) { 
               for (k=0; k<CB_NSTAGES; k++) { 
                   packsplit(cb_index+i*CB_NSTAGES+k, &firstpart,  
                       cb_index+i*CB_NSTAGES+k,  
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp],  
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp]+ 
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+1]+ 
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+2]); 
     
    
    
                   dopack( &pbytes, firstpart,  
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp],  
                       &pos); 
               } 
           } 
            
           for (i=0; i<iLBCenc_inst->nasub; i++) { 
               for (k=0; k<CB_NSTAGES; k++) { 
                   packsplit(gain_index+i*CB_NSTAGES+k, &firstpart,  
                       gain_index+i*CB_NSTAGES+k,  
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp],  
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp]+ 
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+1]+ 
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+2]); 
                   dopack( &pbytes, firstpart,  
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp],  
                       &pos); 
               } 
           } 
       } 
    
       /* set the last unused bit to zero */ 
       dopack( &pbytes, 0, 1, &pos); 
   } 
    
 

⌨️ 快捷键说明

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