📄 musicout.c
字号:
if ((open_bit_stream_r (&bs_ext, ext_bitstream_name, BUFFER_SIZE)) == 0) { printf("No extension bitstream <%s> present \n",ext_bitstream_name); printf("Do you want to decode an MPEG 2 bitstream ? (<y>/n) : "); gets(t); if (*t == 'N' || *t == 'n') { mpeg = 1; printf("An MPEG-1 Layer II bitstream will be decoded \n"); } else { mpeg = 2; printf("An MPEG-2 Layer II bitstream will be decoded \n"); } } printf("Do you wish to write an AIFF compatible sound file ? (<y>/n) : "); gets(t); if (*t == 'N' || *t == 'n') need_aiff = FALSE; else need_aiff = TRUE; if (need_aiff) printf(">>> An AIFF compatible sound file will be written\n"); else printf(">>> A non-headered PCM sound file will be written\n"); printf("Do you want to print out all decoding information ? (y/<n>) :"); gets(t); if( *t == 'y' || *t == 'Y' ) print_out = 1; else print_out = 0; printf( "Do you wish to exit (last chance before decoding) ? (y/<n>) : "); gets(t); if (*t == 'y' || *t == 'Y') exit(0); } else /************** interpret CL Args *****************/ /* default: -write an AIFF file -print encoded bitstream information */ { int i=0, err=0;#ifdef UNIX /* default values */ need_aiff = TRUE; print_out = 0; /* 10/31/95 Ralf Schwalbe: set print_out off in CL Args */ mpeg = 2;#else need_aiff = FALSE;#endif encoded_file_name[0] = NULL_CHAR; decoded_file_name[0] = NULL_CHAR; ext_bitstream_name[0] = NULL_CHAR; while(++i<argc && err == 0) { char c, *token, *arg, *nextArg; int argUsed; token = argv[i]; if(*token++ == '-') { if(i+1 < argc) nextArg = argv[i+1]; else nextArg = ""; argUsed = 0; while((c = *token++) != 0) { if(*token /* NumericQ(token) */) arg = token; else arg = nextArg; switch(c) { case 'a': need_aiff = FALSE; break; case 'b': bits_log = 1; break; case 'd': dynx_log = 1; break; case 'h': bs_mpg.header_size = 2304; bs_ext.header_size = 2304; break; case 'i': print_out = 1; break; case 'm': mpeg = 1; break;#ifdef Augmentation_7ch case 'n': mpeg = 3; break;#endif case 'r': rate_log = 1; break; case 's': scfsi_log = 1; break; case 't': tca_log = 1; break; default: fprintf(stderr,"%s: unrecognized option %c\n", programName, c); err = 1; break; } if(argUsed) { if(arg == token) token = ""; /* no more from token */ else ++i; /* skip arg we used */ arg = ""; argUsed = 0; } } } else { if (encoded_file_name[0] == NULL_CHAR) { strcpy (encoded_file_name, argv[i]); f = strlen (encoded_file_name); strcpy (&encoded_file_name[f], DFLT_IPEXT_MPG); strcpy (ext_bitstream_name, encoded_file_name); strcpy (&ext_bitstream_name[f], DFLT_IPEXT_EXT); } else if (decoded_file_name[0] == NULL_CHAR) { strcpy (decoded_file_name, argv[i]); f = strlen (decoded_file_name); strcpy (&decoded_file_name[f], DFLT_OPEXT_DEC); } else { fprintf (stderr, "%s: excess arg %s\n", programName, argv[i]); err = 1; } } } /* end while argc */ if (bits_log || dynx_log || rate_log || scfsi_log || tca_log) any_log = 1; if (err || encoded_file_name[0] == NULL_CHAR) usage (); /* never returns */ if ((open_bit_stream_r (&bs_ext, ext_bitstream_name, BUFFER_SIZE)) == 0) { printf("No extension bitstream <%s> present \n", ext_bitstream_name); ext_bitstream_name[0] = NULL_CHAR; } if (decoded_file_name[0] == NULL_CHAR) { f = strlen (encoded_file_name) - 4; strcpy (decoded_file_name, encoded_file_name); strcpy (&decoded_file_name[f], DFLT_OPEXT_DEC); } } /* else arg-line end */ /* JMZ 10/03/1995 Multilingual */ strcpy(decoded_file_name_ml, decoded_file_name); strcat(decoded_file_name_ml, DFLT_OPEXT_ML); /* report results of dialog / command line */ printf("Input file = '%s' \nOutput file = '%s' ", encoded_file_name, decoded_file_name); if (mpeg >= 2 && ext_bitstream_name[0] != NULL_CHAR) printf("Ext_bitstream = '%s'\n", ext_bitstream_name); if(mpeg == 1) printf(">>>\nA MPEG 1 Layer-1/2 bitstream will be decoded\n"); else printf(">>>\nA MPEG 2 Layer-1/2 bitstream will be decoded\n"); if(need_aiff) printf("Output file written in AIFF format\n"); if ((musicout = fopen(decoded_file_name, "w+b")) == NULL) { fprintf (stderr, "Could not create \"%s\".\n", decoded_file_name); exit (1); } if (open_bit_stream_r (&bs_mpg, encoded_file_name, BUFFER_SIZE) == 0) { fprintf (stderr, "Could not open \"%s\".\n", encoded_file_name); exit (1); } if (need_aiff) if (aiff_seek_to_sound_data(musicout) == -1) { fprintf (stderr, "Could not seek to PCM sound data in \"%s\".\n", decoded_file_name); exit (1); } sample_frames = 0; sample_frames_ml = 0; total_error_count = total_error_count_mc = 0;#ifdef Augmentation_7ch total_error_count_aug = 0;#endif while (!end_bs (&bs_mpg)) { /****************************************************************/ /* */ /* START OF FRAME LOOP */ /* */ /****************************************************************/ sync = seek_sync_mpg (&bs_mpg); frameBits = bs_mpg.totbits; if (!sync) { printf("\nFrame cannot be located, end of input stream \n"); done = TRUE; /* finally write out the buffer */ out_fifo (*pcm_sample, 3, &fr_ps, done, musicout, &sample_frames, channels); out_fifo_ml (*pcm_sample_ml, 3, &fr_ps, done, musicout_ml, &sample_frames_ml); break; } info.lfe = 0; /* R.S. ! */ decode_info (&bs_mpg, &fr_ps); hdr_to_frps (&fr_ps); stereo = fr_ps.stereo; error_protection = info.error_protection; crc_error_count = 0; if (frameNum == 0) WriteHdr (&fr_ps, stdout); /* printout layer/mode */ if (frameNum % frameMod == 0) { fprintf(stderr, "{%4lu}\r", frameNum++); fflush(stderr); if (frameNum / frameMod >= 100) frameMod *= 10; } else frameNum++; Frame_Bits = 144*Bitrate/S_freq; if(info.padding) Frame_Bits++; /* R.Schwalbe add a padding byte */ Frame_Bits*=8; /* R.Schwalbe to get bits per frame *8 */ if (error_protection) buffer_CRC(&bs_mpg, &old_crc); /* 7/8/95 added message WtK 7/8/95 */ if (info.lay == 3) { fprintf (stderr, "\nLayer = %d, not supported.\nexit.\n\n",info.lay); break; exit (1); } bs_mc.totbits = bs_mc.curpos = 0; if (info.lay == 1) { if (mpeg > 1) layer_I_frames = 3; else layer_I_frames = 1; for (part = 0; part < layer_I_frames; part++) { bitsPerSlot = 32; samplesPerFrame = 384; ch_start = 0; channels = stereo; if (part > 0) { sync = seek_sync_mpg (&bs_mpg); frameBits = bs_mpg.totbits; if (!sync) { fprintf (stderr, "2nd or 3th Frame cannot be located, end of input stream\n"); exit (1); } decode_info (&bs_mpg, &fr_ps); hdr_to_frps (&fr_ps); stereo = fr_ps.stereo; error_protection = info.error_protection; crc_error_count = 0; Frame_Bits = 12*Bitrate/S_freq; if (info.padding) Frame_Bits++; /* R.Schwalbe add a padding byte */ Frame_Bits *=32; /* R.Schwalbe to get bits per frame *32 */ if (error_protection) buffer_CRC (&bs_mpg, &old_crc); /* 7/8/95 added message WtK 7/8/95 */ if (info.lay != 1) { fprintf (stderr, "Change of Layer = %d, not supported.\nexit.\n\n", info.lay); exit (1); } } I_decode_bitalloc (&bs_mpg, &fr_ps, I_bit_alloc[part], bits_log); I_decode_scale (&bs_mpg, &fr_ps, I_bit_alloc[part], scale_index, part, scfsi_log); if (error_protection) { I_CRC_calc (&fr_ps, I_bit_alloc[part], &new_crc); if (new_crc != old_crc) { printf(" \n ERROR in LAYER 1 - CRC! \n"); crc_error_count++; total_error_count++; recover_CRC_error (*pcm_sample, crc_error_count, &fr_ps, musicout, &sample_frames, channels); } else crc_error_count = 0; } clip = 0; for (i=0;i<12;i++) { I_buffer_sample (&bs_mpg, &fr_ps, (*sample), I_bit_alloc[part]);if (!any_log){ I_dequantize_sample ((*sample), part, I_bit_alloc[part], *fraction, &fr_ps, &i); I_denormalize_sample (*fraction, scale_index, part, &fr_ps, &i);} } /* end of for loop */ if (mpeg > 1) { while (bs_mpg.curpos < bs_mpg.totbits-1) bs_mc.bits[bs_mc.totbits++] = bs_mpg.bits[bs_mpg.curpos++]; if (part == 0) { mc_header (&bs_mc, &fr_ps); mc_hdr_to_frps (&fr_ps); } bs_mc.totbits -= fr_ps.header->n_ad_bytes * 8; } } if (mpeg > 1) { if (fr_ps.header->ext_bit_stream_present) { sync = seek_sync_ext (&bs_ext, &fr_ps);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -