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

Windows CE

开发平台:

C/C++

  1. /* libFLAC++ - Free Lossless Audio Codec library
  2.  * Copyright (C) 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 FLACPP__ENCODER_H
  32. #define FLACPP__ENCODER_H
  33. #include "export.h"
  34. #include "FLAC/file_encoder.h"
  35. #include "FLAC/seekable_stream_encoder.h"
  36. #include "FLAC/stream_encoder.h"
  37. #include "decoder.h"
  38. #include "metadata.h"
  39. /** file include/FLAC++/encoder.h
  40.  *
  41.  *  brief
  42.  *  This module contains the classes which implement the various
  43.  *  encoders.
  44.  *
  45.  *  See the detailed documentation in the
  46.  *  link flacpp_encoder encoder endlink module.
  47.  */
  48. /** defgroup flacpp_encoder FLAC++/encoder.h: encoder classes
  49.  *  ingroup flacpp
  50.  *
  51.  *  brief
  52.  *  This module describes the three encoder layers provided by libFLAC++.
  53.  *
  54.  * The libFLAC++ encoder classes are object wrappers around their
  55.  * counterparts in libFLAC.  All three encoding layers available in
  56.  * libFLAC are also provided here.  The interface is very similar;
  57.  * make sure to read the link flac_encoder libFLAC encoder module endlink.
  58.  *
  59.  * The only real difference here is that instead of passing in C function
  60.  * pointers for callbacks, you inherit from the encoder class and provide
  61.  * implementations for the callbacks in the derived class; because of this
  62.  * there is no need for a 'client_data' property.
  63.  */
  64. namespace FLAC {
  65. namespace Encoder {
  66. // ============================================================
  67. //
  68. //  Equivalent: FLAC__StreamEncoder
  69. //
  70. // ============================================================
  71. /** defgroup flacpp_stream_encoder FLAC++/encoder.h: stream encoder class
  72.  *  ingroup flacpp_encoder
  73.  *
  74.  *  brief
  75.  *  This class wraps the ::FLAC__StreamEncoder.
  76.  *
  77.  * See the link flac_stream_encoder libFLAC stream encoder module endlink.
  78.  *
  79.  * {
  80.  */
  81. /** This class wraps the ::FLAC__StreamEncoder.
  82.  */
  83. class FLACPP_API Stream {
  84. public:
  85. class FLACPP_API State {
  86. public:
  87. inline State(::FLAC__StreamEncoderState state): state_(state) { }
  88. inline operator ::FLAC__StreamEncoderState() const { return state_; }
  89. inline const char *as_cstring() const { return ::FLAC__StreamEncoderStateString[state_]; }
  90. inline const char *resolved_as_cstring(const Stream &encoder) const { return ::FLAC__stream_encoder_get_resolved_state_string(encoder.encoder_); }
  91. protected:
  92. ::FLAC__StreamEncoderState state_;
  93. };
  94. Stream();
  95. virtual ~Stream();
  96. bool is_valid() const;
  97. inline operator bool() const { return is_valid(); }
  98. bool set_verify(bool value);
  99. bool set_streamable_subset(bool value);
  100. bool set_do_mid_side_stereo(bool value);
  101. bool set_loose_mid_side_stereo(bool value);
  102. bool set_channels(unsigned value);
  103. bool set_bits_per_sample(unsigned value);
  104. bool set_sample_rate(unsigned value);
  105. bool set_blocksize(unsigned value);
  106. bool set_max_lpc_order(unsigned value);
  107. bool set_qlp_coeff_precision(unsigned value);
  108. bool set_do_qlp_coeff_prec_search(bool value);
  109. bool set_do_escape_coding(bool value);
  110. bool set_do_exhaustive_model_search(bool value);
  111. bool set_min_residual_partition_order(unsigned value);
  112. bool set_max_residual_partition_order(unsigned value);
  113. bool set_rice_parameter_search_dist(unsigned value);
  114. bool set_total_samples_estimate(FLAC__uint64 value);
  115. bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks);
  116. bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks);
  117. State    get_state() const;
  118. Decoder::Stream::State get_verify_decoder_state() const;
  119. void get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
  120. bool     get_verify() const;
  121. bool     get_streamable_subset() const;
  122. bool     get_do_mid_side_stereo() const;
  123. bool     get_loose_mid_side_stereo() const;
  124. unsigned get_channels() const;
  125. unsigned get_bits_per_sample() const;
  126. unsigned get_sample_rate() const;
  127. unsigned get_blocksize() const;
  128. unsigned get_max_lpc_order() const;
  129. unsigned get_qlp_coeff_precision() const;
  130. bool     get_do_qlp_coeff_prec_search() const;
  131. bool     get_do_escape_coding() const;
  132. bool     get_do_exhaustive_model_search() const;
  133. unsigned get_min_residual_partition_order() const;
  134. unsigned get_max_residual_partition_order() const;
  135. unsigned get_rice_parameter_search_dist() const;
  136. FLAC__uint64 get_total_samples_estimate() const;
  137. State init();
  138. void finish();
  139. bool process(const FLAC__int32 * const buffer[], unsigned samples);
  140. bool process_interleaved(const FLAC__int32 buffer[], unsigned samples);
  141. protected:
  142. virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame) = 0;
  143. virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata) = 0;
  144. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  145. // lame hack: some MSVC/GCC versions can't see a protected encoder_ from nested State::resolved_as_cstring()
  146. friend State;
  147. #endif
  148. ::FLAC__StreamEncoder *encoder_;
  149. private:
  150. static ::FLAC__StreamEncoderWriteStatus write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
  151. static void metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data);
  152. // Private and undefined so you can't use them:
  153. Stream(const Stream &);
  154. void operator=(const Stream &);
  155. };
  156. /* } */
  157. /** defgroup flacpp_seekable_stream_encoder FLAC++/encoder.h: seekable stream encoder class
  158.  *  ingroup flacpp_encoder
  159.  *
  160.  *  brief
  161.  *  This class wraps the ::FLAC__SeekableStreamEncoder.
  162.  *
  163.  * See the link flac_seekable_stream_encoder libFLAC seekable stream encoder module endlink.
  164.  *
  165.  * {
  166.  */
  167. /** This class wraps the ::FLAC__SeekableStreamEncoder.
  168.  */
  169. class FLACPP_API SeekableStream {
  170. public:
  171. class FLACPP_API State {
  172. public:
  173. inline State(::FLAC__SeekableStreamEncoderState state): state_(state) { }
  174. inline operator ::FLAC__SeekableStreamEncoderState() const { return state_; }
  175. inline const char *as_cstring() const { return ::FLAC__SeekableStreamEncoderStateString[state_]; }
  176. inline const char *resolved_as_cstring(const SeekableStream &encoder) const { return ::FLAC__seekable_stream_encoder_get_resolved_state_string(encoder.encoder_); }
  177. protected:
  178. ::FLAC__SeekableStreamEncoderState state_;
  179. };
  180. SeekableStream();
  181. virtual ~SeekableStream();
  182. bool is_valid() const;
  183. inline operator bool() const { return is_valid(); }
  184. bool set_verify(bool value);
  185. bool set_streamable_subset(bool value);
  186. bool set_do_mid_side_stereo(bool value);
  187. bool set_loose_mid_side_stereo(bool value);
  188. bool set_channels(unsigned value);
  189. bool set_bits_per_sample(unsigned value);
  190. bool set_sample_rate(unsigned value);
  191. bool set_blocksize(unsigned value);
  192. bool set_max_lpc_order(unsigned value);
  193. bool set_qlp_coeff_precision(unsigned value);
  194. bool set_do_qlp_coeff_prec_search(bool value);
  195. bool set_do_escape_coding(bool value);
  196. bool set_do_exhaustive_model_search(bool value);
  197. bool set_min_residual_partition_order(unsigned value);
  198. bool set_max_residual_partition_order(unsigned value);
  199. bool set_rice_parameter_search_dist(unsigned value);
  200. bool set_total_samples_estimate(FLAC__uint64 value);
  201. bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks);
  202. bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks);
  203. State    get_state() const;
  204. Stream::State get_stream_encoder_state() const;
  205. Decoder::Stream::State get_verify_decoder_state() const;
  206. void get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
  207. bool     get_verify() const;
  208. bool     get_streamable_subset() const;
  209. bool     get_do_mid_side_stereo() const;
  210. bool     get_loose_mid_side_stereo() const;
  211. unsigned get_channels() const;
  212. unsigned get_bits_per_sample() const;
  213. unsigned get_sample_rate() const;
  214. unsigned get_blocksize() const;
  215. unsigned get_max_lpc_order() const;
  216. unsigned get_qlp_coeff_precision() const;
  217. bool     get_do_qlp_coeff_prec_search() const;
  218. bool     get_do_escape_coding() const;
  219. bool     get_do_exhaustive_model_search() const;
  220. unsigned get_min_residual_partition_order() const;
  221. unsigned get_max_residual_partition_order() const;
  222. unsigned get_rice_parameter_search_dist() const;
  223. FLAC__uint64 get_total_samples_estimate() const;
  224. State init();
  225. void finish();
  226. bool process(const FLAC__int32 * const buffer[], unsigned samples);
  227. bool process_interleaved(const FLAC__int32 buffer[], unsigned samples);
  228. protected:
  229. virtual ::FLAC__SeekableStreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset) = 0;
  230. virtual ::FLAC__SeekableStreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset) = 0;
  231. virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame) = 0;
  232. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  233. // lame hack: some MSVC/GCC versions can't see a protected encoder_ from nested State::resolved_as_cstring()
  234. friend State;
  235. #endif
  236. ::FLAC__SeekableStreamEncoder *encoder_;
  237. private:
  238. static ::FLAC__SeekableStreamEncoderSeekStatus seek_callback_(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
  239. static ::FLAC__SeekableStreamEncoderTellStatus tell_callback_(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
  240. static ::FLAC__StreamEncoderWriteStatus write_callback_(const FLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
  241. // Private and undefined so you can't use them:
  242. SeekableStream(const SeekableStream &);
  243. void operator=(const SeekableStream &);
  244. };
  245. /* } */
  246. /** defgroup flacpp_file_encoder FLAC++/encoder.h: file encoder class
  247.  *  ingroup flacpp_encoder
  248.  *
  249.  *  brief
  250.  *  This class wraps the ::FLAC__FileEncoder.
  251.  *
  252.  * See the link flac_file_encoder libFLAC file encoder module endlink.
  253.  *
  254.  * {
  255.  */
  256. /** This class wraps the ::FLAC__FileEncoder.
  257.  */
  258. class FLACPP_API File {
  259. public:
  260. class FLACPP_API State {
  261. public:
  262. inline State(::FLAC__FileEncoderState state): state_(state) { }
  263. inline operator ::FLAC__FileEncoderState() const { return state_; }
  264. inline const char *as_cstring() const { return ::FLAC__FileEncoderStateString[state_]; }
  265. inline const char *resolved_as_cstring(const File &encoder) const { return ::FLAC__file_encoder_get_resolved_state_string(encoder.encoder_); }
  266. protected:
  267. ::FLAC__FileEncoderState state_;
  268. };
  269. File();
  270. virtual ~File();
  271. bool is_valid() const;
  272. inline operator bool() const { return is_valid(); }
  273. bool set_verify(bool value);
  274. bool set_streamable_subset(bool value);
  275. bool set_do_mid_side_stereo(bool value);
  276. bool set_loose_mid_side_stereo(bool value);
  277. bool set_channels(unsigned value);
  278. bool set_bits_per_sample(unsigned value);
  279. bool set_sample_rate(unsigned value);
  280. bool set_blocksize(unsigned value);
  281. bool set_max_lpc_order(unsigned value);
  282. bool set_qlp_coeff_precision(unsigned value);
  283. bool set_do_qlp_coeff_prec_search(bool value);
  284. bool set_do_escape_coding(bool value);
  285. bool set_do_exhaustive_model_search(bool value);
  286. bool set_min_residual_partition_order(unsigned value);
  287. bool set_max_residual_partition_order(unsigned value);
  288. bool set_rice_parameter_search_dist(unsigned value);
  289. bool set_total_samples_estimate(FLAC__uint64 value);
  290. bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks);
  291. bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks);
  292. bool set_filename(const char *value);
  293. State    get_state() const;
  294. SeekableStream::State get_seekable_stream_encoder_state() const;
  295. Stream::State get_stream_encoder_state() const;
  296. Decoder::Stream::State get_verify_decoder_state() const;
  297. void get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
  298. bool     get_verify() const;
  299. bool     get_streamable_subset() const;
  300. bool     get_do_mid_side_stereo() const;
  301. bool     get_loose_mid_side_stereo() const;
  302. unsigned get_channels() const;
  303. unsigned get_bits_per_sample() const;
  304. unsigned get_sample_rate() const;
  305. unsigned get_blocksize() const;
  306. unsigned get_max_lpc_order() const;
  307. unsigned get_qlp_coeff_precision() const;
  308. bool     get_do_qlp_coeff_prec_search() const;
  309. bool     get_do_escape_coding() const;
  310. bool     get_do_exhaustive_model_search() const;
  311. unsigned get_min_residual_partition_order() const;
  312. unsigned get_max_residual_partition_order() const;
  313. unsigned get_rice_parameter_search_dist() const;
  314. FLAC__uint64 get_total_samples_estimate() const;
  315. State init();
  316. void finish();
  317. bool process(const FLAC__int32 * const buffer[], unsigned samples);
  318. bool process_interleaved(const FLAC__int32 buffer[], unsigned samples);
  319. protected:
  320. virtual void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate);
  321. #if (defined _MSC_VER) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC)
  322. // lame hack: some MSVC/GCC versions can't see a protected encoder_ from nested State::resolved_as_cstring()
  323. friend State;
  324. #endif
  325. ::FLAC__FileEncoder *encoder_;
  326. private:
  327. static void progress_callback_(const ::FLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
  328. // Private and undefined so you can't use them:
  329. File(const Stream &);
  330. void operator=(const Stream &);
  331. };
  332. /* } */
  333. }
  334. }
  335. #endif