lame.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:41k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * LAME MP3 encoding engine
  3.  *
  4.  * Copyright (c) 1999 Mark Taylor
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Library General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Library General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Library General Public
  17.  * License along with this library; if not, write to the
  18.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  19.  * Boston, MA 02111-1307, USA.
  20.  */
  21. #include <assert.h>
  22. #ifdef HAVEGTK
  23. #include "gtkanal.h"
  24. #include <gtk/gtk.h>
  25. #endif
  26. #include "lame.h"
  27. #include "util.h"
  28. #include "timestatus.h"
  29. #include "psymodel.h"
  30. #include "newmdct.h"
  31. #include "quantize.h"
  32. #include "quantize-pvt.h"
  33. #include "l3bitstream.h"
  34. #include "formatBitstream.h"
  35. #include "version.h"
  36. #include "VbrTag.h"
  37. #include "id3tag.h"
  38. #include "tables.h"
  39. #include "brhist.h"
  40. #include "get_audio.h"
  41. #ifdef __riscos__
  42. #include "asmstuff.h"
  43. #endif
  44. /* Global variable definitions for lame.c */
  45. static Bit_stream_struc   bs;
  46. static III_side_info_t l3_side;
  47. #define MFSIZE (1152+1152+ENCDELAY-MDCTDELAY)
  48. static short int mfbuf[2][MFSIZE];
  49. static int mf_size;
  50. static int mf_samples_to_encode;
  51. /********************************************************************
  52.  *   initialize internal params based on data in gf
  53.  *   (globalflags struct filled in by calling program)
  54.  *
  55.  ********************************************************************/
  56. void lame_init_params(lame_global_flags *gfp)
  57. {
  58.   int i;
  59.   FLOAT compression_ratio;
  60.   memset(&bs, 0, sizeof(Bit_stream_struc));
  61.   memset(&l3_side,0x00,sizeof(III_side_info_t));
  62.   gfp->frameNum=0;
  63.   InitFormatBitStream();
  64.   if (gfp->num_channels==1) {
  65.     gfp->mode = MPG_MD_MONO;
  66.   }
  67.   gfp->stereo=2;
  68.   if (gfp->mode == MPG_MD_MONO) gfp->stereo=1;
  69. #ifdef BRHIST
  70.   if (gfp->silent) {
  71.     disp_brhist=0;  /* turn of VBR historgram */
  72.   }
  73.   if (!gfp->VBR) {
  74.     disp_brhist=0;  /* turn of VBR historgram */
  75.   }
  76. #endif
  77.   /* set the output sampling rate, and resample options if necessary
  78.      samplerate = input sample rate
  79.      resamplerate = ouput sample rate
  80.   */
  81.   if (gfp->out_samplerate==0) {
  82.     /* user did not specify output sample rate */
  83.     gfp->out_samplerate=gfp->in_samplerate;   /* default */
  84.     /* if resamplerate is not valid, find a valid value */
  85.     if (gfp->out_samplerate>=48000) gfp->out_samplerate=48000;
  86.     else if (gfp->out_samplerate>=44100) gfp->out_samplerate=44100;
  87.     else if (gfp->out_samplerate>=32000) gfp->out_samplerate=32000;
  88.     else if (gfp->out_samplerate>=24000) gfp->out_samplerate=24000;
  89.     else if (gfp->out_samplerate>=22050) gfp->out_samplerate=22050;
  90.     else gfp->out_samplerate=16000;
  91.     if (gfp->brate>0) {
  92.       /* check if user specified bitrate requires downsampling */
  93.       compression_ratio = gfp->out_samplerate*16*gfp->stereo/(1000.0*gfp->brate);
  94.       if (!gfp->VBR && compression_ratio > 13 ) {
  95. /* automatic downsample, if possible */
  96. gfp->out_samplerate = (10*1000.0*gfp->brate)/(16*gfp->stereo);
  97. if (gfp->out_samplerate<=16000) gfp->out_samplerate=16000;
  98. else if (gfp->out_samplerate<=22050) gfp->out_samplerate=22050;
  99. else if (gfp->out_samplerate<=24000) gfp->out_samplerate=24000;
  100. else if (gfp->out_samplerate<=32000) gfp->out_samplerate=32000;
  101. else if (gfp->out_samplerate<=44100) gfp->out_samplerate=44100;
  102. else gfp->out_samplerate=48000;
  103.       }
  104.     }
  105.   }
  106.   gfp->mode_gr = (gfp->out_samplerate <= 24000) ? 1 : 2;  /* mode_gr = 2 */
  107.   gfp->encoder_delay = ENCDELAY;
  108.   gfp->framesize = gfp->mode_gr*576;
  109.   if (gfp->brate==0) { /* user didn't specify a bitrate, use default */
  110.     gfp->brate=128;
  111.     if (gfp->mode_gr==1) gfp->brate=64;
  112.   }
  113.   gfp->resample_ratio=1;
  114.   if (gfp->out_samplerate != gfp->in_samplerate) gfp->resample_ratio = (FLOAT)gfp->in_samplerate/(FLOAT)gfp->out_samplerate;
  115.   /* estimate total frames.  must be done after setting sampling rate so
  116.    * we know the framesize.  */
  117.   gfp->totalframes=0;
  118.   gfp->totalframes = 2+ gfp->num_samples/(gfp->resample_ratio*gfp->framesize);
  119.   /* 44.1kHz at 56kbs/channel: compression factor of 12.6
  120.      44.1kHz at 64kbs/channel: compression factor of 11.025
  121.      44.1kHz at 80kbs/channel: compression factor of 8.82
  122.      22.05kHz at 24kbs:  14.7
  123.      22.05kHz at 32kbs:  11.025
  124.      22.05kHz at 40kbs:  8.82
  125.      16kHz at 16kbs:  16.0
  126.      16kHz at 24kbs:  10.7
  127.      compression_ratio
  128.         11                                .70?
  129.         12                   sox resample .66
  130.         14.7                 sox resample .45
  131.   */
  132.   if (gfp->brate >= 320) gfp->VBR=0;  /* dont bother with VBR at 320kbs */
  133.   compression_ratio = gfp->out_samplerate*16*gfp->stereo/(1000.0*gfp->brate);
  134.   /* for VBR, take a guess at the compression_ratio */
  135.   /* VBR_q           compression       like
  136.      0                4.4             320kbs
  137.      1                5.4             256kbs
  138.      3                7.4             192kbs
  139.      4                8.8             160kbs
  140.      6                10.4            128kbs
  141.   */
  142.   if (gfp->VBR && compression_ratio>11) {
  143.     compression_ratio = 4.4 + gfp->VBR_q;
  144.   }
  145.   /* At higher quality (lower compression) use STEREO instead of JSTEREO.
  146.    * (unless the user explicitly specified a mode ) */
  147.   if ( (!gfp->mode_fixed) && (gfp->mode !=MPG_MD_MONO)) {
  148.     if (compression_ratio < 9 ) {
  149.       gfp->mode = MPG_MD_STEREO;
  150.     }
  151.   }
  152.   /****************************************************************/
  153.   /* if a filter has not been enabled, see if we should add one: */
  154.   /****************************************************************/
  155.   if (gfp->lowpassfreq == 0) {
  156.     /* If the user has not selected their own filter, add a lowpass
  157.      * filter based on the compression ratio.  Formula based on
  158.           44.1   /160    4.4x
  159.           44.1   /128    5.5x      keep all bands
  160.           44.1   /96kbs  7.3x      keep band 28
  161.           44.1   /80kbs  8.8x      keep band 25
  162.           44.1khz/64kbs  11x       keep band 21  22?
  163.   16khz/24kbs  10.7x       keep band 21
  164.   22kHz/32kbs  11x         keep band ?
  165.   22kHz/24kbs  14.7x       keep band 16
  166.           16    16     16x         keep band 14
  167.     */
  168.     /* Should we use some lowpass filters? */
  169.     int band = 1+floor(.5 + 14-18*log(compression_ratio/16.0));
  170.     if (band < 31) {
  171.       gfp->lowpass1 = band/31.0;
  172.       gfp->lowpass2 = band/31.0;
  173.     }
  174.   }
  175.   /****************************************************************/
  176.   /* apply user driven filters*/
  177.   /****************************************************************/
  178.   if ( gfp->highpassfreq > 0 ) {
  179.     gfp->highpass1 = 2.0*gfp->highpassfreq/gfp->out_samplerate; /* will always be >=0 */
  180.     if ( gfp->highpasswidth >= 0 ) {
  181.       gfp->highpass2 = 2.0*(gfp->highpassfreq+gfp->highpasswidth)/gfp->out_samplerate;
  182.     } else {
  183.       /* 15% above on default */
  184.       /* gfp->highpass2 = 1.15*2.0*gfp->highpassfreq/gfp->out_samplerate;  */
  185.       gfp->highpass2 = 1.00*2.0*gfp->highpassfreq/gfp->out_samplerate; 
  186.     }
  187.     gfp->highpass1 = Min( 1, gfp->highpass1 );
  188.     gfp->highpass2 = Min( 1, gfp->highpass2 );
  189.   }
  190.   if ( gfp->lowpassfreq > 0 ) {
  191.     gfp->lowpass2 = 2.0*gfp->lowpassfreq/gfp->out_samplerate; /* will always be >=0 */
  192.     if ( gfp->lowpasswidth >= 0 ) {
  193.       gfp->lowpass1 = 2.0*(gfp->lowpassfreq-gfp->lowpasswidth)/gfp->out_samplerate;
  194.       if ( gfp->lowpass1 < 0 ) { /* has to be >= 0 */
  195. gfp->lowpass1 = 0;
  196.       }
  197.     } else {
  198.       /* 15% below on default */
  199.       /* gfp->lowpass1 = 0.85*2.0*gfp->lowpassfreq/gfp->out_samplerate;  */
  200.       gfp->lowpass1 = 1.00*2.0*gfp->lowpassfreq/gfp->out_samplerate;
  201.     }
  202.     gfp->lowpass1 = Min( 1, gfp->lowpass1 );
  203.     gfp->lowpass2 = Min( 1, gfp->lowpass2 );
  204.   }
  205.   /***************************************************************/
  206.   /* compute info needed for polyphase filter                    */
  207.   /***************************************************************/
  208.   if (gfp->filter_type==0) {
  209.     int band,maxband,minband;
  210.     FLOAT8 amp,freq;
  211.     if (gfp->lowpass1 > 0) {
  212.       minband=999;
  213.       maxband=-1;
  214.       for (band=0;  band <=31 ; ++band) { 
  215. freq = band/31.0;
  216. amp = 1;
  217. /* this band and above will be zeroed: */
  218. if (freq >= gfp->lowpass2) {
  219.   gfp->lowpass_band= Min(gfp->lowpass_band,band);
  220.   amp=0;
  221. }
  222. if (gfp->lowpass1 < freq && freq < gfp->lowpass2) {
  223.           minband = Min(minband,band);
  224.           maxband = Max(maxband,band);
  225.   amp = cos((PI/2)*(gfp->lowpass1-freq)/(gfp->lowpass2-gfp->lowpass1));
  226. }
  227. /* printf("lowpass band=%i  amp=%f n",band,amp);*/
  228.       }
  229.       /* compute the *actual* transition band implemented by the polyphase filter */
  230.       if (minband==999) gfp->lowpass1 = (gfp->lowpass_band-.75)/31.0;
  231.       else gfp->lowpass1 = (minband-.75)/31.0;
  232.       gfp->lowpass2 = gfp->lowpass_band/31.0;
  233.     }
  234.     /* make sure highpass filter is within 90% of whan the effective highpass
  235.      * frequency will be */
  236.     if (gfp->highpass2 > 0) 
  237.       if (gfp->highpass2 <  .9*(.75/31.0) ) {
  238. gfp->highpass1=0; gfp->highpass2=0;
  239. fprintf(stderr,"Warning: highpass filter disabled.  highpass frequency to smalln");
  240.       }
  241.     
  242.     if (gfp->highpass2 > 0) {
  243.       minband=999;
  244.       maxband=-1;
  245.       for (band=0;  band <=31; ++band) { 
  246. freq = band/31.0;
  247. amp = 1;
  248. /* this band and below will be zereod */
  249. if (freq <= gfp->highpass1) {
  250.   gfp->highpass_band = Max(gfp->highpass_band,band);
  251.   amp=0;
  252. }
  253. if (gfp->highpass1 < freq && freq < gfp->highpass2) {
  254.           minband = Min(minband,band);
  255.           maxband = Max(maxband,band);
  256.   amp = cos((PI/2)*(gfp->highpass2-freq)/(gfp->highpass2-gfp->highpass1));
  257. }
  258. /* printf("highpass band=%i  amp=%f n",band,amp);*/
  259.       }
  260.       /* compute the *actual* transition band implemented by the polyphase filter */
  261.       gfp->highpass1 = gfp->highpass_band/31.0;
  262.       if (maxband==-1) gfp->highpass2 = (gfp->highpass_band+.75)/31.0;
  263.       else gfp->highpass2 = (maxband+.75)/31.0;
  264.     }
  265.     /*
  266.     printf("lowpass band with amp=0:  %i n",gfp->lowpass_band);
  267.     printf("highpass band with amp=0:  %i n",gfp->highpass_band);
  268.     */
  269.   }
  270.   /***************************************************************/
  271.   /* compute info needed for FIR filter */
  272.   /***************************************************************/
  273.   if (gfp->filter_type==1) {
  274.   }
  275.   gfp->mode_ext=MPG_MD_LR_LR;
  276.   gfp->stereo = (gfp->mode == MPG_MD_MONO) ? 1 : 2;
  277.   gfp->samplerate_index = SmpFrqIndex((long)gfp->out_samplerate, &gfp->version);
  278.   if( gfp->samplerate_index < 0) {
  279.     display_bitrates(stderr);
  280.     exit(1);
  281.   }
  282.   if( (gfp->bitrate_index = BitrateIndex(gfp->brate, gfp->version,gfp->out_samplerate)) < 0) {
  283.     display_bitrates(stderr);
  284.     exit(1);
  285.   }
  286.   /* choose a min/max bitrate for VBR */
  287.   if (gfp->VBR) {
  288.     /* if the user didn't specify VBR_max_bitrate: */
  289.     if (0==gfp->VBR_max_bitrate_kbps) {
  290.       /* default max bitrate is 256kbs */
  291.       /* we do not normally allow 320bps frams with VBR, unless: */
  292.       gfp->VBR_max_bitrate=13;   /* default: allow 256kbs */
  293.       if (gfp->VBR_min_bitrate_kbps>=256) gfp->VBR_max_bitrate=14;
  294.       if (gfp->VBR_q == 0) gfp->VBR_max_bitrate=14;   /* allow 320kbs */
  295.       if (gfp->VBR_q >= 4) gfp->VBR_max_bitrate=12;   /* max = 224kbs */
  296.       if (gfp->VBR_q >= 8) gfp->VBR_max_bitrate=9;    /* low quality, max = 128kbs */
  297.     }else{
  298.       if( (gfp->VBR_max_bitrate  = BitrateIndex(gfp->VBR_max_bitrate_kbps, gfp->version,gfp->out_samplerate)) < 0) {
  299. display_bitrates(stderr);
  300. exit(1);
  301.       }
  302.     }
  303.     if (0==gfp->VBR_min_bitrate_kbps) {
  304.       gfp->VBR_min_bitrate=1;  /* 32 kbps */
  305.     }else{
  306.       if( (gfp->VBR_min_bitrate  = BitrateIndex(gfp->VBR_min_bitrate_kbps, gfp->version,gfp->out_samplerate)) < 0) {
  307. display_bitrates(stderr);
  308. exit(1);
  309.       }
  310.     }
  311.   }
  312.   if (gfp->VBR) gfp->quality=Min(gfp->quality,2);    /* always use quality <=2  with VBR */
  313.   /* dont allow forced mid/side stereo for mono output */
  314.   if (gfp->mode == MPG_MD_MONO) gfp->force_ms=0;
  315.   /* Do not write VBR tag if VBR flag is not specified */
  316.   if (gfp->VBR==0) gfp->bWriteVbrTag=0;
  317.   /* some file options not allowed if output is: not specified or stdout */
  318.   if (gfp->outPath!=NULL && gfp->outPath[0]=='-' ) {
  319.     gfp->bWriteVbrTag=0; /* turn off VBR tag */
  320.   }
  321.   if (gfp->outPath==NULL || gfp->outPath[0]=='-' ) {
  322.     id3tag.used=0;         /* turn of id3 tagging */
  323.   }
  324.   if (gfp->gtkflag) {
  325.     gfp->bWriteVbrTag=0;  /* disable Xing VBR tag */
  326.   }
  327.   init_bit_stream_w(&bs);
  328.   /* set internal feature flags.  USER should not access these since
  329.    * some combinations will produce strange results */
  330.   /* no psymodel, no noise shaping */
  331.   if (gfp->quality==9) {
  332.     gfp->filter_type=0;
  333.     gfp->psymodel=0;
  334.     gfp->quantization=0;
  335.     gfp->noise_shaping=0;
  336.     gfp->noise_shaping_stop=0;
  337.     gfp->use_best_huffman=0;
  338.   }
  339.   if (gfp->quality==8) gfp->quality=7;
  340.   /* use psymodel (for short block and m/s switching), but no noise shapping */
  341.   if (gfp->quality==7) {
  342.     gfp->filter_type=0;
  343.     gfp->psymodel=1;
  344.     gfp->quantization=0;
  345.     gfp->noise_shaping=0;
  346.     gfp->noise_shaping_stop=0;
  347.     gfp->use_best_huffman=0;
  348.   }
  349.   if (gfp->quality==6) gfp->quality=5;
  350.   if (gfp->quality==5) {
  351.     /* the default */
  352.     gfp->filter_type=0;
  353.     gfp->psymodel=1;
  354.     gfp->quantization=0;
  355.     gfp->noise_shaping=1;
  356.     gfp->noise_shaping_stop=0;
  357.     gfp->use_best_huffman=0;
  358.   }
  359.   if (gfp->quality==4) gfp->quality=2;
  360.   if (gfp->quality==3) gfp->quality=2;
  361.   if (gfp->quality==2) {
  362.     gfp->filter_type=0;
  363.     gfp->psymodel=1;
  364.     gfp->quantization=1;
  365.     gfp->noise_shaping=1;
  366.     gfp->noise_shaping_stop=0;
  367.     gfp->use_best_huffman=1;
  368.   }
  369.   if (gfp->quality==1) {
  370.     gfp->filter_type=0;
  371.     gfp->psymodel=1;
  372.     gfp->quantization=1;
  373.     gfp->noise_shaping=1;
  374.     gfp->noise_shaping_stop=1;
  375.     gfp->use_best_huffman=1;
  376.   }
  377.   if (gfp->quality==0) {
  378.     /* 0..1 quality */
  379.     gfp->filter_type=1;         /* not yet coded */
  380.     gfp->psymodel=1;
  381.     gfp->quantization=1;
  382.     gfp->noise_shaping=3;       /* not yet coded */
  383.     gfp->noise_shaping_stop=2;  /* not yet coded */
  384.     gfp->use_best_huffman=2;   /* not yet coded */
  385.     exit(-99);
  386.   }
  387.   for (i = 0; i < SBMAX_l + 1; i++) {
  388.     scalefac_band.l[i] =
  389.       sfBandIndex[gfp->samplerate_index + (gfp->version * 3)].l[i];
  390.   }
  391.   for (i = 0; i < SBMAX_s + 1; i++) {
  392.     scalefac_band.s[i] =
  393.       sfBandIndex[gfp->samplerate_index + (gfp->version * 3)].s[i];
  394.   }
  395.   if (gfp->bWriteVbrTag)
  396.     {
  397.       /* Write initial VBR Header to bitstream */
  398.       InitVbrTag(&bs,1-gfp->version,gfp->mode,gfp->samplerate_index);
  399.     }
  400. #ifdef HAVEGTK
  401.   gtkflag=gfp->gtkflag;
  402. #endif
  403. #ifdef BRHIST
  404.   if (gfp->VBR) {
  405.     if (disp_brhist)
  406.       brhist_init(gfp,1, 14);
  407.   } else
  408.     disp_brhist = 0;
  409. #endif
  410.   return;
  411. }
  412. /************************************************************************
  413.  *
  414.  * print_config
  415.  *
  416.  * PURPOSE:  Prints the encoding parameters used
  417.  *
  418.  ************************************************************************/
  419. void lame_print_config(lame_global_flags *gfp)
  420. {
  421.   static const char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };
  422.   FLOAT out_samplerate=gfp->out_samplerate/1000.0;
  423.   FLOAT in_samplerate = gfp->resample_ratio*out_samplerate;
  424.   FLOAT compression=
  425.     (FLOAT)(gfp->stereo*16*out_samplerate)/(FLOAT)(gfp->brate);
  426.   lame_print_version(stderr);
  427.   if (gfp->num_channels==2 && gfp->stereo==1) {
  428.     fprintf(stderr, "Autoconverting from stereo to mono. Setting encoding to mono mode.n");
  429.   }
  430.   if (gfp->resample_ratio!=1) {
  431.     fprintf(stderr,"Resampling:  input=%ikHz  output=%ikHzn",
  432.     (int)in_samplerate,(int)out_samplerate);
  433.   }
  434.   if (gfp->highpass2>0.0)
  435.     fprintf(stderr, "Using polyphase highpass filter, transition band: %.0f Hz -  %.0f Hzn",
  436.     gfp->highpass1*out_samplerate*500,
  437.     gfp->highpass2*out_samplerate*500);
  438.   if (gfp->lowpass1>0.0)
  439.     fprintf(stderr, "Using polyphase lowpass filter,  transition band:  %.0f Hz - %.0f Hzn",
  440.     gfp->lowpass1*out_samplerate*500,
  441.     gfp->lowpass2*out_samplerate*500);
  442.   if (gfp->gtkflag) {
  443.     fprintf(stderr, "Analyzing %s n",gfp->inPath);
  444.   }
  445.   else {
  446.     fprintf(stderr, "Encoding %s to %sn",
  447.     (strcmp(gfp->inPath, "-")? gfp->inPath : "stdin"),
  448.     (strcmp(gfp->outPath, "-")? gfp->outPath : "stdout"));
  449.     if (gfp->VBR)
  450.       fprintf(stderr, "Encoding as %.1fkHz VBR(q=%i) %s MPEG%i LayerIII  qval=%in",
  451.       gfp->out_samplerate/1000.0,
  452.       gfp->VBR_q,mode_names[gfp->mode],2-gfp->version,gfp->quality);
  453.     else
  454.       fprintf(stderr, "Encoding as %.1f kHz %d kbps %s MPEG%i LayerIII (%4.1fx)  qval=%in",
  455.       gfp->out_samplerate/1000.0,gfp->brate,
  456.       mode_names[gfp->mode],2-gfp->version,compression,gfp->quality);
  457.   }
  458.   fflush(stderr);
  459. }
  460. /************************************************************************
  461. *
  462. * encodeframe()           Layer 3
  463. *
  464. * encode a single frame
  465. *
  466. ************************************************************************
  467. lame_encode_frame()
  468.                        gr 0            gr 1
  469. inbuf:           |--------------|---------------|-------------|
  470. MDCT output:  |--------------|---------------|-------------|
  471. FFT's                    <---------1024---------->
  472.                                          <---------1024-------->
  473.     inbuf = buffer of PCM data size=MP3 framesize
  474.     encoder acts on inbuf[ch][0], but output is delayed by MDCTDELAY
  475.     so the MDCT coefficints are from inbuf[ch][-MDCTDELAY]
  476.     psy-model FFT has a 1 granule day, so we feed it data for the next granule.
  477.     FFT is centered over granule:  224+576+224
  478.     So FFT starts at:   576-224-MDCTDELAY
  479.     MPEG2:  FFT ends at:  BLKSIZE+576-224-MDCTDELAY
  480.     MPEG1:  FFT ends at:  BLKSIZE+2*576-224-MDCTDELAY    (1904)
  481.     FFT starts at 576-224-MDCTDELAY (304)  = 576-FFTOFFSET
  482. */
  483. int lame_encode_frame(lame_global_flags *gfp,
  484. short int inbuf_l[],short int inbuf_r[],
  485. int mf_size,char *mp3buf, int mp3buf_size)
  486. {
  487.   static unsigned long frameBits;
  488.   static unsigned long bitsPerSlot;
  489.   static FLOAT8 frac_SpF;
  490.   static FLOAT8 slot_lag;
  491.   static unsigned long sentBits = 0;
  492.   FLOAT8 xr[2][2][576];
  493.   int l3_enc[2][2][576];
  494.   int mp3count;
  495.   III_psy_ratio masking_ratio[2][2];    /*LR ratios */
  496.   III_psy_ratio masking_MS_ratio[2][2]; /*MS ratios */
  497.   III_psy_ratio (*masking)[2][2];  /*LR ratios and MS ratios*/
  498.   III_scalefac_t scalefac[2][2];
  499.   short int *inbuf[2];
  500.   typedef FLOAT8 pedata[2][2];
  501.   pedata pe,pe_MS;
  502.   pedata *pe_use;
  503.   int ch,gr,mean_bits;
  504.   int bitsPerFrame;
  505.   int check_ms_stereo;
  506.   static FLOAT8 ms_ratio[2]={0,0};
  507.   FLOAT8 ms_ratio_next=0;
  508.   FLOAT8 ms_ratio_prev=0;
  509.   static FLOAT8 ms_ener_ratio[2]={0,0};
  510.   memset((char *) masking_ratio, 0, sizeof(masking_ratio));
  511.   memset((char *) masking_MS_ratio, 0, sizeof(masking_MS_ratio));
  512.   memset((char *) scalefac, 0, sizeof(scalefac));
  513.   inbuf[0]=inbuf_l;
  514.   inbuf[1]=inbuf_r;
  515.   gfp->mode_ext = MPG_MD_LR_LR;
  516.   if (gfp->frameNum==0 )  {
  517.     /* Figure average number of 'slots' per frame. */
  518.     FLOAT8 avg_slots_per_frame;
  519.     FLOAT8 sampfreq =   gfp->out_samplerate/1000.0;
  520.     int bit_rate = gfp->brate;
  521.     sentBits = 0;
  522.     bitsPerSlot = 8;
  523.     avg_slots_per_frame = (bit_rate*gfp->framesize) /
  524.            (sampfreq* bitsPerSlot);
  525.     /* -f fast-math option causes some strange rounding here, be carefull: */
  526.     frac_SpF  = avg_slots_per_frame - floor(avg_slots_per_frame + 1e-9);
  527.     if (fabs(frac_SpF) < 1e-9) frac_SpF = 0;
  528.     slot_lag  = -frac_SpF;
  529.     gfp->padding = 1;
  530.     if (frac_SpF==0) gfp->padding = 0;
  531.     /* check FFT will not use a negative starting offset */
  532.     assert(576>=FFTOFFSET);
  533.     /* check if we have enough data for FFT */
  534.     assert(mf_size>=(BLKSIZE+gfp->framesize-FFTOFFSET));
  535.   }
  536.   /********************** padding *****************************/
  537.   switch (gfp->padding_type) {
  538.   case 0:
  539.     gfp->padding=0;
  540.     break;
  541.   case 1:
  542.     gfp->padding=1;
  543.     break;
  544.   case 2:
  545.   default:
  546.     if (gfp->VBR) {
  547.       gfp->padding=0;
  548.     } else {
  549.       if (gfp->disable_reservoir) {
  550. gfp->padding = 0;
  551. /* if the user specified --nores, dont very gfp->padding either */
  552. /* tiny changes in frac_SpF rounding will cause file differences */
  553.       }else{
  554. if (frac_SpF != 0) {
  555.   if (slot_lag > (frac_SpF-1.0) ) {
  556.     slot_lag -= frac_SpF;
  557.     gfp->padding = 0;
  558.   }
  559.   else {
  560.     gfp->padding = 1;
  561.     slot_lag += (1-frac_SpF);
  562.   }
  563. }
  564.       }
  565.     }
  566.   }
  567.   /********************** status display  *****************************/
  568.   if (!gfp->gtkflag && !gfp->silent) {
  569.     int mod = gfp->version == 0 ? 200 : 50;
  570.     if (gfp->frameNum%mod==0) {
  571.       timestatus(gfp->out_samplerate,gfp->frameNum,gfp->totalframes,gfp->framesize);
  572. #ifdef BRHIST
  573.       if (disp_brhist)
  574. {
  575.   brhist_add_count();
  576.   brhist_disp();
  577. }
  578. #endif
  579.     }
  580.   }
  581.   if (gfp->psymodel) {
  582.     /* psychoacoustic model
  583.      * psy model has a 1 granule (576) delay that we must compensate for
  584.      * (mt 6/99).
  585.      */
  586.     short int *bufp[2];  /* address of beginning of left & right granule */
  587.     int blocktype[2];
  588.     ms_ratio_prev=ms_ratio[gfp->mode_gr-1];
  589.     for (gr=0; gr < gfp->mode_gr ; gr++) {
  590.       for ( ch = 0; ch < gfp->stereo; ch++ )
  591. bufp[ch] = &inbuf[ch][576 + gr*576-FFTOFFSET];
  592.       L3psycho_anal( gfp,bufp, gr, 
  593.      &ms_ratio[gr],&ms_ratio_next,&ms_ener_ratio[gr],
  594.      masking_ratio, masking_MS_ratio,
  595.      pe[gr],pe_MS[gr],blocktype);
  596.       for ( ch = 0; ch < gfp->stereo; ch++ )
  597. l3_side.gr[gr].ch[ch].tt.block_type=blocktype[ch];
  598.     }
  599.   }else{
  600.     for (gr=0; gr < gfp->mode_gr ; gr++)
  601.       for ( ch = 0; ch < gfp->stereo; ch++ ) {
  602. l3_side.gr[gr].ch[ch].tt.block_type=NORM_TYPE;
  603. pe[gr][ch]=700;
  604.       }
  605.   }
  606.   /* block type flags */
  607.   for( gr = 0; gr < gfp->mode_gr; gr++ ) {
  608.     for ( ch = 0; ch < gfp->stereo; ch++ ) {
  609.       gr_info *cod_info = &l3_side.gr[gr].ch[ch].tt;
  610.       cod_info->mixed_block_flag = 0;     /* never used by this model */
  611.       if (cod_info->block_type == NORM_TYPE )
  612. cod_info->window_switching_flag = 0;
  613.       else
  614. cod_info->window_switching_flag = 1;
  615.     }
  616.   }
  617.   /* polyphase filtering / mdct */
  618.   mdct_sub48(gfp,inbuf[0], inbuf[1], xr, &l3_side);
  619.   /* use m/s gfp->stereo? */
  620.   check_ms_stereo =  (gfp->mode == MPG_MD_JOINT_STEREO);
  621.   if (check_ms_stereo) {
  622.     /* make sure block type is the same in each channel */
  623.     check_ms_stereo =
  624.       (l3_side.gr[0].ch[0].tt.block_type==l3_side.gr[0].ch[1].tt.block_type) &&
  625.       (l3_side.gr[1].ch[0].tt.block_type==l3_side.gr[1].ch[1].tt.block_type);
  626.   }
  627.   if (check_ms_stereo) {
  628.     /* ms_ratio = is like the ratio of side_energy/total_energy */
  629.     FLOAT8 ms_ratio_ave,ms_ener_ratio_ave;
  630.     /*     ms_ratio_ave = .5*(ms_ratio[0] + ms_ratio[1]);*/
  631.     ms_ratio_ave = .25*(ms_ratio[0] + ms_ratio[1]+
  632.  ms_ratio_prev + ms_ratio_next);
  633.     ms_ener_ratio_ave = .5*(ms_ener_ratio[0]+ms_ener_ratio[1]);
  634.     if ( ms_ratio_ave <.35 /*&& ms_ener_ratio_ave<.75*/ ) gfp->mode_ext = MPG_MD_MS_LR;
  635.   }
  636.   if (gfp->force_ms) gfp->mode_ext = MPG_MD_MS_LR;
  637. #ifdef HAVEGTK
  638.   if (gfp->gtkflag) {
  639.     int j;
  640.     for ( gr = 0; gr < gfp->mode_gr; gr++ ) {
  641.       for ( ch = 0; ch < gfp->stereo; ch++ ) {
  642. pinfo->ms_ratio[gr]=ms_ratio[gr];
  643. pinfo->ms_ener_ratio[gr]=ms_ener_ratio[gr];
  644. pinfo->blocktype[gr][ch]=
  645.   l3_side.gr[gr].ch[ch].tt.block_type;
  646. for ( j = 0; j < 576; j++ ) pinfo->xr[gr][ch][j]=xr[gr][ch][j];
  647. /* if MS stereo, switch to MS psy data */
  648. if (gfp->mode_ext==MPG_MD_MS_LR) {
  649.   pinfo->pe[gr][ch]=pinfo->pe[gr][ch+2];
  650.   pinfo->ers[gr][ch]=pinfo->ers[gr][ch+2];
  651.   memcpy(pinfo->energy[gr][ch],pinfo->energy[gr][ch+2],
  652.  sizeof(pinfo->energy[gr][ch]));
  653. }
  654.       }
  655.     }
  656.   }
  657. #endif
  658.   /* bit and noise allocation */
  659.   if (MPG_MD_MS_LR == gfp->mode_ext) {
  660.     masking = &masking_MS_ratio;    /* use MS masking */
  661.     pe_use=&pe_MS;
  662.   } else {
  663.     masking = &masking_ratio;    /* use LR masking */
  664.     pe_use=&pe;
  665.   }
  666.   /*
  667.   VBR_iteration_loop_new( gfp,*pe_use, ms_ratio, xr, masking, &l3_side, l3_enc,
  668.      &scalefac);
  669.   */
  670.   if (gfp->VBR) {
  671.     VBR_iteration_loop( gfp,*pe_use, ms_ratio, xr, *masking, &l3_side, l3_enc,
  672. scalefac);
  673.   }else{
  674.     iteration_loop( gfp,*pe_use, ms_ratio, xr, *masking, &l3_side, l3_enc,
  675.     scalefac);
  676.   }
  677. #ifdef BRHIST
  678.   brhist_temp[gfp->bitrate_index]++;
  679. #endif
  680.   /*  write the frame to the bitstream  */
  681.   getframebits(gfp,&bitsPerFrame,&mean_bits);
  682.   III_format_bitstream( gfp,bitsPerFrame, l3_enc, &l3_side,
  683. scalefac, &bs);
  684.   frameBits = bs.totbit - sentBits;
  685.   if ( frameBits % bitsPerSlot )   /* a program failure */
  686.     fprintf( stderr, "Sent %ld bits = %ld slots plus %ldn",
  687.      frameBits, frameBits/bitsPerSlot,
  688.      frameBits%bitsPerSlot );
  689.   sentBits += frameBits;
  690.   /* copy mp3 bit buffer into array */
  691.   mp3count = copy_buffer(mp3buf,mp3buf_size,&bs);
  692.   if (gfp->bWriteVbrTag) AddVbrFrame((int)(sentBits/8));
  693. #ifdef HAVEGTK
  694.   if (gfp->gtkflag) {
  695.     int j;
  696.     for ( ch = 0; ch < gfp->stereo; ch++ ) {
  697.       for ( j = 0; j < FFTOFFSET; j++ )
  698. pinfo->pcmdata[ch][j] = pinfo->pcmdata[ch][j+gfp->framesize];
  699.       for ( j = FFTOFFSET; j < 1600; j++ ) {
  700. pinfo->pcmdata[ch][j] = inbuf[ch][j-FFTOFFSET];
  701.       }
  702.     }
  703.   }
  704. #endif
  705.   gfp->frameNum++;
  706.   return mp3count;
  707. }
  708. int fill_buffer_resample(lame_global_flags *gfp,short int *outbuf,int desired_len,
  709.         short int *inbuf,int len,int *num_used,int ch) {
  710.   static FLOAT8 itime[2];
  711. #define OLDBUFSIZE 5
  712.   static short int inbuf_old[2][OLDBUFSIZE];
  713.   static int init[2]={0,0};
  714.   int i,j=0,k,linear,value;
  715.   if (gfp->frameNum==0 && !init[ch]) {
  716.     init[ch]=1;
  717.     itime[ch]=0;
  718.     memset((char *) inbuf_old[ch], 0, sizeof(short int)*OLDBUFSIZE);
  719.   }
  720.   if (gfp->frameNum!=0) init[ch]=0; /* reset, for next time framenum=0 */
  721.   /* if downsampling by an integer multiple, use linear resampling,
  722.    * otherwise use quadratic */
  723.   linear = ( fabs(gfp->resample_ratio - floor(.5+gfp->resample_ratio)) < .0001 );
  724.   /* time of j'th element in inbuf = itime + j/ifreq; */
  725.   /* time of k'th element in outbuf   =  j/ofreq */
  726.   for (k=0;k<desired_len;k++) {
  727.     int y0,y1,y2,y3;
  728.     FLOAT8 x0,x1,x2,x3;
  729.     FLOAT8 time0;
  730.     time0 = k*gfp->resample_ratio;       /* time of k'th output sample */
  731.     j = floor( time0 -itime[ch]  );
  732.     /* itime[ch] + j;    */            /* time of j'th input sample */
  733.     if (j+2 >= len) break;             /* not enough data in input buffer */
  734.     x1 = time0-(itime[ch]+j);
  735.     x2 = x1-1;
  736.     y1 = (j<0) ? inbuf_old[ch][OLDBUFSIZE+j] : inbuf[j];
  737.     y2 = ((1+j)<0) ? inbuf_old[ch][OLDBUFSIZE+1+j] : inbuf[1+j];
  738.     /* linear resample */
  739.     if (linear) {
  740.       outbuf[k] = floor(.5 +  (y2*x1-y1*x2) );
  741.     } else {
  742.       /* quadratic */
  743.       x0 = x1+1;
  744.       x3 = x1-2;
  745.       y0 = ((j-1)<0) ? inbuf_old[ch][OLDBUFSIZE+(j-1)] : inbuf[j-1];
  746.       y3 = ((j+2)<0) ? inbuf_old[ch][OLDBUFSIZE+(j+2)] : inbuf[j+2];
  747.       value = floor(.5 +
  748. -y0*x1*x2*x3/6 + y1*x0*x2*x3/2 - y2*x0*x1*x3/2 +y3*x0*x1*x2/6
  749. );
  750.       if (value > 32767) outbuf[k]=32767;
  751.       else if (value < -32767) outbuf[k]=-32767;
  752.       else outbuf[k]=value;
  753.       /*
  754.       printf("k=%i  new=%i   [ %i %i %i %i ]n",k,outbuf[k],
  755.      y0,y1,y2,y3);
  756.       */
  757.     }
  758.   }
  759.   /* k = number of samples added to outbuf */
  760.   /* last k sample used data from j,j+1, or j+1 overflowed buffer */
  761.   /* remove num_used samples from inbuf: */
  762.   *num_used = Min(len,j+2);
  763.   itime[ch] += *num_used - k*gfp->resample_ratio;
  764.   for (i=0;i<OLDBUFSIZE;i++)
  765.     inbuf_old[ch][i]=inbuf[*num_used + i -OLDBUFSIZE];
  766.   return k;
  767. }
  768. int fill_buffer(lame_global_flags *gfp,short int *outbuf,int desired_len,short int *inbuf,int len) {
  769.   int j;
  770.   j=Min(desired_len,len);
  771.   memcpy( (char *) outbuf,(char *)inbuf,sizeof(short int)*j);
  772.   return j;
  773. }
  774. /*
  775.  * THE MAIN LAME ENCODING INTERFACE
  776.  * mt 3/00
  777.  *
  778.  * input pcm data, output (maybe) mp3 frames.
  779.  * This routine handles all buffering, resampling and filtering for you.
  780.  * The required mp3buffer_size can be computed from num_samples,
  781.  * samplerate and encoding rate, but here is a worst case estimate:
  782.  *
  783.  * mp3buffer_size in bytes = 1.25*num_samples + 7200
  784.  *
  785.  * return code = number of bytes output in mp3buffer.  can be 0
  786. */
  787. int lame_encode_buffer(lame_global_flags *gfp,
  788.    short int buffer_l[], short int buffer_r[],int nsamples,
  789.    char *mp3buf, int mp3buf_size)
  790. {
  791.   static int frame_buffered=0;
  792.   int mp3size=0,ret,i,ch,mf_needed;
  793.   short int *in_buffer[2];
  794.   in_buffer[0] = buffer_l;
  795.   in_buffer[1] = buffer_r;
  796.   /* some sanity checks */
  797.   assert(ENCDELAY>=MDCTDELAY);
  798.   assert(BLKSIZE-FFTOFFSET >= 0);
  799.   mf_needed = BLKSIZE+gfp->framesize-FFTOFFSET;
  800.   assert(MFSIZE>=mf_needed);
  801.   /* The reason for
  802.    *       int mf_samples_to_encode = ENCDELAY + 288;
  803.    * ENCDELAY = internal encoder delay.  And then we have to add 288
  804.    * because of the 50% MDCT overlap.  A 576 MDCT granule decodes to
  805.    * 1152 samples.  To synthesize the 576 samples centered under this granule
  806.    * we need the previous granule for the first 288 samples (no problem), and
  807.    * the next granule for the next 288 samples (not possible if this is last
  808.    * granule).  So we need to pad with 288 samples to make sure we can
  809.    * encode the 576 samples we are interested in.
  810.    */
  811.   if (gfp->frameNum==0 && !frame_buffered) {
  812.     memset((char *) mfbuf, 0, sizeof(mfbuf));
  813.     frame_buffered=1;
  814.     mf_samples_to_encode = ENCDELAY+288;
  815.     mf_size=ENCDELAY-MDCTDELAY;  /* we pad input with this many 0's */
  816.   }
  817.   if (gfp->frameNum==1) {
  818.     /* reset, for the next time frameNum==0 */
  819.     frame_buffered=0;
  820.   }
  821.   if (gfp->num_channels==2  && gfp->stereo==1) {
  822.     /* downsample to mono */
  823.     for (i=0; i<nsamples; ++i) {
  824.       in_buffer[0][i]=((int)in_buffer[0][i]+(int)in_buffer[1][i])/2;
  825.       in_buffer[1][i]=0;
  826.     }
  827.   }
  828.   while (nsamples > 0) {
  829.     int n_in=0;
  830.     int n_out=0;
  831.     /* copy in new samples */
  832.     for (ch=0; ch<gfp->stereo; ch++) {
  833.       if (gfp->resample_ratio!=1)  {
  834. n_out=fill_buffer_resample(gfp,&mfbuf[ch][mf_size],gfp->framesize,
  835.   in_buffer[ch],nsamples,&n_in,ch);
  836.       } else {
  837. n_out=fill_buffer(gfp,&mfbuf[ch][mf_size],gfp->framesize,in_buffer[ch],nsamples);
  838. n_in = n_out;
  839.       }
  840.       in_buffer[ch] += n_in;
  841.     }
  842.     nsamples -= n_in;
  843.     mf_size += n_out;
  844.     assert(mf_size<=MFSIZE);
  845.     mf_samples_to_encode += n_out;
  846.     if (mf_size >= mf_needed) {
  847.       /* encode the frame */
  848.       ret = lame_encode_frame(gfp,mfbuf[0],mfbuf[1],mf_size,mp3buf,mp3buf_size);
  849.       if (ret == -1) {
  850. /* fatel error: mp3buffer was too small */
  851. return -1;
  852.       }
  853.       mp3buf += ret;
  854.       mp3size += ret;
  855.       /* shift out old samples */
  856.       mf_size -= gfp->framesize;
  857.       mf_samples_to_encode -= gfp->framesize;
  858.       for (ch=0; ch<gfp->stereo; ch++)
  859. for (i=0; i<mf_size; i++)
  860.   mfbuf[ch][i]=mfbuf[ch][i+gfp->framesize];
  861.     }
  862.   }
  863.   assert(nsamples==0);
  864.   return mp3size;
  865. }
  866. int lame_encode_buffer_interleaved(lame_global_flags *gfp,
  867.    short int buffer[], int nsamples, char *mp3buf, int mp3buf_size)
  868. {
  869.   static int frame_buffered=0;
  870.   int mp3size=0,ret,i,ch,mf_needed;
  871.   /* some sanity checks */
  872.   assert(ENCDELAY>=MDCTDELAY);
  873.   assert(BLKSIZE-FFTOFFSET >= 0);
  874.   mf_needed = BLKSIZE+gfp->framesize-FFTOFFSET;
  875.   assert(MFSIZE>=mf_needed);
  876.   if (gfp->num_channels == 1) {
  877.     return lame_encode_buffer(gfp,buffer, NULL ,nsamples,mp3buf,mp3buf_size);
  878.   }
  879.   if (gfp->resample_ratio!=1)  {
  880.     short int *buffer_l;
  881.     short int *buffer_r;
  882.     buffer_l=malloc(sizeof(short int)*nsamples);
  883.     buffer_r=malloc(sizeof(short int)*nsamples);
  884.     if (buffer_l == NULL || buffer_r == NULL) {
  885.       return -1;
  886.     }
  887.     for (i=0; i<nsamples; i++) {
  888.       buffer_l[i]=buffer[2*i];
  889.       buffer_r[i]=buffer[2*i+1];
  890.     }
  891.     ret = lame_encode_buffer(gfp,buffer_l,buffer_r,nsamples,mp3buf,mp3buf_size);
  892.     free(buffer_l);
  893.     free(buffer_r);
  894.     return ret;
  895.   }
  896.   if (gfp->frameNum==0 && !frame_buffered) {
  897.     memset((char *) mfbuf, 0, sizeof(mfbuf));
  898.     frame_buffered=1;
  899.     mf_samples_to_encode = ENCDELAY+288;
  900.     mf_size=ENCDELAY-MDCTDELAY;  /* we pad input with this many 0's */
  901.   }
  902.   if (gfp->frameNum==1) {
  903.     /* reset, for the next time frameNum==0 */
  904.     frame_buffered=0;
  905.   }
  906.   if (gfp->num_channels==2  && gfp->stereo==1) {
  907.     /* downsample to mono */
  908.     for (i=0; i<nsamples; ++i) {
  909.       buffer[2*i]=((int)buffer[2*i]+(int)buffer[2*i+1])/2;
  910.       buffer[2*i+1]=0;
  911.     }
  912.   }
  913.   while (nsamples > 0) {
  914.     int n_out;
  915.     /* copy in new samples */
  916.     n_out = Min(gfp->framesize,nsamples);
  917.     for (i=0; i<n_out; ++i) {
  918.       mfbuf[0][mf_size+i]=buffer[2*i];
  919.       mfbuf[1][mf_size+i]=buffer[2*i+1];
  920.     }
  921.     buffer += 2*n_out;
  922.     nsamples -= n_out;
  923.     mf_size += n_out;
  924.     assert(mf_size<=MFSIZE);
  925.     mf_samples_to_encode += n_out;
  926.     if (mf_size >= mf_needed) {
  927.       /* encode the frame */
  928.       ret = lame_encode_frame(gfp,mfbuf[0],mfbuf[1],mf_size,mp3buf,mp3buf_size);
  929.       if (ret == -1) {
  930. /* fatel error: mp3buffer was too small */
  931. return -1;
  932.       }
  933.       mp3buf += ret;
  934.       mp3size += ret;
  935.       /* shift out old samples */
  936.       mf_size -= gfp->framesize;
  937.       mf_samples_to_encode -= gfp->framesize;
  938.       for (ch=0; ch<gfp->stereo; ch++)
  939. for (i=0; i<mf_size; i++)
  940.   mfbuf[ch][i]=mfbuf[ch][i+gfp->framesize];
  941.     }
  942.   }
  943.   assert(nsamples==0);
  944.   return mp3size;
  945. }
  946. /* old LAME interface */
  947. /* With this interface, it is the users responsibilty to keep track of the
  948.  * buffered, unencoded samples.  Thus mf_samples_to_encode is not incremented.
  949.  *
  950.  * lame_encode() is also used to flush the PCM input buffer by
  951.  * lame_encode_finish()
  952.  */
  953. int lame_encode(lame_global_flags *gfp, short int in_buffer[2][1152],char *mp3buf,int size){
  954.   int imp3,save;
  955.   save = mf_samples_to_encode;
  956.   imp3= lame_encode_buffer(gfp,in_buffer[0],in_buffer[1],576*gfp->mode_gr,
  957.         mp3buf,size);
  958.   mf_samples_to_encode = save;
  959.   return imp3;
  960. }
  961. /* initialize mp3 encoder */
  962. void lame_init(lame_global_flags *gfp)
  963. {
  964.   /*
  965.    *  Disable floating point exepctions
  966.    */
  967. #ifdef __FreeBSD__
  968. # include <floatingpoint.h>
  969.   {
  970.   /* seet floating point mask to the Linux default */
  971.   fp_except_t mask;
  972.   mask=fpgetmask();
  973.   /* if bit is set, we get SIGFPE on that error! */
  974.   fpsetmask(mask & ~(FP_X_INV|FP_X_DZ));
  975.   /*  fprintf(stderr,"FreeBSD mask is 0x%xn",mask); */
  976.   }
  977. #endif
  978. #if defined(__riscos__) && !defined(ABORTFP)
  979.   /* Disable FPE's under RISC OS */
  980.   /* if bit is set, we disable trapping that error! */
  981.   /*   _FPE_IVO : invalid operation */
  982.   /*   _FPE_DVZ : divide by zero */
  983.   /*   _FPE_OFL : overflow */
  984.   /*   _FPE_UFL : underflow */
  985.   /*   _FPE_INX : inexact */
  986.   DisableFPETraps( _FPE_IVO | _FPE_DVZ | _FPE_OFL );
  987. #endif
  988.   /*
  989.    *  Debugging stuff
  990.    *  The default is to ignore FPE's, unless compiled with -DABORTFP
  991.    *  so add code below to ENABLE FPE's.
  992.    */
  993. #if defined(ABORTFP) && !defined(__riscos__)
  994. #if defined(_MSC_VER)
  995.   {
  996. #include <float.h>
  997. unsigned int mask;
  998. mask=_controlfp( 0, 0 );
  999. mask&=~(_EM_OVERFLOW|_EM_UNDERFLOW|_EM_ZERODIVIDE|_EM_INVALID);
  1000. mask=_controlfp( mask, _MCW_EM );
  1001. }
  1002. #elif defined(__CYGWIN__)
  1003. #  define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw))
  1004. #  define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw))
  1005. #  define _EM_INEXACT     0x00000001 /* inexact (precision) */
  1006. #  define _EM_UNDERFLOW   0x00000002 /* underflow */
  1007. #  define _EM_OVERFLOW    0x00000004 /* overflow */
  1008. #  define _EM_ZERODIVIDE  0x00000008 /* zero divide */
  1009. #  define _EM_INVALID     0x00000010 /* invalid */
  1010.   {
  1011.     unsigned int mask;
  1012.     _FPU_GETCW(mask);
  1013.     /* Set the FPU control word to abort on most FPEs */
  1014.     mask &= ~(_EM_UNDERFLOW | _EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID);
  1015.     _FPU_SETCW(mask);
  1016.   }
  1017. # else
  1018.   {
  1019. #  include <fpu_control.h>
  1020. #ifndef _FPU_GETCW
  1021. #define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw))
  1022. #endif
  1023. #ifndef _FPU_SETCW
  1024. #define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw))
  1025. #endif
  1026.     unsigned int mask;
  1027.     _FPU_GETCW(mask);
  1028.     /* Set the Linux mask to abort on most FPE's */
  1029.     /* if bit is set, we _mask_ SIGFPE on that error! */
  1030.     /*  mask &= ~( _FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM );*/
  1031.     mask &= ~( _FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM );
  1032.     _FPU_SETCW(mask);
  1033.   }
  1034. #endif
  1035. #endif /* ABORTFP && !__riscos__ */
  1036.   /* Global flags.  set defaults here */
  1037.   gfp->allow_diff_short=0;
  1038.   gfp->ATHonly=0;
  1039.   gfp->noATH=0;
  1040.   gfp->bWriteVbrTag=1;
  1041.   gfp->cwlimit=0;
  1042.   gfp->disable_reservoir=0;
  1043.   gfp->experimentalX = 0;
  1044.   gfp->experimentalY = 0;
  1045.   gfp->experimentalZ = 0;
  1046.   gfp->frameNum=0;
  1047.   gfp->gtkflag=0;
  1048.   gfp->quality=5;
  1049.   gfp->input_format=sf_unknown;
  1050.   gfp->filter_type=0;
  1051.   gfp->lowpassfreq=0;
  1052.   gfp->highpassfreq=0;
  1053.   gfp->lowpasswidth=-1;
  1054.   gfp->highpasswidth=-1;
  1055.   gfp->lowpass1=0;
  1056.   gfp->lowpass2=0;
  1057.   gfp->highpass1=0;
  1058.   gfp->highpass2=0;
  1059.   gfp->lowpass_band=32;
  1060.   gfp->highpass_band=-1;
  1061.   gfp->no_short_blocks=0;
  1062.   gfp->resample_ratio=1;
  1063.   gfp->padding_type=2;
  1064.   gfp->padding=0;
  1065.   gfp->swapbytes=0;
  1066.   gfp->silent=0;
  1067.   gfp->totalframes=0;
  1068.   gfp->VBR=0;
  1069.   gfp->VBR_q=4;
  1070.   gfp->VBR_min_bitrate_kbps=0;
  1071.   gfp->VBR_max_bitrate_kbps=0;
  1072.   gfp->VBR_min_bitrate=1;
  1073.   gfp->VBR_max_bitrate=13;
  1074.   gfp->version = 1;   /* =1   Default: MPEG-1 */
  1075.   gfp->mode = MPG_MD_JOINT_STEREO;
  1076.   gfp->mode_fixed=0;
  1077.   gfp->force_ms=0;
  1078.   gfp->brate=0;
  1079.   gfp->copyright=0;
  1080.   gfp->original=1;
  1081.   gfp->extension=0;
  1082.   gfp->error_protection=0;
  1083.   gfp->emphasis=0;
  1084.   gfp->in_samplerate=1000*44.1;
  1085.   gfp->out_samplerate=0;
  1086.   gfp->num_channels=2;
  1087.   gfp->num_samples=MAX_U_32_NUM;
  1088.   gfp->inPath=NULL;
  1089.   gfp->outPath=NULL;
  1090.   id3tag.used=0;
  1091. }
  1092. /*****************************************************************/
  1093. /* flush internal mp3 buffers,                                   */
  1094. /*****************************************************************/
  1095. int lame_encode_finish(lame_global_flags *gfp,char *mp3buffer, int mp3buffer_size)
  1096. {
  1097.   int imp3,mp3count,mp3buffer_size_remaining;
  1098.   short int buffer[2][1152];
  1099.   memset((char *)buffer,0,sizeof(buffer));
  1100.   mp3count = 0;
  1101.   while (mf_samples_to_encode > 0) {
  1102.     mp3buffer_size_remaining = mp3buffer_size - mp3count;
  1103.     /* if user specifed buffer size = 0, dont check size */
  1104.     if (mp3buffer_size == 0) mp3buffer_size_remaining=0;  
  1105.     imp3=lame_encode(gfp,buffer,mp3buffer,mp3buffer_size_remaining);
  1106.     if (imp3 == -1) {
  1107.       /* fatel error: mp3buffer too small */
  1108.       desalloc_buffer(&bs);    /* Deallocate all buffers */
  1109.       return -1;
  1110.     }
  1111.     mp3buffer += imp3;
  1112.     mp3count += imp3;
  1113.     mf_samples_to_encode -= gfp->framesize;
  1114.   }
  1115.   gfp->frameNum--;
  1116.   if (!gfp->gtkflag && !gfp->silent) {
  1117.       timestatus(gfp->out_samplerate,gfp->frameNum,gfp->totalframes,gfp->framesize);
  1118. #ifdef BRHIST
  1119.       if (disp_brhist)
  1120. {
  1121.   brhist_add_count();
  1122.   brhist_disp();
  1123.   brhist_disp_total(gfp);
  1124. }
  1125. #endif
  1126.       fprintf(stderr,"n");
  1127.       fflush(stderr);
  1128.   }
  1129.   III_FlushBitstream();
  1130.   mp3buffer_size_remaining = mp3buffer_size - mp3count;
  1131.   /* if user specifed buffer size = 0, dont check size */
  1132.   if (mp3buffer_size == 0) mp3buffer_size_remaining=0;  
  1133.   imp3= copy_buffer(mp3buffer,mp3buffer_size_remaining,&bs);
  1134.   if (imp3 == -1) {
  1135.     /* fatel error: mp3buffer too small */
  1136.     desalloc_buffer(&bs);    /* Deallocate all buffers */
  1137.     return -1;
  1138.   }
  1139.   mp3count += imp3;
  1140.   desalloc_buffer(&bs);    /* Deallocate all buffers */
  1141.   return mp3count;
  1142. }
  1143. /*****************************************************************/
  1144. /* write VBR Xing header, and ID3 tag, if asked for               */
  1145. /*****************************************************************/
  1146. void lame_mp3_tags(lame_global_flags *gfp)
  1147. {
  1148.   if (gfp->bWriteVbrTag)
  1149.     {
  1150.       /* Calculate relative quality of VBR stream
  1151.        * 0=best, 100=worst */
  1152.       int nQuality=gfp->VBR_q*100/9;
  1153.       /* Write Xing header again */
  1154.       PutVbrTag(gfp->outPath,nQuality,1-gfp->version);
  1155.     }
  1156.   /* write an ID3 tag  */
  1157.   if(id3tag.used) {
  1158.     id3_buildtag(&id3tag);
  1159.     id3_writetag(gfp->outPath, &id3tag);
  1160.   }
  1161. }
  1162. void lame_version(lame_global_flags *gfp,char *ostring) {
  1163.   strncpy(ostring,get_lame_version(),20);
  1164. }