*::State::resolved_as_cstring() is now inlined
[platform/upstream/flac.git] / src / libFLAC++ / stream_encoder.cpp
1 /* libFLAC++ - Free Lossless Audio Codec library
2  * Copyright (C) 2002,2003  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
32 #include "FLAC++/encoder.h"
33 #include "FLAC/assert.h"
34
35 namespace FLAC {
36         namespace Encoder {
37
38                 Stream::Stream():
39                 encoder_(::FLAC__stream_encoder_new())
40                 { }
41
42                 Stream::~Stream()
43                 {
44                         if(0 != encoder_) {
45                                 ::FLAC__stream_encoder_finish(encoder_);
46                                 ::FLAC__stream_encoder_delete(encoder_);
47                         }
48                 }
49
50                 bool Stream::is_valid() const
51                 {
52                         return 0 != encoder_;
53                 }
54
55                 bool Stream::set_verify(bool value)
56                 {
57                         FLAC__ASSERT(is_valid());
58                         return (bool)::FLAC__stream_encoder_set_verify(encoder_, value);
59                 }
60
61                 bool Stream::set_streamable_subset(bool value)
62                 {
63                         FLAC__ASSERT(is_valid());
64                         return (bool)::FLAC__stream_encoder_set_streamable_subset(encoder_, value);
65                 }
66
67                 bool Stream::set_do_mid_side_stereo(bool value)
68                 {
69                         FLAC__ASSERT(is_valid());
70                         return (bool)::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value);
71                 }
72
73                 bool Stream::set_loose_mid_side_stereo(bool value)
74                 {
75                         FLAC__ASSERT(is_valid());
76                         return (bool)::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value);
77                 }
78
79                 bool Stream::set_channels(unsigned value)
80                 {
81                         FLAC__ASSERT(is_valid());
82                         return (bool)::FLAC__stream_encoder_set_channels(encoder_, value);
83                 }
84
85                 bool Stream::set_bits_per_sample(unsigned value)
86                 {
87                         FLAC__ASSERT(is_valid());
88                         return (bool)::FLAC__stream_encoder_set_bits_per_sample(encoder_, value);
89                 }
90
91                 bool Stream::set_sample_rate(unsigned value)
92                 {
93                         FLAC__ASSERT(is_valid());
94                         return (bool)::FLAC__stream_encoder_set_sample_rate(encoder_, value);
95                 }
96
97                 bool Stream::set_blocksize(unsigned value)
98                 {
99                         FLAC__ASSERT(is_valid());
100                         return (bool)::FLAC__stream_encoder_set_blocksize(encoder_, value);
101                 }
102
103                 bool Stream::set_max_lpc_order(unsigned value)
104                 {
105                         FLAC__ASSERT(is_valid());
106                         return (bool)::FLAC__stream_encoder_set_max_lpc_order(encoder_, value);
107                 }
108
109                 bool Stream::set_qlp_coeff_precision(unsigned value)
110                 {
111                         FLAC__ASSERT(is_valid());
112                         return (bool)::FLAC__stream_encoder_set_qlp_coeff_precision(encoder_, value);
113                 }
114
115                 bool Stream::set_do_qlp_coeff_prec_search(bool value)
116                 {
117                         FLAC__ASSERT(is_valid());
118                         return (bool)::FLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder_, value);
119                 }
120
121                 bool Stream::set_do_escape_coding(bool value)
122                 {
123                         FLAC__ASSERT(is_valid());
124                         return (bool)::FLAC__stream_encoder_set_do_escape_coding(encoder_, value);
125                 }
126
127                 bool Stream::set_do_exhaustive_model_search(bool value)
128                 {
129                         FLAC__ASSERT(is_valid());
130                         return (bool)::FLAC__stream_encoder_set_do_exhaustive_model_search(encoder_, value);
131                 }
132
133                 bool Stream::set_min_residual_partition_order(unsigned value)
134                 {
135                         FLAC__ASSERT(is_valid());
136                         return (bool)::FLAC__stream_encoder_set_min_residual_partition_order(encoder_, value);
137                 }
138
139                 bool Stream::set_max_residual_partition_order(unsigned value)
140                 {
141                         FLAC__ASSERT(is_valid());
142                         return (bool)::FLAC__stream_encoder_set_max_residual_partition_order(encoder_, value);
143                 }
144
145                 bool Stream::set_rice_parameter_search_dist(unsigned value)
146                 {
147                         FLAC__ASSERT(is_valid());
148                         return (bool)::FLAC__stream_encoder_set_rice_parameter_search_dist(encoder_, value);
149                 }
150
151                 bool Stream::set_total_samples_estimate(FLAC__uint64 value)
152                 {
153                         FLAC__ASSERT(is_valid());
154                         return (bool)::FLAC__stream_encoder_set_total_samples_estimate(encoder_, value);
155                 }
156
157                 bool Stream::set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks)
158                 {
159                         FLAC__ASSERT(is_valid());
160                         return (bool)::FLAC__stream_encoder_set_metadata(encoder_, metadata, num_blocks);
161                 }
162
163                 Stream::State Stream::get_state() const
164                 {
165                         FLAC__ASSERT(is_valid());
166                         return State(::FLAC__stream_encoder_get_state(encoder_));
167                 }
168
169                 Decoder::Stream::State Stream::get_verify_decoder_state() const
170                 {
171                         FLAC__ASSERT(is_valid());
172                         return Decoder::Stream::State(::FLAC__stream_encoder_get_verify_decoder_state(encoder_));
173                 }
174
175                 void Stream::get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got)
176                 {
177                         FLAC__ASSERT(is_valid());
178                         ::FLAC__stream_encoder_get_verify_decoder_error_stats(encoder_, absolute_sample, frame_number, channel, sample, expected, got);
179                 }
180
181                 bool Stream::get_verify() const
182                 {
183                         FLAC__ASSERT(is_valid());
184                         return (bool)::FLAC__stream_encoder_get_verify(encoder_);
185                 }
186
187                 bool Stream::get_streamable_subset() const
188                 {
189                         FLAC__ASSERT(is_valid());
190                         return (bool)::FLAC__stream_encoder_get_streamable_subset(encoder_);
191                 }
192
193                 bool Stream::get_do_mid_side_stereo() const
194                 {
195                         FLAC__ASSERT(is_valid());
196                         return (bool)::FLAC__stream_encoder_get_do_mid_side_stereo(encoder_);
197                 }
198
199                 bool Stream::get_loose_mid_side_stereo() const
200                 {
201                         FLAC__ASSERT(is_valid());
202                         return (bool)::FLAC__stream_encoder_get_loose_mid_side_stereo(encoder_);
203                 }
204
205                 unsigned Stream::get_channels() const
206                 {
207                         FLAC__ASSERT(is_valid());
208                         return ::FLAC__stream_encoder_get_channels(encoder_);
209                 }
210
211                 unsigned Stream::get_bits_per_sample() const
212                 {
213                         FLAC__ASSERT(is_valid());
214                         return ::FLAC__stream_encoder_get_bits_per_sample(encoder_);
215                 }
216
217                 unsigned Stream::get_sample_rate() const
218                 {
219                         FLAC__ASSERT(is_valid());
220                         return ::FLAC__stream_encoder_get_sample_rate(encoder_);
221                 }
222
223                 unsigned Stream::get_blocksize() const
224                 {
225                         FLAC__ASSERT(is_valid());
226                         return ::FLAC__stream_encoder_get_blocksize(encoder_);
227                 }
228
229                 unsigned Stream::get_max_lpc_order() const
230                 {
231                         FLAC__ASSERT(is_valid());
232                         return ::FLAC__stream_encoder_get_max_lpc_order(encoder_);
233                 }
234
235                 unsigned Stream::get_qlp_coeff_precision() const
236                 {
237                         FLAC__ASSERT(is_valid());
238                         return ::FLAC__stream_encoder_get_qlp_coeff_precision(encoder_);
239                 }
240
241                 bool Stream::get_do_qlp_coeff_prec_search() const
242                 {
243                         FLAC__ASSERT(is_valid());
244                         return (bool)::FLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder_);
245                 }
246
247                 bool Stream::get_do_escape_coding() const
248                 {
249                         FLAC__ASSERT(is_valid());
250                         return (bool)::FLAC__stream_encoder_get_do_escape_coding(encoder_);
251                 }
252
253                 bool Stream::get_do_exhaustive_model_search() const
254                 {
255                         FLAC__ASSERT(is_valid());
256                         return (bool)::FLAC__stream_encoder_get_do_exhaustive_model_search(encoder_);
257                 }
258
259                 unsigned Stream::get_min_residual_partition_order() const
260                 {
261                         FLAC__ASSERT(is_valid());
262                         return ::FLAC__stream_encoder_get_min_residual_partition_order(encoder_);
263                 }
264
265                 unsigned Stream::get_max_residual_partition_order() const
266                 {
267                         FLAC__ASSERT(is_valid());
268                         return ::FLAC__stream_encoder_get_max_residual_partition_order(encoder_);
269                 }
270
271                 unsigned Stream::get_rice_parameter_search_dist() const
272                 {
273                         FLAC__ASSERT(is_valid());
274                         return ::FLAC__stream_encoder_get_rice_parameter_search_dist(encoder_);
275                 }
276
277                 FLAC__uint64 Stream::get_total_samples_estimate() const
278                 {
279                         FLAC__ASSERT(is_valid());
280                         return ::FLAC__stream_encoder_get_total_samples_estimate(encoder_);
281                 }
282
283                 Stream::State Stream::init()
284                 {
285                         FLAC__ASSERT(is_valid());
286                         ::FLAC__stream_encoder_set_write_callback(encoder_, write_callback_);
287                         ::FLAC__stream_encoder_set_metadata_callback(encoder_, metadata_callback_);
288                         ::FLAC__stream_encoder_set_client_data(encoder_, (void*)this);
289                         return State(::FLAC__stream_encoder_init(encoder_));
290                 }
291
292                 void Stream::finish()
293                 {
294                         FLAC__ASSERT(is_valid());
295                         ::FLAC__stream_encoder_finish(encoder_);
296                 }
297
298                 bool Stream::process(const FLAC__int32 * const buffer[], unsigned samples)
299                 {
300                         FLAC__ASSERT(is_valid());
301                         return (bool)::FLAC__stream_encoder_process(encoder_, buffer, samples);
302                 }
303
304                 bool Stream::process_interleaved(const FLAC__int32 buffer[], unsigned samples)
305                 {
306                         FLAC__ASSERT(is_valid());
307                         return (bool)::FLAC__stream_encoder_process_interleaved(encoder_, buffer, samples);
308                 }
309
310                 ::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
311                 {
312                         (void)encoder;
313                         FLAC__ASSERT(0 != client_data);
314                         Stream *instance = reinterpret_cast<Stream *>(client_data);
315                         FLAC__ASSERT(0 != instance);
316                         return instance->write_callback(buffer, bytes, samples, current_frame);
317                 }
318
319                 void Stream::metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data)
320                 {
321                         (void)encoder;
322                         FLAC__ASSERT(0 != client_data);
323                         Stream *instance = reinterpret_cast<Stream *>(client_data);
324                         FLAC__ASSERT(0 != instance);
325                         instance->metadata_callback(metadata);
326                 }
327
328         };
329 };