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

📄 musicout.c

📁 mpeg layerI II III, support window and linux
💻 C
📖 第 1 页 / 共 3 页
字号:
       compatibility with smaller machines */    pcm_sample = (PCM FAR *) mem_alloc((long) sizeof(PCM), "PCM Samp");    sample = (SAM FAR *) mem_alloc((long) sizeof(SAM), "Sample");    fraction = (FRA FAR *) mem_alloc((long) sizeof(FRA), "fraction");    w = (VE FAR *) mem_alloc((long) sizeof(VE), "w");    fr_ps.header = &info;    fr_ps.tab_num = -1;                /* no table loaded */    fr_ps.alloc = NULL;    for (i=0;i<HAN_SIZE;i++) for (j=0;j<2;j++) (*w)[j][i] = 0.0;    Arguments.topSb = 0;    GetArguments(argc, argv, &Arguments);    if ((musicout = fopen(Arguments.decoded_file_name, "w+b")) == NULL) {          printf ("Could not create \"%s\".\n", Arguments.decoded_file_name);          exit(1);        }    open_bit_stream_r(&bs, Arguments.encoded_file_name, BUFFER_SIZE);    if (Arguments.need_aiff)       if (aiff_seek_to_sound_data(musicout) == -1) {          printf("Could not seek to PCM sound data in \"%s\".\n",                 Arguments.decoded_file_name);          exit(1);       }    sample_frames = 0;    for( bbq=0;bbq<20;bbq++) {       sync = seek_sync(&bs, SYNC_WORD, SYNC_WORD_LNGTH);       frameBits = sstell(&bs) - gotBits;       if(frameNum > 0)        /* don't want to print on 1st loop; no lay */          if(frameBits%bitsPerSlot)             fprintf(stderr,"Got %ld bits = %ld slots plus %ld\n",                     frameBits, frameBits/bitsPerSlot, frameBits%bitsPerSlot);       gotBits += frameBits;#ifdef  DEBUG_PRINT_XING#ifdef  DEBUG_SCALEFAC      fprintf(fp_scalefac,"******************************\n");      fprintf(fp_scalefac,"decode_fram = %d\n",bbq);#endif#ifdef  DEBUG_HUFFMAN      fprintf(fp_huffman,"totbit = %d\n",hsstell());      fprintf(fp_huffman,"******************************\n");      fprintf(fp_huffman,"decode_fram = %d\n",bbq);#endif #ifdef  DEBUG_REQUAN      fprintf(fp_requan,"******************************\n");      fprintf(fp_requan,"decode_fram = %d\n",bbq);#endif #ifdef  CAPT_CODE_BOOK      fprintf(fp_capt_codebook,"******************************\n");      fprintf(fp_capt_codebook,"decode_fram = %d\n",bbq);#endif       #endif        if (!sync) {          printf("Frame cannot be located\n");          printf("Input stream may be empty\n");          done = TRUE;          /* finally write out the buffer */          if (info.lay != 1) out_fifo(*pcm_sample, 3, &fr_ps, done,                                      musicout, &sample_frames);          else               out_fifo(*pcm_sample, 1, &fr_ps, done,                                      musicout, &sample_frames);          break;       }       decode_info(&bs, &fr_ps);       hdr_to_frps(&fr_ps);       stereo = fr_ps.stereo;       if(fr_ps.header->version == MPEG_PHASE2_LSF) {		Max_gr = 1;       }       else       { 		Max_gr = 2;       }       error_protection = info.error_protection;       crc_error_count = 0;       total_error_count = 0;       if(frameNum == 0) WriteHdr(&fr_ps, stdout);  /* printout layer/mode */#ifdef ESPSif (frameNum == 0 && Arguments.need_esps) {	esps_write_header(musicout,(long) sample_frames, (double)		s_freq[info.version][info.sampling_frequency] * 1000,		(int) stereo, Arguments.decoded_file_name );} /* MI */#endif       fprintf(stderr, "{%4lu}", frameNum++); fflush(stderr);        if (error_protection) buffer_CRC(&bs, &old_crc);       switch (info.lay) {          case 1: {             bitsPerSlot = 32;        samplesPerFrame = 384;             I_decode_bitalloc(&bs,bit_alloc,&fr_ps);             I_decode_scale(&bs, bit_alloc, scale_index, &fr_ps);             if (error_protection) {                I_CRC_calc(&fr_ps, bit_alloc, &new_crc);                if (new_crc != old_crc) {                   crc_error_count++;                   total_error_count++;                   recover_CRC_error(*pcm_sample, crc_error_count,                                     &fr_ps, musicout, &sample_frames);                   break;                }                else crc_error_count = 0;             }             clip = 0;             for (i=0;i<SCALE_BLOCK;i++) {                I_buffer_sample(&bs,(*sample),bit_alloc,&fr_ps);                I_dequantize_sample(*sample,*fraction,bit_alloc,&fr_ps);                I_denormalize_sample((*fraction),scale_index,&fr_ps);                if(Arguments.topSb>0)        /* clear channels to 0 */                   for(j=Arguments.topSb; j<fr_ps.sblimit; ++j)                      for(k=0; k<stereo; ++k)                         (*fraction)[k][0][j] = 0;                for (j=0;j<stereo;j++) {                  // clip += SubBandSynthesis (&((*fraction)[j][0][0]), j,&((*pcm_sample)[j][0][0]));                }                out_fifo(*pcm_sample, 1, &fr_ps, done,                         musicout, &sample_frames);             }             if(clip > 0) printf("%d output samples clipped\n", clip);             break;          }          case 2: {             bitsPerSlot = 8;        samplesPerFrame = 1152;             II_decode_bitalloc(&bs, bit_alloc, &fr_ps);             II_decode_scale(&bs, scfsi, bit_alloc, scale_index, &fr_ps);             if (error_protection) {                 II_CRC_calc(&fr_ps, bit_alloc, scfsi, &new_crc);                if (new_crc != old_crc) {                   crc_error_count++;                   total_error_count++;                   recover_CRC_error(*pcm_sample, crc_error_count,                                     &fr_ps, musicout, &sample_frames);                   break;                }                else crc_error_count = 0;             }             clip = 0;             for (i=0;i<SCALE_BLOCK;i++) {                II_buffer_sample(&bs,(*sample),bit_alloc,&fr_ps);                II_dequantize_sample((*sample),bit_alloc,(*fraction),&fr_ps);                II_denormalize_sample((*fraction),scale_index,&fr_ps,i>>2);                if(Arguments.topSb>0)        /* debug : clear channels to 0 */                   for(j=Arguments.topSb; j<fr_ps.sblimit; ++j)                      for(k=0; k<stereo; ++k)                         (*fraction)[k][0][j] =                         (*fraction)[k][1][j] =                         (*fraction)[k][2][j] = 0;                for (j=0;j<3;j++) for (k=0;k<stereo;k++) {                   //clip += SubBandSynthesis (&((*fraction)[k][j][0]), k,&((*pcm_sample)[k][j][0]));                }                out_fifo(*pcm_sample, 3, &fr_ps, done, musicout,                         &sample_frames);             }             if(clip > 0) printf("%d samples clipped\n", clip);             break;          }          case 3: {             int nSlots;             int gr, ch, ss, sb, main_data_end, flush_main ;	     int  bytes_to_discard ;	     static int frame_start = 0;             bitsPerSlot = 8;                     if(fr_ps.header->version == MPEG_PHASE2_LSF)		samplesPerFrame = 576;	     else		samplesPerFrame = 1152;              III_get_side_info(&bs, &III_side_info, &fr_ps);             nSlots = main_data_slots(fr_ps);             for (; nSlots > 0; nSlots--)  /* read main data. */                hputbuf((unsigned int) getbits(&bs,8), 8);	     main_data_end = hsstell() / 8; /*of privious frame*/             if ( flush_main=(hsstell() % bitsPerSlot) ) {                 hgetbits((int)(bitsPerSlot - flush_main));		main_data_end ++;	     }             bytes_to_discard = frame_start - main_data_end 			            - III_side_info.main_data_begin ;#ifdef DEBUG_MAIN             printf("bytes_to_discard = %d\n",bytes_to_discard);#endif              if( main_data_end > 4096 )             {   frame_start -= 4096;                 rewindNbytes( 4096 );             }             frame_start += main_data_slots(fr_ps);#ifdef DEBUG_MAIN              printf("frame_start = %d\n",frame_start);#endif                          if (bytes_to_discard < 0) {         printf("Not enough main data to decode frame %d.  Frame discarded.\n",                         frameNum - 1); break;             }             for (; bytes_to_discard > 0; bytes_to_discard--) hgetbits(8);             clip = 0;             for (gr=0;gr<Max_gr;gr++) {               double lr[2][SBLIMIT][SSLIMIT],ro[2][SBLIMIT][SSLIMIT];               for (ch=0; ch<stereo; ch++) {                 long int is[SBLIMIT][SSLIMIT];   /* Quantized samples. */                 int part2_start;                 part2_start = hsstell();#ifdef DEBUG_MAIN                 printf("gr = %d, ch = %d,part2_start = %d\n",gr,ch,part2_start);#endif                 if(fr_ps.header->version != MPEG_PHASE2_LSF)                 {                    III_get_scale_factors(&III_scalefac,&III_side_info,gr,ch,			   &fr_ps,fp_scalefac);                 }                 else                 {                    III_get_LSF_scale_factors(&III_scalefac,                                                    &III_side_info,                                                    gr,ch,&fr_ps);                 }#ifdef CAPT_BS                 huffman_start = hsstell();                bit_num = 0;                for (i=huffman_start; i<huffman_start+2800; i++)                {                    fprintf(fp_capt_bs,"%x",hget1bit() & 0x1);                    bit_num ++;                    if (bit_num == 8)                    {                        fprintf(fp_capt_bs,"\n");                        bit_num = 0;                    }                     if (i == (huffman_start+2800 - 1))                    {                        exit(0);                    }                }#endif                                   III_hufman_decode(is, &III_side_info, ch, gr, part2_start,                                   &fr_ps,fp_huffman,fp_capt_codebook);                 III_dequantize_sample(is, ro[ch], &III_scalefac,                                   &(III_side_info.ch[ch].gr[gr]), ch, &fr_ps,fp_requan);               }               III_stereo(ro,lr,&III_scalefac,                            &(III_side_info.ch[0].gr[gr]), &fr_ps,fp_stereo);               for (ch=0; ch<stereo; ch++) {                    double re[SBLIMIT][SSLIMIT];                    double hybridIn[SBLIMIT][SSLIMIT];/* Hybrid filter input */                    double hybridOut[SBLIMIT][SSLIMIT];/* Hybrid filter out */                    double polyPhaseIn[SBLIMIT];     /* PolyPhase Input. */                    III_reorder (lr[ch],re,&(III_side_info.ch[ch].gr[gr]),                                  &fr_ps,fp_reorder);                    III_antialias(re, hybridIn, /* Antialias butterflies. */                                  &(III_side_info.ch[ch].gr[gr]), &fr_ps,fp_antialias);

⌨️ 快捷键说明

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