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

📄 musicin.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    *num_samples = audio_bytes/(audio_bits/8);    if (brt==0)	{        if (info->lay==2)            brt = (info->mode == MPG_MD_MONO) ? 112 : 224;        else            brt = (info->mode == MPG_MD_MONO) ? 192 : 384;	}    for(j=0;j<15;j++) if (bitrate[info->lay-1][j] == brt) break;    if (j==15)        mjpeg_error_exit1("Bitrate of %d KBit/s not allowed!",brt);    info->bitrate_index = j;    if(info->lay==2 && brt>192 && info->mode==MPG_MD_MONO)        mjpeg_error_exit1("Bitrate of %d KBit/s not allowed for MONO",brt);    open_bit_stream_w(&bs, *encoded_file_name, BUFFER_SIZE);}/* * print_config * * PURPOSE:  Prints the encoding parameters used*/voidprint_config(fr_ps, psy, num_samples, outPath)frame_params *fr_ps;int     *psy;unsigned long *num_samples;char    *outPath;{	layer *info = fr_ps->header;	mjpeg_debug("Encoding configuration:");	if(info->mode != MPG_MD_JOINT_STEREO)		mjpeg_debug("Layer=%s   mode=%s   extn=%d   psy model=%d",					layer_names[info->lay-1], mode_names[info->mode],					info->mode_ext, *psy);	else mjpeg_debug("Layer=%s   mode=%s   extn=data dependant   psy model=%d",					 layer_names[info->lay-1], mode_names[info->mode], *psy);	mjpeg_debug("samp frq=%.1f kHz   total bitrate=%d kbps",				s_freq[info->sampling_frequency],				bitrate[info->lay-1][info->bitrate_index]);	mjpeg_debug("de-emph=%d   c/right=%d   orig=%d   errprot=%d",				info->emphasis, info->copyright, info->original,				info->error_protection);	mjpeg_debug("output file: '%s'", outPath);} /* * main * * PURPOSE:  MPEG I Encoder supporting layers 1 and 2, and * psychoacoustic models 1 (MUSICAM) and 2 (AT&T) * * SEMANTICS:  One overlapping frame of audio of up to 2 channels are * processed at a time in the following order: * (associated routines are in parentheses) * * 1.  Filter sliding window of data to get 32 subband * samples per channel. * (window_subband,filter_subband) * * 2.  If joint stereo mode, combine left and right channels * for subbands above #jsbound#. * (*_combine_LR) * * 3.  Calculate scalefactors for the frame, and if layer 2, * also calculate scalefactor select information. * (*_scale_factor_calc) * * 4.  Calculate psychoacoustic masking levels using selected * psychoacoustic model. * (*_Psycho_One, psycho_anal) * * 5.  Perform iterative bit allocation for subbands with low * mask_to_noise ratios using masking levels from step 4. * (*_main_bit_allocation) * * 6.  If error protection flag is active, add redundancy for * error protection. * (*_CRC_calc) * * 7.  Pack bit allocation, scalefactors, and scalefactor select * information (layer 2) onto bitstream. * (*_encode_bit_alloc,*_encode_scale,II_transmission_pattern) * * 8.  Quantize subbands and pack them into bitstream * (*_subband_quantization, *_sample_encoding)*/ int main(argc, argv)int     argc;char    **argv;{typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT];    SBS  *sb_sample;typedef double JSBS[3][SCALE_BLOCK][SBLIMIT];    JSBS *j_sample;typedef double IN[2][HAN_SIZE];    IN   *win_que;typedef unsigned int SUB[2][3][SCALE_BLOCK][SBLIMIT];    SUB  *subband;     frame_params fr_ps;    layer info;    char *encoded_file_name;    short **win_buf;static short buffer[2][1152];static unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];static unsigned int scalar[2][3][SBLIMIT], j_scale[3][SBLIMIT];static double ltmin[2][SBLIMIT], lgmin[2][SBLIMIT], max_sc[2][SBLIMIT];    FLOAT snr32[32];    short sam[2][1056];    int whole_SpF, extra_slot = 0;    double avg_slots_per_frame, frac_SpF, slot_lag;    int model, stereo, error_protection;static unsigned int crc;    int i, j, k, adb;    unsigned long bitsPerSlot, samplesPerFrame, frameNum = 0;    unsigned long frameBits, sentBits = 0;    unsigned long num_samples;    /* Most large variables are declared dynamically to ensure       compatibility with smaller machines */    sb_sample = (SBS *) mem_alloc(sizeof(SBS), "sb_sample");    j_sample = (JSBS *) mem_alloc(sizeof(JSBS), "j_sample");    win_que = (IN *) mem_alloc(sizeof(IN), "Win_que");    subband = (SUB *) mem_alloc(sizeof(SUB),"subband");    win_buf = (short **) mem_alloc(sizeof(short *)*2, "win_buf");     /* clear buffers */    memset((char *) buffer, 0, sizeof(buffer));    memset((char *) bit_alloc, 0, sizeof(bit_alloc));    memset((char *) scalar, 0, sizeof(scalar));    memset((char *) j_scale, 0, sizeof(j_scale));    memset((char *) scfsi, 0, sizeof(scfsi));    memset((char *) ltmin, 0, sizeof(ltmin));    memset((char *) lgmin, 0, sizeof(lgmin));    memset((char *) max_sc, 0, sizeof(max_sc));    memset((char *) snr32, 0, sizeof(snr32));    memset((char *) sam, 0, sizeof(sam));     fr_ps.header = &info;    fr_ps.tab_num = -1;             /* no table loaded */    fr_ps.alloc = NULL;    info.version = MPEG_AUDIO_ID;    programName = argv[0];    get_params(argc, argv, &fr_ps, &model, &num_samples, &encoded_file_name);    print_config(&fr_ps, &model, &num_samples, encoded_file_name);    hdr_to_frps(&fr_ps);    stereo = fr_ps.stereo;    error_protection = info.error_protection;     if (info.lay == 1) { bitsPerSlot = 32; samplesPerFrame = 384;  }    else               { bitsPerSlot = 8;  samplesPerFrame = 1152; }    /* Figure average number of 'slots' per frame. */    /* Bitrate means TOTAL for both channels, not per side. */    avg_slots_per_frame = ((double)samplesPerFrame /                           s_freq[info.sampling_frequency]) *                          ((double)bitrate[info.lay-1][info.bitrate_index] /                           (double)bitsPerSlot);    whole_SpF = (int) avg_slots_per_frame;    frac_SpF  = avg_slots_per_frame - (double)whole_SpF;    slot_lag  = -frac_SpF;	mjpeg_info("SpF=%d, frac SpF=%.3f, bitrate=%d kbps, sfreq=%.1f kHz",	   whole_SpF, frac_SpF,           bitrate[info.lay-1][info.bitrate_index],           s_freq[info.sampling_frequency]);     if (frac_SpF != 0)       mjpeg_info("Fractional number of slots, padding required");    else info.padding = 0;     while (get_audio(musicin, buffer, num_samples, stereo, info.lay) != 0) {       frameNum++;       win_buf[0] = &buffer[0][0];       win_buf[1] = &buffer[1][0];       if (frac_SpF != 0) {          if (slot_lag > (frac_SpF-1.0) ) {             slot_lag -= frac_SpF;             extra_slot = 0;             info.padding = 0;          }          else {             extra_slot = 1;             info.padding = 1;             slot_lag += (1-frac_SpF);          }       }       adb = (whole_SpF+extra_slot) * bitsPerSlot;       switch (info.lay) { /***************************** Layer I **********************************/           case 1 :             for (j=0;j<SCALE_BLOCK;j++)             for (k=0;k<stereo;k++) {                window_subband(&win_buf[k], &(*win_que)[k][0], k);                filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][0][j][0]);             }             I_scale_factor_calc(*sb_sample, scalar, stereo);             if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) {                I_combine_LR(*sb_sample, *j_sample);                I_scale_factor_calc(j_sample, &j_scale, 1);             }              put_scale(scalar, &fr_ps, max_sc);              if (model == 1) I_Psycho_One(buffer, max_sc, ltmin, &fr_ps);             else {                for (k=0;k<stereo;k++) {                   psycho_anal(&buffer[k][0],&sam[k][0], k, info.lay, snr32,                               (FLOAT)s_freq[info.sampling_frequency]*1000);                   for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i];                }             }              I_main_bit_allocation(ltmin, bit_alloc, &adb, &fr_ps);              if (error_protection) I_CRC_calc(&fr_ps, bit_alloc, &crc);              encode_info(&fr_ps, &bs);              if (error_protection) encode_CRC(crc, &bs);              I_encode_bit_alloc(bit_alloc, &fr_ps, &bs);             I_encode_scale(scalar, bit_alloc, &fr_ps, &bs);             I_subband_quantization(scalar, *sb_sample, j_scale, *j_sample,                                    bit_alloc, *subband, &fr_ps);             I_sample_encoding(*subband, bit_alloc, &fr_ps, &bs);             for (i=0;i<adb;i++) put1bit(&bs, 0);          break; /***************************** Layer 2 **********************************/           case 2 :             for (i=0;i<3;i++) for (j=0;j<SCALE_BLOCK;j++)                for (k=0;k<stereo;k++) {                   window_subband(&win_buf[k], &(*win_que)[k][0], k);                   filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][i][j][0]);                }                 II_scale_factor_calc(*sb_sample, scalar, stereo, fr_ps.sblimit);                pick_scale(scalar, &fr_ps, max_sc);                if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) {                   II_combine_LR(*sb_sample, *j_sample, fr_ps.sblimit);                   II_scale_factor_calc(j_sample, &j_scale, 1, fr_ps.sblimit);                }       /* this way we calculate more mono than we need */                        /* but it is cheap */                 if (model == 1) II_Psycho_One(buffer, max_sc, ltmin, &fr_ps);                else {                   for (k=0;k<stereo;k++) {                      psycho_anal(&buffer[k][0],&sam[k][0], k,                                  info.lay, snr32,                                 (FLOAT)s_freq[info.sampling_frequency]*1000);                      for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i];                   }                }                 II_transmission_pattern(scalar, scfsi, &fr_ps);                II_main_bit_allocation(ltmin, scfsi, bit_alloc, &adb, &fr_ps);                 if (error_protection)                   II_CRC_calc(&fr_ps, bit_alloc, scfsi, &crc);                 encode_info(&fr_ps, &bs);                 if (error_protection) encode_CRC(crc, &bs);                 II_encode_bit_alloc(bit_alloc, &fr_ps, &bs);                II_encode_scale(bit_alloc, scfsi, scalar, &fr_ps, &bs);                II_subband_quantization(scalar, *sb_sample, j_scale,                                      *j_sample, bit_alloc, *subband, &fr_ps);                II_sample_encoding(*subband, bit_alloc, &fr_ps, &bs);                for (i=0;i<adb;i++) put1bit(&bs, 0);          break; /***************************** Layer 3 **********************************/          case 3 : break;       }        frameBits = sstell(&bs) - sentBits;       if(frameBits%bitsPerSlot)   /* a program failure */          mjpeg_error("Sent %ld bits = %ld slots plus %ld",                  frameBits, frameBits/bitsPerSlot,                  frameBits%bitsPerSlot);       sentBits += frameBits;    }    close_bit_stream_w(&bs);	mjpeg_info("Num frames %ld Avg slots/frame = %.3f; b/smp = %.2f; br = %.3f kbps",	   frameNum,           (FLOAT) sentBits / (frameNum * bitsPerSlot),           (FLOAT) sentBits / (frameNum * samplesPerFrame),           (FLOAT) sentBits / (frameNum * samplesPerFrame) *                               s_freq[info.sampling_frequency]);	mjpeg_info("Encoding to layer %d with psychoacoustic model %d is finished", info.lay, model);	mjpeg_info("The MPEG encoded output file name is \"%s\"",			   encoded_file_name);    exit(0);}

⌨️ 快捷键说明

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