enc_base.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:12k
源码类别:

midi

开发平台:

Unix_Linux

  1. /***************************************************************************
  2.  *             __________               __   ___.
  3.  *   Open      ______    ____   ____ |  | __ |__   _______  ___
  4.  *   Source     |       _//  _ _/ ___|  |/ /| __  /  _   /  /
  5.  *   Jukebox    |    |   (  <_> )  ___|    < | _ (  <_> > <  <
  6.  *   Firmware   |____|_  /____/ ___  >__|_ |___  /____/__/_ 
  7.  *                     /            /     /    /            /
  8.  * $Id: 67cb41e5d828894491f4b6a905d81e4affbdfd0c $
  9.  *
  10.  * Base declarations for working with software encoders
  11.  *
  12.  * Copyright (C) 2006 Michael Sevakis
  13.  *
  14.  * This program is free software; you can redistribute it and/or
  15.  * modify it under the terms of the GNU General Public License
  16.  * as published by the Free Software Foundation; either version 2
  17.  * of the License, or (at your option) any later version.
  18.  *
  19.  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  20.  * KIND, either express or implied.
  21.  *
  22.  ****************************************************************************/
  23. #ifndef ENC_BASE_H
  24. #define ENC_BASE_H
  25. /* firmware/export/system.h */
  26. /* return p incremented by specified number of bytes */
  27. #define SKIPBYTES(p, count) ((typeof (p))((char *)(p) + (count)))
  28. #define P2_M1(p2)  ((1 << (p2))-1)
  29. /* align up or down to nearest 2^p2 */
  30. #define ALIGN_DOWN_P2(n, p2) ((n) & ~P2_M1(p2))
  31. #define ALIGN_UP_P2(n, p2)   ALIGN_DOWN_P2((n) + P2_M1(p2),p2)
  32. /* end of firmware/export/system.h */
  33. /** encoder config structures **/
  34. /** aiff_enc.codec **/
  35. struct aiff_enc_config
  36. {
  37. #if 0
  38.     unsigned long sample_depth;
  39. #endif
  40. };
  41. /** mp3_enc.codec **/
  42. #define MP3_BITR_CAP_8      (1 << 0)
  43. #define MP3_BITR_CAP_16     (1 << 1)
  44. #define MP3_BITR_CAP_24     (1 << 2)
  45. #define MP3_BITR_CAP_32     (1 << 3)
  46. #define MP3_BITR_CAP_40     (1 << 4)
  47. #define MP3_BITR_CAP_48     (1 << 5)
  48. #define MP3_BITR_CAP_56     (1 << 6)
  49. #define MP3_BITR_CAP_64     (1 << 7)
  50. #define MP3_BITR_CAP_80     (1 << 8)
  51. #define MP3_BITR_CAP_96     (1 << 9)
  52. #define MP3_BITR_CAP_112    (1 << 10)
  53. #define MP3_BITR_CAP_128    (1 << 11)
  54. #define MP3_BITR_CAP_144    (1 << 12)
  55. #define MP3_BITR_CAP_160    (1 << 13)
  56. #define MP3_BITR_CAP_192    (1 << 14)
  57. #define MP3_BITR_CAP_224    (1 << 15)
  58. #define MP3_BITR_CAP_256    (1 << 16)
  59. #define MP3_BITR_CAP_320    (1 << 17)
  60. #define MP3_ENC_NUM_BITR    18
  61. /* MPEG 1 */
  62. #define MPEG1_SAMPR_CAPS    (SAMPR_CAP_32 | SAMPR_CAP_48 | SAMPR_CAP_44)
  63. #define MPEG1_BITR_CAPS     (MP3_BITR_CAP_32  | MP3_BITR_CAP_40  | MP3_BITR_CAP_48  | 
  64.                              MP3_BITR_CAP_56  | MP3_BITR_CAP_64  | MP3_BITR_CAP_80  | 
  65.                              MP3_BITR_CAP_96  | MP3_BITR_CAP_112 | MP3_BITR_CAP_128 | 
  66.                              MP3_BITR_CAP_160 | MP3_BITR_CAP_192 | MP3_BITR_CAP_224 | 
  67.                              MP3_BITR_CAP_256 | MP3_BITR_CAP_320)
  68. /* MPEG 2 */
  69. #define MPEG2_SAMPR_CAPS    (SAMPR_CAP_22 | SAMPR_CAP_24 | SAMPR_CAP_16)
  70. #define MPEG2_BITR_CAPS     (MP3_BITR_CAP_8   | MP3_BITR_CAP_16  | MP3_BITR_CAP_24  | 
  71.                              MP3_BITR_CAP_32  | MP3_BITR_CAP_40  | MP3_BITR_CAP_48  | 
  72.                              MP3_BITR_CAP_56  | MP3_BITR_CAP_64  | MP3_BITR_CAP_80  | 
  73.                              MP3_BITR_CAP_96  | MP3_BITR_CAP_112 | MP3_BITR_CAP_128 | 
  74.                              MP3_BITR_CAP_144 | MP3_BITR_CAP_160)
  75. #if 0
  76. /* MPEG 2.5 */
  77. #define MPEG2_5_SAMPR_CAPS  (SAMPR_CAP_8  | SAMPR_CAP_12 | SAMPR_CAP_11)
  78. #define MPEG2_5_BITR_CAPS   MPEG2_BITR_CAPS
  79. #endif
  80. #if 0
  81. /* HAVE_MPEG* defines mainly apply to the bitrate menu */
  82. #if (REC_SAMPR_CAPS & MPEG1_SAMPR_CAPS) || defined (HAVE_SPDIF_REC)
  83. #define HAVE_MPEG1_SAMPR
  84. #endif
  85. #if (REC_SAMPR_CAPS & MPEG2_SAMPR_CAPS) || defined (HAVE_SPDIF_REC)
  86. #define HAVE_MPEG2_SAMPR
  87. #endif
  88. #endif
  89. #if 0
  90. #if (REC_SAMPR_CAPS & MPEG2_5_SAMPR_CAPS) || defined (HAVE_SPDIF_REC)
  91. #define HAVE_MPEG2_5_SAMPR
  92. #endif
  93. #endif /* 0 */
  94. #define MP3_ENC_SAMPR_CAPS      (MPEG1_SAMPR_CAPS | MPEG2_SAMPR_CAPS)
  95. /* This number is count of full encoder set */
  96. #define MP3_ENC_NUM_SAMPR       6
  97. extern const unsigned long mp3_enc_sampr[MP3_ENC_NUM_SAMPR];
  98. extern const unsigned long mp3_enc_bitr[MP3_ENC_NUM_BITR];
  99. struct mp3_enc_config
  100. {
  101.     unsigned long bitrate;
  102. };
  103. #define MP3_ENC_BITRATE_CFG_DEFAULT     11 /* 128 */
  104. #define MP3_ENC_BITRATE_CFG_VALUE_LIST  "8,16,24,32,40,48,56,64,80,96," 
  105.                                         "112,128,144,160,192,224,256,320"
  106. /** wav_enc.codec **/
  107. #define WAV_ENC_SAMPR_CAPS      SAMPR_CAP_ALL
  108. struct wav_enc_config
  109. {
  110. #if 0
  111.     unsigned long sample_depth;
  112. #endif
  113. };
  114. /** wavpack_enc.codec **/
  115. #define WAVPACK_ENC_SAMPR_CAPS  SAMPR_CAP_ALL
  116. struct wavpack_enc_config
  117. {
  118. #if 0
  119.     unsigned long sample_depth;
  120. #endif
  121. };
  122. struct encoder_config
  123. {
  124.     union
  125.     {
  126.         /* states which *_enc_config member is valid */
  127.         int rec_format; /* REC_FORMAT_* value */
  128.         int afmt;       /* AFMT_* value       */
  129.     };
  130.     union
  131.     {
  132.         struct mp3_enc_config     mp3_enc;
  133.         struct wavpack_enc_config wavpack_enc;
  134.         struct wav_enc_config     wav_enc;
  135.     };
  136. };
  137. /** Encoder chunk macros and definitions **/
  138. #define CHUNKF_START_FILE 0x0001ul /* This chunk starts a new file         */
  139. #define CHUNKF_END_FILE   0x0002ul /* This chunk ends the current file     */
  140. #define CHUNKF_PRERECORD  0x0010ul /* This chunk is prerecord data,
  141.                                       a new file could start anytime       */
  142. #define CHUNKF_ABORT      0x0020ul /* Encoder should not finish this
  143.                                       chunk                                */
  144. #define CHUNKF_ERROR    (~0ul ^ (~0ul >> 1)) /* An error has occured
  145.                                       (passed to/from encoder). Use the
  146.                                       sign bit to check (long)flags < 0.   */
  147. #define CHUNKF_ALLFLAGS (0x0033ul | CHUNKF_ERROR)
  148. /* Header at the beginning of every encoder chunk */
  149. #ifdef DEBUG
  150. #define ENC_CHUNK_MAGIC H_TO_BE32(('P' << 24) | ('T' << 16) | ('Y' << 8) | 'R')
  151. #endif
  152. struct enc_chunk_hdr
  153. {
  154. #ifdef DEBUG
  155.     unsigned long id;         /* overflow detection - 'PTYR' - acronym for
  156.                                  "PTYR Tells You Right" ;)                 */
  157. #endif
  158.     unsigned long flags;      /* in/out: flags used by encoder and file
  159.                                          writing                           */
  160.     size_t        enc_size;   /* out:    amount of encoder data written to
  161.                                          chunk                             */
  162.     unsigned long num_pcm;    /* out:    number of PCM samples eaten during
  163.                                          processing
  164.                                          (<= size of allocated buffer)     */
  165.     unsigned char *enc_data;  /* out:    pointer to enc_size_written bytes
  166.                                          of encoded audio data in chunk    */
  167.     /* Encoder defined data follows header. Can be audio data + any other
  168.        stuff the encoder needs to handle on a per chunk basis */
  169. };
  170. /* Paranoia: be sure header size is 4-byte aligned */
  171. #define ENC_CHUNK_HDR_SIZE 
  172.             ALIGN_UP_P2(sizeof (struct enc_chunk_hdr), 2)
  173. /* Skip the chunk header and return data */
  174. #define ENC_CHUNK_SKIP_HDR(t, hdr) 
  175.             ((typeof (t))((char *)hdr + ENC_CHUNK_HDR_SIZE))
  176. /* Cast p to struct enc_chunk_hdr * */
  177. #define ENC_CHUNK_HDR(p) 
  178.             ((struct enc_chunk_hdr *)(p))
  179. enum enc_events
  180. {
  181.     /* File writing events - data points to enc_file_event_data            */
  182.     ENC_START_FILE = 0,  /* a new file has been opened and no data has yet
  183.                             been written                                   */
  184.     ENC_WRITE_CHUNK,     /* write the current chunk to disk                */
  185.     ENC_END_FILE,        /* current file about to be closed and all valid
  186.                             data has been written                          */
  187.     /* Encoder buffer events - data points to enc_buffer_event_data        */
  188.     ENC_REC_NEW_STREAM,  /* Take steps to finish current stream and start
  189.                             new                                            */
  190. };
  191. /**
  192.  * encoder can write extra data to the file such as headers or more encoded
  193.  * samples and must update sizes and samples accordingly.
  194.  */
  195. struct enc_file_event_data
  196. {
  197.     struct enc_chunk_hdr *chunk;   /* Current chunk                        */
  198.     size_t        new_enc_size;    /* New size of chunk                    */
  199.     unsigned long new_num_pcm;     /* New number of pcm in chunk           */
  200.     const char   *filename;        /* filename to open if ENC_START_FILE   */
  201.     int           rec_file;        /* Current file or < 0 if none          */
  202.     unsigned long num_pcm_samples; /* Current pcm sample count written to
  203.                                       file so far.                         */
  204. };
  205. /**
  206.  * encoder may add some data to the end of the last and start of the next
  207.  * but must never yield when called so any encoding done should be absolutely
  208.  * minimal.
  209.  */
  210. struct enc_buffer_event_data
  211. {
  212.     unsigned long         flags;       /* in: One or more of:
  213.                                         *     CHUNKF_PRERECORD
  214.                                         *     CHUNKF_END_FILE
  215.                                         *     CHUNKF_START_FILE
  216.                                         */
  217.     struct enc_chunk_hdr *pre_chunk;   /* in: pointer to first prerecord
  218.                                         *     chunk
  219.                                         */
  220.     struct enc_chunk_hdr *chunk;       /* in,out: chunk were split occurs -
  221.                                         *         first chunk of start
  222.                                         */
  223. };
  224. /** Callbacks called by encoder codec **/
  225. /* parameters passed to encoder by enc_get_inputs */
  226. struct enc_inputs
  227. {
  228.     unsigned long sample_rate;     /* out - pcm frequency                  */
  229.     int           num_channels;    /* out - number of audio channels       */
  230.     struct encoder_config *config; /* out - encoder settings               */
  231. };
  232. void enc_get_inputs(struct enc_inputs *inputs);
  233. /* parameters pass from encoder to enc_set_parameters */
  234. struct enc_parameters
  235. {
  236.     /* IN parameters */
  237.     int           afmt;            /* AFMT_* id - sanity checker           */
  238.     size_t        chunk_size;      /* max chunk size required              */
  239.     unsigned long enc_sample_rate; /* actual sample rate used by encoder
  240.                                       (for recorded time calculation)      */
  241.     size_t        reserve_bytes;   /* number of bytes to reserve immediately
  242.                                       following chunks                     */
  243.     void (*events_callback)(enum enc_events event,
  244.                             void *data); /*  pointer to events callback    */
  245.     /* OUT parameters */
  246.     unsigned char *enc_buffer;     /* pointer to enc_buffer                */
  247.     size_t         buf_chunk_size; /* size of chunks in enc_buffer         */
  248.     int            num_chunks;     /* number of chunks allotted to encoder */
  249.     unsigned char *reserve_buffer; /* pointer to reserve_bytes bytes       */
  250. };
  251. /* set the encoder dimensions - called by encoder codec at initialization
  252.    and termination */
  253. void   enc_set_parameters(struct enc_parameters *params);
  254. /* returns pointer to next write chunk in circular buffer */
  255. struct enc_chunk_hdr * enc_get_chunk(void);
  256. /* releases the current chunk into the available chunks */
  257. void   enc_finish_chunk(void);
  258. #define PCM_MAX_FEED_SIZE       20000 /* max pcm size passed to encoder    */
  259. /* passes a pointer to next chunk of unprocessed wav data */
  260. unsigned char * enc_get_pcm_data(size_t size);
  261. /* puts some pcm data back in the queue */
  262. size_t          enc_unget_pcm_data(size_t size);
  263. #endif /* ENC_BASE_H */