format.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:32k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC - Free Lossless Audio Codec library
  2.  * Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #ifndef FLAC__FORMAT_H
  32. #define FLAC__FORMAT_H
  33. #include "export.h"
  34. #include "ordinals.h"
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. /** file include/FLAC/format.h
  39.  *
  40.  *  brief
  41.  *  This module contains structure definitions for the representation
  42.  *  of FLAC format components in memory.  These are the basic
  43.  *  structures used by the rest of the interfaces.
  44.  *
  45.  *  See the detailed documentation in the
  46.  *  link flac_format format endlink module.
  47.  */
  48. /** defgroup flac_format FLAC/format.h: format components
  49.  *  ingroup flac
  50.  *
  51.  *  brief
  52.  *  This module contains structure definitions for the representation
  53.  *  of FLAC format components in memory.  These are the basic
  54.  *  structures used by the rest of the interfaces.
  55.  *
  56.  *  First, you should be familiar with the
  57.  *  <A HREF="../format.html">FLAC format</A>.  Many of the values here
  58.  *  follow directly from the specification.  As a user of libFLAC, the
  59.  *  interesting parts really are the structures that describe the frame
  60.  *  header and metadata blocks.
  61.  *
  62.  *  The format structures here are very primitive, designed to store
  63.  *  information in an efficient way.  Reading information from the
  64.  *  structures is easy but creating or modifying them directly is
  65.  *  more complex.  For the most part, as a user of a library, editing
  66.  *  is not necessary; however, for metadata blocks it is, so there are
  67.  *  convenience functions provided in the link flac_metadata metadata
  68.  *  module endlink to simplify the manipulation of metadata blocks.
  69.  *
  70.  * note
  71.  * It's not the best convention, but symbols ending in _LEN are in bits
  72.  * and _LENGTH are in bytes.  _LENGTH symbols are #defines instead of
  73.  * global variables because they are usually used when declaring byte
  74.  * arrays and some compilers require compile-time knowledge of array
  75.  * sizes when declared on the stack.
  76.  *
  77.  * {
  78.  */
  79. /*
  80. Most of the values described in this file are defined by the FLAC
  81. format specification.  There is nothing to tune here.
  82. */
  83. /** The largest legal metadata type code. */
  84. #define FLAC__MAX_METADATA_TYPE_CODE (126u)
  85. /** The minimum block size, in samples, permitted by the format. */
  86. #define FLAC__MIN_BLOCK_SIZE (16u)
  87. /** The maximum block size, in samples, permitted by the format. */
  88. #define FLAC__MAX_BLOCK_SIZE (65535u)
  89. /** The maximum number of channels permitted by the format. */
  90. #define FLAC__MAX_CHANNELS (8u)
  91. /** The minimum sample resolution permitted by the format. */
  92. #define FLAC__MIN_BITS_PER_SAMPLE (4u)
  93. /** The maximum sample resolution permitted by the format. */
  94. #define FLAC__MAX_BITS_PER_SAMPLE (32u)
  95. /** The maximum sample resolution permitted by libFLAC.
  96.  *
  97.  * warning
  98.  * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format.  However,
  99.  * the reference encoder/decoder is currently limited to 24 bits because
  100.  * of prevalent 32-bit math, so make sure and use this value when
  101.  * appropriate.
  102.  */
  103. #define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u)
  104. /** The maximum sample rate permitted by the format.  The value is
  105.  *  ((2 ^ 16) - 1) * 10; see <A HREF="../format.html">FLAC format</A>
  106.  *  as to why.
  107.  */
  108. #define FLAC__MAX_SAMPLE_RATE (655350u)
  109. /** The maximum LPC order permitted by the format. */
  110. #define FLAC__MAX_LPC_ORDER (32u)
  111. /** The minimum quantized linear predictor coefficient precision
  112.  *  permitted by the format.
  113.  */
  114. #define FLAC__MIN_QLP_COEFF_PRECISION (5u)
  115. /** The maximum quantized linear predictor coefficient precision
  116.  *  permitted by the format.
  117.  */
  118. #define FLAC__MAX_QLP_COEFF_PRECISION (15u)
  119. /** The maximum order of the fixed predictors permitted by the format. */
  120. #define FLAC__MAX_FIXED_ORDER (4u)
  121. /** The maximum Rice partition order permitted by the format. */
  122. #define FLAC__MAX_RICE_PARTITION_ORDER (15u)
  123. /** The maximum Rice partition order permitted by the FLAC Subset. */
  124. #define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u)
  125. /** The version string of the release, stamped onto the libraries and binaries.
  126.  *
  127.  * note
  128.  * This does not correspond to the shared library version number, which
  129.  * is used to determine binary compatibility.
  130.  */
  131. extern FLAC_API const char *FLAC__VERSION_STRING;
  132. /** The vendor string inserted by the encoder into the VORBIS_COMMENT block.
  133.  *  This is a nulL-terminated ASCII string; when inserted into the
  134.  *  VORBIS_COMMENT the trailing null is stripped.
  135.  */
  136. extern FLAC_API const char *FLAC__VENDOR_STRING;
  137. /** The byte string representation of the beginning of a FLAC stream. */
  138. extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */
  139. /** The 32-bit integer big-endian representation of the beginning of
  140.  *  a FLAC stream.
  141.  */
  142. extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */
  143. /** The length of the FLAC signature in bits. */
  144. extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */
  145. /** The length of the FLAC signature in bytes. */
  146. #define FLAC__STREAM_SYNC_LENGTH (4u)
  147. /*****************************************************************************
  148.  *
  149.  * Subframe structures
  150.  *
  151.  *****************************************************************************/
  152. /*****************************************************************************/
  153. /** An enumeration of the available entropy coding methods. */
  154. typedef enum {
  155. FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0
  156. /**< Residual is coded by partitioning into contexts, each with it's own
  157.  * Rice parameter. */
  158. } FLAC__EntropyCodingMethodType;
  159. /** Maps a FLAC__EntropyCodingMethodType to a C string.
  160.  *
  161.  *  Using a FLAC__EntropyCodingMethodType as the index to this array will
  162.  *  give the string equivalent.  The contents should not be modified.
  163.  */
  164. extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[];
  165. /** Contents of a Rice partitioned residual
  166.  */
  167. typedef struct {
  168. unsigned *parameters;
  169. /**< The Rice parameters for each context. */
  170. unsigned *raw_bits;
  171. /**< Widths for escape-coded partitions. */
  172. unsigned capacity_by_order;
  173. /**< The capacity of the a parameters and a raw_bits arrays
  174.  * specified as an order, i.e. the number of array elements
  175.  * allocated is 2 ^ a capacity_by_order.
  176.  */
  177. } FLAC__EntropyCodingMethod_PartitionedRiceContents;
  178. /** Header for a Rice partitioned residual.  (c.f. <A HREF="../format.html#partitioned_rice">format specification</A>)
  179.  */
  180. typedef struct {
  181. unsigned order;
  182. /**< The partition order, i.e. # of contexts = 2 ^ a order. */
  183. const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents;
  184. /**< The context's Rice parameters and/or raw bits. */
  185. } FLAC__EntropyCodingMethod_PartitionedRice;
  186. extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */
  187. extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */
  188. extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */
  189. extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
  190. /**< == (1<<FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN)-1 */
  191. /** Header for the entropy coding method.  (c.f. <A HREF="../format.html#residual">format specification</A>)
  192.  */
  193. typedef struct {
  194. FLAC__EntropyCodingMethodType type;
  195. union {
  196. FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice;
  197. } data;
  198. } FLAC__EntropyCodingMethod;
  199. extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */
  200. /*****************************************************************************/
  201. /** An enumeration of the available subframe types. */
  202. typedef enum {
  203. FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */
  204. FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */
  205. FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */
  206. FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */
  207. } FLAC__SubframeType;
  208. /** Maps a FLAC__SubframeType to a C string.
  209.  *
  210.  *  Using a FLAC__SubframeType as the index to this array will
  211.  *  give the string equivalent.  The contents should not be modified.
  212.  */
  213. extern FLAC_API const char * const FLAC__SubframeTypeString[];
  214. /** CONSTANT subframe.  (c.f. <A HREF="../format.html#subframe_constant">format specification</A>)
  215.  */
  216. typedef struct {
  217. FLAC__int32 value; /**< The constant signal value. */
  218. } FLAC__Subframe_Constant;
  219. /** VERBATIM subframe.  (c.f. <A HREF="../format.html#subframe_verbatim">format specification</A>)
  220.  */
  221. typedef struct {
  222. const FLAC__int32 *data; /**< A pointer to verbatim signal. */
  223. } FLAC__Subframe_Verbatim;
  224. /** FIXED subframe.  (c.f. <A HREF="../format.html#subframe_fixed">format specification</A>)
  225.  */
  226. typedef struct {
  227. FLAC__EntropyCodingMethod entropy_coding_method;
  228. /**< The residual coding method. */
  229. unsigned order;
  230. /**< The polynomial order. */
  231. FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER];
  232. /**< Warmup samples to prime the predictor, length == order. */
  233. const FLAC__int32 *residual;
  234. /**< The residual signal, length == (blocksize minus order) samples. */
  235. } FLAC__Subframe_Fixed;
  236. /** LPC subframe.  (c.f. <A HREF="../format.html#subframe_lpc">format specification</A>)
  237.  */
  238. typedef struct {
  239. FLAC__EntropyCodingMethod entropy_coding_method;
  240. /**< The residual coding method. */
  241. unsigned order;
  242. /**< The FIR order. */
  243. unsigned qlp_coeff_precision;
  244. /**< Quantized FIR filter coefficient precision in bits. */
  245. int quantization_level;
  246. /**< The qlp coeff shift needed. */
  247. FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER];
  248. /**< FIR filter coefficients. */
  249. FLAC__int32 warmup[FLAC__MAX_LPC_ORDER];
  250. /**< Warmup samples to prime the predictor, length == order. */
  251. const FLAC__int32 *residual;
  252. /**< The residual signal, length == (blocksize minus order) samples. */
  253. } FLAC__Subframe_LPC;
  254. extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */
  255. extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */
  256. /** FLAC subframe structure.  (c.f. <A HREF="../format.html#subframe">format specification</A>)
  257.  */
  258. typedef struct {
  259. FLAC__SubframeType type;
  260. union {
  261. FLAC__Subframe_Constant constant;
  262. FLAC__Subframe_Fixed fixed;
  263. FLAC__Subframe_LPC lpc;
  264. FLAC__Subframe_Verbatim verbatim;
  265. } data;
  266. unsigned wasted_bits;
  267. } FLAC__Subframe;
  268. extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; /**< == 1 (bit) */
  269. extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */
  270. extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */
  271. extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /* = 0x00 */
  272. extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /* = 0x02 */
  273. extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /* = 0x10 */
  274. extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /* = 0x40 */
  275. /*****************************************************************************/
  276. /*****************************************************************************
  277.  *
  278.  * Frame structures
  279.  *
  280.  *****************************************************************************/
  281. /** An enumeration of the available channel assignments. */
  282. typedef enum {
  283. FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */
  284. FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */
  285. FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */
  286. FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */
  287. } FLAC__ChannelAssignment;
  288. /** Maps a FLAC__ChannelAssignment to a C string.
  289.  *
  290.  *  Using a FLAC__ChannelAssignment as the index to this array will
  291.  *  give the string equivalent.  The contents should not be modified.
  292.  */
  293. extern FLAC_API const char * const FLAC__ChannelAssignmentString[];
  294. /** An enumeration of the possible frame numbering methods. */
  295. typedef enum {
  296. FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */
  297. FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */
  298. } FLAC__FrameNumberType;
  299. /** Maps a FLAC__FrameNumberType to a C string.
  300.  *
  301.  *  Using a FLAC__FrameNumberType as the index to this array will
  302.  *  give the string equivalent.  The contents should not be modified.
  303.  */
  304. extern FLAC_API const char * const FLAC__FrameNumberTypeString[];
  305. /** FLAC frame header structure.  (c.f. <A HREF="../format.html#frame_header">format specification</A>)
  306.  */
  307. typedef struct {
  308. unsigned blocksize;
  309. /**< The number of samples per subframe. */
  310. unsigned sample_rate;
  311. /**< The sample rate in Hz. */
  312. unsigned channels;
  313. /**< The number of channels (== number of subframes). */
  314. FLAC__ChannelAssignment channel_assignment;
  315. /**< The channel assignment for the frame. */
  316. unsigned bits_per_sample;
  317. /**< The sample resolution. */
  318. FLAC__FrameNumberType number_type;
  319. /**< The numbering scheme used for the frame. */
  320. union {
  321. FLAC__uint32 frame_number;
  322. FLAC__uint64 sample_number;
  323. } number;
  324. /**< The frame number or sample number of first sample in frame;
  325.  * use the a number_type value to determine which to use. */
  326. FLAC__uint8 crc;
  327. /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0)
  328.  * of the raw frame header bytes, meaning everything before the CRC byte
  329.  * including the sync code.
  330.  */
  331. } FLAC__FrameHeader;
  332. extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */
  333. extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */
  334. extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 2 (bits) */
  335. extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */
  336. extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */
  337. extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */
  338. extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */
  339. extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */
  340. extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */
  341. /** FLAC frame footer structure.  (c.f. <A HREF="../format.html#frame_footer">format specification</A>)
  342.  */
  343. typedef struct {
  344. FLAC__uint16 crc;
  345. /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with
  346.  * 0) of the bytes before the crc, back to and including the frame header
  347.  * sync code.
  348.  */
  349. } FLAC__FrameFooter;
  350. extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */
  351. /** FLAC frame structure.  (c.f. <A HREF="../format.html#frame">format specification</A>)
  352.  */
  353. typedef struct {
  354. FLAC__FrameHeader header;
  355. FLAC__Subframe subframes[FLAC__MAX_CHANNELS];
  356. FLAC__FrameFooter footer;
  357. } FLAC__Frame;
  358. /*****************************************************************************/
  359. /*****************************************************************************
  360.  *
  361.  * Meta-data structures
  362.  *
  363.  *****************************************************************************/
  364. /** An enumeration of the available metadata block types. */
  365. typedef enum {
  366. FLAC__METADATA_TYPE_STREAMINFO = 0,
  367. /**< <A HREF="../format.html#metadata_block_streaminfo">STREAMINFO</A> block */
  368. FLAC__METADATA_TYPE_PADDING = 1,
  369. /**< <A HREF="../format.html#metadata_block_padding">PADDING</A> block */
  370. FLAC__METADATA_TYPE_APPLICATION = 2,
  371. /**< <A HREF="../format.html#metadata_block_application">APPLICATION</A> block */
  372. FLAC__METADATA_TYPE_SEEKTABLE = 3,
  373. /**< <A HREF="../format.html#metadata_block_seektable">SEEKTABLE</A> block */
  374. FLAC__METADATA_TYPE_VORBIS_COMMENT = 4,
  375. /**< <A HREF="../format.html#metadata_block_vorbis_comment">VORBISCOMMENT</A> block */
  376. FLAC__METADATA_TYPE_CUESHEET = 5,
  377. /**< <A HREF="../format.html#metadata_block_cuesheet">CUESHEET</A> block */
  378. FLAC__METADATA_TYPE_UNDEFINED = 6
  379. /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */
  380. } FLAC__MetadataType;
  381. /** Maps a FLAC__MetadataType to a C string.
  382.  *
  383.  *  Using a FLAC__MetadataType as the index to this array will
  384.  *  give the string equivalent.  The contents should not be modified.
  385.  */
  386. extern FLAC_API const char * const FLAC__MetadataTypeString[];
  387. /** FLAC STREAMINFO structure.  (c.f. <A HREF="../format.html#metadata_block_streaminfo">format specification</A>)
  388.  */
  389. typedef struct {
  390. unsigned min_blocksize, max_blocksize;
  391. unsigned min_framesize, max_framesize;
  392. unsigned sample_rate;
  393. unsigned channels;
  394. unsigned bits_per_sample;
  395. FLAC__uint64 total_samples;
  396. FLAC__byte md5sum[16];
  397. } FLAC__StreamMetadata_StreamInfo;
  398. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */
  399. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */
  400. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */
  401. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */
  402. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */
  403. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */
  404. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */
  405. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */
  406. extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */
  407. /** The total stream length of the STREAMINFO block in bytes. */
  408. #define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u)
  409. /** FLAC PADDING structure.  (c.f. <A HREF="../format.html#metadata_block_padding">format specification</A>)
  410.  */
  411. typedef struct {
  412. int dummy;
  413. /**< Conceptually this is an empty struct since we don't store the
  414.  * padding bytes.  Empty structs are not allowed by some C compilers,
  415.  * hence the dummy.
  416.  */
  417. } FLAC__StreamMetadata_Padding;
  418. /** FLAC APPLICATION structure.  (c.f. <A HREF="../format.html#metadata_block_application">format specification</A>)
  419.  */
  420. typedef struct {
  421. FLAC__byte id[4];
  422. FLAC__byte *data;
  423. } FLAC__StreamMetadata_Application;
  424. extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */
  425. /** SeekPoint structure used in SEEKTABLE blocks.  (c.f. <A HREF="../format.html#seekpoint">format specification</A>)
  426.  */
  427. typedef struct {
  428. FLAC__uint64 sample_number;
  429. /**<  The sample number of the target frame. */
  430. FLAC__uint64 stream_offset;
  431. /**< The offset, in bytes, of the target frame with respect to
  432.  * beginning of the first frame. */
  433. unsigned frame_samples;
  434. /**< The number of samples in the target frame. */
  435. } FLAC__StreamMetadata_SeekPoint;
  436. extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */
  437. extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */
  438. extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */
  439. /** The total stream length of a seek point in bytes. */
  440. #define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u)
  441. /** The value used in the a sample_number field of
  442.  *  FLAC__StreamMetadataSeekPoint used to indicate a placeholder
  443.  *  point (== 0xffffffffffffffff).
  444.  */
  445. extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
  446. /** FLAC SEEKTABLE structure.  (c.f. <A HREF="../format.html#metadata_block_seektable">format specification</A>)
  447.  *
  448.  * note From the format specification:
  449.  * - The seek points must be sorted by ascending sample number.
  450.  * - Each seek point's sample number must be the first sample of the
  451.  *   target frame.
  452.  * - Each seek point's sample number must be unique within the table.
  453.  * - Existence of a SEEKTABLE block implies a correct setting of
  454.  *   total_samples in the stream_info block.
  455.  * - Behavior is undefined when more than one SEEKTABLE block is
  456.  *   present in a stream.
  457.  */
  458. typedef struct {
  459. unsigned num_points;
  460. FLAC__StreamMetadata_SeekPoint *points;
  461. } FLAC__StreamMetadata_SeekTable;
  462. /** Vorbis comment entry structure used in VORBIS_COMMENT blocks.  (c.f. <A HREF="../format.html#metadata_block_vorbis_comment">format specification</A>)
  463.  *
  464.  *  For convenience, the APIs maintain a trailing NUL character at the end of
  465.  *  a entry which is not counted toward a length, i.e.
  466.  *  code strlen(entry) == length endcode
  467.  */
  468. typedef struct {
  469. FLAC__uint32 length;
  470. FLAC__byte *entry;
  471. } FLAC__StreamMetadata_VorbisComment_Entry;
  472. extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */
  473. /** FLAC VORBIS_COMMENT structure.  (c.f. <A HREF="../format.html#metadata_block_vorbis_comment">format specification</A>)
  474.  */
  475. typedef struct {
  476. FLAC__StreamMetadata_VorbisComment_Entry vendor_string;
  477. FLAC__uint32 num_comments;
  478. FLAC__StreamMetadata_VorbisComment_Entry *comments;
  479. } FLAC__StreamMetadata_VorbisComment;
  480. extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */
  481. /** FLAC CUESHEET track index structure.  (See the
  482.  * <A HREF="../format.html#cuesheet_track_index">format specification</A> for
  483.  * the full description of each field.)
  484.  */
  485. typedef struct {
  486. FLAC__uint64 offset;
  487. /**< Offset in samples, relative to the track offset, of the index
  488.  * point.
  489.  */
  490. FLAC__byte number;
  491. /**< The index point number. */
  492. } FLAC__StreamMetadata_CueSheet_Index;
  493. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */
  494. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */
  495. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */
  496. /** FLAC CUESHEET track structure.  (See the
  497.  * <A HREF="../format.html#cuesheet_track">format specification</A> for
  498.  * the full description of each field.)
  499.  */
  500. typedef struct {
  501. FLAC__uint64 offset;
  502. /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */
  503. FLAC__byte number;
  504. /**< The track number. */
  505. char isrc[13];
  506. /**< Track ISRC.  This is a 12-digit alphanumeric code plus a trailing '' */
  507. unsigned type:1;
  508. /**< The track type: 0 for audio, 1 for non-audio. */
  509. unsigned pre_emphasis:1;
  510. /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */
  511. FLAC__byte num_indices;
  512. /**< The number of track index points. */
  513. FLAC__StreamMetadata_CueSheet_Index *indices;
  514. /**< NULL if num_indices == 0, else pointer to array of index points. */
  515. } FLAC__StreamMetadata_CueSheet_Track;
  516. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */
  517. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */
  518. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */
  519. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */
  520. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */
  521. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */
  522. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */
  523. /** FLAC CUESHEET structure.  (See the
  524.  * <A HREF="../format.html#metadata_block_cuesheet">format specification</A>
  525.  * for the full description of each field.)
  526.  */
  527. typedef struct {
  528. char media_catalog_number[129];
  529. /**< Media catalog number, in ASCII printable characters 0x20-0x7e.  In
  530.  * general, the media catalog number may be 0 to 128 bytes long; any
  531.  * unused characters should be right-padded with NUL characters.
  532.  */
  533. FLAC__uint64 lead_in;
  534. /**< The number of lead-in samples. */
  535. FLAC__bool is_cd;
  536. /**< c true if CUESHEET corresponds to a Compact Disc, else c false */
  537. unsigned num_tracks;
  538. /**< The number of tracks. */
  539. FLAC__StreamMetadata_CueSheet_Track *tracks;
  540. /**< NULL if num_tracks == 0, else pointer to array of tracks. */
  541. } FLAC__StreamMetadata_CueSheet;
  542. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */
  543. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */
  544. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */
  545. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */
  546. extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */
  547. /** Structure that is used when a metadata block of unknown type is loaded.
  548.  *  The contents are opaque.  The structure is used only internally to
  549.  *  correctly handle unknown metadata.
  550.  */
  551. typedef struct {
  552. FLAC__byte *data;
  553. } FLAC__StreamMetadata_Unknown;
  554. /** FLAC metadata block structure.  (c.f. <A HREF="../format.html#metadata_block">format specification</A>)
  555.  */
  556. typedef struct {
  557. FLAC__MetadataType type;
  558. /**< The type of the metadata block; used determine which member of the
  559.  * a data union to dereference.  If type >= FLAC__METADATA_TYPE_UNDEFINED
  560.  * then a data.unknown must be used. */
  561. FLAC__bool is_last;
  562. /**< c true if this metadata block is the last, else a false */
  563. unsigned length;
  564. /**< Length, in bytes, of the block data as it appears in the stream. */
  565. union {
  566. FLAC__StreamMetadata_StreamInfo stream_info;
  567. FLAC__StreamMetadata_Padding padding;
  568. FLAC__StreamMetadata_Application application;
  569. FLAC__StreamMetadata_SeekTable seek_table;
  570. FLAC__StreamMetadata_VorbisComment vorbis_comment;
  571. FLAC__StreamMetadata_CueSheet cue_sheet;
  572. FLAC__StreamMetadata_Unknown unknown;
  573. } data;
  574. /**< Polymorphic block data; use the a type value to determine which
  575.  * to use. */
  576. } FLAC__StreamMetadata;
  577. extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */
  578. extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */
  579. extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */
  580. /** The total stream length of a metadata block header in bytes. */
  581. #define FLAC__STREAM_METADATA_HEADER_LENGTH (4u)
  582. /*****************************************************************************/
  583. /*****************************************************************************
  584.  *
  585.  * Utility functions
  586.  *
  587.  *****************************************************************************/
  588. /** Tests that a sample rate is valid for FLAC.  Since the rules for valid
  589.  *  sample rates are slightly complex, they are encapsulated in this function.
  590.  *
  591.  * param sample_rate  The sample rate to test for compliance.
  592.  * retval FLAC__bool
  593.  *    c true if the given sample rate conforms to the specification, else
  594.  *    c false.
  595.  */
  596. FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate);
  597. /** Check a Vorbis comment entry name to see if it conforms to the Vorbis
  598.  *  comment specification.
  599.  *
  600.  *  Vorbis comment names must be composed only of characters from
  601.  *  [0x20-0x3C,0x3E-0x7D].
  602.  *
  603.  * param name       A NUL-terminated string to be checked.
  604.  * assert
  605.  *    code name != NULL endcode
  606.  * retval FLAC__bool
  607.  *    c false if entry name is illegal, else c true.
  608.  */
  609. FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name);
  610. /** Check a Vorbis comment entry value to see if it conforms to the Vorbis
  611.  *  comment specification.
  612.  *
  613.  *  Vorbis comment values must be valid UTF-8 sequences.
  614.  *
  615.  * param value      A string to be checked.
  616.  * param length     A the length of a value in bytes.  May be
  617.  *                   c (unsigned)(-1) to indicate that a value is a plain
  618.  *                   UTF-8 NUL-terminated string.
  619.  * assert
  620.  *    code value != NULL endcode
  621.  * retval FLAC__bool
  622.  *    c false if entry name is illegal, else c true.
  623.  */
  624. FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length);
  625. /** Check a Vorbis comment entry to see if it conforms to the Vorbis
  626.  *  comment specification.
  627.  *
  628.  *  Vorbis comment entries must be of the form 'name=value', and 'name' and
  629.  *  'value' must be legal according to
  630.  *  FLAC__format_vorbiscomment_entry_name_is_legal() and
  631.  *  FLAC__format_vorbiscomment_entry_value_is_legal() respectively.
  632.  *
  633.  * param value      A string to be checked.
  634.  * assert
  635.  *    code value != NULL endcode
  636.  * retval FLAC__bool
  637.  *    c false if entry name is illegal, else c true.
  638.  */
  639. FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length);
  640. /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
  641. /** Check a seek table to see if it conforms to the FLAC specification.
  642.  *  See the format specification for limits on the contents of the
  643.  *  seek table.
  644.  *
  645.  * param seek_table  A pointer to a seek table to be checked.
  646.  * assert
  647.  *    code seek_table != NULL endcode
  648.  * retval FLAC__bool
  649.  *    c false if seek table is illegal, else c true.
  650.  */
  651. FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table);
  652. /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
  653. /** Sort a seek table's seek points according to the format specification.
  654.  *  This includes a "unique-ification" step to remove duplicates, i.e.
  655.  *  seek points with identical a sample_number values.  Duplicate seek
  656.  *  points are converted into placeholder points and sorted to the end of
  657.  *  the table.
  658.  *
  659.  * param seek_table  A pointer to a seek table to be sorted.
  660.  * assert
  661.  *    code seek_table != NULL endcode
  662.  * retval unsigned
  663.  *    The number of duplicate seek points converted into placeholders.
  664.  */
  665. FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table);
  666. /* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */
  667. /** Check a cue sheet to see if it conforms to the FLAC specification.
  668.  *  See the format specification for limits on the contents of the
  669.  *  cue sheet.
  670.  *
  671.  * param cue_sheet  A pointer to an existing cue sheet to be checked.
  672.  * param check_cd_da_subset  If c true, check CUESHEET against more
  673.  *                   stringent requirements for a CD-DA (audio) disc.
  674.  * param violation  Address of a pointer to a string.  If there is a
  675.  *                   violation, a pointer to a string explanation of the
  676.  *                   violation will be returned here. a violation may be
  677.  *                   c NULL if you don't need the returned string.  Do not
  678.  *                   free the returned string; it will always point to static
  679.  *                   data.
  680.  * assert
  681.  *    code cue_sheet != NULL endcode
  682.  * retval FLAC__bool
  683.  *    c false if cue sheet is illegal, else c true.
  684.  */
  685. FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation);
  686. /* } */
  687. #ifdef __cplusplus
  688. }
  689. #endif
  690. #endif