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

Windows CE

开发平台:

C/C++

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