COMMON.H
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:22k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
  4.  *
  5.  * $Id: common.h 2.0 1996/02/12 07:18:32 rowlands Exp $
  6.  *
  7.  * $Log: common.h $
  8.  * Revision 2.0  1996/02/12 07:18:32  rowlands
  9.  * Release following Munich meeting
  10.  *
  11.  * Revision 1.5.2.1  1995/11/06  04:19:12  rowlands
  12.  * Received from Uwe Felderhoff (IRT)
  13.  *
  14.  * Revision 1.7  1995/08/14  07:52:40  tenkate
  15.  * ML-LSF added Warner ten Kate 7/8/95 (Philips)
  16.  * struct frame_params extended
  17.  *
  18.  * Revision 1.6  1995/07/31  07:46:45  tenkate
  19.  * typedef frame_params updated for phantom coding, 25/07/95 WtK
  20.  *
  21.  * Revision 1.4.2.1  1995/06/16  03:46:42  rowlands
  22.  * Input from Susanne Ritscher (IRT)
  23.  *
  24.  **********************************************************************/
  25. /**********************************************************************
  26.  *   date   programmers         comment                               *
  27.  * 2/25/91  Doulas Wong,        start of version 1.0 records          *
  28.  *          Davis Pan                                                 *
  29.  * 5/10/91  W. Joseph Carter    Reorganized & renamed all ".h" files  *
  30.  *                              into "common.h" and "encoder.h".      *
  31.  *                              Ported to Macintosh and Unix.         *
  32.  *                              Added additional type definitions for *
  33.  *                              AIFF, double/SANE and "bitstream.c".  *
  34.  *                              Added function prototypes for more    *
  35.  *                              rigorous type checking.               *
  36.  * 27jun91  dpwe (Aware)        Added "alloc_*" defs & prototypes     *
  37.  *                              Defined new struct 'frame_params'.    *
  38.  *                              Changed info.stereo to info.mode_ext  *
  39.  *                              #define constants for mode types      *
  40.  *                              Prototype arguments if PROTO_ARGS     *
  41.  * 5/28/91  Earle Jennings      added MS_DOS definition               *
  42.  *                              MsDos function prototype declarations *
  43.  * 7/10/91  Earle Jennings      added FLOAT definition as double      *
  44.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  45.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  46.  *                              important fixes involved changing     *
  47.  *                              16-bit ints to long or unsigned in    *
  48.  *                              bit alloc routines for quant of 65535 *
  49.  *                              and passing proper function args.     *
  50.  *                              Removed "Other Joint Stereo" option   *
  51.  *                              and made bitrate be total channel     *
  52.  *                              bitrate, irrespective of the mode.    *
  53.  *                              Fixed many small bugs & reorganized.  *
  54.  *                              Modified some function prototypes.    *
  55.  *                              Changed BUFFER_SIZE back to 4096.     *
  56.  * 8 jul 92 Susanne Ritscher    MS-DOS, MSC 6.0 port fixes.           *
  57.  *19 aug 92 Soren H. Nielsen    Printout of bit allocation.           *
  58.  *                              UNIX port fixes. MS-DOS file name     *
  59.  *  extensions fix                        *
  60.  * dec 92 Susanne Ritscher Changed to multi-channel with several *
  61.  *  options                 *
  62.  **********************************************************************
  63.  *                                                                    *
  64.  *                                                                    *
  65.  *  MPEG/audio Phase 2 coding/decoding multichannel                   *
  66.  *                                                                    *
  67.  *  7/27/93        Susanne Ritscher,  IRT Munich                      *
  68.  *  8/27/93        Susanne Ritscher, IRT Munich                       *
  69.  *                 Channel-Switching is working                       *
  70.  *  9/1/93         Susanne Ritscher,  IRT Munich                      *
  71.  *                 all channels normalized                            *
  72.  *  9/20/93        channel-switching is only performed at a           *
  73.  *                 certain limit of TC_ALLOC dB, which is included    *
  74.  *                 in encoder.h                                       *
  75.  *                                                                    *
  76.  *  Version 1.0                                                       *
  77.  *                                                                    *
  78.  *  07/12/94       Susanne Ritscher,  IRT Munich                      *
  79.  *                                                                    *
  80.  *  Version 1.1                                                       *
  81.  *                                                                    *
  82.  *  02/23/95    Susanne Ritscher,  IRT Munich                      *
  83.  *                 corrected some bugs                                *
  84.  *                 extension bitstream is working                     *
  85.  *                                                                    *
  86.  *  Version 2.0                                                       *
  87.  *                                                                    *
  88.  *  01/28/97       Frans de Bont, Philips Sound & Vision, Eindhoven   *
  89.  *     - dynamic crosstalk working for all configurations*
  90.  *     - prediction working for all configurations       *
  91.  *     - extension bitstream fixed       *
  92.  *     - fully compliant to DIS 13818-3.2                *
  93.  *                                                                    *       *     
  94.  **********************************************************************/
  95. /***********************************************************************
  96. *
  97. *  Global Conditional Compile Switches
  98. *
  99. ***********************************************************************/
  100. #define PRINTOUT
  101. #define DEBUG
  102. /*#define MACINTOSH */ /* Macintosh conditional compile switch */
  103. /*#define MS_DOS */ /* IBM PC conditional compile switch
  104.    Microsoft C ver. 6.0 */
  105. #define VERSION "$Revision: 2.0 $"
  106. #ifdef  UNIX
  107. #define         TABLES_PATH     "tables/"  /* to find data files */
  108. /* name of environment variable holding path of table files */
  109. #define         MPEGTABENV      "MPEGTABLES"
  110. #define         PATH_SEPARATOR  "/"        /* how to build paths */
  111. #define         PROTO_ARGS                 /* unix gcc uses arg. prototypes */
  112. #endif  /* UNIX */
  113. #ifdef  MACINTOSH
  114. /* #define      TABLES_PATH ":tables:"  /* where to find data files */
  115. #define         PROTO_ARGS              /* Mac uses argument prototypes */
  116. #endif  /* MACINTOSH */
  117. #ifdef  MS_DOS
  118. #define         PROTO_ARGS  /* DOS uses argument prototypes */
  119. #endif  /* MS_DOS */
  120. /* MS_DOS and VMS do not define TABLES_PATH, so OpenTableFile will default
  121.    to finding the data files in the default directory */
  122. /***********************************************************************
  123. *
  124. *  Global Include Files
  125. *
  126. ***********************************************************************/
  127. #include        <stdio.h>
  128. #include        <string.h>
  129. #include        <math.h>
  130. #ifdef  UNIX
  131. #include        <unistd.h>  /* removed 92-08-05 shn */
  132. #include <stdlib.h>       /* put in 92-08-05 shn */
  133. #endif  /* UNIX */
  134. #ifdef  MACINTOSH
  135. #include        <stdlib.h>
  136. #include        <console.h>
  137. #endif  /* MACINTOSH */
  138. #ifdef  MS_DOS
  139. /* #include <alloc.h> */ /* removed 92-07-08 sr */
  140. #include <malloc.h>   /* put in 92-07-08 sr */
  141. /* #include <mem.h> */   /* removed 92-07-08 sr */
  142. #include <stdlib.h>
  143. #endif  /* MS_DOS */
  144. /***********************************************************************
  145. *
  146. *  Global Definitions
  147. *
  148. ***********************************************************************/
  149. /* General Definitions */
  150. #ifdef  MS_DOS
  151. #define         FLOAT                   double
  152. #else
  153. #define         FLOAT                   float
  154. #endif
  155. #define         FALSE                   0
  156. #define         TRUE                    (!FALSE)
  157. #define         NULL_CHAR               ''
  158. #define         MAX_U_32_NUM            0xFFFFFFFF
  159. #define         PI                      3.14159265358979
  160. #define         PI4                     PI/4
  161. #define         PI64                    PI/64
  162. #define         LN_TO_LOG10             0.2302585093
  163. #define         VOL_REF_NUM             0
  164. #define         MPEG_AUDIO_ID           1
  165. #define         MAC_WINDOW_SIZE         24
  166. #define         MONO                    1
  167. #define         STEREO                  2
  168. #define         BITS_IN_A_BYTE          8
  169. #define         WORD                    16
  170. #define         MAX_NAME_SIZE           81
  171. #define         SBLIMIT                 32
  172. #define         FFT_SIZE                1024
  173. #define         HAN_SIZE                512
  174. #define         SCALE_BLOCK             12
  175. #define         SCALE_RANGE             63
  176. #define         SCALE                   32768
  177. #define         CRC16_POLYNOMIAL        0x8005
  178. #define         MAX_PRED_COEFF          3.96875     /* gleichfoermige Quantisierung der */
  179.                                                     /* Praediktorkoeff. im Bereich */
  180.                                                     /* [-MAX_PRED_COEF .. +MAX_PRED_COEF] */
  181. #define CHANMAX1        5
  182. #define CHANMAX2        7
  183. #define CHANMAX3       12
  184. #define SBGRS          12
  185. /* Channels */
  186. #define     L0     0     
  187. #define     R0     1     
  188. #define     C     2     
  189. #define     LS     3     
  190. #define     RS     4     
  191. #define     L     5     
  192. #define     R     6
  193. #define     L7     7
  194. #define     R7     8     
  195. #define     C7     9
  196. #define     LC     10     
  197. #define     RC     11     
  198. /* Sums */
  199. #define     T23     0
  200. #define     T24     1
  201. #define     T34     2
  202. #define     T234    3     
  203. #define     T56     4     
  204. /* MPEG Header Definitions - Mode Values */
  205. #define         MPG_MD_STEREO           0
  206. #define         MPG_MD_JOINT_STEREO     1
  207. #define         MPG_MD_DUAL_CHANNEL     2
  208. #define MPG_MD_MONO 3
  209. #define MPG_MD_NONE 4
  210. /* AIFF Definitions */
  211. #ifndef MS_DOS
  212. #define         IFF_ID_FORM             "FORM" /* HP400 unix v8.0: double qoutes 1992-07-24 shn */
  213. #define         IFF_ID_AIFF             "AIFF"
  214. #define         IFF_ID_COMM             "COMM"
  215. #define         IFF_ID_SSND             "SSND"
  216. #define         IFF_ID_MPEG             "MPEG"
  217. #else
  218. #define         IFF_ID_FORM             "FORM"
  219. #define         IFF_ID_AIFF             "AIFF"
  220. #define         IFF_ID_COMM             "COMM"
  221. #define         IFF_ID_SSND             "SSND"
  222. #define         IFF_ID_MPEG             "MPEG"
  223. #endif
  224. /* "bit_stream.h" Definitions */
  225. #define         MINIMUM         4    /* Minimum size of the buffer in bytes */
  226. #define         MAX_LENGTH      32   /* Maximum length of word written or
  227.                                         read from bit stream */
  228. #define         READ_MODE       0
  229. #define         WRITE_MODE      1
  230. #define         ALIGNING        8
  231. #define         BINARY          0
  232. #define         ASCII           1
  233. #define         BS_FORMAT       BINARY /* BINARY or ASCII = 2x bytes */
  234. #define         BUFFER_SIZE     4096
  235. #define         MIN(A, B)       ((A) < (B) ? (A) : (B))
  236. #define         MAX(A, B)       ((A) > (B) ? (A) : (B))
  237. /***********************************************************************
  238. *
  239. *  Global Type Definitions
  240. *
  241. ***********************************************************************/
  242. /* Structure for Reading Layer II Allocation Tables from File */
  243. typedef struct {
  244.         unsigned int    steps;
  245.         unsigned int    bits;
  246.         unsigned int    group;
  247.         unsigned int    quant;
  248. } sb_alloc, *alloc_ptr;
  249. typedef sb_alloc        al_table[SBLIMIT][16];
  250. /* Header Information Structure */
  251. typedef struct {
  252.     int version;
  253.     int lay;
  254.     int error_protection;
  255.     int bitrate_index;
  256.     int sampling_frequency;
  257.     int padding;
  258.     int extension;
  259.     int mode;
  260.     int mode_ext;
  261.     int copyright;
  262.     int original;
  263.     int emphasis;
  264.     int center;  /* center present */
  265.     int surround;   /* surrounds present*/
  266.     int audio_mix;  /* large listening room or not? */
  267.     int matrix;  /* type of dematricing */
  268.     int lfe;  /* low frequency effect channel*/
  269.     int multiling_ch;  /* number of multilingual channels */
  270.     int multiling_fs;  /* fs of ML channels is half fs of main channels */
  271.     int multiling_lay;  /* Layer IIML or Layer II ML is used*/
  272.     int ext_bit_stream_present;  /* extension bitstream present? */
  273.     int n_ad_bytes;              /* if yes, how many bits anc.data for mpeg2 */
  274.     int mc_pred[8];  /* prediction bit*/
  275.     int tc_alloc[12];  /* transmission channel allocation in each sbgroup*/
  276.     int predsi[8][6];  /* predictor select information*/
  277.     int delay_comp[8][6];
  278.     int pred_coef[8][6][3];
  279.     int mc_prediction_on;
  280.     int tc_sbgr_select;
  281.     int tc_allocation;
  282.     int dyn_cross_on;
  283.     int dyn_cross_LR;            /* center out of Lo or Ro*/
  284.     int dyn_cross[12];
  285.     int ext_length;
  286.     int ext_sync;
  287.     int ext_bit;
  288.     int copy_ident_bit;
  289.     int copy_ident_start;
  290.     int dyn_second_stereo[12];
  291. #ifdef Augmentation_7ch
  292.     int aug_mtx_proc;
  293.     int aug_dyn_cross_on;
  294.     int aug_future_ext;
  295.     int aug_tc_alloc[12];    /* transmission channel allocation in each sbgroup */
  296.     int aug_dyn_cross[12];
  297. #endif
  298. } layer, *the_layer;
  299. /* Parent Structure Interpreting some Frame Parameters in Header */
  300. typedef struct {
  301.          layer                   *header;        /* raw header information */
  302.  int  actual_mode;  /* when writing IS, may forget if 0 chs */
  303.          al_table                *alloc;         /* bit allocation table read in */
  304.  al_table  *alloc_mc;      /* MC bit allocation table read in */
  305.          al_table                *alloc_ml;      /* ML bit allocation table read in */
  306.          int                     tab_num;        /* number of table as loaded */
  307.          int                     tab_num_mc;     /* number of MC table as loaded */
  308.          int                     tab_num_ml;     /* number of ML table as loaded */
  309.  int  stereo;   /* 1 for mono, 2 for stereo */
  310.  int  stereomc;
  311.  int  stereoaug;
  312.  int  lfe_pos;
  313.  int  jsbound;  /* first band of joint stereo coding */
  314.  double          mnr_min;  /* mnr for dynamic bitallocation */
  315.          int                     sblimit;        /* total number of sub bands */
  316.          int                     sblimit_mc;     /* total number of MC sub bands */
  317.          int                     sblimit_ml;     /* total number of ML sub bands */
  318.  int                     phantom_c;      /* phantom coding of Center signal */
  319.  int                     config;        /* config code: 320, 310, 300, 302, 220, 210, 200, 202, 100, 102 */
  320. } frame_params;
  321. /* Double and SANE Floating Point Type Definitions */
  322. typedef struct  IEEE_DBL_struct {
  323.                 unsigned long   hi;
  324.                 unsigned long   lo;
  325. } IEEE_DBL;
  326. typedef struct  SANE_EXT_struct {
  327.                 unsigned long   l1;
  328.                 unsigned long   l2;
  329.                 unsigned short  s1;
  330. } SANE_EXT;
  331. /* AIFF Type Definitions */
  332. typedef char  ID[4];
  333. typedef struct  identifier_struct{
  334.  ID name;
  335.  long ck_length;
  336. }identifier;
  337. typedef struct  ChunkHeader_struct {
  338.                 ID      ckID;
  339.                 long    ckSize;
  340. } ChunkHeader;
  341. typedef struct  Chunk_struct {
  342.                 ID      ckID;
  343.                 long    ckSize;
  344.                 ID      formType;
  345. } Chunk;
  346. typedef struct  CommonChunk_struct {
  347.                 ID              ckID;
  348.                 long            ckSize;
  349.                 short           numChannels;
  350.                 unsigned long   numSampleFrames;
  351.                 short           sampleSize;
  352.                 char            sampleRate[10];
  353. } CommonChunk;
  354. typedef struct  SoundDataChunk_struct {
  355.                 ID              ckID;
  356.                 long            ckSize;
  357.                 unsigned long   offset;
  358.                 unsigned long   blockSize;
  359. } SoundDataChunk;
  360. typedef struct  blockAlign_struct {
  361.                 unsigned long   offset;
  362.                 unsigned long   blockSize;
  363. } blockAlign;
  364. typedef struct  IFF_AIFF_struct {
  365.                 short           numChannels;
  366.                 unsigned long   numSampleFrames;
  367.                 short           sampleSize;
  368.                 double          sampleRate;
  369.                 ID/*char**/     sampleType;/*must be allocated 21.6.93 SR*/
  370.                 blockAlign      blkAlgn;
  371. } IFF_AIFF;
  372. /* "bit_stream.h" Type Definitions */
  373. typedef struct  bit_stream_struc {
  374.     FILE        *pt;            /* pointer to bit stream device */
  375.     unsigned char *buf;         /* bit stream buffer */
  376.     int         buf_size;       /* size of buffer (in number of bytes) */
  377.     long        totbit;         /* bit counter of bit stream */
  378.     int         buf_byte_idx;   /* pointer to top byte in buffer */
  379.     int         buf_bit_idx;    /* pointer to top bit of top byte in buffer */
  380.     int         mode;           /* bit stream open in read or write mode */
  381.     int         eob;            /* end of buffer index */
  382.     int         eobs;           /* end of bit stream flag */
  383.     char        format;
  384. /* format of file in rd mode (BINARY/ASCII) */
  385.     } Bit_stream_struc;
  386. /* JMZ 08/03/1995 begin SORT*/
  387. typedef struct {
  388.          int    tc_channel;
  389.          int    audio_channel;
  390.          int    subband;
  391.          int    sbgroup;
  392.          int    used;
  393.          double mnr;
  394.          int    next;
  395. } channel_sort;
  396. /* JMZ 08/03/1995 end SORT*/
  397. /***********************************************************************
  398. *
  399. *  Global Variable External Declarations
  400. *
  401. ***********************************************************************/
  402. extern char     *mode_names[4];
  403. extern char     *layer_names[3];
  404. extern double   s_freq[4];
  405. extern int bitrate[3][16];
  406. extern double multiple[64];
  407. extern int      sbgrp[32];
  408. extern int      sb_groups[12];
  409. extern int      n_pred_coef[16];          
  410. extern int no_channel[8][2];
  411. extern int T2[SBGRS], T3[SBGRS], T4[SBGRS];  
  412. #ifdef Augmentation_7ch
  413. extern int T5[SBGRS], T6[SBGRS];  
  414. #endif
  415. extern int T2outof[12], T3outof[12], T4outof[12]; /* L0 or R0 */
  416. extern int T2from[12], T3from[12], T4from[12];
  417. extern int verbosity;
  418. /***********************************************************************
  419. *
  420. *  Global Function Prototype Declarations
  421. *
  422. ***********************************************************************/
  423. /* The following functions are in the file "common.c" */
  424. #ifdef  MACINTOSH
  425. extern void           set_mac_file_attr(char[MAX_NAME_SIZE], short, OsType,
  426.                         OsType);
  427. #endif
  428. extern void       program_information(void);
  429. extern FILE           *OpenTableFile(char *name);
  430. extern int            read_bit_alloc(int table, al_table (*alloc));
  431. extern int            pick_table(frame_params *fr_ps);
  432. extern int            js_bound(int lay, int m_ext);
  433. extern void           hdr_to_frps(frame_params *fr_ps);
  434. extern int            BitrateIndex(int layr, int bRate);
  435. extern int            SmpFrqIndex(long int sRate);
  436. extern void           *mem_alloc(long unsigned int block, char *item);
  437. extern void           mem_free(void **ptr_addr);
  438. extern void           double_to_extended(double *pd, char *ps);
  439. extern void           extended_to_double(char *ps, double *pd);
  440. extern int            aiff_read_headers(FILE *file_ptr, IFF_AIFF *aiff_ptr, int *byte_per_sample);
  441. extern int            aiff_seek_to_sound_data(FILE *file_ptr);
  442. extern int            aiff_write_headers(FILE *file_ptr, IFF_AIFF *aiff_ptr);
  443. extern int            refill_buffer(Bit_stream_struc *bs);
  444. extern void           empty_buffer(Bit_stream_struc *bs, int minimum);
  445. extern void           open_bit_stream_w(Bit_stream_struc *bs, char *bs_filenam, int size);
  446. extern void           open_bit_stream_r(Bit_stream_struc *bs, char *bs_filenam, int size);
  447. extern void           close_bit_stream_r(Bit_stream_struc *bs);
  448. extern void           close_bit_stream_w(Bit_stream_struc *bs);
  449. extern void           alloc_buffer(Bit_stream_struc *bs, int size);
  450. extern void           desalloc_buffer(Bit_stream_struc *bs);
  451. extern unsigned int   get1bit(Bit_stream_struc *bs);
  452. extern void           put1bit(Bit_stream_struc *bs, int bit);
  453. extern unsigned long  getbits(Bit_stream_struc *bs, int N);
  454. extern void           putbits(Bit_stream_struc *bs, unsigned int val, int N);
  455. extern unsigned long  sstell (Bit_stream_struc *bs);
  456. extern int            end_bs (Bit_stream_struc *bs);
  457. extern int            transmission_channel (frame_params *fr_ps, int sbgr, int m);
  458. extern int            dyn_ch (frame_params *fr_ps, int sbgr, int m);
  459. extern int            dyn_bbal (int config, int center, int dynx, int m);
  460. extern int            dyn_bbal_2ndst (int dynx, int m);
  461. #ifdef Augmentation_7ch
  462. extern int            dyn_bbal_aug (int aug_dynx, int m);
  463. #endif
  464. extern void           init_mc_pred (frame_params *fr_ps);
  465. extern void           set_mc_pred (frame_params *fr_ps);
  466. extern void           I_CRC_calc (frame_params *fr_ps, unsigned int (*bit_alloc)[32], unsigned int *crc);
  467. extern void           II_CRC_calc (frame_params *fr_ps, unsigned int (*bit_alloc)[32], unsigned int (*scfsi)[32], unsigned int *crc);
  468. extern void           II_CRC_calc_mc (frame_params *fr_ps, unsigned int (*bit_alloc)[32], unsigned int lfe_alloc, unsigned int (*scfsi)[32], unsigned int *crc);
  469. #ifdef Augmentation_7ch
  470. extern void           II_CRC_calc_aug (frame_params *fr_ps, unsigned int (*bit_alloc)[32], unsigned int (*scfsi)[32], unsigned int *crc);
  471. #endif
  472. extern void           II_CRC_calc_ext (frame_params *fr_ps, unsigned int *x, unsigned int *crc);
  473. extern void           update_CRC (unsigned int data, unsigned int length, unsigned int *crc);