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

📄 imdct.c

📁 MPEG2/MPEG4编解码参考程序(实现了MPEG4的部分功能)
💻 C
📖 第 1 页 / 共 2 页
字号:
      vmult( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, 1, -1, 1, nlong );    }    break;    case LONG_START_SEQUENCE :     imdct( p_in_data, transf_buf, 2*nlong );     vmult( transf_buf, window_long_prev, transf_buf, 1, 1, 1, nlong );     if (overlap_select != NON_OVERLAPPED_MODE) {      vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong );       vcopy( transf_buf+nlong, o_buf+nlong, 1, 1, nflat_ls );       vmult( transf_buf+nlong+nflat_ls, window_short+nshort-1, o_buf+nlong+nflat_ls, 1, -1, 1, nshort );       vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_ls );     }    else { /* overlap_select == NON_OVERLAPPED_MODE */      vmult( transf_buf+nlong+nflat_ls, window_short+nshort-1, transf_buf+nlong+nflat_ls, 1, -1, 1, nshort );       vcopy( &zero, transf_buf+2*nlong-1, 0, -1, nflat_ls );     }    break;       case LONG_STOP_SEQUENCE :     imdct( p_in_data, transf_buf, 2*nlong );     vmult( transf_buf+nflat_ls, window_short_prev_ptr, transf_buf+nflat_ls, 1, 1, 1, nshort );     if (overlap_select != NON_OVERLAPPED_MODE) {      vadd( transf_buf+nflat_ls, o_buf+nflat_ls, o_buf+nflat_ls, 1, 1, 1, nshort );       vcopy( transf_buf+nflat_ls+nshort, o_buf+nflat_ls+nshort, 1, 1, nflat_ls );       vmult( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, 1, -1, 1, nlong );     }    else { /* overlap_select == NON_OVERLAPPED_MODE */      vcopy( &zero, transf_buf, 0, 1, nflat_ls);      vmult( transf_buf+nlong, window_long+nlong-1, transf_buf+nlong, 1, -1, 1, nlong);    }    break;    case EIGHT_SHORT_SEQUENCE :     {int ii; for(ii=0; ii<2*nlong; ii++) transf_buf[ii]=0;}    if (overlap_select != NON_OVERLAPPED_MODE) {      fp = o_buf + nflat_ls;     }    else { /* overlap_select == NON_OVERLAPPED_MODE */      fp = transf_buf;    }    for( k = num_short_win-1; k-->= 0; ) {       if (overlap_select != NON_OVERLAPPED_MODE) {        imdct( p_in_data, transf_buf, 2*nshort );         vmult( transf_buf, window_short_prev_ptr, transf_buf, 1, 1, 1, nshort );         vadd( transf_buf, fp, fp, 1, 1, 1, nshort );         vmult( transf_buf+nshort, window_short+nshort-1, fp+nshort, 1, -1, 1, nshort );         p_in_data += nshort;         fp        += nshort;         window_short_prev_ptr = window_short;       }      else { /* overlap_select == NON_OVERLAPPED_MODE */        imdct( p_in_data, fp, 2*nshort );        vmult( fp, window_short_prev_ptr, fp, 1, 1, 1, nshort );         vmult( fp+nshort, window_short+nshort-1, fp+nshort, 1, -1, 1, nshort );         p_in_data += nshort;         fp        += 2*nshort;        window_short_prev_ptr = window_short;       }    }     vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_ls );     break;         #if 0 /* not used anymore */  case LONG_MEDIUM_WINDOW :     imdct( p_in_data, transf_buf, 2*nlong );     vmult( transf_buf, window_long_prev, transf_buf, 1, 1, 1, nlong );     vadd( transf_buf, o_buf, o_buf, 1, 1, 1, nlong );     vcopy( transf_buf+nlong, o_buf+nlong, 1, 1, nflat_lm );     vmult( transf_buf+nlong+nflat_lm, window_med+nmed-1, o_buf+nlong+nflat_lm, 1, -1, 1, nmed );     vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_lm );     break;     case MEDIUM_LONG_WINDOW :     imdct( p_in_data, transf_buf, 2*nlong );     vmult( transf_buf+nflat_lm, window_med, transf_buf+nflat_lm, 1, 1, 1, nmed );     vadd( transf_buf+nflat_lm, o_buf+nflat_lm, o_buf+nflat_lm, 1, 1, 1, nmed );     vcopy( transf_buf+nflat_lm+nmed, o_buf+nflat_lm+nmed, 1, 1, nflat_lm );     vmult( transf_buf+nlong, window_long+nlong-1, o_buf+nlong, 1, -1, 1, nlong );     break;     case ONLY_MEDIUM_WINDOW :     fp = o_buf + nflat_lm;     for( k = transfak_lm-1; k-->=0; ) {       imdct( p_in_data, transf_buf, 2*nmed );       vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed );       vadd( transf_buf, fp, fp, 1, 1, 1, nmed );       vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed );       p_in_data += nmed;       fp        += nmed;     }     vcopy( &zero, o_buf+2*nlong-1, 0, -1, nflat_lm );     break;     case MEDIUM_SHORT_WINDOW :     fp = o_buf + nflat_lm;     for( k = transfak_lm-2; k-->=0; ) {  /* NI */      imdct( p_in_data, transf_buf, 2*nmed );       vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed );       vadd( transf_buf, fp, fp, 1, 1, 1, nmed );       vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed );       p_in_data += nmed;       fp        += nmed;     }     imdct( p_in_data, transf_buf, 2*nmed );     vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed );     vadd( transf_buf, fp, fp, 1, 1, 1, nmed );     vcopy( transf_buf+nmed, fp+nmed, 1, 1, nflat_ms );     vmult( transf_buf+nmed+nflat_ms, window_short+nshort-1, fp+nmed+nflat_ms, 1, -1, 1, nshort );     break;     case SHORT_MEDIUM_WINDOW :     fp = o_buf + nflat_lm;     imdct( p_in_data, transf_buf, 2*nmed );     vmult( transf_buf+nflat_ms, window_short_prev_ptr, transf_buf+nflat_ms, 1, 1, 1, nshort );     vadd( transf_buf+nflat_ms, fp+nflat_ms, fp+nflat_ms, 1, 1, 1, nshort );     vcopy( transf_buf+nflat_ms+nshort, fp+nflat_ms+nshort, 1, 1, nflat_ms );     vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed );     fp        += nmed;     p_in_data += nmed;     for( k = transfak_lm-2; k-->=0; ) { /* NI */      imdct( p_in_data, transf_buf, 2*nmed );       vmult( transf_buf, window_med, transf_buf, 1, 1, 1, nmed );       vadd( transf_buf, fp, fp, 1, 1, 1, nmed );       vmult( transf_buf+nmed, window_med+nmed-1, fp+nmed, 1, -1, 1, nmed );       p_in_data += nmed;       fp        += nmed;     }     break; #endif    default :     CommonExit( 1, "mdct_synthesis: Unknown window type(1)" );   }    if (overlap_select != NON_OVERLAPPED_MODE) {    vcopy( o_buf, p_out_data, 1, 1, nlong );   }  else { /* overlap_select == NON_OVERLAPPED_MODE */    vcopy( transf_buf, p_out_data, 1, 1, 2*nlong );   }    /* save unused output data */   if (overlap_select != NON_OVERLAPPED_MODE)  vcopy( o_buf+nlong, p_overlap, 1, 1, nlong ); } /* %%%%%%%%%%%%%%%%% MDCT - STUFF %%%%%%%%%%%%%%%% */void mdct( double in_data[], double out_data[], int len ){  double *tmp_data;  tmp_data = (double*)malloc(len*sizeof(double));  vcopy(in_data, tmp_data, 1, 1, len);   MDCT(tmp_data, len, len/2, 1);  vcopy(tmp_data, out_data, 1, 1, len/2);   free(tmp_data);}void buffer2freq(  double           p_in_data[],   double           p_out_mdct[],  double           p_overlap[],  WINDOW_SEQUENCE  windowSequence,  WINDOW_SHAPE     wfun_select,      /* offers the possibility to select different window functions */  WINDOW_SHAPE     wfun_select_prev,  int              nlong,            /* shift length for long windows   */  int              nmed,             /* shift length for medium windows */  int              nshort,           /* shift length for short windows  */  Mdct_in          overlap_select,   /* select mdct input *TK*          */                                     /* switch (overlap_select) {       */                                     /* case OVERLAPPED_MODE:                */                                     /*   p_in_data[]                   */                                     /*   = overlapped signal           */                                     /*         (bufferlength: nlong)   */                                     /* case NON_OVERLAPPED_MODE:            */                                     /*   p_in_data[]                   */                                     /*   = non overlapped signal       */                                     /*         (bufferlength: 2*nlong) */  int              num_short_win     /* number of short windows to      */                                     /* transform                       */  /*int              save_window*/       /* save window information         */){  double         transf_buf[ 2*MAX_SHIFT_LEN_LONG ];  double         windowed_buf[ 2*MAX_SHIFT_LEN_LONG ];  double           *p_o_buf;  int             k;  double           window_long[MAX_SHIFT_LEN_LONG];   double           window_long_prev[MAX_SHIFT_LEN_LONG];   double           window_med[MAX_SHIFT_LEN_LONG];   double           window_med_prev[MAX_SHIFT_LEN_LONG];   double           window_short[MAX_SHIFT_LEN_LONG];   double           window_short_prev[MAX_SHIFT_LEN_LONG];   double           *window_short_prev_ptr;  int nflat_ls    = (nlong-nshort)/ 2;   int transfak_ls =  nlong/nshort;   int transfak_lm =  nlong/nmed; #if 0 /* not used anymore */  int nflat_lm    = (nlong-nmed)  / 2;   int nflat_ms    = (nmed-nshort) / 2; #endif  static int firstTime=1;  window_short_prev_ptr = window_short_prev ;   if( (nlong%nshort) || (nlong > MAX_SHIFT_LEN_LONG) || (nshort > MAX_SHIFT_LEN_LONG/2) ) {     CommonExit( 1, "mdct_analysis: Problem with window length" ); }   if( (nlong%nmed) || (nmed%nshort) || (nmed > MAX_SHIFT_LEN_LONG/2) ) {     CommonExit( 1, "mdct_analysis: Problem with window length" );  }   if( transfak_lm%2 ) {     CommonExit( 1, "mdct_analysis: Problem with window length" );  }   if( windowSequence==EIGHT_SHORT_SEQUENCE      && ( (num_short_win <= 0) || (num_short_win > transfak_ls) ) ) {    CommonExit( 1, "mdct_analysis: Problem with number of short windows" );  }     calc_window( window_long,      nlong, wfun_select );   calc_window( window_long_prev, nlong, wfun_select_prev );   calc_window( window_med, nmed, wfun_select );   calc_window( window_med_prev, nmed, wfun_select_prev );   calc_window( window_short,      nshort, wfun_select );   calc_window( window_short_prev, nshort, wfun_select_prev );     if (overlap_select != NON_OVERLAPPED_MODE) {    /* create / shift old values */    /* We use p_overlap here as buffer holding the last frame time signal*/    if (firstTime){      firstTime=0;      vcopy( &zero, transf_buf, 0, 1, nlong );    }    else      vcopy( p_overlap, transf_buf, 1, 1, nlong );    /* Append new data */    vcopy( p_in_data, transf_buf+nlong, 1, 1, nlong );    vcopy( p_in_data, p_overlap,        1, 1, nlong );  }  else { /* overlap_select == NON_OVERLAPPED_MODE */    vcopy( p_in_data, transf_buf, 1, 1, 2*nlong);  }  /* Set ptr to transf-Buffer */  p_o_buf = transf_buf;      /* Separate action for each Block Type */  switch( windowSequence ) {   case ONLY_LONG_SEQUENCE :     vmult( p_o_buf, window_long_prev, windowed_buf,       1, 1,  1, nlong );     vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong );     mdct( windowed_buf, p_out_mdct, 2*nlong );         break;      case LONG_START_SEQUENCE :    vmult( p_o_buf, window_long_prev, windowed_buf, 1, 1, 1, nlong );    vcopy( p_o_buf+nlong, windowed_buf+nlong, 1, 1, nflat_ls );    vmult( p_o_buf+nlong+nflat_ls, window_short+nshort-1, windowed_buf+nlong+nflat_ls, 1, -1, 1, nshort );    vcopy( &zero, windowed_buf+2*nlong-1, 0, -1, nflat_ls );    mdct( windowed_buf, p_out_mdct, 2*nlong );    break;   case LONG_STOP_SEQUENCE :    vcopy( &zero, windowed_buf, 0, 1, nflat_ls );    vmult( p_o_buf+nflat_ls, window_short_prev_ptr, windowed_buf+nflat_ls, 1, 1, 1, nshort );    vcopy( p_o_buf+nflat_ls+nshort, windowed_buf+nflat_ls+nshort, 1, 1, nflat_ls );    vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong );    mdct( windowed_buf, p_out_mdct, 2*nlong );    break;   case EIGHT_SHORT_SEQUENCE :    if (overlap_select != NON_OVERLAPPED_MODE) {      p_o_buf += nflat_ls;    }    for (k=num_short_win-1; k-->=0; ) {      vmult( p_o_buf,        window_short_prev_ptr,          windowed_buf,        1, 1,  1, nshort );      vmult( p_o_buf+nshort, window_short+nshort-1, windowed_buf+nshort, 1, -1, 1, nshort );      mdct( windowed_buf, p_out_mdct, 2*nshort );      p_out_mdct += nshort;      p_o_buf    += (overlap_select != NON_OVERLAPPED_MODE) ? nshort : 2*nshort;      window_short_prev_ptr = window_short;     }    break;#if 0 /* not used anymore */   case LONG_MEDIUM_WINDOW :    vmult( p_o_buf, window_long_prev, windowed_buf, 1, 1, 1, nlong );    vcopy( p_o_buf+nlong, windowed_buf+nlong, 1, 1, nflat_lm );    vmult( p_o_buf+nlong+nflat_lm, window_med+nmed-1, windowed_buf+nlong+nflat_lm, 1, -1, 1, nmed );    vcopy( &zero, windowed_buf+2*nlong-1, 0, -1, nflat_lm );    mdct( windowed_buf, p_out_mdct, 2*nlong );    break;   case MEDIUM_LONG_WINDOW :    vcopy( &zero, windowed_buf, 0, 1, nflat_lm );    vmult( p_o_buf+nflat_lm, window_med, windowed_buf+nflat_lm, 1, 1, 1, nmed );    vcopy( p_o_buf+nflat_lm+nmed, windowed_buf+nflat_lm+nmed, 1, 1, nflat_lm );    vmult( p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, 1, -1, 1, nlong );    mdct( windowed_buf, p_out_mdct, 2*nlong );    break;   case ONLY_MEDIUM_WINDOW :    p_o_buf += nflat_lm;    for( k=transfak_lm-1; k-->=0; ) {      vmult( p_o_buf,      window_med,        windowed_buf,      1, 1,  1, nmed );      vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed );      mdct( windowed_buf, p_out_mdct, 2*nmed );      p_o_buf    += nmed;      p_out_mdct += nmed;    }    break;   case MEDIUM_SHORT_WINDOW :    p_o_buf += nflat_lm;    for( k=transfak_lm-2; k-->=0; ) { /* NI */      vmult( p_o_buf,      window_med,        windowed_buf,      1, 1,  1, nmed );      vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed );      mdct( windowed_buf, p_out_mdct, 2*nmed );      p_o_buf    += nmed;      p_out_mdct += nmed;    }    vmult( p_o_buf, window_med, windowed_buf, 1, 1, 1, nmed );    vcopy( p_o_buf+nmed, windowed_buf+nmed, 1, 1, nflat_ms );    vmult( p_o_buf+nmed+nflat_ms, window_short+nshort-1, windowed_buf+nmed+nflat_ms, 1, -1, 1, nshort );    vcopy( &zero, windowed_buf+2*nmed-1, 0, -1, nflat_ms );    mdct( windowed_buf, p_out_mdct, 2*nmed );    break;   case SHORT_MEDIUM_WINDOW :    p_o_buf += nflat_lm;    vcopy( &zero, windowed_buf, 0, 1, nflat_ms );    vmult( p_o_buf+nflat_ms, window_short_prev_ptr, windowed_buf+nflat_ms, 1, 1, 1, nshort );    vcopy( p_o_buf+nflat_ms+nshort, windowed_buf+nflat_ms+nshort, 1, 1, nflat_ms );    vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed );    mdct( windowed_buf, p_out_mdct, 2*nmed );    p_o_buf    += nmed;    p_out_mdct += nmed;    for (k=transfak_lm-2; k-->=0; ) { /* NI */      vmult( p_o_buf,      window_med,        windowed_buf,      1, 1,  1, nmed );      vmult( p_o_buf+nmed, window_med+nmed-1, windowed_buf+nmed, 1, -1, 1, nmed );      mdct( windowed_buf, p_out_mdct, 2*nmed );      p_o_buf    += nmed;      p_out_mdct += nmed;    }    break;#endif   default :      CommonExit( 1, "mdct_synthesis: Unknown window type (2)" );   }  /* Set output data   vcopy(transf_buf, p_out_mdct,1, 1, nlong); */ }/***********************************************************************************************/  

⌨️ 快捷键说明

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