1*600f14f4SXin Li /* libFLAC - Free Lossless Audio Codec library
2*600f14f4SXin Li * Copyright (C) 2000-2009 Josh Coalson
3*600f14f4SXin Li * Copyright (C) 2011-2023 Xiph.Org Foundation
4*600f14f4SXin Li *
5*600f14f4SXin Li * Redistribution and use in source and binary forms, with or without
6*600f14f4SXin Li * modification, are permitted provided that the following conditions
7*600f14f4SXin Li * are met:
8*600f14f4SXin Li *
9*600f14f4SXin Li * - Redistributions of source code must retain the above copyright
10*600f14f4SXin Li * notice, this list of conditions and the following disclaimer.
11*600f14f4SXin Li *
12*600f14f4SXin Li * - Redistributions in binary form must reproduce the above copyright
13*600f14f4SXin Li * notice, this list of conditions and the following disclaimer in the
14*600f14f4SXin Li * documentation and/or other materials provided with the distribution.
15*600f14f4SXin Li *
16*600f14f4SXin Li * - Neither the name of the Xiph.org Foundation nor the names of its
17*600f14f4SXin Li * contributors may be used to endorse or promote products derived from
18*600f14f4SXin Li * this software without specific prior written permission.
19*600f14f4SXin Li *
20*600f14f4SXin Li * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*600f14f4SXin Li * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*600f14f4SXin Li * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*600f14f4SXin Li * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
24*600f14f4SXin Li * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*600f14f4SXin Li * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*600f14f4SXin Li * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27*600f14f4SXin Li * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28*600f14f4SXin Li * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29*600f14f4SXin Li * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*600f14f4SXin Li * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*600f14f4SXin Li */
32*600f14f4SXin Li
33*600f14f4SXin Li #ifdef HAVE_CONFIG_H
34*600f14f4SXin Li # include <config.h>
35*600f14f4SXin Li #endif
36*600f14f4SXin Li
37*600f14f4SXin Li #include <stdio.h>
38*600f14f4SXin Li #include <stdlib.h> /* for malloc() */
39*600f14f4SXin Li #include <string.h> /* for memset/memcpy() */
40*600f14f4SXin Li #include <sys/types.h> /* for off_t */
41*600f14f4SXin Li #include <sys/stat.h> /* for stat() */
42*600f14f4SXin Li #include "share/compat.h"
43*600f14f4SXin Li #include "FLAC/assert.h"
44*600f14f4SXin Li #include "share/alloc.h"
45*600f14f4SXin Li #include "protected/stream_decoder.h"
46*600f14f4SXin Li #include "private/bitreader.h"
47*600f14f4SXin Li #include "private/bitmath.h"
48*600f14f4SXin Li #include "private/cpu.h"
49*600f14f4SXin Li #include "private/crc.h"
50*600f14f4SXin Li #include "private/fixed.h"
51*600f14f4SXin Li #include "private/format.h"
52*600f14f4SXin Li #include "private/lpc.h"
53*600f14f4SXin Li #include "private/md5.h"
54*600f14f4SXin Li #include "private/memory.h"
55*600f14f4SXin Li #include "private/macros.h"
56*600f14f4SXin Li
57*600f14f4SXin Li
58*600f14f4SXin Li /* technically this should be in an "export.c" but this is convenient enough */
59*600f14f4SXin Li FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = FLAC__HAS_OGG;
60*600f14f4SXin Li
61*600f14f4SXin Li
62*600f14f4SXin Li /***********************************************************************
63*600f14f4SXin Li *
64*600f14f4SXin Li * Private static data
65*600f14f4SXin Li *
66*600f14f4SXin Li ***********************************************************************/
67*600f14f4SXin Li
68*600f14f4SXin Li static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' };
69*600f14f4SXin Li
70*600f14f4SXin Li /***********************************************************************
71*600f14f4SXin Li *
72*600f14f4SXin Li * Private class method prototypes
73*600f14f4SXin Li *
74*600f14f4SXin Li ***********************************************************************/
75*600f14f4SXin Li
76*600f14f4SXin Li static void set_defaults_(FLAC__StreamDecoder *decoder);
77*600f14f4SXin Li static FILE *get_binary_stdin_(void);
78*600f14f4SXin Li static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, uint32_t size, uint32_t channels, uint32_t bps);
79*600f14f4SXin Li static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id);
80*600f14f4SXin Li static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder);
81*600f14f4SXin Li static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder);
82*600f14f4SXin Li static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length);
83*600f14f4SXin Li static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length);
84*600f14f4SXin Li static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, uint32_t length);
85*600f14f4SXin Li static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj);
86*600f14f4SXin Li static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj);
87*600f14f4SXin Li static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder);
88*600f14f4SXin Li static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder);
89*600f14f4SXin Li static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode);
90*600f14f4SXin Li static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder);
91*600f14f4SXin Li static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode);
92*600f14f4SXin Li static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode);
93*600f14f4SXin Li static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode);
94*600f14f4SXin Li static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode);
95*600f14f4SXin Li static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode);
96*600f14f4SXin Li static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_t predictor_order, uint32_t partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended);
97*600f14f4SXin Li static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder);
98*600f14f4SXin Li static void undo_channel_coding(FLAC__StreamDecoder *decoder);
99*600f14f4SXin Li static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data);
100*600f14f4SXin Li #if FLAC__HAS_OGG
101*600f14f4SXin Li static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes);
102*600f14f4SXin Li static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
103*600f14f4SXin Li #endif
104*600f14f4SXin Li static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]);
105*600f14f4SXin Li static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status);
106*600f14f4SXin Li static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample);
107*600f14f4SXin Li #if FLAC__HAS_OGG
108*600f14f4SXin Li static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample);
109*600f14f4SXin Li #endif
110*600f14f4SXin Li static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
111*600f14f4SXin Li static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
112*600f14f4SXin Li static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
113*600f14f4SXin Li static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
114*600f14f4SXin Li static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data);
115*600f14f4SXin Li
116*600f14f4SXin Li /***********************************************************************
117*600f14f4SXin Li *
118*600f14f4SXin Li * Private class data
119*600f14f4SXin Li *
120*600f14f4SXin Li ***********************************************************************/
121*600f14f4SXin Li
122*600f14f4SXin Li typedef struct FLAC__StreamDecoderPrivate {
123*600f14f4SXin Li FLAC__bool is_ogg;
124*600f14f4SXin Li FLAC__StreamDecoderReadCallback read_callback;
125*600f14f4SXin Li FLAC__StreamDecoderSeekCallback seek_callback;
126*600f14f4SXin Li FLAC__StreamDecoderTellCallback tell_callback;
127*600f14f4SXin Li FLAC__StreamDecoderLengthCallback length_callback;
128*600f14f4SXin Li FLAC__StreamDecoderEofCallback eof_callback;
129*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback;
130*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback;
131*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback;
132*600f14f4SXin Li void *client_data;
133*600f14f4SXin Li FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */
134*600f14f4SXin Li FLAC__BitReader *input;
135*600f14f4SXin Li FLAC__int32 *output[FLAC__MAX_CHANNELS];
136*600f14f4SXin Li FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */
137*600f14f4SXin Li FLAC__int64 *side_subframe;
138*600f14f4SXin Li FLAC__bool side_subframe_in_use;
139*600f14f4SXin Li FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS];
140*600f14f4SXin Li uint32_t output_capacity, output_channels;
141*600f14f4SXin Li FLAC__uint32 fixed_block_size, next_fixed_block_size;
142*600f14f4SXin Li FLAC__uint64 samples_decoded;
143*600f14f4SXin Li FLAC__bool has_stream_info, has_seek_table;
144*600f14f4SXin Li FLAC__StreamMetadata stream_info;
145*600f14f4SXin Li FLAC__StreamMetadata seek_table;
146*600f14f4SXin Li FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */
147*600f14f4SXin Li FLAC__byte *metadata_filter_ids;
148*600f14f4SXin Li size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */
149*600f14f4SXin Li FLAC__Frame frame;
150*600f14f4SXin Li FLAC__bool cached; /* true if there is a byte in lookahead */
151*600f14f4SXin Li FLAC__CPUInfo cpuinfo;
152*600f14f4SXin Li FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */
153*600f14f4SXin Li FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */
154*600f14f4SXin Li /* unaligned (original) pointers to allocated data */
155*600f14f4SXin Li FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS];
156*600f14f4SXin Li FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */
157*600f14f4SXin Li FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */
158*600f14f4SXin Li FLAC__bool is_seeking;
159*600f14f4SXin Li FLAC__MD5Context md5context;
160*600f14f4SXin Li FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */
161*600f14f4SXin Li /* (the rest of these are only used for seeking) */
162*600f14f4SXin Li FLAC__Frame last_frame; /* holds the info of the last frame we decoded or seeked to */
163*600f14f4SXin Li FLAC__bool last_frame_is_set;
164*600f14f4SXin Li FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */
165*600f14f4SXin Li FLAC__uint64 last_seen_framesync; /* if tell callback works, the location of the last seen frame sync code, to rewind to if needed */
166*600f14f4SXin Li FLAC__uint64 target_sample;
167*600f14f4SXin Li uint32_t unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */
168*600f14f4SXin Li FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */
169*600f14f4SXin Li FLAC__bool (*local_bitreader_read_rice_signed_block)(FLAC__BitReader *br, int vals[], uint32_t nvals, uint32_t parameter);
170*600f14f4SXin Li } FLAC__StreamDecoderPrivate;
171*600f14f4SXin Li
172*600f14f4SXin Li /***********************************************************************
173*600f14f4SXin Li *
174*600f14f4SXin Li * Public static class data
175*600f14f4SXin Li *
176*600f14f4SXin Li ***********************************************************************/
177*600f14f4SXin Li
178*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderStateString[] = {
179*600f14f4SXin Li "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA",
180*600f14f4SXin Li "FLAC__STREAM_DECODER_READ_METADATA",
181*600f14f4SXin Li "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC",
182*600f14f4SXin Li "FLAC__STREAM_DECODER_READ_FRAME",
183*600f14f4SXin Li "FLAC__STREAM_DECODER_END_OF_STREAM",
184*600f14f4SXin Li "FLAC__STREAM_DECODER_OGG_ERROR",
185*600f14f4SXin Li "FLAC__STREAM_DECODER_SEEK_ERROR",
186*600f14f4SXin Li "FLAC__STREAM_DECODER_ABORTED",
187*600f14f4SXin Li "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR",
188*600f14f4SXin Li "FLAC__STREAM_DECODER_UNINITIALIZED"
189*600f14f4SXin Li };
190*600f14f4SXin Li
191*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = {
192*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_OK",
193*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER",
194*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS",
195*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR",
196*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE",
197*600f14f4SXin Li "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED"
198*600f14f4SXin Li };
199*600f14f4SXin Li
200*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = {
201*600f14f4SXin Li "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE",
202*600f14f4SXin Li "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM",
203*600f14f4SXin Li "FLAC__STREAM_DECODER_READ_STATUS_ABORT"
204*600f14f4SXin Li };
205*600f14f4SXin Li
206*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = {
207*600f14f4SXin Li "FLAC__STREAM_DECODER_SEEK_STATUS_OK",
208*600f14f4SXin Li "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR",
209*600f14f4SXin Li "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED"
210*600f14f4SXin Li };
211*600f14f4SXin Li
212*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = {
213*600f14f4SXin Li "FLAC__STREAM_DECODER_TELL_STATUS_OK",
214*600f14f4SXin Li "FLAC__STREAM_DECODER_TELL_STATUS_ERROR",
215*600f14f4SXin Li "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED"
216*600f14f4SXin Li };
217*600f14f4SXin Li
218*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = {
219*600f14f4SXin Li "FLAC__STREAM_DECODER_LENGTH_STATUS_OK",
220*600f14f4SXin Li "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR",
221*600f14f4SXin Li "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED"
222*600f14f4SXin Li };
223*600f14f4SXin Li
224*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = {
225*600f14f4SXin Li "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE",
226*600f14f4SXin Li "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT"
227*600f14f4SXin Li };
228*600f14f4SXin Li
229*600f14f4SXin Li FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = {
230*600f14f4SXin Li "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC",
231*600f14f4SXin Li "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER",
232*600f14f4SXin Li "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH",
233*600f14f4SXin Li "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM",
234*600f14f4SXin Li "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_METADATA"
235*600f14f4SXin Li };
236*600f14f4SXin Li
237*600f14f4SXin Li /***********************************************************************
238*600f14f4SXin Li *
239*600f14f4SXin Li * Class constructor/destructor
240*600f14f4SXin Li *
241*600f14f4SXin Li ***********************************************************************/
FLAC__stream_decoder_new(void)242*600f14f4SXin Li FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void)
243*600f14f4SXin Li {
244*600f14f4SXin Li FLAC__StreamDecoder *decoder;
245*600f14f4SXin Li uint32_t i;
246*600f14f4SXin Li
247*600f14f4SXin Li FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */
248*600f14f4SXin Li
249*600f14f4SXin Li decoder = calloc(1, sizeof(FLAC__StreamDecoder));
250*600f14f4SXin Li if(decoder == 0) {
251*600f14f4SXin Li return 0;
252*600f14f4SXin Li }
253*600f14f4SXin Li
254*600f14f4SXin Li decoder->protected_ = calloc(1, sizeof(FLAC__StreamDecoderProtected));
255*600f14f4SXin Li if(decoder->protected_ == 0) {
256*600f14f4SXin Li free(decoder);
257*600f14f4SXin Li return 0;
258*600f14f4SXin Li }
259*600f14f4SXin Li
260*600f14f4SXin Li decoder->private_ = calloc(1, sizeof(FLAC__StreamDecoderPrivate));
261*600f14f4SXin Li if(decoder->private_ == 0) {
262*600f14f4SXin Li free(decoder->protected_);
263*600f14f4SXin Li free(decoder);
264*600f14f4SXin Li return 0;
265*600f14f4SXin Li }
266*600f14f4SXin Li
267*600f14f4SXin Li decoder->private_->input = FLAC__bitreader_new();
268*600f14f4SXin Li if(decoder->private_->input == 0) {
269*600f14f4SXin Li free(decoder->private_);
270*600f14f4SXin Li free(decoder->protected_);
271*600f14f4SXin Li free(decoder);
272*600f14f4SXin Li return 0;
273*600f14f4SXin Li }
274*600f14f4SXin Li
275*600f14f4SXin Li decoder->private_->metadata_filter_ids_capacity = 16;
276*600f14f4SXin Li if(0 == (decoder->private_->metadata_filter_ids = malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) {
277*600f14f4SXin Li FLAC__bitreader_delete(decoder->private_->input);
278*600f14f4SXin Li free(decoder->private_);
279*600f14f4SXin Li free(decoder->protected_);
280*600f14f4SXin Li free(decoder);
281*600f14f4SXin Li return 0;
282*600f14f4SXin Li }
283*600f14f4SXin Li
284*600f14f4SXin Li for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
285*600f14f4SXin Li decoder->private_->output[i] = 0;
286*600f14f4SXin Li decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0;
287*600f14f4SXin Li }
288*600f14f4SXin Li
289*600f14f4SXin Li decoder->private_->side_subframe = 0;
290*600f14f4SXin Li
291*600f14f4SXin Li decoder->private_->output_capacity = 0;
292*600f14f4SXin Li decoder->private_->output_channels = 0;
293*600f14f4SXin Li decoder->private_->has_seek_table = false;
294*600f14f4SXin Li
295*600f14f4SXin Li for(i = 0; i < FLAC__MAX_CHANNELS; i++)
296*600f14f4SXin Li FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]);
297*600f14f4SXin Li
298*600f14f4SXin Li decoder->private_->file = 0;
299*600f14f4SXin Li
300*600f14f4SXin Li set_defaults_(decoder);
301*600f14f4SXin Li
302*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED;
303*600f14f4SXin Li
304*600f14f4SXin Li return decoder;
305*600f14f4SXin Li }
306*600f14f4SXin Li
FLAC__stream_decoder_delete(FLAC__StreamDecoder * decoder)307*600f14f4SXin Li FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder)
308*600f14f4SXin Li {
309*600f14f4SXin Li uint32_t i;
310*600f14f4SXin Li
311*600f14f4SXin Li if (decoder == NULL)
312*600f14f4SXin Li return ;
313*600f14f4SXin Li
314*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
315*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
316*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_->input);
317*600f14f4SXin Li
318*600f14f4SXin Li (void)FLAC__stream_decoder_finish(decoder);
319*600f14f4SXin Li
320*600f14f4SXin Li if(0 != decoder->private_->metadata_filter_ids)
321*600f14f4SXin Li free(decoder->private_->metadata_filter_ids);
322*600f14f4SXin Li
323*600f14f4SXin Li FLAC__bitreader_delete(decoder->private_->input);
324*600f14f4SXin Li
325*600f14f4SXin Li for(i = 0; i < FLAC__MAX_CHANNELS; i++)
326*600f14f4SXin Li FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]);
327*600f14f4SXin Li
328*600f14f4SXin Li free(decoder->private_);
329*600f14f4SXin Li free(decoder->protected_);
330*600f14f4SXin Li free(decoder);
331*600f14f4SXin Li }
332*600f14f4SXin Li
333*600f14f4SXin Li /***********************************************************************
334*600f14f4SXin Li *
335*600f14f4SXin Li * Public class methods
336*600f14f4SXin Li *
337*600f14f4SXin Li ***********************************************************************/
338*600f14f4SXin Li
init_stream_internal_(FLAC__StreamDecoder * decoder,FLAC__StreamDecoderReadCallback read_callback,FLAC__StreamDecoderSeekCallback seek_callback,FLAC__StreamDecoderTellCallback tell_callback,FLAC__StreamDecoderLengthCallback length_callback,FLAC__StreamDecoderEofCallback eof_callback,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data,FLAC__bool is_ogg)339*600f14f4SXin Li static FLAC__StreamDecoderInitStatus init_stream_internal_(
340*600f14f4SXin Li FLAC__StreamDecoder *decoder,
341*600f14f4SXin Li FLAC__StreamDecoderReadCallback read_callback,
342*600f14f4SXin Li FLAC__StreamDecoderSeekCallback seek_callback,
343*600f14f4SXin Li FLAC__StreamDecoderTellCallback tell_callback,
344*600f14f4SXin Li FLAC__StreamDecoderLengthCallback length_callback,
345*600f14f4SXin Li FLAC__StreamDecoderEofCallback eof_callback,
346*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
347*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
348*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
349*600f14f4SXin Li void *client_data,
350*600f14f4SXin Li FLAC__bool is_ogg
351*600f14f4SXin Li )
352*600f14f4SXin Li {
353*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
354*600f14f4SXin Li
355*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
356*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED;
357*600f14f4SXin Li
358*600f14f4SXin Li if(FLAC__HAS_OGG == 0 && is_ogg)
359*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER;
360*600f14f4SXin Li
361*600f14f4SXin Li if(
362*600f14f4SXin Li 0 == read_callback ||
363*600f14f4SXin Li 0 == write_callback ||
364*600f14f4SXin Li 0 == error_callback ||
365*600f14f4SXin Li (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback))
366*600f14f4SXin Li )
367*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS;
368*600f14f4SXin Li
369*600f14f4SXin Li #if FLAC__HAS_OGG
370*600f14f4SXin Li decoder->private_->is_ogg = is_ogg;
371*600f14f4SXin Li if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect))
372*600f14f4SXin Li return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE;
373*600f14f4SXin Li #endif
374*600f14f4SXin Li
375*600f14f4SXin Li FLAC__cpu_info(&decoder->private_->cpuinfo);
376*600f14f4SXin Li decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block;
377*600f14f4SXin Li
378*600f14f4SXin Li #ifdef FLAC__BMI2_SUPPORTED
379*600f14f4SXin Li if (decoder->private_->cpuinfo.x86.bmi2) {
380*600f14f4SXin Li decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block_bmi2;
381*600f14f4SXin Li }
382*600f14f4SXin Li #endif
383*600f14f4SXin Li
384*600f14f4SXin Li /* from here on, errors are fatal */
385*600f14f4SXin Li
386*600f14f4SXin Li if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) {
387*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
388*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR;
389*600f14f4SXin Li }
390*600f14f4SXin Li
391*600f14f4SXin Li decoder->private_->read_callback = read_callback;
392*600f14f4SXin Li decoder->private_->seek_callback = seek_callback;
393*600f14f4SXin Li decoder->private_->tell_callback = tell_callback;
394*600f14f4SXin Li decoder->private_->length_callback = length_callback;
395*600f14f4SXin Li decoder->private_->eof_callback = eof_callback;
396*600f14f4SXin Li decoder->private_->write_callback = write_callback;
397*600f14f4SXin Li decoder->private_->metadata_callback = metadata_callback;
398*600f14f4SXin Li decoder->private_->error_callback = error_callback;
399*600f14f4SXin Li decoder->private_->client_data = client_data;
400*600f14f4SXin Li decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0;
401*600f14f4SXin Li decoder->private_->samples_decoded = 0;
402*600f14f4SXin Li decoder->private_->has_stream_info = false;
403*600f14f4SXin Li decoder->private_->cached = false;
404*600f14f4SXin Li
405*600f14f4SXin Li decoder->private_->do_md5_checking = decoder->protected_->md5_checking;
406*600f14f4SXin Li decoder->private_->is_seeking = false;
407*600f14f4SXin Li
408*600f14f4SXin Li decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */
409*600f14f4SXin Li if(!FLAC__stream_decoder_reset(decoder)) {
410*600f14f4SXin Li /* above call sets the state for us */
411*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR;
412*600f14f4SXin Li }
413*600f14f4SXin Li
414*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_OK;
415*600f14f4SXin Li }
416*600f14f4SXin Li
FLAC__stream_decoder_init_stream(FLAC__StreamDecoder * decoder,FLAC__StreamDecoderReadCallback read_callback,FLAC__StreamDecoderSeekCallback seek_callback,FLAC__StreamDecoderTellCallback tell_callback,FLAC__StreamDecoderLengthCallback length_callback,FLAC__StreamDecoderEofCallback eof_callback,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)417*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream(
418*600f14f4SXin Li FLAC__StreamDecoder *decoder,
419*600f14f4SXin Li FLAC__StreamDecoderReadCallback read_callback,
420*600f14f4SXin Li FLAC__StreamDecoderSeekCallback seek_callback,
421*600f14f4SXin Li FLAC__StreamDecoderTellCallback tell_callback,
422*600f14f4SXin Li FLAC__StreamDecoderLengthCallback length_callback,
423*600f14f4SXin Li FLAC__StreamDecoderEofCallback eof_callback,
424*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
425*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
426*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
427*600f14f4SXin Li void *client_data
428*600f14f4SXin Li )
429*600f14f4SXin Li {
430*600f14f4SXin Li return init_stream_internal_(
431*600f14f4SXin Li decoder,
432*600f14f4SXin Li read_callback,
433*600f14f4SXin Li seek_callback,
434*600f14f4SXin Li tell_callback,
435*600f14f4SXin Li length_callback,
436*600f14f4SXin Li eof_callback,
437*600f14f4SXin Li write_callback,
438*600f14f4SXin Li metadata_callback,
439*600f14f4SXin Li error_callback,
440*600f14f4SXin Li client_data,
441*600f14f4SXin Li /*is_ogg=*/false
442*600f14f4SXin Li );
443*600f14f4SXin Li }
444*600f14f4SXin Li
FLAC__stream_decoder_init_ogg_stream(FLAC__StreamDecoder * decoder,FLAC__StreamDecoderReadCallback read_callback,FLAC__StreamDecoderSeekCallback seek_callback,FLAC__StreamDecoderTellCallback tell_callback,FLAC__StreamDecoderLengthCallback length_callback,FLAC__StreamDecoderEofCallback eof_callback,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)445*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream(
446*600f14f4SXin Li FLAC__StreamDecoder *decoder,
447*600f14f4SXin Li FLAC__StreamDecoderReadCallback read_callback,
448*600f14f4SXin Li FLAC__StreamDecoderSeekCallback seek_callback,
449*600f14f4SXin Li FLAC__StreamDecoderTellCallback tell_callback,
450*600f14f4SXin Li FLAC__StreamDecoderLengthCallback length_callback,
451*600f14f4SXin Li FLAC__StreamDecoderEofCallback eof_callback,
452*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
453*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
454*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
455*600f14f4SXin Li void *client_data
456*600f14f4SXin Li )
457*600f14f4SXin Li {
458*600f14f4SXin Li return init_stream_internal_(
459*600f14f4SXin Li decoder,
460*600f14f4SXin Li read_callback,
461*600f14f4SXin Li seek_callback,
462*600f14f4SXin Li tell_callback,
463*600f14f4SXin Li length_callback,
464*600f14f4SXin Li eof_callback,
465*600f14f4SXin Li write_callback,
466*600f14f4SXin Li metadata_callback,
467*600f14f4SXin Li error_callback,
468*600f14f4SXin Li client_data,
469*600f14f4SXin Li /*is_ogg=*/true
470*600f14f4SXin Li );
471*600f14f4SXin Li }
472*600f14f4SXin Li
init_FILE_internal_(FLAC__StreamDecoder * decoder,FILE * file,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data,FLAC__bool is_ogg)473*600f14f4SXin Li static FLAC__StreamDecoderInitStatus init_FILE_internal_(
474*600f14f4SXin Li FLAC__StreamDecoder *decoder,
475*600f14f4SXin Li FILE *file,
476*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
477*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
478*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
479*600f14f4SXin Li void *client_data,
480*600f14f4SXin Li FLAC__bool is_ogg
481*600f14f4SXin Li )
482*600f14f4SXin Li {
483*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
484*600f14f4SXin Li FLAC__ASSERT(0 != file);
485*600f14f4SXin Li
486*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
487*600f14f4SXin Li return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED;
488*600f14f4SXin Li
489*600f14f4SXin Li if(0 == write_callback || 0 == error_callback)
490*600f14f4SXin Li return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS;
491*600f14f4SXin Li
492*600f14f4SXin Li /*
493*600f14f4SXin Li * To make sure that our file does not go unclosed after an error, we
494*600f14f4SXin Li * must assign the FILE pointer before any further error can occur in
495*600f14f4SXin Li * this routine.
496*600f14f4SXin Li */
497*600f14f4SXin Li if(file == stdin)
498*600f14f4SXin Li file = get_binary_stdin_(); /* just to be safe */
499*600f14f4SXin Li
500*600f14f4SXin Li decoder->private_->file = file;
501*600f14f4SXin Li
502*600f14f4SXin Li return init_stream_internal_(
503*600f14f4SXin Li decoder,
504*600f14f4SXin Li file_read_callback_,
505*600f14f4SXin Li decoder->private_->file == stdin? 0: file_seek_callback_,
506*600f14f4SXin Li decoder->private_->file == stdin? 0: file_tell_callback_,
507*600f14f4SXin Li decoder->private_->file == stdin? 0: file_length_callback_,
508*600f14f4SXin Li file_eof_callback_,
509*600f14f4SXin Li write_callback,
510*600f14f4SXin Li metadata_callback,
511*600f14f4SXin Li error_callback,
512*600f14f4SXin Li client_data,
513*600f14f4SXin Li is_ogg
514*600f14f4SXin Li );
515*600f14f4SXin Li }
516*600f14f4SXin Li
FLAC__stream_decoder_init_FILE(FLAC__StreamDecoder * decoder,FILE * file,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)517*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE(
518*600f14f4SXin Li FLAC__StreamDecoder *decoder,
519*600f14f4SXin Li FILE *file,
520*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
521*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
522*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
523*600f14f4SXin Li void *client_data
524*600f14f4SXin Li )
525*600f14f4SXin Li {
526*600f14f4SXin Li return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false);
527*600f14f4SXin Li }
528*600f14f4SXin Li
FLAC__stream_decoder_init_ogg_FILE(FLAC__StreamDecoder * decoder,FILE * file,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)529*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE(
530*600f14f4SXin Li FLAC__StreamDecoder *decoder,
531*600f14f4SXin Li FILE *file,
532*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
533*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
534*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
535*600f14f4SXin Li void *client_data
536*600f14f4SXin Li )
537*600f14f4SXin Li {
538*600f14f4SXin Li return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true);
539*600f14f4SXin Li }
540*600f14f4SXin Li
init_file_internal_(FLAC__StreamDecoder * decoder,const char * filename,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data,FLAC__bool is_ogg)541*600f14f4SXin Li static FLAC__StreamDecoderInitStatus init_file_internal_(
542*600f14f4SXin Li FLAC__StreamDecoder *decoder,
543*600f14f4SXin Li const char *filename,
544*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
545*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
546*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
547*600f14f4SXin Li void *client_data,
548*600f14f4SXin Li FLAC__bool is_ogg
549*600f14f4SXin Li )
550*600f14f4SXin Li {
551*600f14f4SXin Li FILE *file;
552*600f14f4SXin Li
553*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
554*600f14f4SXin Li
555*600f14f4SXin Li /*
556*600f14f4SXin Li * To make sure that our file does not go unclosed after an error, we
557*600f14f4SXin Li * have to do the same entrance checks here that are later performed
558*600f14f4SXin Li * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned.
559*600f14f4SXin Li */
560*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
561*600f14f4SXin Li return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED;
562*600f14f4SXin Li
563*600f14f4SXin Li if(0 == write_callback || 0 == error_callback)
564*600f14f4SXin Li return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS;
565*600f14f4SXin Li
566*600f14f4SXin Li file = filename? flac_fopen(filename, "rb") : stdin;
567*600f14f4SXin Li
568*600f14f4SXin Li if(0 == file)
569*600f14f4SXin Li return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE;
570*600f14f4SXin Li
571*600f14f4SXin Li return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg);
572*600f14f4SXin Li }
573*600f14f4SXin Li
FLAC__stream_decoder_init_file(FLAC__StreamDecoder * decoder,const char * filename,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)574*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file(
575*600f14f4SXin Li FLAC__StreamDecoder *decoder,
576*600f14f4SXin Li const char *filename,
577*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
578*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
579*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
580*600f14f4SXin Li void *client_data
581*600f14f4SXin Li )
582*600f14f4SXin Li {
583*600f14f4SXin Li return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false);
584*600f14f4SXin Li }
585*600f14f4SXin Li
FLAC__stream_decoder_init_ogg_file(FLAC__StreamDecoder * decoder,const char * filename,FLAC__StreamDecoderWriteCallback write_callback,FLAC__StreamDecoderMetadataCallback metadata_callback,FLAC__StreamDecoderErrorCallback error_callback,void * client_data)586*600f14f4SXin Li FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file(
587*600f14f4SXin Li FLAC__StreamDecoder *decoder,
588*600f14f4SXin Li const char *filename,
589*600f14f4SXin Li FLAC__StreamDecoderWriteCallback write_callback,
590*600f14f4SXin Li FLAC__StreamDecoderMetadataCallback metadata_callback,
591*600f14f4SXin Li FLAC__StreamDecoderErrorCallback error_callback,
592*600f14f4SXin Li void *client_data
593*600f14f4SXin Li )
594*600f14f4SXin Li {
595*600f14f4SXin Li return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true);
596*600f14f4SXin Li }
597*600f14f4SXin Li
FLAC__stream_decoder_finish(FLAC__StreamDecoder * decoder)598*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder)
599*600f14f4SXin Li {
600*600f14f4SXin Li FLAC__bool md5_failed = false;
601*600f14f4SXin Li uint32_t i;
602*600f14f4SXin Li
603*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
604*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
605*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
606*600f14f4SXin Li
607*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED)
608*600f14f4SXin Li return true;
609*600f14f4SXin Li
610*600f14f4SXin Li /* see the comment in FLAC__stream_decoder_reset() as to why we
611*600f14f4SXin Li * always call FLAC__MD5Final()
612*600f14f4SXin Li */
613*600f14f4SXin Li FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context);
614*600f14f4SXin Li
615*600f14f4SXin Li free(decoder->private_->seek_table.data.seek_table.points);
616*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.points = 0;
617*600f14f4SXin Li decoder->private_->has_seek_table = false;
618*600f14f4SXin Li
619*600f14f4SXin Li FLAC__bitreader_free(decoder->private_->input);
620*600f14f4SXin Li for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
621*600f14f4SXin Li /* WATCHOUT:
622*600f14f4SXin Li * FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN()
623*600f14f4SXin Li * require that the output arrays have a buffer of up to 3 zeroes
624*600f14f4SXin Li * in front (at negative indices) for alignment purposes;
625*600f14f4SXin Li * we use 4 to keep the data well-aligned.
626*600f14f4SXin Li */
627*600f14f4SXin Li if(0 != decoder->private_->output[i]) {
628*600f14f4SXin Li free(decoder->private_->output[i]-4);
629*600f14f4SXin Li decoder->private_->output[i] = 0;
630*600f14f4SXin Li }
631*600f14f4SXin Li if(0 != decoder->private_->residual_unaligned[i]) {
632*600f14f4SXin Li free(decoder->private_->residual_unaligned[i]);
633*600f14f4SXin Li decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0;
634*600f14f4SXin Li }
635*600f14f4SXin Li }
636*600f14f4SXin Li if(0 != decoder->private_->side_subframe) {
637*600f14f4SXin Li free(decoder->private_->side_subframe);
638*600f14f4SXin Li decoder->private_->side_subframe = 0;
639*600f14f4SXin Li }
640*600f14f4SXin Li decoder->private_->output_capacity = 0;
641*600f14f4SXin Li decoder->private_->output_channels = 0;
642*600f14f4SXin Li
643*600f14f4SXin Li #if FLAC__HAS_OGG
644*600f14f4SXin Li if(decoder->private_->is_ogg)
645*600f14f4SXin Li FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect);
646*600f14f4SXin Li #endif
647*600f14f4SXin Li
648*600f14f4SXin Li if(0 != decoder->private_->file) {
649*600f14f4SXin Li if(decoder->private_->file != stdin)
650*600f14f4SXin Li fclose(decoder->private_->file);
651*600f14f4SXin Li decoder->private_->file = 0;
652*600f14f4SXin Li }
653*600f14f4SXin Li
654*600f14f4SXin Li if(decoder->private_->do_md5_checking) {
655*600f14f4SXin Li if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16))
656*600f14f4SXin Li md5_failed = true;
657*600f14f4SXin Li }
658*600f14f4SXin Li decoder->private_->is_seeking = false;
659*600f14f4SXin Li
660*600f14f4SXin Li set_defaults_(decoder);
661*600f14f4SXin Li
662*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED;
663*600f14f4SXin Li
664*600f14f4SXin Li return !md5_failed;
665*600f14f4SXin Li }
666*600f14f4SXin Li
FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder * decoder,long value)667*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value)
668*600f14f4SXin Li {
669*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
670*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
671*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
672*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
673*600f14f4SXin Li return false;
674*600f14f4SXin Li #if FLAC__HAS_OGG
675*600f14f4SXin Li /* can't check decoder->private_->is_ogg since that's not set until init time */
676*600f14f4SXin Li FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value);
677*600f14f4SXin Li return true;
678*600f14f4SXin Li #else
679*600f14f4SXin Li (void)value;
680*600f14f4SXin Li return false;
681*600f14f4SXin Li #endif
682*600f14f4SXin Li }
683*600f14f4SXin Li
FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder * decoder,FLAC__bool value)684*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value)
685*600f14f4SXin Li {
686*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
687*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
688*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
689*600f14f4SXin Li return false;
690*600f14f4SXin Li decoder->protected_->md5_checking = value;
691*600f14f4SXin Li return true;
692*600f14f4SXin Li }
693*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder * decoder,FLAC__MetadataType type)694*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type)
695*600f14f4SXin Li {
696*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
697*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
698*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
699*600f14f4SXin Li FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE);
700*600f14f4SXin Li /* double protection */
701*600f14f4SXin Li if((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE)
702*600f14f4SXin Li return false;
703*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
704*600f14f4SXin Li return false;
705*600f14f4SXin Li decoder->private_->metadata_filter[type] = true;
706*600f14f4SXin Li if(type == FLAC__METADATA_TYPE_APPLICATION)
707*600f14f4SXin Li decoder->private_->metadata_filter_ids_count = 0;
708*600f14f4SXin Li return true;
709*600f14f4SXin Li }
710*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder * decoder,const FLAC__byte id[4])711*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4])
712*600f14f4SXin Li {
713*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
714*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
715*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
716*600f14f4SXin Li FLAC__ASSERT(0 != id);
717*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
718*600f14f4SXin Li return false;
719*600f14f4SXin Li
720*600f14f4SXin Li if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION])
721*600f14f4SXin Li return true;
722*600f14f4SXin Li
723*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids);
724*600f14f4SXin Li
725*600f14f4SXin Li if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) {
726*600f14f4SXin Li if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) {
727*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
728*600f14f4SXin Li return false;
729*600f14f4SXin Li }
730*600f14f4SXin Li decoder->private_->metadata_filter_ids_capacity *= 2;
731*600f14f4SXin Li }
732*600f14f4SXin Li
733*600f14f4SXin Li memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8));
734*600f14f4SXin Li decoder->private_->metadata_filter_ids_count++;
735*600f14f4SXin Li
736*600f14f4SXin Li return true;
737*600f14f4SXin Li }
738*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder * decoder)739*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder)
740*600f14f4SXin Li {
741*600f14f4SXin Li uint32_t i;
742*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
743*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
744*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
745*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
746*600f14f4SXin Li return false;
747*600f14f4SXin Li for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++)
748*600f14f4SXin Li decoder->private_->metadata_filter[i] = true;
749*600f14f4SXin Li decoder->private_->metadata_filter_ids_count = 0;
750*600f14f4SXin Li return true;
751*600f14f4SXin Li }
752*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder * decoder,FLAC__MetadataType type)753*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type)
754*600f14f4SXin Li {
755*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
756*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
757*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
758*600f14f4SXin Li FLAC__ASSERT((uint32_t)type <= FLAC__MAX_METADATA_TYPE_CODE);
759*600f14f4SXin Li /* double protection */
760*600f14f4SXin Li if((uint32_t)type > FLAC__MAX_METADATA_TYPE_CODE)
761*600f14f4SXin Li return false;
762*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
763*600f14f4SXin Li return false;
764*600f14f4SXin Li decoder->private_->metadata_filter[type] = false;
765*600f14f4SXin Li if(type == FLAC__METADATA_TYPE_APPLICATION)
766*600f14f4SXin Li decoder->private_->metadata_filter_ids_count = 0;
767*600f14f4SXin Li return true;
768*600f14f4SXin Li }
769*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder * decoder,const FLAC__byte id[4])770*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4])
771*600f14f4SXin Li {
772*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
773*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
774*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
775*600f14f4SXin Li FLAC__ASSERT(0 != id);
776*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
777*600f14f4SXin Li return false;
778*600f14f4SXin Li
779*600f14f4SXin Li if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION])
780*600f14f4SXin Li return true;
781*600f14f4SXin Li
782*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids);
783*600f14f4SXin Li
784*600f14f4SXin Li if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) {
785*600f14f4SXin Li if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) {
786*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
787*600f14f4SXin Li return false;
788*600f14f4SXin Li }
789*600f14f4SXin Li decoder->private_->metadata_filter_ids_capacity *= 2;
790*600f14f4SXin Li }
791*600f14f4SXin Li
792*600f14f4SXin Li memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8));
793*600f14f4SXin Li decoder->private_->metadata_filter_ids_count++;
794*600f14f4SXin Li
795*600f14f4SXin Li return true;
796*600f14f4SXin Li }
797*600f14f4SXin Li
FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder * decoder)798*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder)
799*600f14f4SXin Li {
800*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
801*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
802*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
803*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED)
804*600f14f4SXin Li return false;
805*600f14f4SXin Li memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter));
806*600f14f4SXin Li decoder->private_->metadata_filter_ids_count = 0;
807*600f14f4SXin Li return true;
808*600f14f4SXin Li }
809*600f14f4SXin Li
FLAC__stream_decoder_get_state(const FLAC__StreamDecoder * decoder)810*600f14f4SXin Li FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder)
811*600f14f4SXin Li {
812*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
813*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
814*600f14f4SXin Li return decoder->protected_->state;
815*600f14f4SXin Li }
816*600f14f4SXin Li
FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder * decoder)817*600f14f4SXin Li FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder)
818*600f14f4SXin Li {
819*600f14f4SXin Li return FLAC__StreamDecoderStateString[decoder->protected_->state];
820*600f14f4SXin Li }
821*600f14f4SXin Li
FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder * decoder)822*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder)
823*600f14f4SXin Li {
824*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
825*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
826*600f14f4SXin Li return decoder->protected_->md5_checking;
827*600f14f4SXin Li }
828*600f14f4SXin Li
FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder * decoder)829*600f14f4SXin Li FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder)
830*600f14f4SXin Li {
831*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
832*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
833*600f14f4SXin Li return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0;
834*600f14f4SXin Li }
835*600f14f4SXin Li
FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder * decoder)836*600f14f4SXin Li FLAC_API uint32_t FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder)
837*600f14f4SXin Li {
838*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
839*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
840*600f14f4SXin Li return decoder->protected_->channels;
841*600f14f4SXin Li }
842*600f14f4SXin Li
FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder * decoder)843*600f14f4SXin Li FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder)
844*600f14f4SXin Li {
845*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
846*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
847*600f14f4SXin Li return decoder->protected_->channel_assignment;
848*600f14f4SXin Li }
849*600f14f4SXin Li
FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder * decoder)850*600f14f4SXin Li FLAC_API uint32_t FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder)
851*600f14f4SXin Li {
852*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
853*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
854*600f14f4SXin Li return decoder->protected_->bits_per_sample;
855*600f14f4SXin Li }
856*600f14f4SXin Li
FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder * decoder)857*600f14f4SXin Li FLAC_API uint32_t FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder)
858*600f14f4SXin Li {
859*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
860*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
861*600f14f4SXin Li return decoder->protected_->sample_rate;
862*600f14f4SXin Li }
863*600f14f4SXin Li
FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder * decoder)864*600f14f4SXin Li FLAC_API uint32_t FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder)
865*600f14f4SXin Li {
866*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
867*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
868*600f14f4SXin Li return decoder->protected_->blocksize;
869*600f14f4SXin Li }
870*600f14f4SXin Li
FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder * decoder,FLAC__uint64 * position)871*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position)
872*600f14f4SXin Li {
873*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
874*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
875*600f14f4SXin Li FLAC__ASSERT(0 != position);
876*600f14f4SXin Li
877*600f14f4SXin Li if(FLAC__HAS_OGG && decoder->private_->is_ogg)
878*600f14f4SXin Li return false;
879*600f14f4SXin Li
880*600f14f4SXin Li if(0 == decoder->private_->tell_callback)
881*600f14f4SXin Li return false;
882*600f14f4SXin Li if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK)
883*600f14f4SXin Li return false;
884*600f14f4SXin Li /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */
885*600f14f4SXin Li if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input))
886*600f14f4SXin Li return false;
887*600f14f4SXin Li FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder));
888*600f14f4SXin Li *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder);
889*600f14f4SXin Li return true;
890*600f14f4SXin Li }
891*600f14f4SXin Li
FLAC__stream_decoder_get_client_data(FLAC__StreamDecoder * decoder)892*600f14f4SXin Li FLAC_API const void *FLAC__stream_decoder_get_client_data(FLAC__StreamDecoder *decoder)
893*600f14f4SXin Li {
894*600f14f4SXin Li return decoder->private_->client_data;
895*600f14f4SXin Li }
896*600f14f4SXin Li
FLAC__stream_decoder_flush(FLAC__StreamDecoder * decoder)897*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder)
898*600f14f4SXin Li {
899*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
900*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
901*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
902*600f14f4SXin Li
903*600f14f4SXin Li if(!decoder->private_->internal_reset_hack && decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED)
904*600f14f4SXin Li return false;
905*600f14f4SXin Li
906*600f14f4SXin Li decoder->private_->samples_decoded = 0;
907*600f14f4SXin Li decoder->private_->do_md5_checking = false;
908*600f14f4SXin Li decoder->private_->last_seen_framesync = 0;
909*600f14f4SXin Li decoder->private_->last_frame_is_set = false;
910*600f14f4SXin Li
911*600f14f4SXin Li #if FLAC__HAS_OGG
912*600f14f4SXin Li if(decoder->private_->is_ogg)
913*600f14f4SXin Li FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect);
914*600f14f4SXin Li #endif
915*600f14f4SXin Li
916*600f14f4SXin Li if(!FLAC__bitreader_clear(decoder->private_->input)) {
917*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
918*600f14f4SXin Li return false;
919*600f14f4SXin Li }
920*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
921*600f14f4SXin Li
922*600f14f4SXin Li return true;
923*600f14f4SXin Li }
924*600f14f4SXin Li
FLAC__stream_decoder_reset(FLAC__StreamDecoder * decoder)925*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder)
926*600f14f4SXin Li {
927*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
928*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
929*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
930*600f14f4SXin Li
931*600f14f4SXin Li if(!FLAC__stream_decoder_flush(decoder)) {
932*600f14f4SXin Li /* above call sets the state for us */
933*600f14f4SXin Li return false;
934*600f14f4SXin Li }
935*600f14f4SXin Li
936*600f14f4SXin Li #if FLAC__HAS_OGG
937*600f14f4SXin Li /*@@@ could go in !internal_reset_hack block below */
938*600f14f4SXin Li if(decoder->private_->is_ogg)
939*600f14f4SXin Li FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect);
940*600f14f4SXin Li #endif
941*600f14f4SXin Li
942*600f14f4SXin Li /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us,
943*600f14f4SXin Li * (internal_reset_hack) don't try to rewind since we are already at
944*600f14f4SXin Li * the beginning of the stream and don't want to fail if the input is
945*600f14f4SXin Li * not seekable.
946*600f14f4SXin Li */
947*600f14f4SXin Li if(!decoder->private_->internal_reset_hack) {
948*600f14f4SXin Li if(decoder->private_->file == stdin)
949*600f14f4SXin Li return false; /* can't rewind stdin, reset fails */
950*600f14f4SXin Li if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR)
951*600f14f4SXin Li return false; /* seekable and seek fails, reset fails */
952*600f14f4SXin Li }
953*600f14f4SXin Li
954*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA;
955*600f14f4SXin Li
956*600f14f4SXin Li decoder->private_->has_stream_info = false;
957*600f14f4SXin Li
958*600f14f4SXin Li free(decoder->private_->seek_table.data.seek_table.points);
959*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.points = 0;
960*600f14f4SXin Li decoder->private_->has_seek_table = false;
961*600f14f4SXin Li
962*600f14f4SXin Li decoder->private_->do_md5_checking = decoder->protected_->md5_checking;
963*600f14f4SXin Li /*
964*600f14f4SXin Li * This goes in reset() and not flush() because according to the spec, a
965*600f14f4SXin Li * fixed-blocksize stream must stay that way through the whole stream.
966*600f14f4SXin Li */
967*600f14f4SXin Li decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0;
968*600f14f4SXin Li
969*600f14f4SXin Li /* We initialize the FLAC__MD5Context even though we may never use it. This
970*600f14f4SXin Li * is because md5 checking may be turned on to start and then turned off if
971*600f14f4SXin Li * a seek occurs. So we init the context here and finalize it in
972*600f14f4SXin Li * FLAC__stream_decoder_finish() to make sure things are always cleaned up
973*600f14f4SXin Li * properly.
974*600f14f4SXin Li */
975*600f14f4SXin Li if(!decoder->private_->internal_reset_hack) {
976*600f14f4SXin Li /* Only finish MD5 context when it has been initialized
977*600f14f4SXin Li * (i.e. when internal_reset_hack is not set) */
978*600f14f4SXin Li FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context);
979*600f14f4SXin Li }
980*600f14f4SXin Li else
981*600f14f4SXin Li decoder->private_->internal_reset_hack = false;
982*600f14f4SXin Li FLAC__MD5Init(&decoder->private_->md5context);
983*600f14f4SXin Li
984*600f14f4SXin Li decoder->private_->first_frame_offset = 0;
985*600f14f4SXin Li decoder->private_->unparseable_frame_count = 0;
986*600f14f4SXin Li decoder->private_->last_seen_framesync = 0;
987*600f14f4SXin Li decoder->private_->last_frame_is_set = false;
988*600f14f4SXin Li
989*600f14f4SXin Li return true;
990*600f14f4SXin Li }
991*600f14f4SXin Li
FLAC__stream_decoder_process_single(FLAC__StreamDecoder * decoder)992*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder)
993*600f14f4SXin Li {
994*600f14f4SXin Li FLAC__bool got_a_frame;
995*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
996*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
997*600f14f4SXin Li
998*600f14f4SXin Li while(1) {
999*600f14f4SXin Li switch(decoder->protected_->state) {
1000*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
1001*600f14f4SXin Li if(!find_metadata_(decoder))
1002*600f14f4SXin Li return false; /* above function sets the status for us */
1003*600f14f4SXin Li break;
1004*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_METADATA:
1005*600f14f4SXin Li if(!read_metadata_(decoder))
1006*600f14f4SXin Li return false; /* above function sets the status for us */
1007*600f14f4SXin Li else
1008*600f14f4SXin Li return true;
1009*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
1010*600f14f4SXin Li if(!frame_sync_(decoder))
1011*600f14f4SXin Li return true; /* above function sets the status for us */
1012*600f14f4SXin Li break;
1013*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_FRAME:
1014*600f14f4SXin Li if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true))
1015*600f14f4SXin Li return false; /* above function sets the status for us */
1016*600f14f4SXin Li if(got_a_frame)
1017*600f14f4SXin Li return true; /* above function sets the status for us */
1018*600f14f4SXin Li break;
1019*600f14f4SXin Li case FLAC__STREAM_DECODER_END_OF_STREAM:
1020*600f14f4SXin Li case FLAC__STREAM_DECODER_ABORTED:
1021*600f14f4SXin Li return true;
1022*600f14f4SXin Li default:
1023*600f14f4SXin Li return false;
1024*600f14f4SXin Li }
1025*600f14f4SXin Li }
1026*600f14f4SXin Li }
1027*600f14f4SXin Li
FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder * decoder)1028*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder)
1029*600f14f4SXin Li {
1030*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1031*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
1032*600f14f4SXin Li
1033*600f14f4SXin Li while(1) {
1034*600f14f4SXin Li switch(decoder->protected_->state) {
1035*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
1036*600f14f4SXin Li if(!find_metadata_(decoder))
1037*600f14f4SXin Li return false; /* above function sets the status for us */
1038*600f14f4SXin Li break;
1039*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_METADATA:
1040*600f14f4SXin Li if(!read_metadata_(decoder))
1041*600f14f4SXin Li return false; /* above function sets the status for us */
1042*600f14f4SXin Li break;
1043*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
1044*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_FRAME:
1045*600f14f4SXin Li case FLAC__STREAM_DECODER_END_OF_STREAM:
1046*600f14f4SXin Li case FLAC__STREAM_DECODER_ABORTED:
1047*600f14f4SXin Li return true;
1048*600f14f4SXin Li default:
1049*600f14f4SXin Li return false;
1050*600f14f4SXin Li }
1051*600f14f4SXin Li }
1052*600f14f4SXin Li }
1053*600f14f4SXin Li
FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder * decoder)1054*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder)
1055*600f14f4SXin Li {
1056*600f14f4SXin Li FLAC__bool dummy;
1057*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1058*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
1059*600f14f4SXin Li
1060*600f14f4SXin Li while(1) {
1061*600f14f4SXin Li switch(decoder->protected_->state) {
1062*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
1063*600f14f4SXin Li if(!find_metadata_(decoder))
1064*600f14f4SXin Li return false; /* above function sets the status for us */
1065*600f14f4SXin Li break;
1066*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_METADATA:
1067*600f14f4SXin Li if(!read_metadata_(decoder))
1068*600f14f4SXin Li return false; /* above function sets the status for us */
1069*600f14f4SXin Li break;
1070*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
1071*600f14f4SXin Li if(!frame_sync_(decoder))
1072*600f14f4SXin Li return true; /* above function sets the status for us */
1073*600f14f4SXin Li break;
1074*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_FRAME:
1075*600f14f4SXin Li if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true))
1076*600f14f4SXin Li return false; /* above function sets the status for us */
1077*600f14f4SXin Li break;
1078*600f14f4SXin Li case FLAC__STREAM_DECODER_END_OF_STREAM:
1079*600f14f4SXin Li case FLAC__STREAM_DECODER_ABORTED:
1080*600f14f4SXin Li return true;
1081*600f14f4SXin Li default:
1082*600f14f4SXin Li return false;
1083*600f14f4SXin Li }
1084*600f14f4SXin Li }
1085*600f14f4SXin Li }
1086*600f14f4SXin Li
FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder * decoder)1087*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder)
1088*600f14f4SXin Li {
1089*600f14f4SXin Li FLAC__bool got_a_frame;
1090*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1091*600f14f4SXin Li FLAC__ASSERT(0 != decoder->protected_);
1092*600f14f4SXin Li
1093*600f14f4SXin Li while(1) {
1094*600f14f4SXin Li switch(decoder->protected_->state) {
1095*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
1096*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_METADATA:
1097*600f14f4SXin Li return false; /* above function sets the status for us */
1098*600f14f4SXin Li case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
1099*600f14f4SXin Li if(!frame_sync_(decoder))
1100*600f14f4SXin Li return true; /* above function sets the status for us */
1101*600f14f4SXin Li break;
1102*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_FRAME:
1103*600f14f4SXin Li if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false))
1104*600f14f4SXin Li return false; /* above function sets the status for us */
1105*600f14f4SXin Li if(got_a_frame)
1106*600f14f4SXin Li return true; /* above function sets the status for us */
1107*600f14f4SXin Li break;
1108*600f14f4SXin Li case FLAC__STREAM_DECODER_END_OF_STREAM:
1109*600f14f4SXin Li case FLAC__STREAM_DECODER_ABORTED:
1110*600f14f4SXin Li return true;
1111*600f14f4SXin Li default:
1112*600f14f4SXin Li return false;
1113*600f14f4SXin Li }
1114*600f14f4SXin Li }
1115*600f14f4SXin Li }
1116*600f14f4SXin Li
FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder * decoder,FLAC__uint64 sample)1117*600f14f4SXin Li FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample)
1118*600f14f4SXin Li {
1119*600f14f4SXin Li FLAC__uint64 length;
1120*600f14f4SXin Li
1121*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1122*600f14f4SXin Li
1123*600f14f4SXin Li if(
1124*600f14f4SXin Li decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA &&
1125*600f14f4SXin Li decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA &&
1126*600f14f4SXin Li decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC &&
1127*600f14f4SXin Li decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME &&
1128*600f14f4SXin Li decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM
1129*600f14f4SXin Li )
1130*600f14f4SXin Li return false;
1131*600f14f4SXin Li
1132*600f14f4SXin Li if(0 == decoder->private_->seek_callback)
1133*600f14f4SXin Li return false;
1134*600f14f4SXin Li
1135*600f14f4SXin Li FLAC__ASSERT(decoder->private_->seek_callback);
1136*600f14f4SXin Li FLAC__ASSERT(decoder->private_->tell_callback);
1137*600f14f4SXin Li FLAC__ASSERT(decoder->private_->length_callback);
1138*600f14f4SXin Li FLAC__ASSERT(decoder->private_->eof_callback);
1139*600f14f4SXin Li
1140*600f14f4SXin Li if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder))
1141*600f14f4SXin Li return false;
1142*600f14f4SXin Li
1143*600f14f4SXin Li decoder->private_->is_seeking = true;
1144*600f14f4SXin Li
1145*600f14f4SXin Li /* turn off md5 checking if a seek is attempted */
1146*600f14f4SXin Li decoder->private_->do_md5_checking = false;
1147*600f14f4SXin Li
1148*600f14f4SXin Li /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */
1149*600f14f4SXin Li if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) {
1150*600f14f4SXin Li decoder->private_->is_seeking = false;
1151*600f14f4SXin Li return false;
1152*600f14f4SXin Li }
1153*600f14f4SXin Li
1154*600f14f4SXin Li /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */
1155*600f14f4SXin Li if(
1156*600f14f4SXin Li decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA ||
1157*600f14f4SXin Li decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA
1158*600f14f4SXin Li ) {
1159*600f14f4SXin Li if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) {
1160*600f14f4SXin Li /* above call sets the state for us */
1161*600f14f4SXin Li decoder->private_->is_seeking = false;
1162*600f14f4SXin Li return false;
1163*600f14f4SXin Li }
1164*600f14f4SXin Li /* check this again in case we didn't know total_samples the first time */
1165*600f14f4SXin Li if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) {
1166*600f14f4SXin Li decoder->private_->is_seeking = false;
1167*600f14f4SXin Li return false;
1168*600f14f4SXin Li }
1169*600f14f4SXin Li }
1170*600f14f4SXin Li
1171*600f14f4SXin Li {
1172*600f14f4SXin Li const FLAC__bool ok =
1173*600f14f4SXin Li #if FLAC__HAS_OGG
1174*600f14f4SXin Li decoder->private_->is_ogg?
1175*600f14f4SXin Li seek_to_absolute_sample_ogg_(decoder, length, sample) :
1176*600f14f4SXin Li #endif
1177*600f14f4SXin Li seek_to_absolute_sample_(decoder, length, sample)
1178*600f14f4SXin Li ;
1179*600f14f4SXin Li decoder->private_->is_seeking = false;
1180*600f14f4SXin Li return ok;
1181*600f14f4SXin Li }
1182*600f14f4SXin Li }
1183*600f14f4SXin Li
1184*600f14f4SXin Li /***********************************************************************
1185*600f14f4SXin Li *
1186*600f14f4SXin Li * Protected class methods
1187*600f14f4SXin Li *
1188*600f14f4SXin Li ***********************************************************************/
1189*600f14f4SXin Li
FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder * decoder)1190*600f14f4SXin Li uint32_t FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder)
1191*600f14f4SXin Li {
1192*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1193*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1194*600f14f4SXin Li FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7));
1195*600f14f4SXin Li return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8;
1196*600f14f4SXin Li }
1197*600f14f4SXin Li
1198*600f14f4SXin Li /***********************************************************************
1199*600f14f4SXin Li *
1200*600f14f4SXin Li * Private class methods
1201*600f14f4SXin Li *
1202*600f14f4SXin Li ***********************************************************************/
1203*600f14f4SXin Li
set_defaults_(FLAC__StreamDecoder * decoder)1204*600f14f4SXin Li void set_defaults_(FLAC__StreamDecoder *decoder)
1205*600f14f4SXin Li {
1206*600f14f4SXin Li decoder->private_->is_ogg = false;
1207*600f14f4SXin Li decoder->private_->read_callback = 0;
1208*600f14f4SXin Li decoder->private_->seek_callback = 0;
1209*600f14f4SXin Li decoder->private_->tell_callback = 0;
1210*600f14f4SXin Li decoder->private_->length_callback = 0;
1211*600f14f4SXin Li decoder->private_->eof_callback = 0;
1212*600f14f4SXin Li decoder->private_->write_callback = 0;
1213*600f14f4SXin Li decoder->private_->metadata_callback = 0;
1214*600f14f4SXin Li decoder->private_->error_callback = 0;
1215*600f14f4SXin Li decoder->private_->client_data = 0;
1216*600f14f4SXin Li
1217*600f14f4SXin Li memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter));
1218*600f14f4SXin Li decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true;
1219*600f14f4SXin Li decoder->private_->metadata_filter_ids_count = 0;
1220*600f14f4SXin Li
1221*600f14f4SXin Li decoder->protected_->md5_checking = false;
1222*600f14f4SXin Li
1223*600f14f4SXin Li #if FLAC__HAS_OGG
1224*600f14f4SXin Li FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect);
1225*600f14f4SXin Li #endif
1226*600f14f4SXin Li }
1227*600f14f4SXin Li
1228*600f14f4SXin Li /*
1229*600f14f4SXin Li * This will forcibly set stdin to binary mode (for OSes that require it)
1230*600f14f4SXin Li */
get_binary_stdin_(void)1231*600f14f4SXin Li FILE *get_binary_stdin_(void)
1232*600f14f4SXin Li {
1233*600f14f4SXin Li /* if something breaks here it is probably due to the presence or
1234*600f14f4SXin Li * absence of an underscore before the identifiers 'setmode',
1235*600f14f4SXin Li * 'fileno', and/or 'O_BINARY'; check your system header files.
1236*600f14f4SXin Li */
1237*600f14f4SXin Li #if defined _MSC_VER || defined __MINGW32__
1238*600f14f4SXin Li _setmode(_fileno(stdin), _O_BINARY);
1239*600f14f4SXin Li #elif defined __EMX__
1240*600f14f4SXin Li setmode(fileno(stdin), O_BINARY);
1241*600f14f4SXin Li #endif
1242*600f14f4SXin Li
1243*600f14f4SXin Li return stdin;
1244*600f14f4SXin Li }
1245*600f14f4SXin Li
allocate_output_(FLAC__StreamDecoder * decoder,uint32_t size,uint32_t channels,uint32_t bps)1246*600f14f4SXin Li FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, uint32_t size, uint32_t channels, uint32_t bps)
1247*600f14f4SXin Li {
1248*600f14f4SXin Li uint32_t i;
1249*600f14f4SXin Li FLAC__int32 *tmp;
1250*600f14f4SXin Li
1251*600f14f4SXin Li if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels &&
1252*600f14f4SXin Li (bps < 32 || decoder->private_->side_subframe != 0))
1253*600f14f4SXin Li return true;
1254*600f14f4SXin Li
1255*600f14f4SXin Li /* simply using realloc() is not practical because the number of channels may change mid-stream */
1256*600f14f4SXin Li
1257*600f14f4SXin Li for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
1258*600f14f4SXin Li if(0 != decoder->private_->output[i]) {
1259*600f14f4SXin Li free(decoder->private_->output[i]-4);
1260*600f14f4SXin Li decoder->private_->output[i] = 0;
1261*600f14f4SXin Li }
1262*600f14f4SXin Li if(0 != decoder->private_->residual_unaligned[i]) {
1263*600f14f4SXin Li free(decoder->private_->residual_unaligned[i]);
1264*600f14f4SXin Li decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0;
1265*600f14f4SXin Li }
1266*600f14f4SXin Li }
1267*600f14f4SXin Li
1268*600f14f4SXin Li if(0 != decoder->private_->side_subframe) {
1269*600f14f4SXin Li free(decoder->private_->side_subframe);
1270*600f14f4SXin Li decoder->private_->side_subframe = 0;
1271*600f14f4SXin Li }
1272*600f14f4SXin Li
1273*600f14f4SXin Li for(i = 0; i < channels; i++) {
1274*600f14f4SXin Li /* WATCHOUT:
1275*600f14f4SXin Li * FLAC__lpc_restore_signal_asm_ia32_mmx() and ..._intrin_sseN()
1276*600f14f4SXin Li * require that the output arrays have a buffer of up to 3 zeroes
1277*600f14f4SXin Li * in front (at negative indices) for alignment purposes;
1278*600f14f4SXin Li * we use 4 to keep the data well-aligned.
1279*600f14f4SXin Li */
1280*600f14f4SXin Li tmp = safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/);
1281*600f14f4SXin Li if(tmp == 0) {
1282*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1283*600f14f4SXin Li return false;
1284*600f14f4SXin Li }
1285*600f14f4SXin Li memset(tmp, 0, sizeof(FLAC__int32)*4);
1286*600f14f4SXin Li decoder->private_->output[i] = tmp + 4;
1287*600f14f4SXin Li
1288*600f14f4SXin Li if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) {
1289*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1290*600f14f4SXin Li return false;
1291*600f14f4SXin Li }
1292*600f14f4SXin Li }
1293*600f14f4SXin Li
1294*600f14f4SXin Li if(bps == 32) {
1295*600f14f4SXin Li decoder->private_->side_subframe = safe_malloc_mul_2op_p(sizeof(FLAC__int64), /*times (*/size);
1296*600f14f4SXin Li if(decoder->private_->side_subframe == NULL) {
1297*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1298*600f14f4SXin Li return false;
1299*600f14f4SXin Li }
1300*600f14f4SXin Li }
1301*600f14f4SXin Li
1302*600f14f4SXin Li decoder->private_->output_capacity = size;
1303*600f14f4SXin Li decoder->private_->output_channels = channels;
1304*600f14f4SXin Li
1305*600f14f4SXin Li return true;
1306*600f14f4SXin Li }
1307*600f14f4SXin Li
has_id_filtered_(FLAC__StreamDecoder * decoder,FLAC__byte * id)1308*600f14f4SXin Li FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id)
1309*600f14f4SXin Li {
1310*600f14f4SXin Li size_t i;
1311*600f14f4SXin Li
1312*600f14f4SXin Li FLAC__ASSERT(0 != decoder);
1313*600f14f4SXin Li FLAC__ASSERT(0 != decoder->private_);
1314*600f14f4SXin Li
1315*600f14f4SXin Li for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++)
1316*600f14f4SXin Li if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)))
1317*600f14f4SXin Li return true;
1318*600f14f4SXin Li
1319*600f14f4SXin Li return false;
1320*600f14f4SXin Li }
1321*600f14f4SXin Li
find_metadata_(FLAC__StreamDecoder * decoder)1322*600f14f4SXin Li FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder)
1323*600f14f4SXin Li {
1324*600f14f4SXin Li FLAC__uint32 x;
1325*600f14f4SXin Li uint32_t i, id;
1326*600f14f4SXin Li FLAC__bool first = true;
1327*600f14f4SXin Li
1328*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1329*600f14f4SXin Li
1330*600f14f4SXin Li for(i = id = 0; i < 4; ) {
1331*600f14f4SXin Li if(decoder->private_->cached) {
1332*600f14f4SXin Li x = (FLAC__uint32)decoder->private_->lookahead;
1333*600f14f4SXin Li decoder->private_->cached = false;
1334*600f14f4SXin Li }
1335*600f14f4SXin Li else {
1336*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
1337*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1338*600f14f4SXin Li }
1339*600f14f4SXin Li if(x == FLAC__STREAM_SYNC_STRING[i]) {
1340*600f14f4SXin Li first = true;
1341*600f14f4SXin Li i++;
1342*600f14f4SXin Li id = 0;
1343*600f14f4SXin Li continue;
1344*600f14f4SXin Li }
1345*600f14f4SXin Li
1346*600f14f4SXin Li if(id >= 3)
1347*600f14f4SXin Li return false;
1348*600f14f4SXin Li
1349*600f14f4SXin Li if(x == ID3V2_TAG_[id]) {
1350*600f14f4SXin Li id++;
1351*600f14f4SXin Li i = 0;
1352*600f14f4SXin Li if(id == 3) {
1353*600f14f4SXin Li if(!skip_id3v2_tag_(decoder))
1354*600f14f4SXin Li return false; /* skip_id3v2_tag_ sets the state for us */
1355*600f14f4SXin Li }
1356*600f14f4SXin Li continue;
1357*600f14f4SXin Li }
1358*600f14f4SXin Li id = 0;
1359*600f14f4SXin Li if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
1360*600f14f4SXin Li decoder->private_->header_warmup[0] = (FLAC__byte)x;
1361*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
1362*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1363*600f14f4SXin Li
1364*600f14f4SXin Li /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */
1365*600f14f4SXin Li /* else we have to check if the second byte is the end of a sync code */
1366*600f14f4SXin Li if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
1367*600f14f4SXin Li decoder->private_->lookahead = (FLAC__byte)x;
1368*600f14f4SXin Li decoder->private_->cached = true;
1369*600f14f4SXin Li }
1370*600f14f4SXin Li else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */
1371*600f14f4SXin Li decoder->private_->header_warmup[1] = (FLAC__byte)x;
1372*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME;
1373*600f14f4SXin Li return true;
1374*600f14f4SXin Li }
1375*600f14f4SXin Li }
1376*600f14f4SXin Li i = 0;
1377*600f14f4SXin Li if(first) {
1378*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
1379*600f14f4SXin Li first = false;
1380*600f14f4SXin Li }
1381*600f14f4SXin Li }
1382*600f14f4SXin Li
1383*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA;
1384*600f14f4SXin Li return true;
1385*600f14f4SXin Li }
1386*600f14f4SXin Li
read_metadata_(FLAC__StreamDecoder * decoder)1387*600f14f4SXin Li FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder)
1388*600f14f4SXin Li {
1389*600f14f4SXin Li FLAC__bool is_last;
1390*600f14f4SXin Li FLAC__uint32 i, x, type, length;
1391*600f14f4SXin Li
1392*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1393*600f14f4SXin Li
1394*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN))
1395*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1396*600f14f4SXin Li is_last = x? true : false;
1397*600f14f4SXin Li
1398*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN))
1399*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1400*600f14f4SXin Li
1401*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN))
1402*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1403*600f14f4SXin Li
1404*600f14f4SXin Li if(type == FLAC__METADATA_TYPE_STREAMINFO) {
1405*600f14f4SXin Li if(!read_metadata_streaminfo_(decoder, is_last, length))
1406*600f14f4SXin Li return false;
1407*600f14f4SXin Li
1408*600f14f4SXin Li decoder->private_->has_stream_info = true;
1409*600f14f4SXin Li if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16))
1410*600f14f4SXin Li decoder->private_->do_md5_checking = false;
1411*600f14f4SXin Li if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback)
1412*600f14f4SXin Li decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data);
1413*600f14f4SXin Li }
1414*600f14f4SXin Li else if(type == FLAC__METADATA_TYPE_SEEKTABLE) {
1415*600f14f4SXin Li /* just in case we already have a seek table, and reading the next one fails: */
1416*600f14f4SXin Li decoder->private_->has_seek_table = false;
1417*600f14f4SXin Li
1418*600f14f4SXin Li if(length > 0) {
1419*600f14f4SXin Li if(!read_metadata_seektable_(decoder, is_last, length))
1420*600f14f4SXin Li return false;
1421*600f14f4SXin Li
1422*600f14f4SXin Li decoder->private_->has_seek_table = true;
1423*600f14f4SXin Li if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback)
1424*600f14f4SXin Li decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data);
1425*600f14f4SXin Li }
1426*600f14f4SXin Li }
1427*600f14f4SXin Li else {
1428*600f14f4SXin Li FLAC__bool skip_it = !decoder->private_->metadata_filter[type];
1429*600f14f4SXin Li uint32_t real_length = length;
1430*600f14f4SXin Li FLAC__StreamMetadata block;
1431*600f14f4SXin Li
1432*600f14f4SXin Li memset(&block, 0, sizeof(block));
1433*600f14f4SXin Li block.is_last = is_last;
1434*600f14f4SXin Li block.type = (FLAC__MetadataType)type;
1435*600f14f4SXin Li block.length = length;
1436*600f14f4SXin Li
1437*600f14f4SXin Li if(type == FLAC__METADATA_TYPE_APPLICATION) {
1438*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))
1439*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1440*600f14f4SXin Li
1441*600f14f4SXin Li if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */
1442*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/
1443*600f14f4SXin Li return false;
1444*600f14f4SXin Li }
1445*600f14f4SXin Li
1446*600f14f4SXin Li real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8;
1447*600f14f4SXin Li
1448*600f14f4SXin Li if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id))
1449*600f14f4SXin Li skip_it = !skip_it;
1450*600f14f4SXin Li }
1451*600f14f4SXin Li
1452*600f14f4SXin Li if(skip_it) {
1453*600f14f4SXin Li if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length))
1454*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1455*600f14f4SXin Li }
1456*600f14f4SXin Li else {
1457*600f14f4SXin Li FLAC__bool ok = true;
1458*600f14f4SXin Li FLAC__bitreader_set_limit(decoder->private_->input, real_length*8);
1459*600f14f4SXin Li switch(type) {
1460*600f14f4SXin Li case FLAC__METADATA_TYPE_PADDING:
1461*600f14f4SXin Li /* skip the padding bytes */
1462*600f14f4SXin Li if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length))
1463*600f14f4SXin Li ok = false; /* read_callback_ sets the state for us */
1464*600f14f4SXin Li break;
1465*600f14f4SXin Li case FLAC__METADATA_TYPE_APPLICATION:
1466*600f14f4SXin Li /* remember, we read the ID already */
1467*600f14f4SXin Li if(real_length > 0) {
1468*600f14f4SXin Li if(0 == (block.data.application.data = malloc(real_length))) {
1469*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1470*600f14f4SXin Li ok = false;
1471*600f14f4SXin Li }
1472*600f14f4SXin Li else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length))
1473*600f14f4SXin Li ok = false; /* read_callback_ sets the state for us */
1474*600f14f4SXin Li }
1475*600f14f4SXin Li else
1476*600f14f4SXin Li block.data.application.data = 0;
1477*600f14f4SXin Li break;
1478*600f14f4SXin Li case FLAC__METADATA_TYPE_VORBIS_COMMENT:
1479*600f14f4SXin Li if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length))
1480*600f14f4SXin Li ok = false;
1481*600f14f4SXin Li break;
1482*600f14f4SXin Li case FLAC__METADATA_TYPE_CUESHEET:
1483*600f14f4SXin Li if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet))
1484*600f14f4SXin Li ok = false;
1485*600f14f4SXin Li break;
1486*600f14f4SXin Li case FLAC__METADATA_TYPE_PICTURE:
1487*600f14f4SXin Li if(!read_metadata_picture_(decoder, &block.data.picture))
1488*600f14f4SXin Li ok = false;
1489*600f14f4SXin Li break;
1490*600f14f4SXin Li case FLAC__METADATA_TYPE_STREAMINFO:
1491*600f14f4SXin Li case FLAC__METADATA_TYPE_SEEKTABLE:
1492*600f14f4SXin Li FLAC__ASSERT(0);
1493*600f14f4SXin Li break;
1494*600f14f4SXin Li default:
1495*600f14f4SXin Li if(real_length > 0) {
1496*600f14f4SXin Li if(0 == (block.data.unknown.data = malloc(real_length))) {
1497*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1498*600f14f4SXin Li ok = false;
1499*600f14f4SXin Li }
1500*600f14f4SXin Li else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length))
1501*600f14f4SXin Li ok = false; /* read_callback_ sets the state for us */
1502*600f14f4SXin Li }
1503*600f14f4SXin Li else
1504*600f14f4SXin Li block.data.unknown.data = 0;
1505*600f14f4SXin Li break;
1506*600f14f4SXin Li }
1507*600f14f4SXin Li if(FLAC__bitreader_limit_remaining(decoder->private_->input) > 0) {
1508*600f14f4SXin Li /* Content in metadata block didn't fit in block length
1509*600f14f4SXin Li * We cannot know whether the length or the content was
1510*600f14f4SXin Li * corrupt, so stop parsing metadata */
1511*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_METADATA);
1512*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA)
1513*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
1514*600f14f4SXin Li ok = false;
1515*600f14f4SXin Li }
1516*600f14f4SXin Li FLAC__bitreader_remove_limit(decoder->private_->input);
1517*600f14f4SXin Li if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback)
1518*600f14f4SXin Li decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data);
1519*600f14f4SXin Li
1520*600f14f4SXin Li /* now we have to free any malloc()ed data in the block */
1521*600f14f4SXin Li switch(type) {
1522*600f14f4SXin Li case FLAC__METADATA_TYPE_PADDING:
1523*600f14f4SXin Li break;
1524*600f14f4SXin Li case FLAC__METADATA_TYPE_APPLICATION:
1525*600f14f4SXin Li if(0 != block.data.application.data)
1526*600f14f4SXin Li free(block.data.application.data);
1527*600f14f4SXin Li break;
1528*600f14f4SXin Li case FLAC__METADATA_TYPE_VORBIS_COMMENT:
1529*600f14f4SXin Li if(0 != block.data.vorbis_comment.vendor_string.entry)
1530*600f14f4SXin Li free(block.data.vorbis_comment.vendor_string.entry);
1531*600f14f4SXin Li if(block.data.vorbis_comment.num_comments > 0)
1532*600f14f4SXin Li for(i = 0; i < block.data.vorbis_comment.num_comments; i++)
1533*600f14f4SXin Li if(0 != block.data.vorbis_comment.comments[i].entry)
1534*600f14f4SXin Li free(block.data.vorbis_comment.comments[i].entry);
1535*600f14f4SXin Li if(0 != block.data.vorbis_comment.comments)
1536*600f14f4SXin Li free(block.data.vorbis_comment.comments);
1537*600f14f4SXin Li break;
1538*600f14f4SXin Li case FLAC__METADATA_TYPE_CUESHEET:
1539*600f14f4SXin Li if(block.data.cue_sheet.num_tracks > 0 && 0 != block.data.cue_sheet.tracks)
1540*600f14f4SXin Li for(i = 0; i < block.data.cue_sheet.num_tracks; i++)
1541*600f14f4SXin Li if(0 != block.data.cue_sheet.tracks[i].indices)
1542*600f14f4SXin Li free(block.data.cue_sheet.tracks[i].indices);
1543*600f14f4SXin Li if(0 != block.data.cue_sheet.tracks)
1544*600f14f4SXin Li free(block.data.cue_sheet.tracks);
1545*600f14f4SXin Li break;
1546*600f14f4SXin Li case FLAC__METADATA_TYPE_PICTURE:
1547*600f14f4SXin Li if(0 != block.data.picture.mime_type)
1548*600f14f4SXin Li free(block.data.picture.mime_type);
1549*600f14f4SXin Li if(0 != block.data.picture.description)
1550*600f14f4SXin Li free(block.data.picture.description);
1551*600f14f4SXin Li if(0 != block.data.picture.data)
1552*600f14f4SXin Li free(block.data.picture.data);
1553*600f14f4SXin Li break;
1554*600f14f4SXin Li case FLAC__METADATA_TYPE_STREAMINFO:
1555*600f14f4SXin Li case FLAC__METADATA_TYPE_SEEKTABLE:
1556*600f14f4SXin Li FLAC__ASSERT(0);
1557*600f14f4SXin Li default:
1558*600f14f4SXin Li if(0 != block.data.unknown.data)
1559*600f14f4SXin Li free(block.data.unknown.data);
1560*600f14f4SXin Li break;
1561*600f14f4SXin Li }
1562*600f14f4SXin Li
1563*600f14f4SXin Li if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */
1564*600f14f4SXin Li return false;
1565*600f14f4SXin Li }
1566*600f14f4SXin Li }
1567*600f14f4SXin Li
1568*600f14f4SXin Li if(is_last) {
1569*600f14f4SXin Li /* if this fails, it's OK, it's just a hint for the seek routine */
1570*600f14f4SXin Li if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset))
1571*600f14f4SXin Li decoder->private_->first_frame_offset = 0;
1572*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
1573*600f14f4SXin Li }
1574*600f14f4SXin Li
1575*600f14f4SXin Li return true;
1576*600f14f4SXin Li }
1577*600f14f4SXin Li
read_metadata_streaminfo_(FLAC__StreamDecoder * decoder,FLAC__bool is_last,uint32_t length)1578*600f14f4SXin Li FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length)
1579*600f14f4SXin Li {
1580*600f14f4SXin Li FLAC__uint32 x;
1581*600f14f4SXin Li uint32_t bits, used_bits = 0;
1582*600f14f4SXin Li
1583*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1584*600f14f4SXin Li
1585*600f14f4SXin Li decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO;
1586*600f14f4SXin Li decoder->private_->stream_info.is_last = is_last;
1587*600f14f4SXin Li decoder->private_->stream_info.length = length;
1588*600f14f4SXin Li
1589*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN;
1590*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits))
1591*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1592*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.min_blocksize = x;
1593*600f14f4SXin Li used_bits += bits;
1594*600f14f4SXin Li
1595*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN;
1596*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN))
1597*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1598*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.max_blocksize = x;
1599*600f14f4SXin Li used_bits += bits;
1600*600f14f4SXin Li
1601*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN;
1602*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN))
1603*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1604*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.min_framesize = x;
1605*600f14f4SXin Li used_bits += bits;
1606*600f14f4SXin Li
1607*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN;
1608*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN))
1609*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1610*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.max_framesize = x;
1611*600f14f4SXin Li used_bits += bits;
1612*600f14f4SXin Li
1613*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN;
1614*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN))
1615*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1616*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.sample_rate = x;
1617*600f14f4SXin Li used_bits += bits;
1618*600f14f4SXin Li
1619*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN;
1620*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN))
1621*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1622*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.channels = x+1;
1623*600f14f4SXin Li used_bits += bits;
1624*600f14f4SXin Li
1625*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN;
1626*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN))
1627*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1628*600f14f4SXin Li decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1;
1629*600f14f4SXin Li used_bits += bits;
1630*600f14f4SXin Li
1631*600f14f4SXin Li bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN;
1632*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN))
1633*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1634*600f14f4SXin Li used_bits += bits;
1635*600f14f4SXin Li
1636*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16))
1637*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1638*600f14f4SXin Li used_bits += 16*8;
1639*600f14f4SXin Li
1640*600f14f4SXin Li /* skip the rest of the block */
1641*600f14f4SXin Li FLAC__ASSERT(used_bits % 8 == 0);
1642*600f14f4SXin Li if (length < (used_bits / 8))
1643*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1644*600f14f4SXin Li length -= (used_bits / 8);
1645*600f14f4SXin Li if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length))
1646*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1647*600f14f4SXin Li
1648*600f14f4SXin Li return true;
1649*600f14f4SXin Li }
1650*600f14f4SXin Li
read_metadata_seektable_(FLAC__StreamDecoder * decoder,FLAC__bool is_last,uint32_t length)1651*600f14f4SXin Li FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, uint32_t length)
1652*600f14f4SXin Li {
1653*600f14f4SXin Li FLAC__uint32 i, x;
1654*600f14f4SXin Li FLAC__uint64 xx;
1655*600f14f4SXin Li
1656*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1657*600f14f4SXin Li
1658*600f14f4SXin Li decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE;
1659*600f14f4SXin Li decoder->private_->seek_table.is_last = is_last;
1660*600f14f4SXin Li decoder->private_->seek_table.length = length;
1661*600f14f4SXin Li
1662*600f14f4SXin Li if(length % FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) {
1663*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1664*600f14f4SXin Li return false;
1665*600f14f4SXin Li }
1666*600f14f4SXin Li
1667*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
1668*600f14f4SXin Li
1669*600f14f4SXin Li /* use realloc since we may pass through here several times (e.g. after seeking) */
1670*600f14f4SXin Li if(0 == (decoder->private_->seek_table.data.seek_table.points = safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) {
1671*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1672*600f14f4SXin Li return false;
1673*600f14f4SXin Li }
1674*600f14f4SXin Li for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) {
1675*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN))
1676*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1677*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx;
1678*600f14f4SXin Li
1679*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN))
1680*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1681*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx;
1682*600f14f4SXin Li
1683*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN))
1684*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1685*600f14f4SXin Li decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x;
1686*600f14f4SXin Li }
1687*600f14f4SXin Li length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH);
1688*600f14f4SXin Li
1689*600f14f4SXin Li FLAC__ASSERT(length == 0);
1690*600f14f4SXin Li
1691*600f14f4SXin Li return true;
1692*600f14f4SXin Li }
1693*600f14f4SXin Li
read_metadata_vorbiscomment_(FLAC__StreamDecoder * decoder,FLAC__StreamMetadata_VorbisComment * obj,uint32_t length)1694*600f14f4SXin Li FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, uint32_t length)
1695*600f14f4SXin Li {
1696*600f14f4SXin Li FLAC__uint32 i;
1697*600f14f4SXin Li
1698*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1699*600f14f4SXin Li
1700*600f14f4SXin Li /* read vendor string */
1701*600f14f4SXin Li if (length >= 8) {
1702*600f14f4SXin Li length -= 8; /* vendor string length + num comments entries alone take 8 bytes */
1703*600f14f4SXin Li FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32);
1704*600f14f4SXin Li if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length))
1705*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1706*600f14f4SXin Li if (length < obj->vendor_string.length) {
1707*600f14f4SXin Li obj->vendor_string.length = 0;
1708*600f14f4SXin Li obj->vendor_string.entry = 0;
1709*600f14f4SXin Li goto skip;
1710*600f14f4SXin Li }
1711*600f14f4SXin Li else
1712*600f14f4SXin Li length -= obj->vendor_string.length;
1713*600f14f4SXin Li if (0 == (obj->vendor_string.entry = safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) {
1714*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1715*600f14f4SXin Li return false;
1716*600f14f4SXin Li }
1717*600f14f4SXin Li if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length))
1718*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1719*600f14f4SXin Li obj->vendor_string.entry[obj->vendor_string.length] = '\0';
1720*600f14f4SXin Li
1721*600f14f4SXin Li /* read num comments */
1722*600f14f4SXin Li FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32);
1723*600f14f4SXin Li if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments))
1724*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1725*600f14f4SXin Li
1726*600f14f4SXin Li /* read comments */
1727*600f14f4SXin Li if (obj->num_comments > 100000) {
1728*600f14f4SXin Li /* Possibly malicious file. */
1729*600f14f4SXin Li obj->num_comments = 0;
1730*600f14f4SXin Li return false;
1731*600f14f4SXin Li }
1732*600f14f4SXin Li if (obj->num_comments > 0) {
1733*600f14f4SXin Li if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) {
1734*600f14f4SXin Li obj->num_comments = 0;
1735*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1736*600f14f4SXin Li return false;
1737*600f14f4SXin Li }
1738*600f14f4SXin Li for (i = 0; i < obj->num_comments; i++) {
1739*600f14f4SXin Li /* Initialize here just to make sure. */
1740*600f14f4SXin Li obj->comments[i].length = 0;
1741*600f14f4SXin Li obj->comments[i].entry = 0;
1742*600f14f4SXin Li
1743*600f14f4SXin Li FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32);
1744*600f14f4SXin Li if (length < 4) {
1745*600f14f4SXin Li obj->num_comments = i;
1746*600f14f4SXin Li goto skip;
1747*600f14f4SXin Li }
1748*600f14f4SXin Li else
1749*600f14f4SXin Li length -= 4;
1750*600f14f4SXin Li if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) {
1751*600f14f4SXin Li obj->num_comments = i;
1752*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1753*600f14f4SXin Li }
1754*600f14f4SXin Li if (length < obj->comments[i].length) {
1755*600f14f4SXin Li obj->num_comments = i;
1756*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1757*600f14f4SXin Li return false;
1758*600f14f4SXin Li }
1759*600f14f4SXin Li else
1760*600f14f4SXin Li length -= obj->comments[i].length;
1761*600f14f4SXin Li if (0 == (obj->comments[i].entry = safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) {
1762*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1763*600f14f4SXin Li obj->num_comments = i;
1764*600f14f4SXin Li return false;
1765*600f14f4SXin Li }
1766*600f14f4SXin Li memset (obj->comments[i].entry, 0, obj->comments[i].length) ;
1767*600f14f4SXin Li if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) {
1768*600f14f4SXin Li /* Current i-th entry is bad, so we delete it. */
1769*600f14f4SXin Li free (obj->comments[i].entry) ;
1770*600f14f4SXin Li obj->comments[i].entry = NULL ;
1771*600f14f4SXin Li obj->num_comments = i;
1772*600f14f4SXin Li goto skip;
1773*600f14f4SXin Li }
1774*600f14f4SXin Li obj->comments[i].entry[obj->comments[i].length] = '\0';
1775*600f14f4SXin Li }
1776*600f14f4SXin Li }
1777*600f14f4SXin Li }
1778*600f14f4SXin Li else {
1779*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1780*600f14f4SXin Li return false;
1781*600f14f4SXin Li }
1782*600f14f4SXin Li
1783*600f14f4SXin Li skip:
1784*600f14f4SXin Li if (length > 0) {
1785*600f14f4SXin Li /* length > 0 can only happen on files with invalid data in comments */
1786*600f14f4SXin Li if(obj->num_comments < 1) {
1787*600f14f4SXin Li free(obj->comments);
1788*600f14f4SXin Li obj->comments = NULL;
1789*600f14f4SXin Li }
1790*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1791*600f14f4SXin Li return false;
1792*600f14f4SXin Li }
1793*600f14f4SXin Li
1794*600f14f4SXin Li return true;
1795*600f14f4SXin Li }
1796*600f14f4SXin Li
read_metadata_cuesheet_(FLAC__StreamDecoder * decoder,FLAC__StreamMetadata_CueSheet * obj)1797*600f14f4SXin Li FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj)
1798*600f14f4SXin Li {
1799*600f14f4SXin Li FLAC__uint32 i, j, x;
1800*600f14f4SXin Li
1801*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1802*600f14f4SXin Li
1803*600f14f4SXin Li memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet));
1804*600f14f4SXin Li
1805*600f14f4SXin Li FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0);
1806*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8))
1807*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1808*600f14f4SXin Li
1809*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN))
1810*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1811*600f14f4SXin Li
1812*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN))
1813*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1814*600f14f4SXin Li obj->is_cd = x? true : false;
1815*600f14f4SXin Li
1816*600f14f4SXin Li if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN))
1817*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1818*600f14f4SXin Li
1819*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN))
1820*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1821*600f14f4SXin Li obj->num_tracks = x;
1822*600f14f4SXin Li
1823*600f14f4SXin Li if(obj->num_tracks > 0) {
1824*600f14f4SXin Li if(0 == (obj->tracks = safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) {
1825*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1826*600f14f4SXin Li return false;
1827*600f14f4SXin Li }
1828*600f14f4SXin Li for(i = 0; i < obj->num_tracks; i++) {
1829*600f14f4SXin Li FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i];
1830*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN))
1831*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1832*600f14f4SXin Li
1833*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN))
1834*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1835*600f14f4SXin Li track->number = (FLAC__byte)x;
1836*600f14f4SXin Li
1837*600f14f4SXin Li FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0);
1838*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8))
1839*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1840*600f14f4SXin Li
1841*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN))
1842*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1843*600f14f4SXin Li track->type = x;
1844*600f14f4SXin Li
1845*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN))
1846*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1847*600f14f4SXin Li track->pre_emphasis = x;
1848*600f14f4SXin Li
1849*600f14f4SXin Li if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN))
1850*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1851*600f14f4SXin Li
1852*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN))
1853*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1854*600f14f4SXin Li track->num_indices = (FLAC__byte)x;
1855*600f14f4SXin Li
1856*600f14f4SXin Li if(track->num_indices > 0) {
1857*600f14f4SXin Li if(0 == (track->indices = safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) {
1858*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1859*600f14f4SXin Li return false;
1860*600f14f4SXin Li }
1861*600f14f4SXin Li for(j = 0; j < track->num_indices; j++) {
1862*600f14f4SXin Li FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j];
1863*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN))
1864*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1865*600f14f4SXin Li
1866*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN))
1867*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1868*600f14f4SXin Li indx->number = (FLAC__byte)x;
1869*600f14f4SXin Li
1870*600f14f4SXin Li if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN))
1871*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1872*600f14f4SXin Li }
1873*600f14f4SXin Li }
1874*600f14f4SXin Li }
1875*600f14f4SXin Li }
1876*600f14f4SXin Li else { /* obj->num_tracks == 0 */
1877*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1878*600f14f4SXin Li return false;
1879*600f14f4SXin Li }
1880*600f14f4SXin Li
1881*600f14f4SXin Li return true;
1882*600f14f4SXin Li }
1883*600f14f4SXin Li
read_metadata_picture_(FLAC__StreamDecoder * decoder,FLAC__StreamMetadata_Picture * obj)1884*600f14f4SXin Li FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj)
1885*600f14f4SXin Li {
1886*600f14f4SXin Li FLAC__uint32 x;
1887*600f14f4SXin Li
1888*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
1889*600f14f4SXin Li
1890*600f14f4SXin Li /* read type */
1891*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN))
1892*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1893*600f14f4SXin Li if(x < FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED)
1894*600f14f4SXin Li obj->type = x;
1895*600f14f4SXin Li else
1896*600f14f4SXin Li obj->type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER;
1897*600f14f4SXin Li
1898*600f14f4SXin Li /* read MIME type */
1899*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN))
1900*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1901*600f14f4SXin Li if(FLAC__bitreader_limit_remaining(decoder->private_->input) < x){
1902*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1903*600f14f4SXin Li return false;
1904*600f14f4SXin Li }
1905*600f14f4SXin Li if(0 == (obj->mime_type = safe_malloc_add_2op_(x, /*+*/1))) {
1906*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1907*600f14f4SXin Li return false;
1908*600f14f4SXin Li }
1909*600f14f4SXin Li if(x > 0) {
1910*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x))
1911*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1912*600f14f4SXin Li }
1913*600f14f4SXin Li obj->mime_type[x] = '\0';
1914*600f14f4SXin Li
1915*600f14f4SXin Li /* read description */
1916*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN))
1917*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1918*600f14f4SXin Li if(FLAC__bitreader_limit_remaining(decoder->private_->input) < x){
1919*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1920*600f14f4SXin Li return false;
1921*600f14f4SXin Li }
1922*600f14f4SXin Li if(0 == (obj->description = safe_malloc_add_2op_(x, /*+*/1))) {
1923*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1924*600f14f4SXin Li return false;
1925*600f14f4SXin Li }
1926*600f14f4SXin Li if(x > 0) {
1927*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x))
1928*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1929*600f14f4SXin Li }
1930*600f14f4SXin Li obj->description[x] = '\0';
1931*600f14f4SXin Li
1932*600f14f4SXin Li /* read width */
1933*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN))
1934*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1935*600f14f4SXin Li
1936*600f14f4SXin Li /* read height */
1937*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN))
1938*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1939*600f14f4SXin Li
1940*600f14f4SXin Li /* read depth */
1941*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN))
1942*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1943*600f14f4SXin Li
1944*600f14f4SXin Li /* read colors */
1945*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN))
1946*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1947*600f14f4SXin Li
1948*600f14f4SXin Li /* read data */
1949*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN))
1950*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1951*600f14f4SXin Li if(FLAC__bitreader_limit_remaining(decoder->private_->input) < obj->data_length){
1952*600f14f4SXin Li FLAC__bitreader_limit_invalidate(decoder->private_->input);
1953*600f14f4SXin Li return false;
1954*600f14f4SXin Li }
1955*600f14f4SXin Li if(0 == (obj->data = safe_malloc_(obj->data_length))) {
1956*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
1957*600f14f4SXin Li return false;
1958*600f14f4SXin Li }
1959*600f14f4SXin Li if(obj->data_length > 0) {
1960*600f14f4SXin Li if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length))
1961*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1962*600f14f4SXin Li }
1963*600f14f4SXin Li
1964*600f14f4SXin Li return true;
1965*600f14f4SXin Li }
1966*600f14f4SXin Li
skip_id3v2_tag_(FLAC__StreamDecoder * decoder)1967*600f14f4SXin Li FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder)
1968*600f14f4SXin Li {
1969*600f14f4SXin Li FLAC__uint32 x;
1970*600f14f4SXin Li uint32_t i, skip;
1971*600f14f4SXin Li
1972*600f14f4SXin Li /* skip the version and flags bytes */
1973*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24))
1974*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1975*600f14f4SXin Li /* get the size (in bytes) to skip */
1976*600f14f4SXin Li skip = 0;
1977*600f14f4SXin Li for(i = 0; i < 4; i++) {
1978*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
1979*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1980*600f14f4SXin Li skip <<= 7;
1981*600f14f4SXin Li skip |= (x & 0x7f);
1982*600f14f4SXin Li }
1983*600f14f4SXin Li /* skip the rest of the tag */
1984*600f14f4SXin Li if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip))
1985*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1986*600f14f4SXin Li return true;
1987*600f14f4SXin Li }
1988*600f14f4SXin Li
frame_sync_(FLAC__StreamDecoder * decoder)1989*600f14f4SXin Li FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder)
1990*600f14f4SXin Li {
1991*600f14f4SXin Li FLAC__uint32 x;
1992*600f14f4SXin Li FLAC__bool first = true;
1993*600f14f4SXin Li
1994*600f14f4SXin Li /* make sure we're byte aligned */
1995*600f14f4SXin Li if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) {
1996*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input)))
1997*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
1998*600f14f4SXin Li }
1999*600f14f4SXin Li
2000*600f14f4SXin Li while(1) {
2001*600f14f4SXin Li if(decoder->private_->cached) {
2002*600f14f4SXin Li x = (FLAC__uint32)decoder->private_->lookahead;
2003*600f14f4SXin Li decoder->private_->cached = false;
2004*600f14f4SXin Li }
2005*600f14f4SXin Li else {
2006*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2007*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2008*600f14f4SXin Li }
2009*600f14f4SXin Li if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
2010*600f14f4SXin Li decoder->private_->header_warmup[0] = (FLAC__byte)x;
2011*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2012*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2013*600f14f4SXin Li
2014*600f14f4SXin Li /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */
2015*600f14f4SXin Li /* else we have to check if the second byte is the end of a sync code */
2016*600f14f4SXin Li if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
2017*600f14f4SXin Li decoder->private_->lookahead = (FLAC__byte)x;
2018*600f14f4SXin Li decoder->private_->cached = true;
2019*600f14f4SXin Li }
2020*600f14f4SXin Li else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */
2021*600f14f4SXin Li decoder->private_->header_warmup[1] = (FLAC__byte)x;
2022*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME;
2023*600f14f4SXin Li
2024*600f14f4SXin Li /* Save location so we can rewind in case the frame turns
2025*600f14f4SXin Li * out to be invalid after the header */
2026*600f14f4SXin Li FLAC__bitreader_set_framesync_location(decoder->private_->input);
2027*600f14f4SXin Li if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->last_seen_framesync))
2028*600f14f4SXin Li decoder->private_->last_seen_framesync = 0;
2029*600f14f4SXin Li return true;
2030*600f14f4SXin Li }
2031*600f14f4SXin Li }
2032*600f14f4SXin Li if(first) {
2033*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2034*600f14f4SXin Li first = false;
2035*600f14f4SXin Li }
2036*600f14f4SXin Li }
2037*600f14f4SXin Li
2038*600f14f4SXin Li return true;
2039*600f14f4SXin Li }
2040*600f14f4SXin Li
read_frame_(FLAC__StreamDecoder * decoder,FLAC__bool * got_a_frame,FLAC__bool do_full_decode)2041*600f14f4SXin Li FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode)
2042*600f14f4SXin Li {
2043*600f14f4SXin Li uint32_t channel;
2044*600f14f4SXin Li uint32_t i;
2045*600f14f4SXin Li uint32_t frame_crc; /* the one we calculate from the input stream */
2046*600f14f4SXin Li FLAC__uint32 x;
2047*600f14f4SXin Li
2048*600f14f4SXin Li *got_a_frame = false;
2049*600f14f4SXin Li decoder->private_->side_subframe_in_use = false;
2050*600f14f4SXin Li
2051*600f14f4SXin Li /* init the CRC */
2052*600f14f4SXin Li frame_crc = 0;
2053*600f14f4SXin Li frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc);
2054*600f14f4SXin Li frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc);
2055*600f14f4SXin Li FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc);
2056*600f14f4SXin Li
2057*600f14f4SXin Li if(!read_frame_header_(decoder))
2058*600f14f4SXin Li return false;
2059*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */
2060*600f14f4SXin Li return true;
2061*600f14f4SXin Li if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels, decoder->private_->frame.header.bits_per_sample))
2062*600f14f4SXin Li return false;
2063*600f14f4SXin Li for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) {
2064*600f14f4SXin Li /*
2065*600f14f4SXin Li * first figure the correct bits-per-sample of the subframe
2066*600f14f4SXin Li */
2067*600f14f4SXin Li uint32_t bps = decoder->private_->frame.header.bits_per_sample;
2068*600f14f4SXin Li switch(decoder->private_->frame.header.channel_assignment) {
2069*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
2070*600f14f4SXin Li /* no adjustment needed */
2071*600f14f4SXin Li break;
2072*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
2073*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
2074*600f14f4SXin Li if(channel == 1)
2075*600f14f4SXin Li bps++;
2076*600f14f4SXin Li break;
2077*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
2078*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
2079*600f14f4SXin Li if(channel == 0)
2080*600f14f4SXin Li bps++;
2081*600f14f4SXin Li break;
2082*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
2083*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
2084*600f14f4SXin Li if(channel == 1)
2085*600f14f4SXin Li bps++;
2086*600f14f4SXin Li break;
2087*600f14f4SXin Li default:
2088*600f14f4SXin Li FLAC__ASSERT(0);
2089*600f14f4SXin Li }
2090*600f14f4SXin Li /*
2091*600f14f4SXin Li * now read it
2092*600f14f4SXin Li */
2093*600f14f4SXin Li if(!read_subframe_(decoder, channel, bps, do_full_decode)){
2094*600f14f4SXin Li /* read_callback_ sets the state for us */
2095*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM)
2096*600f14f4SXin Li break;
2097*600f14f4SXin Li else
2098*600f14f4SXin Li return false;
2099*600f14f4SXin Li }
2100*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME)
2101*600f14f4SXin Li break;
2102*600f14f4SXin Li }
2103*600f14f4SXin Li
2104*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM)
2105*600f14f4SXin Li if(!read_zero_padding_(decoder))
2106*600f14f4SXin Li return false;
2107*600f14f4SXin Li
2108*600f14f4SXin Li /*
2109*600f14f4SXin Li * Read the frame CRC-16 from the footer and check
2110*600f14f4SXin Li */
2111*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME) {
2112*600f14f4SXin Li frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input);
2113*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) {
2114*600f14f4SXin Li /* read_callback_ sets the state for us */
2115*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM)
2116*600f14f4SXin Li return false;
2117*600f14f4SXin Li }
2118*600f14f4SXin Li #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2119*600f14f4SXin Li }
2120*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME && frame_crc == x) {
2121*600f14f4SXin Li #endif
2122*600f14f4SXin Li if(do_full_decode) {
2123*600f14f4SXin Li /* Undo any special channel coding */
2124*600f14f4SXin Li undo_channel_coding(decoder);
2125*600f14f4SXin Li /* Check whether decoded data actually fits bps */
2126*600f14f4SXin Li for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) {
2127*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
2128*600f14f4SXin Li int shift_bits = 32 - decoder->private_->frame.header.bits_per_sample;
2129*600f14f4SXin Li /* Check whether shift_bits MSBs are 'empty' by shifting up and down */
2130*600f14f4SXin Li if((decoder->private_->output[channel][i] < (INT32_MIN >> shift_bits)) ||
2131*600f14f4SXin Li (decoder->private_->output[channel][i] > (INT32_MAX >> shift_bits))) {
2132*600f14f4SXin Li /* Bad frame, emit error */
2133*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH);
2134*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2135*600f14f4SXin Li break;
2136*600f14f4SXin Li }
2137*600f14f4SXin Li }
2138*600f14f4SXin Li }
2139*600f14f4SXin Li }
2140*600f14f4SXin Li }
2141*600f14f4SXin Li #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2142*600f14f4SXin Li else if (decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME) {
2143*600f14f4SXin Li /* Bad frame, emit error */
2144*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH);
2145*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2146*600f14f4SXin Li }
2147*600f14f4SXin Li #endif
2148*600f14f4SXin Li
2149*600f14f4SXin Li /* Check whether frames are missing, if so, add silence to compensate */
2150*600f14f4SXin Li if(decoder->private_->last_frame_is_set && decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME && !decoder->private_->is_seeking && do_full_decode) {
2151*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
2152*600f14f4SXin Li FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
2153*600f14f4SXin Li if(decoder->private_->last_frame.header.number.sample_number + decoder->private_->last_frame.header.blocksize < decoder->private_->frame.header.number.sample_number) {
2154*600f14f4SXin Li uint32_t padding_samples_needed = decoder->private_->frame.header.number.sample_number - (decoder->private_->last_frame.header.number.sample_number + decoder->private_->last_frame.header.blocksize);
2155*600f14f4SXin Li
2156*600f14f4SXin Li /* Do some extra validation to assure last frame an current frame
2157*600f14f4SXin Li * header are both valid before adding silence inbetween
2158*600f14f4SXin Li * Technically both frames could be valid with differing sample_rates,
2159*600f14f4SXin Li * channels and bits_per_sample, but it is quite rare */
2160*600f14f4SXin Li if(decoder->private_->last_frame.header.sample_rate == decoder->private_->frame.header.sample_rate &&
2161*600f14f4SXin Li decoder->private_->last_frame.header.channels == decoder->private_->frame.header.channels &&
2162*600f14f4SXin Li decoder->private_->last_frame.header.bits_per_sample == decoder->private_->frame.header.bits_per_sample &&
2163*600f14f4SXin Li decoder->private_->last_frame.header.blocksize >= 16) {
2164*600f14f4SXin Li FLAC__Frame empty_frame;
2165*600f14f4SXin Li FLAC__int32 * empty_buffer[FLAC__MAX_CHANNELS] = {NULL};
2166*600f14f4SXin Li empty_frame.header = decoder->private_->last_frame.header;
2167*600f14f4SXin Li empty_frame.footer.crc = 0;
2168*600f14f4SXin Li for(i = 0; i < empty_frame.header.channels; i++) {
2169*600f14f4SXin Li empty_buffer[i] = safe_calloc_(empty_frame.header.blocksize, sizeof(FLAC__int32));
2170*600f14f4SXin Li if(empty_buffer[i] == NULL) {
2171*600f14f4SXin Li for(i = 0; i < empty_frame.header.channels; i++)
2172*600f14f4SXin Li if(empty_buffer[i] != NULL)
2173*600f14f4SXin Li free(empty_buffer[i]);
2174*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
2175*600f14f4SXin Li return false;
2176*600f14f4SXin Li }
2177*600f14f4SXin Li }
2178*600f14f4SXin Li /* No repairs larger than 5 seconds or 50 frames are made, to not
2179*600f14f4SXin Li * unexpectedly create enormous files when one of the headers was
2180*600f14f4SXin Li * corrupt after all */
2181*600f14f4SXin Li if(padding_samples_needed > (5*empty_frame.header.sample_rate))
2182*600f14f4SXin Li padding_samples_needed = 5*empty_frame.header.sample_rate;
2183*600f14f4SXin Li if(padding_samples_needed > (50*empty_frame.header.blocksize))
2184*600f14f4SXin Li padding_samples_needed = 50*empty_frame.header.blocksize;
2185*600f14f4SXin Li while(padding_samples_needed){
2186*600f14f4SXin Li empty_frame.header.number.sample_number += empty_frame.header.blocksize;
2187*600f14f4SXin Li if(padding_samples_needed < empty_frame.header.blocksize)
2188*600f14f4SXin Li empty_frame.header.blocksize = padding_samples_needed;
2189*600f14f4SXin Li padding_samples_needed -= empty_frame.header.blocksize;
2190*600f14f4SXin Li decoder->protected_->blocksize = empty_frame.header.blocksize;
2191*600f14f4SXin Li
2192*600f14f4SXin Li FLAC__ASSERT(empty_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
2193*600f14f4SXin Li decoder->private_->samples_decoded = empty_frame.header.number.sample_number + empty_frame.header.blocksize;
2194*600f14f4SXin Li
2195*600f14f4SXin Li for(channel = 0; channel < empty_frame.header.channels; channel++) {
2196*600f14f4SXin Li empty_frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT;
2197*600f14f4SXin Li empty_frame.subframes[channel].data.constant.value = 0;
2198*600f14f4SXin Li empty_frame.subframes[channel].wasted_bits = 0;
2199*600f14f4SXin Li }
2200*600f14f4SXin Li
2201*600f14f4SXin Li if(write_audio_frame_to_client_(decoder, &empty_frame, (const FLAC__int32 * const *)empty_buffer) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) {
2202*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED;
2203*600f14f4SXin Li for(i = 0; i < empty_frame.header.channels; i++)
2204*600f14f4SXin Li if(empty_buffer[i] != NULL)
2205*600f14f4SXin Li free(empty_buffer[i]);
2206*600f14f4SXin Li return false;
2207*600f14f4SXin Li }
2208*600f14f4SXin Li }
2209*600f14f4SXin Li for(i = 0; i < empty_frame.header.channels; i++)
2210*600f14f4SXin Li if(empty_buffer[i] != NULL)
2211*600f14f4SXin Li free(empty_buffer[i]);
2212*600f14f4SXin Li
2213*600f14f4SXin Li }
2214*600f14f4SXin Li }
2215*600f14f4SXin Li }
2216*600f14f4SXin Li
2217*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC || decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM) {
2218*600f14f4SXin Li /* Got corruption, rewind if possible. Return value of seek
2219*600f14f4SXin Li * isn't checked, if the seek fails the decoder will continue anyway */
2220*600f14f4SXin Li if(!FLAC__bitreader_rewind_to_after_last_seen_framesync(decoder->private_->input)){
2221*600f14f4SXin Li #ifndef NDEBUG
2222*600f14f4SXin Li fprintf(stderr, "Rewinding, seeking necessary\n");
2223*600f14f4SXin Li #endif
2224*600f14f4SXin Li if(decoder->private_->seek_callback && decoder->private_->last_seen_framesync){
2225*600f14f4SXin Li /* Last framesync isn't in bitreader anymore, rewind with seek if possible */
2226*600f14f4SXin Li #ifndef NDEBUG
2227*600f14f4SXin Li FLAC__uint64 current_decode_position;
2228*600f14f4SXin Li if(FLAC__stream_decoder_get_decode_position(decoder, ¤t_decode_position))
2229*600f14f4SXin Li fprintf(stderr, "Bitreader was %" PRIu64 " bytes short\n", current_decode_position-decoder->private_->last_seen_framesync);
2230*600f14f4SXin Li #endif
2231*600f14f4SXin Li if(decoder->private_->seek_callback(decoder, decoder->private_->last_seen_framesync, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) {
2232*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
2233*600f14f4SXin Li return false;
2234*600f14f4SXin Li }
2235*600f14f4SXin Li if(!FLAC__bitreader_clear(decoder->private_->input)) {
2236*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
2237*600f14f4SXin Li return false;
2238*600f14f4SXin Li }
2239*600f14f4SXin Li }
2240*600f14f4SXin Li }
2241*600f14f4SXin Li #ifndef NDEBUG
2242*600f14f4SXin Li else{
2243*600f14f4SXin Li fprintf(stderr, "Rewinding, seeking not necessary\n");
2244*600f14f4SXin Li }
2245*600f14f4SXin Li #endif
2246*600f14f4SXin Li }
2247*600f14f4SXin Li else {
2248*600f14f4SXin Li *got_a_frame = true;
2249*600f14f4SXin Li
2250*600f14f4SXin Li /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */
2251*600f14f4SXin Li if(decoder->private_->next_fixed_block_size)
2252*600f14f4SXin Li decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size;
2253*600f14f4SXin Li
2254*600f14f4SXin Li /* put the latest values into the public section of the decoder instance */
2255*600f14f4SXin Li decoder->protected_->channels = decoder->private_->frame.header.channels;
2256*600f14f4SXin Li decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment;
2257*600f14f4SXin Li decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample;
2258*600f14f4SXin Li decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate;
2259*600f14f4SXin Li decoder->protected_->blocksize = decoder->private_->frame.header.blocksize;
2260*600f14f4SXin Li
2261*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
2262*600f14f4SXin Li decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize;
2263*600f14f4SXin Li
2264*600f14f4SXin Li /* write it */
2265*600f14f4SXin Li if(do_full_decode) {
2266*600f14f4SXin Li if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) {
2267*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED;
2268*600f14f4SXin Li return false;
2269*600f14f4SXin Li }
2270*600f14f4SXin Li }
2271*600f14f4SXin Li }
2272*600f14f4SXin Li
2273*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2274*600f14f4SXin Li return true;
2275*600f14f4SXin Li }
2276*600f14f4SXin Li
read_frame_header_(FLAC__StreamDecoder * decoder)2277*600f14f4SXin Li FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder)
2278*600f14f4SXin Li {
2279*600f14f4SXin Li FLAC__uint32 x;
2280*600f14f4SXin Li FLAC__uint64 xx;
2281*600f14f4SXin Li uint32_t i, blocksize_hint = 0, sample_rate_hint = 0;
2282*600f14f4SXin Li FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */
2283*600f14f4SXin Li uint32_t raw_header_len;
2284*600f14f4SXin Li FLAC__bool is_unparseable = false;
2285*600f14f4SXin Li
2286*600f14f4SXin Li FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input));
2287*600f14f4SXin Li
2288*600f14f4SXin Li /* init the raw header with the saved bits from synchronization */
2289*600f14f4SXin Li raw_header[0] = decoder->private_->header_warmup[0];
2290*600f14f4SXin Li raw_header[1] = decoder->private_->header_warmup[1];
2291*600f14f4SXin Li raw_header_len = 2;
2292*600f14f4SXin Li
2293*600f14f4SXin Li /* check to make sure that reserved bit is 0 */
2294*600f14f4SXin Li if(raw_header[1] & 0x02) /* MAGIC NUMBER */
2295*600f14f4SXin Li is_unparseable = true;
2296*600f14f4SXin Li
2297*600f14f4SXin Li /*
2298*600f14f4SXin Li * Note that along the way as we read the header, we look for a sync
2299*600f14f4SXin Li * code inside. If we find one it would indicate that our original
2300*600f14f4SXin Li * sync was bad since there cannot be a sync code in a valid header.
2301*600f14f4SXin Li *
2302*600f14f4SXin Li * Three kinds of things can go wrong when reading the frame header:
2303*600f14f4SXin Li * 1) We may have sync'ed incorrectly and not landed on a frame header.
2304*600f14f4SXin Li * If we don't find a sync code, it can end up looking like we read
2305*600f14f4SXin Li * a valid but unparseable header, until getting to the frame header
2306*600f14f4SXin Li * CRC. Even then we could get a false positive on the CRC.
2307*600f14f4SXin Li * 2) We may have sync'ed correctly but on an unparseable frame (from a
2308*600f14f4SXin Li * future encoder).
2309*600f14f4SXin Li * 3) We may be on a damaged frame which appears valid but unparseable.
2310*600f14f4SXin Li *
2311*600f14f4SXin Li * For all these reasons, we try and read a complete frame header as
2312*600f14f4SXin Li * long as it seems valid, even if unparseable, up until the frame
2313*600f14f4SXin Li * header CRC.
2314*600f14f4SXin Li */
2315*600f14f4SXin Li
2316*600f14f4SXin Li /*
2317*600f14f4SXin Li * read in the raw header as bytes so we can CRC it, and parse it on the way
2318*600f14f4SXin Li */
2319*600f14f4SXin Li for(i = 0; i < 2; i++) {
2320*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2321*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2322*600f14f4SXin Li if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
2323*600f14f4SXin Li /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */
2324*600f14f4SXin Li decoder->private_->lookahead = (FLAC__byte)x;
2325*600f14f4SXin Li decoder->private_->cached = true;
2326*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2327*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2328*600f14f4SXin Li return true;
2329*600f14f4SXin Li }
2330*600f14f4SXin Li raw_header[raw_header_len++] = (FLAC__byte)x;
2331*600f14f4SXin Li }
2332*600f14f4SXin Li
2333*600f14f4SXin Li switch(x = raw_header[2] >> 4) {
2334*600f14f4SXin Li case 0:
2335*600f14f4SXin Li is_unparseable = true;
2336*600f14f4SXin Li break;
2337*600f14f4SXin Li case 1:
2338*600f14f4SXin Li decoder->private_->frame.header.blocksize = 192;
2339*600f14f4SXin Li break;
2340*600f14f4SXin Li case 2:
2341*600f14f4SXin Li case 3:
2342*600f14f4SXin Li case 4:
2343*600f14f4SXin Li case 5:
2344*600f14f4SXin Li decoder->private_->frame.header.blocksize = 576 << (x-2);
2345*600f14f4SXin Li break;
2346*600f14f4SXin Li case 6:
2347*600f14f4SXin Li case 7:
2348*600f14f4SXin Li blocksize_hint = x;
2349*600f14f4SXin Li break;
2350*600f14f4SXin Li case 8:
2351*600f14f4SXin Li case 9:
2352*600f14f4SXin Li case 10:
2353*600f14f4SXin Li case 11:
2354*600f14f4SXin Li case 12:
2355*600f14f4SXin Li case 13:
2356*600f14f4SXin Li case 14:
2357*600f14f4SXin Li case 15:
2358*600f14f4SXin Li decoder->private_->frame.header.blocksize = 256 << (x-8);
2359*600f14f4SXin Li break;
2360*600f14f4SXin Li default:
2361*600f14f4SXin Li FLAC__ASSERT(0);
2362*600f14f4SXin Li break;
2363*600f14f4SXin Li }
2364*600f14f4SXin Li
2365*600f14f4SXin Li switch(x = raw_header[2] & 0x0f) {
2366*600f14f4SXin Li case 0:
2367*600f14f4SXin Li if(decoder->private_->has_stream_info)
2368*600f14f4SXin Li decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate;
2369*600f14f4SXin Li else
2370*600f14f4SXin Li is_unparseable = true;
2371*600f14f4SXin Li break;
2372*600f14f4SXin Li case 1:
2373*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 88200;
2374*600f14f4SXin Li break;
2375*600f14f4SXin Li case 2:
2376*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 176400;
2377*600f14f4SXin Li break;
2378*600f14f4SXin Li case 3:
2379*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 192000;
2380*600f14f4SXin Li break;
2381*600f14f4SXin Li case 4:
2382*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 8000;
2383*600f14f4SXin Li break;
2384*600f14f4SXin Li case 5:
2385*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 16000;
2386*600f14f4SXin Li break;
2387*600f14f4SXin Li case 6:
2388*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 22050;
2389*600f14f4SXin Li break;
2390*600f14f4SXin Li case 7:
2391*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 24000;
2392*600f14f4SXin Li break;
2393*600f14f4SXin Li case 8:
2394*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 32000;
2395*600f14f4SXin Li break;
2396*600f14f4SXin Li case 9:
2397*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 44100;
2398*600f14f4SXin Li break;
2399*600f14f4SXin Li case 10:
2400*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 48000;
2401*600f14f4SXin Li break;
2402*600f14f4SXin Li case 11:
2403*600f14f4SXin Li decoder->private_->frame.header.sample_rate = 96000;
2404*600f14f4SXin Li break;
2405*600f14f4SXin Li case 12:
2406*600f14f4SXin Li case 13:
2407*600f14f4SXin Li case 14:
2408*600f14f4SXin Li sample_rate_hint = x;
2409*600f14f4SXin Li break;
2410*600f14f4SXin Li case 15:
2411*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2412*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2413*600f14f4SXin Li return true;
2414*600f14f4SXin Li default:
2415*600f14f4SXin Li FLAC__ASSERT(0);
2416*600f14f4SXin Li }
2417*600f14f4SXin Li
2418*600f14f4SXin Li x = (uint32_t)(raw_header[3] >> 4);
2419*600f14f4SXin Li if(x & 8) {
2420*600f14f4SXin Li decoder->private_->frame.header.channels = 2;
2421*600f14f4SXin Li switch(x & 7) {
2422*600f14f4SXin Li case 0:
2423*600f14f4SXin Li decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
2424*600f14f4SXin Li break;
2425*600f14f4SXin Li case 1:
2426*600f14f4SXin Li decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE;
2427*600f14f4SXin Li break;
2428*600f14f4SXin Li case 2:
2429*600f14f4SXin Li decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
2430*600f14f4SXin Li break;
2431*600f14f4SXin Li default:
2432*600f14f4SXin Li is_unparseable = true;
2433*600f14f4SXin Li break;
2434*600f14f4SXin Li }
2435*600f14f4SXin Li }
2436*600f14f4SXin Li else {
2437*600f14f4SXin Li decoder->private_->frame.header.channels = (uint32_t)x + 1;
2438*600f14f4SXin Li decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT;
2439*600f14f4SXin Li }
2440*600f14f4SXin Li
2441*600f14f4SXin Li switch(x = (uint32_t)(raw_header[3] & 0x0e) >> 1) {
2442*600f14f4SXin Li case 0:
2443*600f14f4SXin Li if(decoder->private_->has_stream_info)
2444*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample;
2445*600f14f4SXin Li else
2446*600f14f4SXin Li is_unparseable = true;
2447*600f14f4SXin Li break;
2448*600f14f4SXin Li case 1:
2449*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 8;
2450*600f14f4SXin Li break;
2451*600f14f4SXin Li case 2:
2452*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 12;
2453*600f14f4SXin Li break;
2454*600f14f4SXin Li case 3:
2455*600f14f4SXin Li is_unparseable = true;
2456*600f14f4SXin Li break;
2457*600f14f4SXin Li case 4:
2458*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 16;
2459*600f14f4SXin Li break;
2460*600f14f4SXin Li case 5:
2461*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 20;
2462*600f14f4SXin Li break;
2463*600f14f4SXin Li case 6:
2464*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 24;
2465*600f14f4SXin Li break;
2466*600f14f4SXin Li case 7:
2467*600f14f4SXin Li decoder->private_->frame.header.bits_per_sample = 32;
2468*600f14f4SXin Li break;
2469*600f14f4SXin Li default:
2470*600f14f4SXin Li FLAC__ASSERT(0);
2471*600f14f4SXin Li break;
2472*600f14f4SXin Li }
2473*600f14f4SXin Li
2474*600f14f4SXin Li #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2475*600f14f4SXin Li /* check to make sure that reserved bit is 0 */
2476*600f14f4SXin Li if(raw_header[3] & 0x01) /* MAGIC NUMBER */
2477*600f14f4SXin Li is_unparseable = true;
2478*600f14f4SXin Li #endif
2479*600f14f4SXin Li
2480*600f14f4SXin Li /* read the frame's starting sample number (or frame number as the case may be) */
2481*600f14f4SXin Li if(
2482*600f14f4SXin Li raw_header[1] & 0x01 ||
2483*600f14f4SXin Li /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */
2484*600f14f4SXin Li (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize)
2485*600f14f4SXin Li ) { /* variable blocksize */
2486*600f14f4SXin Li if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len))
2487*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2488*600f14f4SXin Li if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */
2489*600f14f4SXin Li decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
2490*600f14f4SXin Li decoder->private_->cached = true;
2491*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2492*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2493*600f14f4SXin Li return true;
2494*600f14f4SXin Li }
2495*600f14f4SXin Li decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER;
2496*600f14f4SXin Li decoder->private_->frame.header.number.sample_number = xx;
2497*600f14f4SXin Li }
2498*600f14f4SXin Li else { /* fixed blocksize */
2499*600f14f4SXin Li if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len))
2500*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2501*600f14f4SXin Li if(x == 0xffffffff) { /* i.e. non-UTF8 code... */
2502*600f14f4SXin Li decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
2503*600f14f4SXin Li decoder->private_->cached = true;
2504*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2505*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2506*600f14f4SXin Li return true;
2507*600f14f4SXin Li }
2508*600f14f4SXin Li decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER;
2509*600f14f4SXin Li decoder->private_->frame.header.number.frame_number = x;
2510*600f14f4SXin Li }
2511*600f14f4SXin Li
2512*600f14f4SXin Li if(blocksize_hint) {
2513*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2514*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2515*600f14f4SXin Li raw_header[raw_header_len++] = (FLAC__byte)x;
2516*600f14f4SXin Li if(blocksize_hint == 7) {
2517*600f14f4SXin Li FLAC__uint32 _x;
2518*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8))
2519*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2520*600f14f4SXin Li raw_header[raw_header_len++] = (FLAC__byte)_x;
2521*600f14f4SXin Li x = (x << 8) | _x;
2522*600f14f4SXin Li }
2523*600f14f4SXin Li decoder->private_->frame.header.blocksize = x+1;
2524*600f14f4SXin Li if(decoder->private_->frame.header.blocksize > 65535) { /* invalid blocksize (65536) specified */
2525*600f14f4SXin Li decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
2526*600f14f4SXin Li decoder->private_->cached = true;
2527*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2528*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2529*600f14f4SXin Li return true;
2530*600f14f4SXin Li }
2531*600f14f4SXin Li
2532*600f14f4SXin Li }
2533*600f14f4SXin Li
2534*600f14f4SXin Li if(sample_rate_hint) {
2535*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2536*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2537*600f14f4SXin Li raw_header[raw_header_len++] = (FLAC__byte)x;
2538*600f14f4SXin Li if(sample_rate_hint != 12) {
2539*600f14f4SXin Li FLAC__uint32 _x;
2540*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8))
2541*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2542*600f14f4SXin Li raw_header[raw_header_len++] = (FLAC__byte)_x;
2543*600f14f4SXin Li x = (x << 8) | _x;
2544*600f14f4SXin Li }
2545*600f14f4SXin Li if(sample_rate_hint == 12)
2546*600f14f4SXin Li decoder->private_->frame.header.sample_rate = x*1000;
2547*600f14f4SXin Li else if(sample_rate_hint == 13)
2548*600f14f4SXin Li decoder->private_->frame.header.sample_rate = x;
2549*600f14f4SXin Li else
2550*600f14f4SXin Li decoder->private_->frame.header.sample_rate = x*10;
2551*600f14f4SXin Li }
2552*600f14f4SXin Li
2553*600f14f4SXin Li /* read the CRC-8 byte */
2554*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8))
2555*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2556*600f14f4SXin Li crc8 = (FLAC__byte)x;
2557*600f14f4SXin Li
2558*600f14f4SXin Li #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2559*600f14f4SXin Li if(FLAC__crc8(raw_header, raw_header_len) != crc8) {
2560*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER);
2561*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2562*600f14f4SXin Li return true;
2563*600f14f4SXin Li }
2564*600f14f4SXin Li #endif
2565*600f14f4SXin Li
2566*600f14f4SXin Li /* calculate the sample number from the frame number if needed */
2567*600f14f4SXin Li decoder->private_->next_fixed_block_size = 0;
2568*600f14f4SXin Li if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) {
2569*600f14f4SXin Li x = decoder->private_->frame.header.number.frame_number;
2570*600f14f4SXin Li decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER;
2571*600f14f4SXin Li if(decoder->private_->fixed_block_size)
2572*600f14f4SXin Li decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x;
2573*600f14f4SXin Li else if(decoder->private_->has_stream_info) {
2574*600f14f4SXin Li if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) {
2575*600f14f4SXin Li decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x;
2576*600f14f4SXin Li decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize;
2577*600f14f4SXin Li }
2578*600f14f4SXin Li else
2579*600f14f4SXin Li is_unparseable = true;
2580*600f14f4SXin Li }
2581*600f14f4SXin Li else if(x == 0) {
2582*600f14f4SXin Li decoder->private_->frame.header.number.sample_number = 0;
2583*600f14f4SXin Li decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize;
2584*600f14f4SXin Li }
2585*600f14f4SXin Li else {
2586*600f14f4SXin Li /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */
2587*600f14f4SXin Li decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x;
2588*600f14f4SXin Li }
2589*600f14f4SXin Li }
2590*600f14f4SXin Li
2591*600f14f4SXin Li if(is_unparseable) {
2592*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM);
2593*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2594*600f14f4SXin Li return true;
2595*600f14f4SXin Li }
2596*600f14f4SXin Li
2597*600f14f4SXin Li return true;
2598*600f14f4SXin Li }
2599*600f14f4SXin Li
read_subframe_(FLAC__StreamDecoder * decoder,uint32_t channel,uint32_t bps,FLAC__bool do_full_decode)2600*600f14f4SXin Li FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode)
2601*600f14f4SXin Li {
2602*600f14f4SXin Li FLAC__uint32 x;
2603*600f14f4SXin Li FLAC__bool wasted_bits;
2604*600f14f4SXin Li uint32_t i;
2605*600f14f4SXin Li
2606*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */
2607*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2608*600f14f4SXin Li
2609*600f14f4SXin Li wasted_bits = (x & 1);
2610*600f14f4SXin Li x &= 0xfe;
2611*600f14f4SXin Li
2612*600f14f4SXin Li if(wasted_bits) {
2613*600f14f4SXin Li uint32_t u;
2614*600f14f4SXin Li if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u))
2615*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2616*600f14f4SXin Li decoder->private_->frame.subframes[channel].wasted_bits = u+1;
2617*600f14f4SXin Li if (decoder->private_->frame.subframes[channel].wasted_bits >= bps) {
2618*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2619*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2620*600f14f4SXin Li return true;
2621*600f14f4SXin Li }
2622*600f14f4SXin Li bps -= decoder->private_->frame.subframes[channel].wasted_bits;
2623*600f14f4SXin Li }
2624*600f14f4SXin Li else
2625*600f14f4SXin Li decoder->private_->frame.subframes[channel].wasted_bits = 0;
2626*600f14f4SXin Li
2627*600f14f4SXin Li /*
2628*600f14f4SXin Li * Lots of magic numbers here
2629*600f14f4SXin Li */
2630*600f14f4SXin Li if(x & 0x80) {
2631*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2632*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2633*600f14f4SXin Li return true;
2634*600f14f4SXin Li }
2635*600f14f4SXin Li else if(x == 0) {
2636*600f14f4SXin Li if(!read_subframe_constant_(decoder, channel, bps, do_full_decode))
2637*600f14f4SXin Li return false;
2638*600f14f4SXin Li }
2639*600f14f4SXin Li else if(x == 2) {
2640*600f14f4SXin Li if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode))
2641*600f14f4SXin Li return false;
2642*600f14f4SXin Li }
2643*600f14f4SXin Li else if(x < 16) {
2644*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM);
2645*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2646*600f14f4SXin Li return true;
2647*600f14f4SXin Li }
2648*600f14f4SXin Li else if(x <= 24) {
2649*600f14f4SXin Li uint32_t predictor_order = (x>>1)&7;
2650*600f14f4SXin Li if(decoder->private_->frame.header.blocksize <= predictor_order){
2651*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2652*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2653*600f14f4SXin Li return true;
2654*600f14f4SXin Li }
2655*600f14f4SXin Li if(!read_subframe_fixed_(decoder, channel, bps, predictor_order, do_full_decode))
2656*600f14f4SXin Li return false;
2657*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */
2658*600f14f4SXin Li return true;
2659*600f14f4SXin Li }
2660*600f14f4SXin Li else if(x < 64) {
2661*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM);
2662*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2663*600f14f4SXin Li return true;
2664*600f14f4SXin Li }
2665*600f14f4SXin Li else {
2666*600f14f4SXin Li uint32_t predictor_order = ((x>>1)&31)+1;
2667*600f14f4SXin Li if(decoder->private_->frame.header.blocksize <= predictor_order){
2668*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2669*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2670*600f14f4SXin Li return true;
2671*600f14f4SXin Li }
2672*600f14f4SXin Li if(!read_subframe_lpc_(decoder, channel, bps, predictor_order, do_full_decode))
2673*600f14f4SXin Li return false;
2674*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */
2675*600f14f4SXin Li return true;
2676*600f14f4SXin Li }
2677*600f14f4SXin Li
2678*600f14f4SXin Li if(wasted_bits && do_full_decode) {
2679*600f14f4SXin Li x = decoder->private_->frame.subframes[channel].wasted_bits;
2680*600f14f4SXin Li if((bps + x) < 33) {
2681*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
2682*600f14f4SXin Li uint32_t val = decoder->private_->output[channel][i];
2683*600f14f4SXin Li decoder->private_->output[channel][i] = (val << x);
2684*600f14f4SXin Li }
2685*600f14f4SXin Li }
2686*600f14f4SXin Li else {
2687*600f14f4SXin Li /* When there are wasted bits, bps is never 33 and so
2688*600f14f4SXin Li * side_subframe is never already in use */
2689*600f14f4SXin Li FLAC__ASSERT(!decoder->private_->side_subframe_in_use);
2690*600f14f4SXin Li decoder->private_->side_subframe_in_use = true;
2691*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
2692*600f14f4SXin Li uint64_t val = decoder->private_->output[channel][i];
2693*600f14f4SXin Li decoder->private_->side_subframe[i] = (val << x);
2694*600f14f4SXin Li }
2695*600f14f4SXin Li }
2696*600f14f4SXin Li }
2697*600f14f4SXin Li
2698*600f14f4SXin Li return true;
2699*600f14f4SXin Li }
2700*600f14f4SXin Li
read_subframe_constant_(FLAC__StreamDecoder * decoder,uint32_t channel,uint32_t bps,FLAC__bool do_full_decode)2701*600f14f4SXin Li FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode)
2702*600f14f4SXin Li {
2703*600f14f4SXin Li FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant;
2704*600f14f4SXin Li FLAC__int64 x;
2705*600f14f4SXin Li uint32_t i;
2706*600f14f4SXin Li
2707*600f14f4SXin Li decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT;
2708*600f14f4SXin Li
2709*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int64(decoder->private_->input, &x, bps))
2710*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2711*600f14f4SXin Li
2712*600f14f4SXin Li subframe->value = x;
2713*600f14f4SXin Li
2714*600f14f4SXin Li /* decode the subframe */
2715*600f14f4SXin Li if(do_full_decode) {
2716*600f14f4SXin Li if(bps <= 32) {
2717*600f14f4SXin Li FLAC__int32 *output = decoder->private_->output[channel];
2718*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++)
2719*600f14f4SXin Li output[i] = x;
2720*600f14f4SXin Li } else {
2721*600f14f4SXin Li FLAC__int64 *output = decoder->private_->side_subframe;
2722*600f14f4SXin Li decoder->private_->side_subframe_in_use = true;
2723*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++)
2724*600f14f4SXin Li output[i] = x;
2725*600f14f4SXin Li }
2726*600f14f4SXin Li }
2727*600f14f4SXin Li
2728*600f14f4SXin Li return true;
2729*600f14f4SXin Li }
2730*600f14f4SXin Li
read_subframe_fixed_(FLAC__StreamDecoder * decoder,uint32_t channel,uint32_t bps,const uint32_t order,FLAC__bool do_full_decode)2731*600f14f4SXin Li FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode)
2732*600f14f4SXin Li {
2733*600f14f4SXin Li FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed;
2734*600f14f4SXin Li FLAC__int64 i64;
2735*600f14f4SXin Li FLAC__uint32 u32;
2736*600f14f4SXin Li uint32_t u;
2737*600f14f4SXin Li
2738*600f14f4SXin Li decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED;
2739*600f14f4SXin Li
2740*600f14f4SXin Li subframe->residual = decoder->private_->residual[channel];
2741*600f14f4SXin Li subframe->order = order;
2742*600f14f4SXin Li
2743*600f14f4SXin Li /* read warm-up samples */
2744*600f14f4SXin Li for(u = 0; u < order; u++) {
2745*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int64(decoder->private_->input, &i64, bps))
2746*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2747*600f14f4SXin Li subframe->warmup[u] = i64;
2748*600f14f4SXin Li }
2749*600f14f4SXin Li
2750*600f14f4SXin Li /* read entropy coding method info */
2751*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN))
2752*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2753*600f14f4SXin Li subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32;
2754*600f14f4SXin Li switch(subframe->entropy_coding_method.type) {
2755*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
2756*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
2757*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
2758*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2759*600f14f4SXin Li if((decoder->private_->frame.header.blocksize >> u32 < order) ||
2760*600f14f4SXin Li (decoder->private_->frame.header.blocksize % (1 << u32) > 0)) {
2761*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2762*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2763*600f14f4SXin Li return true;
2764*600f14f4SXin Li }
2765*600f14f4SXin Li subframe->entropy_coding_method.data.partitioned_rice.order = u32;
2766*600f14f4SXin Li subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel];
2767*600f14f4SXin Li break;
2768*600f14f4SXin Li default:
2769*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM);
2770*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2771*600f14f4SXin Li return true;
2772*600f14f4SXin Li }
2773*600f14f4SXin Li
2774*600f14f4SXin Li /* read residual */
2775*600f14f4SXin Li switch(subframe->entropy_coding_method.type) {
2776*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
2777*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
2778*600f14f4SXin Li if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2))
2779*600f14f4SXin Li return false;
2780*600f14f4SXin Li break;
2781*600f14f4SXin Li default:
2782*600f14f4SXin Li FLAC__ASSERT(0);
2783*600f14f4SXin Li }
2784*600f14f4SXin Li
2785*600f14f4SXin Li /* decode the subframe */
2786*600f14f4SXin Li if(do_full_decode) {
2787*600f14f4SXin Li if(bps < 33){
2788*600f14f4SXin Li uint32_t i;
2789*600f14f4SXin Li for(i = 0; i < order; i++)
2790*600f14f4SXin Li decoder->private_->output[channel][i] = subframe->warmup[i];
2791*600f14f4SXin Li if(bps+order <= 32)
2792*600f14f4SXin Li FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order);
2793*600f14f4SXin Li else
2794*600f14f4SXin Li FLAC__fixed_restore_signal_wide(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order);
2795*600f14f4SXin Li }
2796*600f14f4SXin Li else {
2797*600f14f4SXin Li decoder->private_->side_subframe_in_use = true;
2798*600f14f4SXin Li memcpy(decoder->private_->side_subframe, subframe->warmup, sizeof(FLAC__int64) * order);
2799*600f14f4SXin Li FLAC__fixed_restore_signal_wide_33bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->side_subframe+order);
2800*600f14f4SXin Li }
2801*600f14f4SXin Li }
2802*600f14f4SXin Li
2803*600f14f4SXin Li return true;
2804*600f14f4SXin Li }
2805*600f14f4SXin Li
read_subframe_lpc_(FLAC__StreamDecoder * decoder,uint32_t channel,uint32_t bps,const uint32_t order,FLAC__bool do_full_decode)2806*600f14f4SXin Li FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, const uint32_t order, FLAC__bool do_full_decode)
2807*600f14f4SXin Li {
2808*600f14f4SXin Li FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc;
2809*600f14f4SXin Li FLAC__int32 i32;
2810*600f14f4SXin Li FLAC__int64 i64;
2811*600f14f4SXin Li FLAC__uint32 u32;
2812*600f14f4SXin Li uint32_t u;
2813*600f14f4SXin Li
2814*600f14f4SXin Li decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC;
2815*600f14f4SXin Li
2816*600f14f4SXin Li subframe->residual = decoder->private_->residual[channel];
2817*600f14f4SXin Li subframe->order = order;
2818*600f14f4SXin Li
2819*600f14f4SXin Li /* read warm-up samples */
2820*600f14f4SXin Li for(u = 0; u < order; u++) {
2821*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int64(decoder->private_->input, &i64, bps))
2822*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2823*600f14f4SXin Li subframe->warmup[u] = i64;
2824*600f14f4SXin Li }
2825*600f14f4SXin Li
2826*600f14f4SXin Li /* read qlp coeff precision */
2827*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN))
2828*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2829*600f14f4SXin Li if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) {
2830*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2831*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2832*600f14f4SXin Li return true;
2833*600f14f4SXin Li }
2834*600f14f4SXin Li subframe->qlp_coeff_precision = u32+1;
2835*600f14f4SXin Li
2836*600f14f4SXin Li /* read qlp shift */
2837*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN))
2838*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2839*600f14f4SXin Li if(i32 < 0) {
2840*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2841*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2842*600f14f4SXin Li return true;
2843*600f14f4SXin Li }
2844*600f14f4SXin Li subframe->quantization_level = i32;
2845*600f14f4SXin Li
2846*600f14f4SXin Li /* read quantized lp coefficiencts */
2847*600f14f4SXin Li for(u = 0; u < order; u++) {
2848*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision))
2849*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2850*600f14f4SXin Li subframe->qlp_coeff[u] = i32;
2851*600f14f4SXin Li }
2852*600f14f4SXin Li
2853*600f14f4SXin Li /* read entropy coding method info */
2854*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN))
2855*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2856*600f14f4SXin Li subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32;
2857*600f14f4SXin Li switch(subframe->entropy_coding_method.type) {
2858*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
2859*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
2860*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
2861*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2862*600f14f4SXin Li if((decoder->private_->frame.header.blocksize >> u32 < order) ||
2863*600f14f4SXin Li (decoder->private_->frame.header.blocksize % (1 << u32) > 0)) {
2864*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2865*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2866*600f14f4SXin Li return true;
2867*600f14f4SXin Li }
2868*600f14f4SXin Li subframe->entropy_coding_method.data.partitioned_rice.order = u32;
2869*600f14f4SXin Li subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel];
2870*600f14f4SXin Li break;
2871*600f14f4SXin Li default:
2872*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM);
2873*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2874*600f14f4SXin Li return true;
2875*600f14f4SXin Li }
2876*600f14f4SXin Li
2877*600f14f4SXin Li /* read residual */
2878*600f14f4SXin Li switch(subframe->entropy_coding_method.type) {
2879*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
2880*600f14f4SXin Li case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
2881*600f14f4SXin Li if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2))
2882*600f14f4SXin Li return false;
2883*600f14f4SXin Li break;
2884*600f14f4SXin Li default:
2885*600f14f4SXin Li FLAC__ASSERT(0);
2886*600f14f4SXin Li }
2887*600f14f4SXin Li
2888*600f14f4SXin Li /* decode the subframe */
2889*600f14f4SXin Li if(do_full_decode) {
2890*600f14f4SXin Li if(bps <= 32) {
2891*600f14f4SXin Li uint32_t i;
2892*600f14f4SXin Li for(i = 0; i < order; i++)
2893*600f14f4SXin Li decoder->private_->output[channel][i] = subframe->warmup[i];
2894*600f14f4SXin Li if(FLAC__lpc_max_residual_bps(bps, subframe->qlp_coeff, order, subframe->quantization_level) <= 32 &&
2895*600f14f4SXin Li FLAC__lpc_max_prediction_before_shift_bps(bps, subframe->qlp_coeff, order) <= 32)
2896*600f14f4SXin Li FLAC__lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
2897*600f14f4SXin Li else
2898*600f14f4SXin Li FLAC__lpc_restore_signal_wide(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
2899*600f14f4SXin Li }
2900*600f14f4SXin Li else {
2901*600f14f4SXin Li decoder->private_->side_subframe_in_use = true;
2902*600f14f4SXin Li memcpy(decoder->private_->side_subframe, subframe->warmup, sizeof(FLAC__int64) * order);
2903*600f14f4SXin Li FLAC__lpc_restore_signal_wide_33bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->side_subframe+order);
2904*600f14f4SXin Li }
2905*600f14f4SXin Li }
2906*600f14f4SXin Li
2907*600f14f4SXin Li return true;
2908*600f14f4SXin Li }
2909*600f14f4SXin Li
read_subframe_verbatim_(FLAC__StreamDecoder * decoder,uint32_t channel,uint32_t bps,FLAC__bool do_full_decode)2910*600f14f4SXin Li FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, uint32_t channel, uint32_t bps, FLAC__bool do_full_decode)
2911*600f14f4SXin Li {
2912*600f14f4SXin Li FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim;
2913*600f14f4SXin Li uint32_t i;
2914*600f14f4SXin Li
2915*600f14f4SXin Li decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM;
2916*600f14f4SXin Li
2917*600f14f4SXin Li if(bps < 33) {
2918*600f14f4SXin Li FLAC__int32 x, *residual = decoder->private_->residual[channel];
2919*600f14f4SXin Li
2920*600f14f4SXin Li subframe->data_type = FLAC__VERBATIM_SUBFRAME_DATA_TYPE_INT32;
2921*600f14f4SXin Li subframe->data.int32 = residual;
2922*600f14f4SXin Li
2923*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
2924*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps))
2925*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2926*600f14f4SXin Li residual[i] = x;
2927*600f14f4SXin Li }
2928*600f14f4SXin Li
2929*600f14f4SXin Li /* decode the subframe */
2930*600f14f4SXin Li if(do_full_decode)
2931*600f14f4SXin Li memcpy(decoder->private_->output[channel], subframe->data.int32, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize);
2932*600f14f4SXin Li }
2933*600f14f4SXin Li else {
2934*600f14f4SXin Li FLAC__int64 x, *side = decoder->private_->side_subframe;
2935*600f14f4SXin Li
2936*600f14f4SXin Li subframe->data_type = FLAC__VERBATIM_SUBFRAME_DATA_TYPE_INT64;
2937*600f14f4SXin Li subframe->data.int64 = side;
2938*600f14f4SXin Li decoder->private_->side_subframe_in_use = true;
2939*600f14f4SXin Li
2940*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
2941*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int64(decoder->private_->input, &x, bps))
2942*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2943*600f14f4SXin Li side[i] = x;
2944*600f14f4SXin Li }
2945*600f14f4SXin Li }
2946*600f14f4SXin Li
2947*600f14f4SXin Li return true;
2948*600f14f4SXin Li }
2949*600f14f4SXin Li
read_residual_partitioned_rice_(FLAC__StreamDecoder * decoder,uint32_t predictor_order,uint32_t partition_order,FLAC__EntropyCodingMethod_PartitionedRiceContents * partitioned_rice_contents,FLAC__int32 * residual,FLAC__bool is_extended)2950*600f14f4SXin Li FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, uint32_t predictor_order, uint32_t partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended)
2951*600f14f4SXin Li {
2952*600f14f4SXin Li FLAC__uint32 rice_parameter;
2953*600f14f4SXin Li int i;
2954*600f14f4SXin Li uint32_t partition, sample, u;
2955*600f14f4SXin Li const uint32_t partitions = 1u << partition_order;
2956*600f14f4SXin Li const uint32_t partition_samples = decoder->private_->frame.header.blocksize >> partition_order;
2957*600f14f4SXin Li const uint32_t plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
2958*600f14f4SXin Li const uint32_t pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
2959*600f14f4SXin Li
2960*600f14f4SXin Li /* invalid predictor and partition orders mush be handled in the callers */
2961*600f14f4SXin Li FLAC__ASSERT(partition_order > 0? partition_samples >= predictor_order : decoder->private_->frame.header.blocksize >= predictor_order);
2962*600f14f4SXin Li
2963*600f14f4SXin Li if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) {
2964*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
2965*600f14f4SXin Li return false;
2966*600f14f4SXin Li }
2967*600f14f4SXin Li
2968*600f14f4SXin Li sample = 0;
2969*600f14f4SXin Li for(partition = 0; partition < partitions; partition++) {
2970*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen))
2971*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2972*600f14f4SXin Li partitioned_rice_contents->parameters[partition] = rice_parameter;
2973*600f14f4SXin Li if(rice_parameter < pesc) {
2974*600f14f4SXin Li partitioned_rice_contents->raw_bits[partition] = 0;
2975*600f14f4SXin Li u = (partition == 0) ? partition_samples - predictor_order : partition_samples;
2976*600f14f4SXin Li if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)){
2977*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_READ_FRAME) {
2978*600f14f4SXin Li /* no error was set, read_callback_ didn't set it, so
2979*600f14f4SXin Li * invalid rice symbol was found */
2980*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
2981*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
2982*600f14f4SXin Li return true;
2983*600f14f4SXin Li }
2984*600f14f4SXin Li else
2985*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2986*600f14f4SXin Li }
2987*600f14f4SXin Li sample += u;
2988*600f14f4SXin Li }
2989*600f14f4SXin Li else {
2990*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN))
2991*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
2992*600f14f4SXin Li partitioned_rice_contents->raw_bits[partition] = rice_parameter;
2993*600f14f4SXin Li if(rice_parameter == 0) {
2994*600f14f4SXin Li for(u = (partition == 0)? predictor_order : 0; u < partition_samples; u++, sample++)
2995*600f14f4SXin Li residual[sample] = 0;
2996*600f14f4SXin Li }
2997*600f14f4SXin Li else{
2998*600f14f4SXin Li for(u = (partition == 0)? predictor_order : 0; u < partition_samples; u++, sample++) {
2999*600f14f4SXin Li if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter))
3000*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
3001*600f14f4SXin Li residual[sample] = i;
3002*600f14f4SXin Li }
3003*600f14f4SXin Li }
3004*600f14f4SXin Li }
3005*600f14f4SXin Li }
3006*600f14f4SXin Li
3007*600f14f4SXin Li return true;
3008*600f14f4SXin Li }
3009*600f14f4SXin Li
read_zero_padding_(FLAC__StreamDecoder * decoder)3010*600f14f4SXin Li FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder)
3011*600f14f4SXin Li {
3012*600f14f4SXin Li if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) {
3013*600f14f4SXin Li FLAC__uint32 zero = 0;
3014*600f14f4SXin Li if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input)))
3015*600f14f4SXin Li return false; /* read_callback_ sets the state for us */
3016*600f14f4SXin Li #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
3017*600f14f4SXin Li if(zero != 0) {
3018*600f14f4SXin Li send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
3019*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
3020*600f14f4SXin Li }
3021*600f14f4SXin Li #endif
3022*600f14f4SXin Li }
3023*600f14f4SXin Li return true;
3024*600f14f4SXin Li }
3025*600f14f4SXin Li
read_callback_(FLAC__byte buffer[],size_t * bytes,void * client_data)3026*600f14f4SXin Li FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data)
3027*600f14f4SXin Li {
3028*600f14f4SXin Li FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data;
3029*600f14f4SXin Li
3030*600f14f4SXin Li if(
3031*600f14f4SXin Li #if FLAC__HAS_OGG
3032*600f14f4SXin Li /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */
3033*600f14f4SXin Li !decoder->private_->is_ogg &&
3034*600f14f4SXin Li #endif
3035*600f14f4SXin Li decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data)
3036*600f14f4SXin Li ) {
3037*600f14f4SXin Li *bytes = 0;
3038*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM;
3039*600f14f4SXin Li return false;
3040*600f14f4SXin Li }
3041*600f14f4SXin Li else if(*bytes > 0) {
3042*600f14f4SXin Li /* While seeking, it is possible for our seek to land in the
3043*600f14f4SXin Li * middle of audio data that looks exactly like a frame header
3044*600f14f4SXin Li * from a future version of an encoder. When that happens, our
3045*600f14f4SXin Li * error callback will get an
3046*600f14f4SXin Li * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its
3047*600f14f4SXin Li * unparseable_frame_count. But there is a remote possibility
3048*600f14f4SXin Li * that it is properly synced at such a "future-codec frame",
3049*600f14f4SXin Li * so to make sure, we wait to see many "unparseable" errors in
3050*600f14f4SXin Li * a row before bailing out.
3051*600f14f4SXin Li */
3052*600f14f4SXin Li if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) {
3053*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED;
3054*600f14f4SXin Li return false;
3055*600f14f4SXin Li }
3056*600f14f4SXin Li else {
3057*600f14f4SXin Li const FLAC__StreamDecoderReadStatus status =
3058*600f14f4SXin Li #if FLAC__HAS_OGG
3059*600f14f4SXin Li decoder->private_->is_ogg?
3060*600f14f4SXin Li read_callback_ogg_aspect_(decoder, buffer, bytes) :
3061*600f14f4SXin Li #endif
3062*600f14f4SXin Li decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data)
3063*600f14f4SXin Li ;
3064*600f14f4SXin Li if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) {
3065*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED;
3066*600f14f4SXin Li return false;
3067*600f14f4SXin Li }
3068*600f14f4SXin Li else if(*bytes == 0) {
3069*600f14f4SXin Li if(
3070*600f14f4SXin Li status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM ||
3071*600f14f4SXin Li (
3072*600f14f4SXin Li #if FLAC__HAS_OGG
3073*600f14f4SXin Li /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */
3074*600f14f4SXin Li !decoder->private_->is_ogg &&
3075*600f14f4SXin Li #endif
3076*600f14f4SXin Li decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data)
3077*600f14f4SXin Li )
3078*600f14f4SXin Li ) {
3079*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM;
3080*600f14f4SXin Li return false;
3081*600f14f4SXin Li }
3082*600f14f4SXin Li else
3083*600f14f4SXin Li return true;
3084*600f14f4SXin Li }
3085*600f14f4SXin Li else
3086*600f14f4SXin Li return true;
3087*600f14f4SXin Li }
3088*600f14f4SXin Li }
3089*600f14f4SXin Li else {
3090*600f14f4SXin Li /* abort to avoid a deadlock */
3091*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED;
3092*600f14f4SXin Li return false;
3093*600f14f4SXin Li }
3094*600f14f4SXin Li /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around
3095*600f14f4SXin Li * for Ogg FLAC. This is because the ogg decoder aspect can lose sync
3096*600f14f4SXin Li * and at the same time hit the end of the stream (for example, seeking
3097*600f14f4SXin Li * to a point that is after the beginning of the last Ogg page). There
3098*600f14f4SXin Li * is no way to report an Ogg sync loss through the callbacks (see note
3099*600f14f4SXin Li * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0.
3100*600f14f4SXin Li * So to keep the decoder from stopping at this point we gate the call
3101*600f14f4SXin Li * to the eof_callback and let the Ogg decoder aspect set the
3102*600f14f4SXin Li * end-of-stream state when it is needed.
3103*600f14f4SXin Li */
3104*600f14f4SXin Li }
3105*600f14f4SXin Li
3106*600f14f4SXin Li #if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(FUZZING_BUILD_MODE_FLAC_SANITIZE_SIGNED_INTEGER_OVERFLOW)
3107*600f14f4SXin Li /* The attribute below is to silence the undefined sanitizer of oss-fuzz.
3108*600f14f4SXin Li * Because fuzzing feeds bogus predictors and residual samples to the
3109*600f14f4SXin Li * decoder, having overflows in this section is unavoidable. Also,
3110*600f14f4SXin Li * because the calculated values are audio path only, there is no
3111*600f14f4SXin Li * potential for security problems */
3112*600f14f4SXin Li __attribute__((no_sanitize("signed-integer-overflow")))
3113*600f14f4SXin Li #endif
undo_channel_coding(FLAC__StreamDecoder * decoder)3114*600f14f4SXin Li void undo_channel_coding(FLAC__StreamDecoder *decoder) {
3115*600f14f4SXin Li uint32_t i;
3116*600f14f4SXin Li switch(decoder->private_->frame.header.channel_assignment) {
3117*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
3118*600f14f4SXin Li /* do nothing */
3119*600f14f4SXin Li break;
3120*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
3121*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
3122*600f14f4SXin Li FLAC__ASSERT(decoder->private_->side_subframe_in_use != /* logical XOR */ (decoder->private_->frame.header.bits_per_sample < 32));
3123*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++)
3124*600f14f4SXin Li if(decoder->private_->side_subframe_in_use)
3125*600f14f4SXin Li decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->side_subframe[i];
3126*600f14f4SXin Li else
3127*600f14f4SXin Li decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i];
3128*600f14f4SXin Li break;
3129*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
3130*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
3131*600f14f4SXin Li FLAC__ASSERT(decoder->private_->side_subframe_in_use != /* logical XOR */ (decoder->private_->frame.header.bits_per_sample < 32));
3132*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++)
3133*600f14f4SXin Li if(decoder->private_->side_subframe_in_use)
3134*600f14f4SXin Li decoder->private_->output[0][i] = decoder->private_->output[1][i] + decoder->private_->side_subframe[i];
3135*600f14f4SXin Li else
3136*600f14f4SXin Li decoder->private_->output[0][i] += decoder->private_->output[1][i];
3137*600f14f4SXin Li break;
3138*600f14f4SXin Li case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
3139*600f14f4SXin Li FLAC__ASSERT(decoder->private_->frame.header.channels == 2);
3140*600f14f4SXin Li FLAC__ASSERT(decoder->private_->side_subframe_in_use != /* logical XOR */ (decoder->private_->frame.header.bits_per_sample < 32));
3141*600f14f4SXin Li for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
3142*600f14f4SXin Li if(!decoder->private_->side_subframe_in_use){
3143*600f14f4SXin Li FLAC__int32 mid, side;
3144*600f14f4SXin Li mid = decoder->private_->output[0][i];
3145*600f14f4SXin Li side = decoder->private_->output[1][i];
3146*600f14f4SXin Li mid = ((uint32_t) mid) << 1;
3147*600f14f4SXin Li mid |= (side & 1); /* i.e. if 'side' is odd... */
3148*600f14f4SXin Li decoder->private_->output[0][i] = (mid + side) >> 1;
3149*600f14f4SXin Li decoder->private_->output[1][i] = (mid - side) >> 1;
3150*600f14f4SXin Li }
3151*600f14f4SXin Li else { /* bps == 32 */
3152*600f14f4SXin Li FLAC__int64 mid;
3153*600f14f4SXin Li mid = ((uint64_t)decoder->private_->output[0][i]) << 1;
3154*600f14f4SXin Li mid |= (decoder->private_->side_subframe[i] & 1); /* i.e. if 'side' is odd... */
3155*600f14f4SXin Li decoder->private_->output[0][i] = (mid + decoder->private_->side_subframe[i]) >> 1;
3156*600f14f4SXin Li decoder->private_->output[1][i] = (mid - decoder->private_->side_subframe[i]) >> 1;
3157*600f14f4SXin Li }
3158*600f14f4SXin Li }
3159*600f14f4SXin Li break;
3160*600f14f4SXin Li default:
3161*600f14f4SXin Li FLAC__ASSERT(0);
3162*600f14f4SXin Li break;
3163*600f14f4SXin Li }
3164*600f14f4SXin Li }
3165*600f14f4SXin Li
3166*600f14f4SXin Li #if FLAC__HAS_OGG
read_callback_ogg_aspect_(const FLAC__StreamDecoder * decoder,FLAC__byte buffer[],size_t * bytes)3167*600f14f4SXin Li FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes)
3168*600f14f4SXin Li {
3169*600f14f4SXin Li switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) {
3170*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK:
3171*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
3172*600f14f4SXin Li /* we don't really have a way to handle lost sync via read
3173*600f14f4SXin Li * callback so we'll let it pass and let the underlying
3174*600f14f4SXin Li * FLAC decoder catch the error
3175*600f14f4SXin Li */
3176*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC:
3177*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
3178*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM:
3179*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
3180*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC:
3181*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION:
3182*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT:
3183*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR:
3184*600f14f4SXin Li case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR:
3185*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
3186*600f14f4SXin Li default:
3187*600f14f4SXin Li FLAC__ASSERT(0);
3188*600f14f4SXin Li /* double protection */
3189*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
3190*600f14f4SXin Li }
3191*600f14f4SXin Li }
3192*600f14f4SXin Li
read_callback_proxy_(const void * void_decoder,FLAC__byte buffer[],size_t * bytes,void * client_data)3193*600f14f4SXin Li FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
3194*600f14f4SXin Li {
3195*600f14f4SXin Li FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder;
3196*600f14f4SXin Li
3197*600f14f4SXin Li switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) {
3198*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE:
3199*600f14f4SXin Li return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK;
3200*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM:
3201*600f14f4SXin Li return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM;
3202*600f14f4SXin Li case FLAC__STREAM_DECODER_READ_STATUS_ABORT:
3203*600f14f4SXin Li return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT;
3204*600f14f4SXin Li default:
3205*600f14f4SXin Li /* double protection: */
3206*600f14f4SXin Li FLAC__ASSERT(0);
3207*600f14f4SXin Li return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT;
3208*600f14f4SXin Li }
3209*600f14f4SXin Li }
3210*600f14f4SXin Li #endif
3211*600f14f4SXin Li
write_audio_frame_to_client_(FLAC__StreamDecoder * decoder,const FLAC__Frame * frame,const FLAC__int32 * const buffer[])3212*600f14f4SXin Li FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[])
3213*600f14f4SXin Li {
3214*600f14f4SXin Li decoder->private_->last_frame = *frame; /* save the frame */
3215*600f14f4SXin Li decoder->private_->last_frame_is_set = true;
3216*600f14f4SXin Li if(decoder->private_->is_seeking) {
3217*600f14f4SXin Li FLAC__uint64 this_frame_sample = frame->header.number.sample_number;
3218*600f14f4SXin Li FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize;
3219*600f14f4SXin Li FLAC__uint64 target_sample = decoder->private_->target_sample;
3220*600f14f4SXin Li
3221*600f14f4SXin Li FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
3222*600f14f4SXin Li
3223*600f14f4SXin Li #if FLAC__HAS_OGG
3224*600f14f4SXin Li decoder->private_->got_a_frame = true;
3225*600f14f4SXin Li #endif
3226*600f14f4SXin Li if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */
3227*600f14f4SXin Li uint32_t delta = (uint32_t)(target_sample - this_frame_sample);
3228*600f14f4SXin Li /* kick out of seek mode */
3229*600f14f4SXin Li decoder->private_->is_seeking = false;
3230*600f14f4SXin Li /* shift out the samples before target_sample */
3231*600f14f4SXin Li if(delta > 0) {
3232*600f14f4SXin Li uint32_t channel;
3233*600f14f4SXin Li const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS];
3234*600f14f4SXin Li for(channel = 0; channel < frame->header.channels; channel++) {
3235*600f14f4SXin Li newbuffer[channel] = buffer[channel] + delta;
3236*600f14f4SXin Li decoder->private_->last_frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM;
3237*600f14f4SXin Li decoder->private_->last_frame.subframes[channel].data.verbatim.data_type = FLAC__VERBATIM_SUBFRAME_DATA_TYPE_INT32;
3238*600f14f4SXin Li decoder->private_->last_frame.subframes[channel].data.verbatim.data.int32 = newbuffer[channel];
3239*600f14f4SXin Li }
3240*600f14f4SXin Li decoder->private_->last_frame.header.blocksize -= delta;
3241*600f14f4SXin Li decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta;
3242*600f14f4SXin Li /* write the relevant samples */
3243*600f14f4SXin Li return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data);
3244*600f14f4SXin Li }
3245*600f14f4SXin Li else {
3246*600f14f4SXin Li /* write the relevant samples */
3247*600f14f4SXin Li return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data);
3248*600f14f4SXin Li }
3249*600f14f4SXin Li }
3250*600f14f4SXin Li else {
3251*600f14f4SXin Li return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
3252*600f14f4SXin Li }
3253*600f14f4SXin Li }
3254*600f14f4SXin Li else {
3255*600f14f4SXin Li /*
3256*600f14f4SXin Li * If we never got STREAMINFO, turn off MD5 checking to save
3257*600f14f4SXin Li * cycles since we don't have a sum to compare to anyway
3258*600f14f4SXin Li */
3259*600f14f4SXin Li if(!decoder->private_->has_stream_info)
3260*600f14f4SXin Li decoder->private_->do_md5_checking = false;
3261*600f14f4SXin Li if(decoder->private_->do_md5_checking) {
3262*600f14f4SXin Li if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8))
3263*600f14f4SXin Li return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
3264*600f14f4SXin Li }
3265*600f14f4SXin Li return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data);
3266*600f14f4SXin Li }
3267*600f14f4SXin Li }
3268*600f14f4SXin Li
send_error_to_client_(const FLAC__StreamDecoder * decoder,FLAC__StreamDecoderErrorStatus status)3269*600f14f4SXin Li void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status)
3270*600f14f4SXin Li {
3271*600f14f4SXin Li if(!decoder->private_->is_seeking)
3272*600f14f4SXin Li decoder->private_->error_callback(decoder, status, decoder->private_->client_data);
3273*600f14f4SXin Li else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM)
3274*600f14f4SXin Li decoder->private_->unparseable_frame_count++;
3275*600f14f4SXin Li }
3276*600f14f4SXin Li
seek_to_absolute_sample_(FLAC__StreamDecoder * decoder,FLAC__uint64 stream_length,FLAC__uint64 target_sample)3277*600f14f4SXin Li FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample)
3278*600f14f4SXin Li {
3279*600f14f4SXin Li FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample;
3280*600f14f4SXin Li FLAC__int64 pos = -1;
3281*600f14f4SXin Li int i;
3282*600f14f4SXin Li uint32_t approx_bytes_per_frame;
3283*600f14f4SXin Li FLAC__bool first_seek = true, seek_from_lower_bound = false;
3284*600f14f4SXin Li const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder);
3285*600f14f4SXin Li const uint32_t min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize;
3286*600f14f4SXin Li const uint32_t max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize;
3287*600f14f4SXin Li const uint32_t max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize;
3288*600f14f4SXin Li const uint32_t min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize;
3289*600f14f4SXin Li /* take these from the current frame in case they've changed mid-stream */
3290*600f14f4SXin Li uint32_t channels = FLAC__stream_decoder_get_channels(decoder);
3291*600f14f4SXin Li uint32_t bps = FLAC__stream_decoder_get_bits_per_sample(decoder);
3292*600f14f4SXin Li const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0;
3293*600f14f4SXin Li
3294*600f14f4SXin Li /* use values from stream info if we didn't decode a frame */
3295*600f14f4SXin Li if(channels == 0)
3296*600f14f4SXin Li channels = decoder->private_->stream_info.data.stream_info.channels;
3297*600f14f4SXin Li if(bps == 0)
3298*600f14f4SXin Li bps = decoder->private_->stream_info.data.stream_info.bits_per_sample;
3299*600f14f4SXin Li
3300*600f14f4SXin Li /* we are just guessing here */
3301*600f14f4SXin Li if(max_framesize > 0)
3302*600f14f4SXin Li approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1;
3303*600f14f4SXin Li /*
3304*600f14f4SXin Li * Check if it's a known fixed-blocksize stream. Note that though
3305*600f14f4SXin Li * the spec doesn't allow zeroes in the STREAMINFO block, we may
3306*600f14f4SXin Li * never get a STREAMINFO block when decoding so the value of
3307*600f14f4SXin Li * min_blocksize might be zero.
3308*600f14f4SXin Li */
3309*600f14f4SXin Li else if(min_blocksize == max_blocksize && min_blocksize > 0) {
3310*600f14f4SXin Li /* note there are no () around 'bps/8' to keep precision up since it's an integer calculation */
3311*600f14f4SXin Li approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64;
3312*600f14f4SXin Li }
3313*600f14f4SXin Li else
3314*600f14f4SXin Li approx_bytes_per_frame = 4096 * channels * bps/8 + 64;
3315*600f14f4SXin Li
3316*600f14f4SXin Li /*
3317*600f14f4SXin Li * First, we set an upper and lower bound on where in the
3318*600f14f4SXin Li * stream we will search. For now we take the current position
3319*600f14f4SXin Li * as one bound and, depending on where the target position lies,
3320*600f14f4SXin Li * the beginning of the first frame or the end of the stream as
3321*600f14f4SXin Li * the other bound.
3322*600f14f4SXin Li */
3323*600f14f4SXin Li lower_bound = first_frame_offset;
3324*600f14f4SXin Li lower_bound_sample = 0;
3325*600f14f4SXin Li upper_bound = stream_length;
3326*600f14f4SXin Li upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/;
3327*600f14f4SXin Li
3328*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC &&
3329*600f14f4SXin Li decoder->private_->samples_decoded != 0) {
3330*600f14f4SXin Li if(target_sample < decoder->private_->samples_decoded) {
3331*600f14f4SXin Li if(FLAC__stream_decoder_get_decode_position(decoder, &upper_bound))
3332*600f14f4SXin Li upper_bound_sample = decoder->private_->samples_decoded;
3333*600f14f4SXin Li } else {
3334*600f14f4SXin Li if(FLAC__stream_decoder_get_decode_position(decoder, &lower_bound))
3335*600f14f4SXin Li lower_bound_sample = decoder->private_->samples_decoded;
3336*600f14f4SXin Li }
3337*600f14f4SXin Li }
3338*600f14f4SXin Li
3339*600f14f4SXin Li /*
3340*600f14f4SXin Li * Now we refine the bounds if we have a seektable with
3341*600f14f4SXin Li * suitable points. Note that according to the spec they
3342*600f14f4SXin Li * must be ordered by ascending sample number.
3343*600f14f4SXin Li *
3344*600f14f4SXin Li * Note: to protect against invalid seek tables we will ignore points
3345*600f14f4SXin Li * that have frame_samples==0 or sample_number>=total_samples. Also,
3346*600f14f4SXin Li * because math is limited to 64-bit ints, seekpoints with an offset
3347*600f14f4SXin Li * larger than 2^63 (8 exbibyte) are rejected.
3348*600f14f4SXin Li */
3349*600f14f4SXin Li if(seek_table) {
3350*600f14f4SXin Li FLAC__uint64 new_lower_bound = lower_bound;
3351*600f14f4SXin Li FLAC__uint64 new_upper_bound = upper_bound;
3352*600f14f4SXin Li FLAC__uint64 new_lower_bound_sample = lower_bound_sample;
3353*600f14f4SXin Li FLAC__uint64 new_upper_bound_sample = upper_bound_sample;
3354*600f14f4SXin Li
3355*600f14f4SXin Li /* find the closest seek point <= target_sample, if it exists */
3356*600f14f4SXin Li for(i = (int)seek_table->num_points - 1; i >= 0; i--) {
3357*600f14f4SXin Li if(
3358*600f14f4SXin Li seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER &&
3359*600f14f4SXin Li seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */
3360*600f14f4SXin Li (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */
3361*600f14f4SXin Li seek_table->points[i].sample_number <= target_sample
3362*600f14f4SXin Li )
3363*600f14f4SXin Li break;
3364*600f14f4SXin Li }
3365*600f14f4SXin Li if(i >= 0) { /* i.e. we found a suitable seek point... */
3366*600f14f4SXin Li new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset;
3367*600f14f4SXin Li new_lower_bound_sample = seek_table->points[i].sample_number;
3368*600f14f4SXin Li }
3369*600f14f4SXin Li
3370*600f14f4SXin Li /* find the closest seek point > target_sample, if it exists */
3371*600f14f4SXin Li for(i = 0; i < (int)seek_table->num_points; i++) {
3372*600f14f4SXin Li if(
3373*600f14f4SXin Li seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER &&
3374*600f14f4SXin Li seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */
3375*600f14f4SXin Li (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */
3376*600f14f4SXin Li seek_table->points[i].sample_number > target_sample
3377*600f14f4SXin Li )
3378*600f14f4SXin Li break;
3379*600f14f4SXin Li }
3380*600f14f4SXin Li if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */
3381*600f14f4SXin Li new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset;
3382*600f14f4SXin Li new_upper_bound_sample = seek_table->points[i].sample_number;
3383*600f14f4SXin Li }
3384*600f14f4SXin Li /* final protection against unsorted seek tables; keep original values if bogus */
3385*600f14f4SXin Li if(new_upper_bound >= new_lower_bound) {
3386*600f14f4SXin Li lower_bound = new_lower_bound;
3387*600f14f4SXin Li upper_bound = new_upper_bound;
3388*600f14f4SXin Li lower_bound_sample = new_lower_bound_sample;
3389*600f14f4SXin Li upper_bound_sample = new_upper_bound_sample;
3390*600f14f4SXin Li }
3391*600f14f4SXin Li }
3392*600f14f4SXin Li
3393*600f14f4SXin Li FLAC__ASSERT(upper_bound_sample >= lower_bound_sample);
3394*600f14f4SXin Li /* there are 2 insidious ways that the following equality occurs, which
3395*600f14f4SXin Li * we need to fix:
3396*600f14f4SXin Li * 1) total_samples is 0 (unknown) and target_sample is 0
3397*600f14f4SXin Li * 2) total_samples is 0 (unknown) and target_sample happens to be
3398*600f14f4SXin Li * exactly equal to the last seek point in the seek table; this
3399*600f14f4SXin Li * means there is no seek point above it, and upper_bound_samples
3400*600f14f4SXin Li * remains equal to the estimate (of target_samples) we made above
3401*600f14f4SXin Li * in either case it does not hurt to move upper_bound_sample up by 1
3402*600f14f4SXin Li */
3403*600f14f4SXin Li if(upper_bound_sample == lower_bound_sample)
3404*600f14f4SXin Li upper_bound_sample++;
3405*600f14f4SXin Li
3406*600f14f4SXin Li decoder->private_->target_sample = target_sample;
3407*600f14f4SXin Li while(1) {
3408*600f14f4SXin Li /* check whether decoder is still valid so bad state isn't overwritten
3409*600f14f4SXin Li * with seek error */
3410*600f14f4SXin Li if(decoder->protected_->state == FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR ||
3411*600f14f4SXin Li decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED)
3412*600f14f4SXin Li return false;
3413*600f14f4SXin Li /* check if the bounds are still ok */
3414*600f14f4SXin Li if (lower_bound_sample >= upper_bound_sample ||
3415*600f14f4SXin Li lower_bound > upper_bound ||
3416*600f14f4SXin Li upper_bound >= INT64_MAX) {
3417*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3418*600f14f4SXin Li return false;
3419*600f14f4SXin Li }
3420*600f14f4SXin Li if(seek_from_lower_bound) {
3421*600f14f4SXin Li pos = lower_bound;
3422*600f14f4SXin Li }
3423*600f14f4SXin Li else {
3424*600f14f4SXin Li #ifndef FLAC__INTEGER_ONLY_LIBRARY
3425*600f14f4SXin Li pos = (FLAC__int64)lower_bound + (FLAC__int64)((double)(target_sample - lower_bound_sample) / (double)(upper_bound_sample - lower_bound_sample) * (double)(upper_bound - lower_bound)) - approx_bytes_per_frame;
3426*600f14f4SXin Li #else
3427*600f14f4SXin Li /* a little less accurate: */
3428*600f14f4SXin Li if(upper_bound - lower_bound < 0xffffffff)
3429*600f14f4SXin Li pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame;
3430*600f14f4SXin Li else { /* @@@ WATCHOUT, ~2TB limit */
3431*600f14f4SXin Li FLAC__uint64 ratio = (1<<16) / (upper_bound_sample - lower_bound_sample);
3432*600f14f4SXin Li pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8) * ratio)) - approx_bytes_per_frame;
3433*600f14f4SXin Li }
3434*600f14f4SXin Li #endif
3435*600f14f4SXin Li }
3436*600f14f4SXin Li if(pos >= (FLAC__int64)upper_bound)
3437*600f14f4SXin Li pos = (FLAC__int64)upper_bound - 1;
3438*600f14f4SXin Li if(pos < (FLAC__int64)lower_bound)
3439*600f14f4SXin Li pos = (FLAC__int64)lower_bound;
3440*600f14f4SXin Li if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) {
3441*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3442*600f14f4SXin Li return false;
3443*600f14f4SXin Li }
3444*600f14f4SXin Li if(!FLAC__stream_decoder_flush(decoder)) {
3445*600f14f4SXin Li /* above call sets the state for us */
3446*600f14f4SXin Li return false;
3447*600f14f4SXin Li }
3448*600f14f4SXin Li /* Now we need to get a frame. First we need to reset our
3449*600f14f4SXin Li * unparseable_frame_count; if we get too many unparseable
3450*600f14f4SXin Li * frames in a row, the read callback will return
3451*600f14f4SXin Li * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing
3452*600f14f4SXin Li * FLAC__stream_decoder_process_single() to return false.
3453*600f14f4SXin Li */
3454*600f14f4SXin Li decoder->private_->unparseable_frame_count = 0;
3455*600f14f4SXin Li if(!FLAC__stream_decoder_process_single(decoder) || decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED || 0 == decoder->private_->samples_decoded) {
3456*600f14f4SXin Li /* No frame could be decoded */
3457*600f14f4SXin Li if(decoder->protected_->state != FLAC__STREAM_DECODER_ABORTED && decoder->private_->eof_callback(decoder, decoder->private_->client_data) && !seek_from_lower_bound){
3458*600f14f4SXin Li /* decoder has hit end of stream while processing corrupt
3459*600f14f4SXin Li * frame. To remedy this, try decoding a frame at the lower
3460*600f14f4SXin Li * bound so the seek after that hopefully ends up somewhere
3461*600f14f4SXin Li * else */
3462*600f14f4SXin Li seek_from_lower_bound = true;
3463*600f14f4SXin Li continue;
3464*600f14f4SXin Li }
3465*600f14f4SXin Li else {
3466*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3467*600f14f4SXin Li return false;
3468*600f14f4SXin Li }
3469*600f14f4SXin Li }
3470*600f14f4SXin Li seek_from_lower_bound = false;
3471*600f14f4SXin Li
3472*600f14f4SXin Li /* our write callback will change the state when it gets to the target frame */
3473*600f14f4SXin Li /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */
3474*600f14f4SXin Li if(!decoder->private_->is_seeking)
3475*600f14f4SXin Li break;
3476*600f14f4SXin Li
3477*600f14f4SXin Li FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
3478*600f14f4SXin Li this_frame_sample = decoder->private_->last_frame.header.number.sample_number;
3479*600f14f4SXin Li
3480*600f14f4SXin Li if(this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek) {
3481*600f14f4SXin Li if (pos == (FLAC__int64)lower_bound) {
3482*600f14f4SXin Li /* can't move back any more than the first frame, something is fatally wrong */
3483*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3484*600f14f4SXin Li return false;
3485*600f14f4SXin Li }
3486*600f14f4SXin Li /* our last move backwards wasn't big enough, try again */
3487*600f14f4SXin Li approx_bytes_per_frame = (approx_bytes_per_frame > (upper_bound - lower_bound)) ? (upper_bound - lower_bound) : approx_bytes_per_frame ? approx_bytes_per_frame * 2 : 16;
3488*600f14f4SXin Li continue;
3489*600f14f4SXin Li }
3490*600f14f4SXin Li /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */
3491*600f14f4SXin Li first_seek = false;
3492*600f14f4SXin Li
3493*600f14f4SXin Li /* make sure we are not seeking in corrupted stream */
3494*600f14f4SXin Li if (this_frame_sample < lower_bound_sample) {
3495*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3496*600f14f4SXin Li return false;
3497*600f14f4SXin Li }
3498*600f14f4SXin Li
3499*600f14f4SXin Li /* we need to narrow the search */
3500*600f14f4SXin Li if(target_sample < this_frame_sample) {
3501*600f14f4SXin Li upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize;
3502*600f14f4SXin Li /*@@@@@@ what will decode position be if at end of stream? */
3503*600f14f4SXin Li if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) {
3504*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3505*600f14f4SXin Li return false;
3506*600f14f4SXin Li }
3507*600f14f4SXin Li approx_bytes_per_frame = (uint32_t)(2 * (upper_bound - pos) / 3 + 16);
3508*600f14f4SXin Li }
3509*600f14f4SXin Li else { /* target_sample >= this_frame_sample + this frame's blocksize */
3510*600f14f4SXin Li lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize;
3511*600f14f4SXin Li if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) {
3512*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3513*600f14f4SXin Li return false;
3514*600f14f4SXin Li }
3515*600f14f4SXin Li approx_bytes_per_frame = (uint32_t)(2 * (lower_bound - pos) / 3 + 16);
3516*600f14f4SXin Li }
3517*600f14f4SXin Li }
3518*600f14f4SXin Li
3519*600f14f4SXin Li return true;
3520*600f14f4SXin Li }
3521*600f14f4SXin Li
3522*600f14f4SXin Li #if FLAC__HAS_OGG
seek_to_absolute_sample_ogg_(FLAC__StreamDecoder * decoder,FLAC__uint64 stream_length,FLAC__uint64 target_sample)3523*600f14f4SXin Li FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample)
3524*600f14f4SXin Li {
3525*600f14f4SXin Li FLAC__uint64 left_pos = 0, right_pos = stream_length;
3526*600f14f4SXin Li FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder);
3527*600f14f4SXin Li FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1;
3528*600f14f4SXin Li FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */
3529*600f14f4SXin Li FLAC__bool did_a_seek;
3530*600f14f4SXin Li uint32_t iteration = 0;
3531*600f14f4SXin Li
3532*600f14f4SXin Li /* In the first iterations, we will calculate the target byte position
3533*600f14f4SXin Li * by the distance from the target sample to left_sample and
3534*600f14f4SXin Li * right_sample (let's call it "proportional search"). After that, we
3535*600f14f4SXin Li * will switch to binary search.
3536*600f14f4SXin Li */
3537*600f14f4SXin Li uint32_t BINARY_SEARCH_AFTER_ITERATION = 2;
3538*600f14f4SXin Li
3539*600f14f4SXin Li /* We will switch to a linear search once our current sample is less
3540*600f14f4SXin Li * than this number of samples ahead of the target sample
3541*600f14f4SXin Li */
3542*600f14f4SXin Li static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2;
3543*600f14f4SXin Li
3544*600f14f4SXin Li /* If the total number of samples is unknown, use a large value, and
3545*600f14f4SXin Li * force binary search immediately.
3546*600f14f4SXin Li */
3547*600f14f4SXin Li if(right_sample == 0) {
3548*600f14f4SXin Li right_sample = (FLAC__uint64)(-1);
3549*600f14f4SXin Li BINARY_SEARCH_AFTER_ITERATION = 0;
3550*600f14f4SXin Li }
3551*600f14f4SXin Li
3552*600f14f4SXin Li decoder->private_->target_sample = target_sample;
3553*600f14f4SXin Li for( ; ; iteration++) {
3554*600f14f4SXin Li /* Do sanity checks on bounds */
3555*600f14f4SXin Li if(right_pos <= left_pos || right_pos - left_pos < 9) {
3556*600f14f4SXin Li /* FLAC frame is at least 9 byte in size */
3557*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3558*600f14f4SXin Li return false;
3559*600f14f4SXin Li }
3560*600f14f4SXin Li if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) {
3561*600f14f4SXin Li if (iteration >= BINARY_SEARCH_AFTER_ITERATION) {
3562*600f14f4SXin Li pos = (right_pos + left_pos) / 2;
3563*600f14f4SXin Li }
3564*600f14f4SXin Li else {
3565*600f14f4SXin Li #ifndef FLAC__INTEGER_ONLY_LIBRARY
3566*600f14f4SXin Li pos = (FLAC__uint64)((double)(target_sample - left_sample) / (double)(right_sample - left_sample) * (double)(right_pos - left_pos));
3567*600f14f4SXin Li #else
3568*600f14f4SXin Li /* a little less accurate: */
3569*600f14f4SXin Li if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff))
3570*600f14f4SXin Li pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample));
3571*600f14f4SXin Li else /* @@@ WATCHOUT, ~2TB limit */
3572*600f14f4SXin Li pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16));
3573*600f14f4SXin Li #endif
3574*600f14f4SXin Li /* @@@ TODO: might want to limit pos to some distance
3575*600f14f4SXin Li * before EOF, to make sure we land before the last frame,
3576*600f14f4SXin Li * thereby getting a this_frame_sample and so having a better
3577*600f14f4SXin Li * estimate.
3578*600f14f4SXin Li */
3579*600f14f4SXin Li }
3580*600f14f4SXin Li
3581*600f14f4SXin Li /* physical seek */
3582*600f14f4SXin Li if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) {
3583*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3584*600f14f4SXin Li return false;
3585*600f14f4SXin Li }
3586*600f14f4SXin Li if(!FLAC__stream_decoder_flush(decoder)) {
3587*600f14f4SXin Li /* above call sets the state for us */
3588*600f14f4SXin Li return false;
3589*600f14f4SXin Li }
3590*600f14f4SXin Li did_a_seek = true;
3591*600f14f4SXin Li }
3592*600f14f4SXin Li else
3593*600f14f4SXin Li did_a_seek = false;
3594*600f14f4SXin Li
3595*600f14f4SXin Li decoder->private_->got_a_frame = false;
3596*600f14f4SXin Li if(!FLAC__stream_decoder_process_single(decoder) ||
3597*600f14f4SXin Li decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) {
3598*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3599*600f14f4SXin Li return false;
3600*600f14f4SXin Li }
3601*600f14f4SXin Li if(!decoder->private_->got_a_frame) {
3602*600f14f4SXin Li if(did_a_seek) {
3603*600f14f4SXin Li /* this can happen if we seek to a point after the last frame; we drop
3604*600f14f4SXin Li * to binary search right away in this case to avoid any wasted
3605*600f14f4SXin Li * iterations of proportional search.
3606*600f14f4SXin Li */
3607*600f14f4SXin Li right_pos = pos;
3608*600f14f4SXin Li BINARY_SEARCH_AFTER_ITERATION = 0;
3609*600f14f4SXin Li }
3610*600f14f4SXin Li else {
3611*600f14f4SXin Li /* this can probably only happen if total_samples is unknown and the
3612*600f14f4SXin Li * target_sample is past the end of the stream
3613*600f14f4SXin Li */
3614*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3615*600f14f4SXin Li return false;
3616*600f14f4SXin Li }
3617*600f14f4SXin Li }
3618*600f14f4SXin Li /* our write callback will change the state when it gets to the target frame */
3619*600f14f4SXin Li else if(!decoder->private_->is_seeking) {
3620*600f14f4SXin Li break;
3621*600f14f4SXin Li }
3622*600f14f4SXin Li else {
3623*600f14f4SXin Li this_frame_sample = decoder->private_->last_frame.header.number.sample_number;
3624*600f14f4SXin Li FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
3625*600f14f4SXin Li
3626*600f14f4SXin Li if (did_a_seek) {
3627*600f14f4SXin Li if (this_frame_sample <= target_sample) {
3628*600f14f4SXin Li /* The 'equal' case should not happen, since
3629*600f14f4SXin Li * FLAC__stream_decoder_process_single()
3630*600f14f4SXin Li * should recognize that it has hit the
3631*600f14f4SXin Li * target sample and we would exit through
3632*600f14f4SXin Li * the 'break' above.
3633*600f14f4SXin Li */
3634*600f14f4SXin Li FLAC__ASSERT(this_frame_sample != target_sample);
3635*600f14f4SXin Li
3636*600f14f4SXin Li left_sample = this_frame_sample;
3637*600f14f4SXin Li /* sanity check to avoid infinite loop */
3638*600f14f4SXin Li if (left_pos == pos) {
3639*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3640*600f14f4SXin Li return false;
3641*600f14f4SXin Li }
3642*600f14f4SXin Li left_pos = pos;
3643*600f14f4SXin Li }
3644*600f14f4SXin Li else {
3645*600f14f4SXin Li right_sample = this_frame_sample;
3646*600f14f4SXin Li /* sanity check to avoid infinite loop */
3647*600f14f4SXin Li if (right_pos == pos) {
3648*600f14f4SXin Li decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR;
3649*600f14f4SXin Li return false;
3650*600f14f4SXin Li }
3651*600f14f4SXin Li right_pos = pos;
3652*600f14f4SXin Li }
3653*600f14f4SXin Li }
3654*600f14f4SXin Li }
3655*600f14f4SXin Li }
3656*600f14f4SXin Li
3657*600f14f4SXin Li return true;
3658*600f14f4SXin Li }
3659*600f14f4SXin Li #endif
3660*600f14f4SXin Li
file_read_callback_(const FLAC__StreamDecoder * decoder,FLAC__byte buffer[],size_t * bytes,void * client_data)3661*600f14f4SXin Li FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
3662*600f14f4SXin Li {
3663*600f14f4SXin Li (void)client_data;
3664*600f14f4SXin Li
3665*600f14f4SXin Li if(*bytes > 0) {
3666*600f14f4SXin Li *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file);
3667*600f14f4SXin Li if(ferror(decoder->private_->file))
3668*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
3669*600f14f4SXin Li else if(*bytes == 0)
3670*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
3671*600f14f4SXin Li else
3672*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
3673*600f14f4SXin Li }
3674*600f14f4SXin Li else
3675*600f14f4SXin Li return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
3676*600f14f4SXin Li }
3677*600f14f4SXin Li
file_seek_callback_(const FLAC__StreamDecoder * decoder,FLAC__uint64 absolute_byte_offset,void * client_data)3678*600f14f4SXin Li FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
3679*600f14f4SXin Li {
3680*600f14f4SXin Li (void)client_data;
3681*600f14f4SXin Li
3682*600f14f4SXin Li if(decoder->private_->file == stdin)
3683*600f14f4SXin Li return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED;
3684*600f14f4SXin Li else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0)
3685*600f14f4SXin Li return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
3686*600f14f4SXin Li else
3687*600f14f4SXin Li return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
3688*600f14f4SXin Li }
3689*600f14f4SXin Li
file_tell_callback_(const FLAC__StreamDecoder * decoder,FLAC__uint64 * absolute_byte_offset,void * client_data)3690*600f14f4SXin Li FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
3691*600f14f4SXin Li {
3692*600f14f4SXin Li FLAC__off_t pos;
3693*600f14f4SXin Li (void)client_data;
3694*600f14f4SXin Li
3695*600f14f4SXin Li if(decoder->private_->file == stdin)
3696*600f14f4SXin Li return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED;
3697*600f14f4SXin Li else if((pos = ftello(decoder->private_->file)) < 0)
3698*600f14f4SXin Li return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
3699*600f14f4SXin Li else {
3700*600f14f4SXin Li *absolute_byte_offset = (FLAC__uint64)pos;
3701*600f14f4SXin Li return FLAC__STREAM_DECODER_TELL_STATUS_OK;
3702*600f14f4SXin Li }
3703*600f14f4SXin Li }
3704*600f14f4SXin Li
file_length_callback_(const FLAC__StreamDecoder * decoder,FLAC__uint64 * stream_length,void * client_data)3705*600f14f4SXin Li FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
3706*600f14f4SXin Li {
3707*600f14f4SXin Li struct flac_stat_s filestats;
3708*600f14f4SXin Li (void)client_data;
3709*600f14f4SXin Li
3710*600f14f4SXin Li if(decoder->private_->file == stdin)
3711*600f14f4SXin Li return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
3712*600f14f4SXin Li
3713*600f14f4SXin Li #ifndef FLAC__USE_FILELENGTHI64
3714*600f14f4SXin Li if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0)
3715*600f14f4SXin Li #else
3716*600f14f4SXin Li filestats.st_size = _filelengthi64(fileno(decoder->private_->file));
3717*600f14f4SXin Li if(filestats.st_size < 0)
3718*600f14f4SXin Li #endif
3719*600f14f4SXin Li return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
3720*600f14f4SXin Li else {
3721*600f14f4SXin Li *stream_length = (FLAC__uint64)filestats.st_size;
3722*600f14f4SXin Li return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
3723*600f14f4SXin Li }
3724*600f14f4SXin Li }
3725*600f14f4SXin Li
file_eof_callback_(const FLAC__StreamDecoder * decoder,void * client_data)3726*600f14f4SXin Li FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data)
3727*600f14f4SXin Li {
3728*600f14f4SXin Li (void)client_data;
3729*600f14f4SXin Li
3730*600f14f4SXin Li return feof(decoder->private_->file)? true : false;
3731*600f14f4SXin Li }
3732