codec.c
上传用户:bjsgzm
上传日期:2007-01-08
资源大小:256k
文件大小:8k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. #include <stdlib.h>
  17. #include "common.h"
  18. #include "encoder.h"
  19. #include "l3psy.h"
  20. #include "mdct.h"
  21. #include "loop.h"
  22. #include "l3bitstream.h"
  23. #include "formatbitstream2.h"
  24. #include  "codec.h"
  25. extern int fInit_mdct_sub;
  26. extern int fInit_mdct;
  27. extern int fInit_fft;
  28. extern int fInit_iteration_loop;
  29. extern int fInit_huffman_read_flag;
  30. extern void fixStatic_reservoir();
  31. /************************************************************************/
  32. #define SAMPLES_PER_FRAME 1152
  33.     typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT];
  34.     typedef double JSBS[3][SCALE_BLOCK][SBLIMIT];
  35.     static SBS         *sb_sample;
  36.     static L3SBS       *l3_sb_sample;
  37.     static JSBS        *j_sample;
  38.     static layer info;
  39.     static short buffer[2][1152];
  40.     static float snr32[32];
  41. static short sam[2][1344];
  42.     static int whole_SpF, extra_slot;
  43. static double frac_SpF, slot_lag;
  44.     static int stereo, error_protection;
  45. static CodecInitOut sOut;
  46. frame_params fr_ps;
  47. char * pEncodedOutput;
  48. int outputBit;
  49. /*____ codecInit() ____________________________________________________________*/
  50. CodecInitOut * codecInit( CodecInitIn * psIn )
  51. {
  52. int j;
  53.     volatile double avg_slots_per_frame;
  54.     /* Read psIn */
  55. switch (psIn->frequency)
  56. {
  57. case 48000:
  58. info.sampling_frequency = 1;
  59.          break;
  60.        case 44100:
  61. info.sampling_frequency = 0;
  62.          break;
  63.        case 32000:
  64. info.sampling_frequency = 2;
  65.          break;
  66.        default:
  67.          return  FALSE;
  68.     }
  69.     switch( psIn->mode)
  70.     {
  71. case 0:
  72.          info.mode = MPG_MD_STEREO;
  73. info.mode_ext = 0;
  74.          break;
  75.        case 2:
  76.          info.mode = MPG_MD_DUAL_CHANNEL;
  77. info.mode_ext = 0;
  78.          break;
  79.        case 3:
  80.          info.mode = MPG_MD_MONO;
  81. info.mode_ext = 0;
  82.          break;
  83.        default:
  84.          return FALSE;
  85.     }
  86.     j = 0;
  87.     while ( j < 15 )
  88.     {
  89.      if ( bitratex[1][j] == psIn->bitrate )
  90.          break;
  91.        j++;
  92.     }
  93.     info.bitrate_index = j;
  94.     info.version  = 1;   /* Default: MPEG-1 */
  95.     info.emphasis  = psIn->emphasis;
  96.     info.extension  = psIn->fPrivate;
  97.     info.copyright  = psIn->fCopyright;
  98.     info.original  = psIn->fOriginal;
  99.     info.error_protection = psIn->fCRC;
  100. /*_______ Static-fix _______________*/
  101. fInit_mdct_sub = 0;
  102. fInit_mdct = 0;
  103. fInit_fft = 0;
  104. fInit_iteration_loop = 0;
  105. fInit_huffman_read_flag = 0;
  106. fixStatic_loop();
  107. fixStatic_reservoir();
  108. /*___________________________________*/
  109.     psycho_anal_init( psIn->frequency );
  110. initWindowFilterSubband();
  111. initFormatBitstream();
  112. /*     Most large variables are declared dynamically to ensure
  113.        compatibility with smaller machines  */
  114.     
  115.     sb_sample  = (SBS *)  mem_alloc(sizeof(SBS), "sb_sample");
  116.     l3_sb_sample  = (L3SBS *) mem_alloc(sizeof(SBS), "l3_sb_sample");
  117.     j_sample  = (JSBS *)  mem_alloc(sizeof(JSBS), "j_sample");
  118. /*     clear buffers */
  119.     memset((char *) buffer, 0, sizeof(buffer));
  120.     memset((char *) snr32, 0, sizeof(snr32));
  121.     memset((char *) sam, 0, sizeof(sam));
  122.     fr_ps.header  = &info;
  123.     fr_ps.tab_num  = -1;             /* no table loaded */
  124.     fr_ps.alloc  = NULL;
  125.     fr_ps.actual_mode = info.mode;
  126.     fr_ps.stereo  = (info.mode == MPG_MD_MONO) ? 1 : 2;
  127. fr_ps.sblimit  = SBLIMIT;
  128.     fr_ps.jsbound  = SBLIMIT;
  129.     
  130.     stereo = fr_ps.stereo;
  131.     error_protection = info.error_protection;
  132.     avg_slots_per_frame = ((double)SAMPLES_PER_FRAME /
  133.                            s_freq[1][info.sampling_frequency]) *
  134. ((double)bitratex[1][info.bitrate_index] / 8.0);
  135.     whole_SpF = (int) avg_slots_per_frame;
  136.     frac_SpF  = avg_slots_per_frame - (double)whole_SpF;
  137.     slot_lag  = -frac_SpF;
  138.     
  139.     if (frac_SpF == 0)
  140.      info.padding = 0;
  141. genNoisePowTab();
  142. /*________________________*/
  143. if( stereo != 2 )
  144. sOut.nSamples = SAMPLES_PER_FRAME;
  145. else
  146. sOut.nSamples = SAMPLES_PER_FRAME*2;
  147. sOut.bufferSize = 2048;
  148. return  &sOut; /* How many samples we want in each chunk... */
  149. }
  150. void rebuffer_audio( short buffer[2][1152], short * insamp, unsigned int samples_read, int stereo );
  151. /*____ codecEncodeChunk() _____________________________________________________*/
  152. unsigned int codecEncodeChunk( int nSamples, short * pSamples, char * pDest )
  153. {
  154. static double xr[2][2][576];
  155. static double xr_dec[2][2][576];
  156. static double pe[2][2];
  157. static int l3_enc[2][2][576];
  158. static III_psy_ratio ratio;
  159. static III_side_info_t l3_side;
  160. static III_scalefac_t  scalefac;
  161. int gr, ch;
  162. int mean_bits, sideinfo_len;
  163. int bitsPerFrame;
  164. int j;
  165. /*
  166. static int  fFirst = TRUE;
  167. if( fFirst == TRUE )
  168. {
  169. memset( (char *) &xr, 0, sizeof( xr ) );
  170. memset( (char *) &xr_dec, 0, sizeof( xr_dec ) );
  171. memset( (char *) &pe, 0, sizeof( pe ) );
  172. memset( (char *) &l3_enc, 0, sizeof( l3_enc ) );
  173. memset( (char *) &ratio, 0, sizeof( ratio ) );
  174. memset( (char *) &l3_side, 0, sizeof( l3_side ) );
  175. memset( (char *) &scalefac, 0, sizeof( scalefac ) );
  176.         fFirst = FALSE;
  177. }
  178. */
  179. pEncodedOutput = pDest;
  180. outputBit = 8;
  181. pEncodedOutput[0] = 0;
  182. rebuffer_audio( buffer, pSamples, nSamples, stereo );
  183. if (frac_SpF != 0)
  184. {
  185.     if (slot_lag > (frac_SpF-1.0) )
  186. {
  187. slot_lag -= frac_SpF;
  188. extra_slot = 0;
  189. info.padding = 0;
  190.     }
  191. else
  192. {
  193. extra_slot = 1;
  194. info.padding = 1;
  195. slot_lag += (1-frac_SpF);
  196.   }
  197. }
  198.       
  199. bitsPerFrame = 8 * whole_SpF + (info.padding * 8);
  200. /* determine the mean bitrate for main data */
  201. sideinfo_len = 32;
  202. if ( stereo == 1 )
  203. sideinfo_len += 136;
  204. else
  205. sideinfo_len += 256;
  206. if ( info.error_protection )
  207. sideinfo_len += 16;
  208. mean_bits = (bitsPerFrame - sideinfo_len) / 2;
  209. /* psychoacoustic model */
  210. for ( gr = 0; gr < 2; gr++ )
  211. for ( ch = 0; ch < stereo; ch++ )
  212. {
  213.     psycho_anal( &buffer[ch][gr*576], &sam[ch][0], ch, 3, snr32, &ratio.l[gr][ch][0],
  214.  &ratio.s[gr][ch][0], &pe[gr][ch], &l3_side.gr[gr].ch[ch].tt );
  215. }
  216. /* polyphase filtering */
  217. for( gr = 0; gr < 2; gr++ )
  218. for ( ch = 0; ch < stereo; ch++ )
  219. for ( j = 0; j < 18; j++ )
  220.      windowFilterSubband( &buffer[ch][gr*18*32+32*j], ch, &(*l3_sb_sample)[ch][gr+1][j][0] );
  221. /* apply mdct to the polyphase outputs */
  222. mdct_sub( l3_sb_sample, xr, stereo, &l3_side, 2 );
  223. /*    bit and noise allocation */
  224. iteration_loop( pe, xr, &ratio, &l3_side, l3_enc, mean_bits,
  225. stereo, xr_dec, &scalefac, &fr_ps, 0, bitsPerFrame );
  226. /* write the frame to the bitstream */
  227. III_format_bitstream( bitsPerFrame, &fr_ps, l3_enc, &l3_side, &scalefac,
  228.   xr, NULL, 0 );
  229.     
  230. return  pEncodedOutput - pDest;
  231. }
  232. /*____ codecExit() ____________________________________________________________*/
  233. unsigned int codecExit( char * pDest )
  234. {
  235. pEncodedOutput = pDest;
  236. outputBit = 8;
  237. pEncodedOutput[0] = 0;
  238. free( sb_sample );
  239. free( l3_sb_sample );
  240. free( j_sample );
  241. psycho_anal_exit();
  242. exitFormatBitstream();
  243.   III_FlushBitstream();
  244. return  pEncodedOutput - pDest;
  245. }