mirror of
https://github.com/claunia/flac.git
synced 2025-12-16 18:54:26 +00:00
new blurb-based bitbuffer design changes
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -23,23 +23,61 @@
|
|||||||
#include <stdio.h> /* for FILE */
|
#include <stdio.h> /* for FILE */
|
||||||
#include "FLAC/ordinals.h"
|
#include "FLAC/ordinals.h"
|
||||||
|
|
||||||
typedef struct {
|
/* @@@ This should be configurable. Valid values are currently 8 and 32. */
|
||||||
FLAC__byte *buffer;
|
/* @@@ WATCHOUT! do not use 32 with a little endian system yet. */
|
||||||
unsigned capacity; /* in bytes */
|
#define FLAC__BITS_PER_BLURB 8
|
||||||
unsigned bytes, bits;
|
|
||||||
unsigned total_bits; /* must always == 8*bytes+bits */
|
|
||||||
unsigned consumed_bytes, consumed_bits;
|
|
||||||
unsigned total_consumed_bits; /* must always == 8*consumed_bytes+consumed_bits */
|
|
||||||
FLAC__uint16 read_crc16;
|
|
||||||
} FLAC__BitBuffer;
|
|
||||||
|
|
||||||
void FLAC__bitbuffer_init(FLAC__BitBuffer *bb);
|
#if FLAC__BITS_PER_BLURB == 8
|
||||||
|
typedef FLAC__byte FLAC__blurb;
|
||||||
|
#elif FLAC__BITS_PER_BLURB == 32
|
||||||
|
typedef FLAC__uint32 FLAC__blurb;
|
||||||
|
#else
|
||||||
|
/* ERROR, only sizes of 8 and 32 are supported */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* opaque structure definition
|
||||||
|
*/
|
||||||
|
struct FLAC__BitBuffer;
|
||||||
|
typedef struct FLAC__BitBuffer FLAC__BitBuffer;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* construction, deletion, initialization, cloning functions
|
||||||
|
*/
|
||||||
|
FLAC__BitBuffer *FLAC__bitbuffer_new();
|
||||||
|
void FLAC__bitbuffer_delete(FLAC__BitBuffer *bb);
|
||||||
|
FLAC__bool FLAC__bitbuffer_init(FLAC__BitBuffer *bb);
|
||||||
FLAC__bool FLAC__bitbuffer_init_from(FLAC__BitBuffer *bb, const FLAC__byte buffer[], unsigned bytes);
|
FLAC__bool FLAC__bitbuffer_init_from(FLAC__BitBuffer *bb, const FLAC__byte buffer[], unsigned bytes);
|
||||||
void FLAC__bitbuffer_init_read_crc16(FLAC__BitBuffer *bb, FLAC__uint16 seed);
|
|
||||||
FLAC__bool FLAC__bitbuffer_concatenate_aligned(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src);
|
FLAC__bool FLAC__bitbuffer_concatenate_aligned(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src);
|
||||||
void FLAC__bitbuffer_free(FLAC__BitBuffer *bb); /* does not 'free(buffer)' */
|
void FLAC__bitbuffer_free(FLAC__BitBuffer *bb); /* does not 'free(buffer)' */
|
||||||
FLAC__bool FLAC__bitbuffer_clear(FLAC__BitBuffer *bb);
|
FLAC__bool FLAC__bitbuffer_clear(FLAC__BitBuffer *bb);
|
||||||
FLAC__bool FLAC__bitbuffer_clone(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src);
|
FLAC__bool FLAC__bitbuffer_clone(FLAC__BitBuffer *dest, const FLAC__BitBuffer *src);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CRC functions
|
||||||
|
*/
|
||||||
|
void FLAC__bitbuffer_reset_read_crc16(FLAC__BitBuffer *bb, FLAC__uint16 seed);
|
||||||
|
FLAC__uint16 FLAC__bitbuffer_get_read_crc16(FLAC__BitBuffer *bb);
|
||||||
|
FLAC__uint16 FLAC__bitbuffer_get_write_crc16(const FLAC__BitBuffer *bb);
|
||||||
|
FLAC__byte FLAC__bitbuffer_get_write_crc8(const FLAC__BitBuffer *bb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* info functions
|
||||||
|
*/
|
||||||
|
FLAC__bool FLAC__bitbuffer_is_byte_aligned(const FLAC__BitBuffer *bb);
|
||||||
|
FLAC__bool FLAC__bitbuffer_is_consumed_byte_aligned(const FLAC__BitBuffer *bb);
|
||||||
|
unsigned FLAC__bitbuffer_bits_left_for_byte_alignment(const FLAC__BitBuffer *bb);
|
||||||
|
unsigned FLAC__bitbuffer_get_input_bytes_unconsumed(const FLAC__BitBuffer *bb); /* do not call unless byte-aligned */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* direct buffer access
|
||||||
|
*/
|
||||||
|
void FLAC__bitbuffer_get_buffer(FLAC__BitBuffer *bb, const FLAC__byte **buffer, unsigned *bytes);
|
||||||
|
void FLAC__bitbuffer_release_buffer(FLAC__BitBuffer *bb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* write functions
|
||||||
|
*/
|
||||||
FLAC__bool FLAC__bitbuffer_write_zeroes(FLAC__BitBuffer *bb, unsigned bits);
|
FLAC__bool FLAC__bitbuffer_write_zeroes(FLAC__BitBuffer *bb, unsigned bits);
|
||||||
FLAC__bool FLAC__bitbuffer_write_raw_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val, unsigned bits);
|
FLAC__bool FLAC__bitbuffer_write_raw_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val, unsigned bits);
|
||||||
FLAC__bool FLAC__bitbuffer_write_raw_int32(FLAC__BitBuffer *bb, FLAC__int32 val, unsigned bits);
|
FLAC__bool FLAC__bitbuffer_write_raw_int32(FLAC__BitBuffer *bb, FLAC__int32 val, unsigned bits);
|
||||||
@@ -47,20 +85,34 @@ FLAC__bool FLAC__bitbuffer_write_raw_uint64(FLAC__BitBuffer *bb, FLAC__uint64 va
|
|||||||
FLAC__bool FLAC__bitbuffer_write_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 val, unsigned bits);
|
FLAC__bool FLAC__bitbuffer_write_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 val, unsigned bits);
|
||||||
FLAC__bool FLAC__bitbuffer_write_unary_unsigned(FLAC__BitBuffer *bb, unsigned val);
|
FLAC__bool FLAC__bitbuffer_write_unary_unsigned(FLAC__BitBuffer *bb, unsigned val);
|
||||||
unsigned FLAC__bitbuffer_rice_bits(int val, unsigned parameter);
|
unsigned FLAC__bitbuffer_rice_bits(int val, unsigned parameter);
|
||||||
|
#if 0 /* UNUSED */
|
||||||
unsigned FLAC__bitbuffer_golomb_bits_signed(int val, unsigned parameter);
|
unsigned FLAC__bitbuffer_golomb_bits_signed(int val, unsigned parameter);
|
||||||
unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned val, unsigned parameter);
|
unsigned FLAC__bitbuffer_golomb_bits_unsigned(unsigned val, unsigned parameter);
|
||||||
|
#endif
|
||||||
|
#ifdef FLAC__SYMMETRIC_RICE
|
||||||
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
||||||
|
#if 0 /* UNUSED */
|
||||||
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
||||||
|
#endif
|
||||||
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_escape(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
FLAC__bool FLAC__bitbuffer_write_symmetric_rice_signed_escape(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
||||||
|
#endif
|
||||||
FLAC__bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
FLAC__bool FLAC__bitbuffer_write_rice_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
||||||
|
#if 0 /* UNUSED */
|
||||||
FLAC__bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
FLAC__bool FLAC__bitbuffer_write_rice_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
||||||
|
#endif
|
||||||
|
#if 0 /* UNUSED */
|
||||||
FLAC__bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
FLAC__bool FLAC__bitbuffer_write_golomb_signed(FLAC__BitBuffer *bb, int val, unsigned parameter);
|
||||||
FLAC__bool FLAC__bitbuffer_write_golomb_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
FLAC__bool FLAC__bitbuffer_write_golomb_signed_guarded(FLAC__BitBuffer *bb, int val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
||||||
FLAC__bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned val, unsigned parameter);
|
FLAC__bool FLAC__bitbuffer_write_golomb_unsigned(FLAC__BitBuffer *bb, unsigned val, unsigned parameter);
|
||||||
FLAC__bool FLAC__bitbuffer_write_golomb_unsigned_guarded(FLAC__BitBuffer *bb, unsigned val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
FLAC__bool FLAC__bitbuffer_write_golomb_unsigned_guarded(FLAC__BitBuffer *bb, unsigned val, unsigned parameter, unsigned max_bits, FLAC__bool *overflow);
|
||||||
|
#endif
|
||||||
FLAC__bool FLAC__bitbuffer_write_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val);
|
FLAC__bool FLAC__bitbuffer_write_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 val);
|
||||||
FLAC__bool FLAC__bitbuffer_write_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 val);
|
FLAC__bool FLAC__bitbuffer_write_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 val);
|
||||||
FLAC__bool FLAC__bitbuffer_zero_pad_to_byte_boundary(FLAC__BitBuffer *bb);
|
FLAC__bool FLAC__bitbuffer_zero_pad_to_byte_boundary(FLAC__BitBuffer *bb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read functions
|
||||||
|
*/
|
||||||
FLAC__bool FLAC__bitbuffer_peek_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_peek_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
FLAC__bool FLAC__bitbuffer_read_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_bit(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
FLAC__bool FLAC__bitbuffer_read_bit_to_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_bit_to_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
@@ -70,10 +122,14 @@ FLAC__bool FLAC__bitbuffer_read_raw_int32(FLAC__BitBuffer *bb, FLAC__int32 *val,
|
|||||||
FLAC__bool FLAC__bitbuffer_read_raw_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_raw_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
FLAC__bool FLAC__bitbuffer_read_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_raw_int64(FLAC__BitBuffer *bb, FLAC__int64 *val, const unsigned bits, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
FLAC__bool FLAC__bitbuffer_read_unary_unsigned(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_unary_unsigned(FLAC__BitBuffer *bb, unsigned *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
|
#ifdef FLAC__SYMMETRIC_RICE
|
||||||
FLAC__bool FLAC__bitbuffer_read_symmetric_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_symmetric_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
|
#endif
|
||||||
FLAC__bool FLAC__bitbuffer_read_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_rice_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
|
#if 0 /* UNUSED */
|
||||||
FLAC__bool FLAC__bitbuffer_read_golomb_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_golomb_signed(FLAC__BitBuffer *bb, int *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
FLAC__bool FLAC__bitbuffer_read_golomb_unsigned(FLAC__BitBuffer *bb, unsigned *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
FLAC__bool FLAC__bitbuffer_read_golomb_unsigned(FLAC__BitBuffer *bb, unsigned *val, unsigned parameter, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data);
|
||||||
|
#endif
|
||||||
FLAC__bool FLAC__bitbuffer_read_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen);
|
FLAC__bool FLAC__bitbuffer_read_utf8_uint32(FLAC__BitBuffer *bb, FLAC__uint32 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen);
|
||||||
FLAC__bool FLAC__bitbuffer_read_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen);
|
FLAC__bool FLAC__bitbuffer_read_utf8_uint64(FLAC__BitBuffer *bb, FLAC__uint64 *val, FLAC__bool (*read_callback)(FLAC__byte buffer[], unsigned *bytes, void *client_data), void *client_data, FLAC__byte *raw, unsigned *rawlen);
|
||||||
void FLAC__bitbuffer_dump(const FLAC__BitBuffer *bb, FILE *out);
|
void FLAC__bitbuffer_dump(const FLAC__BitBuffer *bb, FILE *out);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ typedef struct FLAC__StreamDecoderPrivate {
|
|||||||
void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
|
||||||
void *client_data;
|
void *client_data;
|
||||||
FLAC__BitBuffer input;
|
FLAC__BitBuffer *input;
|
||||||
FLAC__int32 *output[FLAC__MAX_CHANNELS];
|
FLAC__int32 *output[FLAC__MAX_CHANNELS];
|
||||||
FLAC__int32 *residual[FLAC__MAX_CHANNELS];
|
FLAC__int32 *residual[FLAC__MAX_CHANNELS];
|
||||||
unsigned output_capacity, output_channels;
|
unsigned output_capacity, output_channels;
|
||||||
@@ -151,6 +151,13 @@ FLAC__StreamDecoder *FLAC__stream_decoder_new()
|
|||||||
free(decoder);
|
free(decoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
decoder->private_->input = FLAC__bitbuffer_new();
|
||||||
|
if(decoder->private_->input == 0) {
|
||||||
|
free(decoder->private_);
|
||||||
|
free(decoder->protected_);
|
||||||
|
free(decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED;
|
decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED;
|
||||||
|
|
||||||
@@ -168,7 +175,9 @@ void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder)
|
|||||||
FLAC__ASSERT(decoder != 0);
|
FLAC__ASSERT(decoder != 0);
|
||||||
FLAC__ASSERT(decoder->protected_ != 0);
|
FLAC__ASSERT(decoder->protected_ != 0);
|
||||||
FLAC__ASSERT(decoder->private_ != 0);
|
FLAC__ASSERT(decoder->private_ != 0);
|
||||||
|
FLAC__ASSERT(decoder->private_->input != 0);
|
||||||
|
|
||||||
|
FLAC__bitbuffer_delete(decoder->private_->input);
|
||||||
free(decoder->private_);
|
free(decoder->private_);
|
||||||
free(decoder->protected_);
|
free(decoder->protected_);
|
||||||
free(decoder);
|
free(decoder);
|
||||||
@@ -194,7 +203,8 @@ FLAC__StreamDecoderState FLAC__stream_decoder_init(FLAC__StreamDecoder *decoder)
|
|||||||
if(0 == decoder->private_->read_callback || 0 == decoder->private_->write_callback || 0 == decoder->private_->metadata_callback || 0 == decoder->private_->error_callback)
|
if(0 == decoder->private_->read_callback || 0 == decoder->private_->write_callback || 0 == decoder->private_->metadata_callback || 0 == decoder->private_->error_callback)
|
||||||
return decoder->protected_->state = FLAC__STREAM_DECODER_INVALID_CALLBACK;
|
return decoder->protected_->state = FLAC__STREAM_DECODER_INVALID_CALLBACK;
|
||||||
|
|
||||||
FLAC__bitbuffer_init(&decoder->private_->input);
|
if(!FLAC__bitbuffer_init(decoder->private_->input))
|
||||||
|
return decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
|
||||||
|
|
||||||
for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
|
for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
|
||||||
decoder->private_->output[i] = 0;
|
decoder->private_->output[i] = 0;
|
||||||
@@ -248,7 +258,7 @@ void FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder)
|
|||||||
free(decoder->private_->seek_table.data.seek_table.points);
|
free(decoder->private_->seek_table.data.seek_table.points);
|
||||||
decoder->private_->seek_table.data.seek_table.points = 0;
|
decoder->private_->seek_table.data.seek_table.points = 0;
|
||||||
}
|
}
|
||||||
FLAC__bitbuffer_free(&decoder->private_->input);
|
FLAC__bitbuffer_free(decoder->private_->input);
|
||||||
for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
|
for(i = 0; i < FLAC__MAX_CHANNELS; i++) {
|
||||||
/* WATCHOUT: FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the output arrays have a buffer of up to 3 zeroes in front (at negative indices) for alignment purposes; we use 4 to keep the data well-aligned. */
|
/* WATCHOUT: FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the output arrays have a buffer of up to 3 zeroes in front (at negative indices) for alignment purposes; we use 4 to keep the data well-aligned. */
|
||||||
if(decoder->private_->output[i] != 0) {
|
if(decoder->private_->output[i] != 0) {
|
||||||
@@ -339,7 +349,7 @@ FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder)
|
|||||||
{
|
{
|
||||||
FLAC__ASSERT(decoder != 0);
|
FLAC__ASSERT(decoder != 0);
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_clear(&decoder->private_->input)) {
|
if(!FLAC__bitbuffer_clear(decoder->private_->input)) {
|
||||||
decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
|
decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -507,7 +517,7 @@ FLAC__bool FLAC__stream_decoder_process_remaining_frames(FLAC__StreamDecoder *de
|
|||||||
unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder)
|
unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder)
|
||||||
{
|
{
|
||||||
FLAC__ASSERT(decoder != 0);
|
FLAC__ASSERT(decoder != 0);
|
||||||
return decoder->private_->input.bytes - decoder->private_->input.consumed_bytes;
|
return FLAC__bitbuffer_get_input_bytes_unconsumed(decoder->private_->input);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
@@ -567,7 +577,7 @@ FLAC__bool stream_decoder_find_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
unsigned i, id;
|
unsigned i, id;
|
||||||
FLAC__bool first = true;
|
FLAC__bool first = true;
|
||||||
|
|
||||||
FLAC__ASSERT(decoder->private_->input.consumed_bits == 0); /* make sure we're byte aligned */
|
FLAC__ASSERT(FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input));
|
||||||
|
|
||||||
for(i = id = 0; i < 4; ) {
|
for(i = id = 0; i < 4; ) {
|
||||||
if(decoder->private_->cached) {
|
if(decoder->private_->cached) {
|
||||||
@@ -575,7 +585,7 @@ FLAC__bool stream_decoder_find_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
decoder->private_->cached = false;
|
decoder->private_->cached = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
if(x == FLAC__STREAM_SYNC_STRING[i]) {
|
if(x == FLAC__STREAM_SYNC_STRING[i]) {
|
||||||
@@ -595,7 +605,7 @@ FLAC__bool stream_decoder_find_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
||||||
decoder->private_->header_warmup[0] = (FLAC__byte)x;
|
decoder->private_->header_warmup[0] = (FLAC__byte)x;
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
|
|
||||||
/* 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 */
|
/* 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 */
|
||||||
@@ -626,13 +636,13 @@ FLAC__bool stream_decoder_read_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
FLAC__uint32 i, x, last_block, type, length;
|
FLAC__uint32 i, x, last_block, type, length;
|
||||||
FLAC__uint64 xx;
|
FLAC__uint64 xx;
|
||||||
|
|
||||||
FLAC__ASSERT(decoder->private_->input.consumed_bits == 0); /* make sure we're byte aligned */
|
FLAC__ASSERT(FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input));
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &last_block, FLAC__STREAM_METADATA_IS_LAST_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &last_block, FLAC__STREAM_METADATA_IS_LAST_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(type == FLAC__METADATA_TYPE_STREAMINFO) {
|
if(type == FLAC__METADATA_TYPE_STREAMINFO) {
|
||||||
unsigned used_bits = 0;
|
unsigned used_bits = 0;
|
||||||
@@ -640,47 +650,47 @@ FLAC__bool stream_decoder_read_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
decoder->private_->stream_info.is_last = last_block;
|
decoder->private_->stream_info.is_last = last_block;
|
||||||
decoder->private_->stream_info.length = length;
|
decoder->private_->stream_info.length = length;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.min_blocksize = x;
|
decoder->private_->stream_info.data.stream_info.min_blocksize = x;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.max_blocksize = x;
|
decoder->private_->stream_info.data.stream_info.max_blocksize = x;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.min_framesize = x;
|
decoder->private_->stream_info.data.stream_info.min_framesize = x;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.max_framesize = x;
|
decoder->private_->stream_info.data.stream_info.max_framesize = x;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.sample_rate = x;
|
decoder->private_->stream_info.data.stream_info.sample_rate = x;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.channels = x+1;
|
decoder->private_->stream_info.data.stream_info.channels = x+1;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1;
|
decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1;
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint64(&decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
used_bits += FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN;
|
used_bits += FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN;
|
||||||
|
|
||||||
for(i = 0; i < 16; i++) {
|
for(i = 0; i < 16; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->stream_info.data.stream_info.md5sum[i] = (FLAC__byte)x;
|
decoder->private_->stream_info.data.stream_info.md5sum[i] = (FLAC__byte)x;
|
||||||
}
|
}
|
||||||
@@ -690,7 +700,7 @@ FLAC__bool stream_decoder_read_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
FLAC__ASSERT(used_bits % 8 == 0);
|
FLAC__ASSERT(used_bits % 8 == 0);
|
||||||
length -= (used_bits / 8);
|
length -= (used_bits / 8);
|
||||||
for(i = 0; i < length; i++) {
|
for(i = 0; i < length; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,15 +721,15 @@ FLAC__bool stream_decoder_read_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for(i = real_points = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) {
|
for(i = real_points = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint64(&decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->seek_table.data.seek_table.points[real_points].sample_number = xx;
|
decoder->private_->seek_table.data.seek_table.points[real_points].sample_number = xx;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint64(&decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->seek_table.data.seek_table.points[real_points].stream_offset = xx;
|
decoder->private_->seek_table.data.seek_table.points[real_points].stream_offset = xx;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->seek_table.data.seek_table.points[real_points].frame_samples = x;
|
decoder->private_->seek_table.data.seek_table.points[real_points].frame_samples = x;
|
||||||
|
|
||||||
@@ -734,7 +744,7 @@ FLAC__bool stream_decoder_read_metadata_(FLAC__StreamDecoder *decoder)
|
|||||||
else {
|
else {
|
||||||
/* skip other metadata blocks */
|
/* skip other metadata blocks */
|
||||||
for(i = 0; i < length; i++) {
|
for(i = 0; i < length; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -751,19 +761,19 @@ FLAC__bool stream_decoder_skip_id3v2_tag_(FLAC__StreamDecoder *decoder)
|
|||||||
unsigned i, skip;
|
unsigned i, skip;
|
||||||
|
|
||||||
/* skip the version and flags bytes */
|
/* skip the version and flags bytes */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 24, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 24, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
/* get the size (in bytes) to skip */
|
/* get the size (in bytes) to skip */
|
||||||
skip = 0;
|
skip = 0;
|
||||||
for(i = 0; i < 4; i++) {
|
for(i = 0; i < 4; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
skip <<= 7;
|
skip <<= 7;
|
||||||
skip |= (x & 0x7f);
|
skip |= (x & 0x7f);
|
||||||
}
|
}
|
||||||
/* skip the rest of the tag */
|
/* skip the rest of the tag */
|
||||||
for(i = 0; i < skip; i++) {
|
for(i = 0; i < skip; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -784,8 +794,8 @@ FLAC__bool stream_decoder_frame_sync_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* make sure we're byte aligned */
|
/* make sure we're byte aligned */
|
||||||
if(decoder->private_->input.consumed_bits != 0) {
|
if(!FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input)) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8-decoder->private_->input.consumed_bits, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__bitbuffer_bits_left_for_byte_alignment(decoder->private_->input), read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -795,12 +805,12 @@ FLAC__bool stream_decoder_frame_sync_(FLAC__StreamDecoder *decoder)
|
|||||||
decoder->private_->cached = false;
|
decoder->private_->cached = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
}
|
}
|
||||||
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
||||||
decoder->private_->header_warmup[0] = (FLAC__byte)x;
|
decoder->private_->header_warmup[0] = (FLAC__byte)x;
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
|
|
||||||
/* 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 */
|
/* 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 */
|
||||||
@@ -838,7 +848,7 @@ FLAC__bool stream_decoder_read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *
|
|||||||
frame_crc = 0;
|
frame_crc = 0;
|
||||||
FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc);
|
FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc);
|
||||||
FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc);
|
FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc);
|
||||||
FLAC__bitbuffer_init_read_crc16(&decoder->private_->input, frame_crc);
|
FLAC__bitbuffer_reset_read_crc16(decoder->private_->input, frame_crc);
|
||||||
|
|
||||||
if(!stream_decoder_read_frame_header_(decoder))
|
if(!stream_decoder_read_frame_header_(decoder))
|
||||||
return false;
|
return false;
|
||||||
@@ -889,8 +899,8 @@ FLAC__bool stream_decoder_read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *
|
|||||||
/*
|
/*
|
||||||
* Read the frame CRC-16 from the footer and check
|
* Read the frame CRC-16 from the footer and check
|
||||||
*/
|
*/
|
||||||
frame_crc = decoder->private_->input.read_crc16;
|
frame_crc = FLAC__bitbuffer_get_read_crc16(decoder->private_->input);
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(frame_crc == (FLAC__uint16)x) {
|
if(frame_crc == (FLAC__uint16)x) {
|
||||||
/* Undo any special channel coding */
|
/* Undo any special channel coding */
|
||||||
@@ -967,7 +977,7 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
const FLAC__bool is_known_variable_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize);
|
const FLAC__bool is_known_variable_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize);
|
||||||
const FLAC__bool is_known_fixed_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize);
|
const FLAC__bool is_known_fixed_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize);
|
||||||
|
|
||||||
FLAC__ASSERT(decoder->private_->input.consumed_bits == 0); /* make sure we're byte aligned */
|
FLAC__ASSERT(FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input));
|
||||||
|
|
||||||
/* init the raw header with the saved bits from synchronization */
|
/* init the raw header with the saved bits from synchronization */
|
||||||
raw_header[0] = decoder->private_->header_warmup[0];
|
raw_header[0] = decoder->private_->header_warmup[0];
|
||||||
@@ -991,7 +1001,7 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
* read in the raw header as bytes so we can CRC it, and parse it on the way
|
* read in the raw header as bytes so we can CRC it, and parse it on the way
|
||||||
*/
|
*/
|
||||||
for(i = 0; i < 2; i++) {
|
for(i = 0; i < 2; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */
|
||||||
/* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */
|
/* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */
|
||||||
@@ -1149,7 +1159,7 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(blocksize_hint && is_known_variable_blocksize_stream) {
|
if(blocksize_hint && is_known_variable_blocksize_stream) {
|
||||||
if(!FLAC__bitbuffer_read_utf8_uint64(&decoder->private_->input, &xx, read_callback_, decoder, raw_header, &raw_header_len))
|
if(!FLAC__bitbuffer_read_utf8_uint64(decoder->private_->input, &xx, read_callback_, decoder, raw_header, &raw_header_len))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(xx == 0xffffffffffffffff) { /* i.e. non-UTF8 code... */
|
if(xx == 0xffffffffffffffff) { /* i.e. non-UTF8 code... */
|
||||||
decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
|
decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
|
||||||
@@ -1162,7 +1172,7 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
decoder->private_->frame.header.number.sample_number = xx;
|
decoder->private_->frame.header.number.sample_number = xx;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!FLAC__bitbuffer_read_utf8_uint32(&decoder->private_->input, &x, read_callback_, decoder, raw_header, &raw_header_len))
|
if(!FLAC__bitbuffer_read_utf8_uint32(decoder->private_->input, &x, read_callback_, decoder, raw_header, &raw_header_len))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(x == 0xffffffff) { /* i.e. non-UTF8 code... */
|
if(x == 0xffffffff) { /* i.e. non-UTF8 code... */
|
||||||
decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
|
decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
|
||||||
@@ -1182,12 +1192,12 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(blocksize_hint) {
|
if(blocksize_hint) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
raw_header[raw_header_len++] = (FLAC__byte)x;
|
raw_header[raw_header_len++] = (FLAC__byte)x;
|
||||||
if(blocksize_hint == 7) {
|
if(blocksize_hint == 7) {
|
||||||
FLAC__uint32 _x;
|
FLAC__uint32 _x;
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &_x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &_x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
raw_header[raw_header_len++] = (FLAC__byte)_x;
|
raw_header[raw_header_len++] = (FLAC__byte)_x;
|
||||||
x = (x << 8) | _x;
|
x = (x << 8) | _x;
|
||||||
@@ -1196,12 +1206,12 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(sample_rate_hint) {
|
if(sample_rate_hint) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
raw_header[raw_header_len++] = (FLAC__byte)x;
|
raw_header[raw_header_len++] = (FLAC__byte)x;
|
||||||
if(sample_rate_hint != 12) {
|
if(sample_rate_hint != 12) {
|
||||||
FLAC__uint32 _x;
|
FLAC__uint32 _x;
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &_x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &_x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
raw_header[raw_header_len++] = (FLAC__byte)_x;
|
raw_header[raw_header_len++] = (FLAC__byte)_x;
|
||||||
x = (x << 8) | _x;
|
x = (x << 8) | _x;
|
||||||
@@ -1215,7 +1225,7 @@ FLAC__bool stream_decoder_read_frame_header_(FLAC__StreamDecoder *decoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* read the CRC-8 byte */
|
/* read the CRC-8 byte */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
crc8 = (FLAC__byte)x;
|
crc8 = (FLAC__byte)x;
|
||||||
|
|
||||||
@@ -1238,7 +1248,7 @@ FLAC__bool stream_decoder_read_subframe_(FLAC__StreamDecoder *decoder, unsigned
|
|||||||
FLAC__uint32 x;
|
FLAC__uint32 x;
|
||||||
FLAC__bool wasted_bits;
|
FLAC__bool wasted_bits;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &x, 8, read_callback_, decoder)) /* MAGIC NUMBER */
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder)) /* MAGIC NUMBER */
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
|
|
||||||
wasted_bits = (x & 1);
|
wasted_bits = (x & 1);
|
||||||
@@ -1246,7 +1256,7 @@ FLAC__bool stream_decoder_read_subframe_(FLAC__StreamDecoder *decoder, unsigned
|
|||||||
|
|
||||||
if(wasted_bits) {
|
if(wasted_bits) {
|
||||||
unsigned u;
|
unsigned u;
|
||||||
if(!FLAC__bitbuffer_read_unary_unsigned(&decoder->private_->input, &u, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_unary_unsigned(decoder->private_->input, &u, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
decoder->private_->frame.subframes[channel].wasted_bits = u+1;
|
decoder->private_->frame.subframes[channel].wasted_bits = u+1;
|
||||||
bps -= decoder->private_->frame.subframes[channel].wasted_bits;
|
bps -= decoder->private_->frame.subframes[channel].wasted_bits;
|
||||||
@@ -1306,7 +1316,7 @@ FLAC__bool stream_decoder_read_subframe_constant_(FLAC__StreamDecoder *decoder,
|
|||||||
|
|
||||||
decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT;
|
decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT;
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &x, bps, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &x, bps, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
|
|
||||||
subframe->value = x;
|
subframe->value = x;
|
||||||
@@ -1332,18 +1342,18 @@ FLAC__bool stream_decoder_read_subframe_fixed_(FLAC__StreamDecoder *decoder, uns
|
|||||||
|
|
||||||
/* read warm-up samples */
|
/* read warm-up samples */
|
||||||
for(u = 0; u < order; u++) {
|
for(u = 0; u < order; u++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &i32, bps, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &i32, bps, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->warmup[u] = i32;
|
subframe->warmup[u] = i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read entropy coding method info */
|
/* read entropy coding method info */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->entropy_coding_method.type = u32;
|
subframe->entropy_coding_method.type = u32;
|
||||||
switch(subframe->entropy_coding_method.type) {
|
switch(subframe->entropy_coding_method.type) {
|
||||||
case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
|
case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->entropy_coding_method.data.partitioned_rice.order = u32;
|
subframe->entropy_coding_method.data.partitioned_rice.order = u32;
|
||||||
break;
|
break;
|
||||||
@@ -1383,13 +1393,13 @@ FLAC__bool stream_decoder_read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsig
|
|||||||
|
|
||||||
/* read warm-up samples */
|
/* read warm-up samples */
|
||||||
for(u = 0; u < order; u++) {
|
for(u = 0; u < order; u++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &i32, bps, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &i32, bps, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->warmup[u] = i32;
|
subframe->warmup[u] = i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read qlp coeff precision */
|
/* read qlp coeff precision */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) {
|
if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) {
|
||||||
decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_LOST_SYNC, decoder->private_->client_data);
|
decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_LOST_SYNC, decoder->private_->client_data);
|
||||||
@@ -1399,24 +1409,24 @@ FLAC__bool stream_decoder_read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsig
|
|||||||
subframe->qlp_coeff_precision = u32+1;
|
subframe->qlp_coeff_precision = u32+1;
|
||||||
|
|
||||||
/* read qlp shift */
|
/* read qlp shift */
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->quantization_level = i32;
|
subframe->quantization_level = i32;
|
||||||
|
|
||||||
/* read quantized lp coefficiencts */
|
/* read quantized lp coefficiencts */
|
||||||
for(u = 0; u < order; u++) {
|
for(u = 0; u < order; u++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &i32, subframe->qlp_coeff_precision, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->qlp_coeff[u] = i32;
|
subframe->qlp_coeff[u] = i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read entropy coding method info */
|
/* read entropy coding method info */
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->entropy_coding_method.type = u32;
|
subframe->entropy_coding_method.type = u32;
|
||||||
switch(subframe->entropy_coding_method.type) {
|
switch(subframe->entropy_coding_method.type) {
|
||||||
case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
|
case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
subframe->entropy_coding_method.data.partitioned_rice.order = u32;
|
subframe->entropy_coding_method.data.partitioned_rice.order = u32;
|
||||||
break;
|
break;
|
||||||
@@ -1456,7 +1466,7 @@ FLAC__bool stream_decoder_read_subframe_verbatim_(FLAC__StreamDecoder *decoder,
|
|||||||
subframe->data = residual;
|
subframe->data = residual;
|
||||||
|
|
||||||
for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
|
for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &x, bps, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &x, bps, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
residual[i] = x;
|
residual[i] = x;
|
||||||
}
|
}
|
||||||
@@ -1478,27 +1488,27 @@ FLAC__bool stream_decoder_read_residual_partitioned_rice_(FLAC__StreamDecoder *d
|
|||||||
|
|
||||||
sample = 0;
|
sample = 0;
|
||||||
for(partition = 0; partition < partitions; partition++) {
|
for(partition = 0; partition < partitions; partition++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
partitioned_rice->parameters[partition] = rice_parameter;
|
partitioned_rice->parameters[partition] = rice_parameter;
|
||||||
if(rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
|
if(rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) {
|
||||||
for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) {
|
for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) {
|
||||||
#ifdef FLAC__SYMMETRIC_RICE
|
#ifdef FLAC__SYMMETRIC_RICE
|
||||||
if(!FLAC__bitbuffer_read_symmetric_rice_signed(&decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_symmetric_rice_signed(decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
#else
|
#else
|
||||||
if(!FLAC__bitbuffer_read_rice_signed(&decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_rice_signed(decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
#endif
|
#endif
|
||||||
residual[sample] = i;
|
residual[sample] = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
partitioned_rice->raw_bits[partition] = rice_parameter;
|
partitioned_rice->raw_bits[partition] = rice_parameter;
|
||||||
for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) {
|
for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) {
|
||||||
if(!FLAC__bitbuffer_read_raw_int32(&decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_int32(decoder->private_->input, &i, rice_parameter, read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
residual[sample] = i;
|
residual[sample] = i;
|
||||||
}
|
}
|
||||||
@@ -1510,9 +1520,9 @@ FLAC__bool stream_decoder_read_residual_partitioned_rice_(FLAC__StreamDecoder *d
|
|||||||
|
|
||||||
FLAC__bool stream_decoder_read_zero_padding_(FLAC__StreamDecoder *decoder)
|
FLAC__bool stream_decoder_read_zero_padding_(FLAC__StreamDecoder *decoder)
|
||||||
{
|
{
|
||||||
if(decoder->private_->input.consumed_bits != 0) {
|
if(!FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input)) {
|
||||||
FLAC__uint32 zero = 0;
|
FLAC__uint32 zero = 0;
|
||||||
if(!FLAC__bitbuffer_read_raw_uint32(&decoder->private_->input, &zero, 8-decoder->private_->input.consumed_bits, read_callback_, decoder))
|
if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitbuffer_bits_left_for_byte_alignment(decoder->private_->input), read_callback_, decoder))
|
||||||
return false; /* the read_callback_ sets the state for us */
|
return false; /* the read_callback_ sets the state for us */
|
||||||
if(zero != 0) {
|
if(zero != 0) {
|
||||||
decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_LOST_SYNC, decoder->private_->client_data);
|
decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_LOST_SYNC, decoder->private_->client_data);
|
||||||
@@ -1526,6 +1536,7 @@ FLAC__bool read_callback_(FLAC__byte buffer[], unsigned *bytes, void *client_dat
|
|||||||
{
|
{
|
||||||
FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data;
|
FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data;
|
||||||
FLAC__StreamDecoderReadStatus status;
|
FLAC__StreamDecoderReadStatus status;
|
||||||
|
|
||||||
status = decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data);
|
status = decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data);
|
||||||
if(status == FLAC__STREAM_DECODER_READ_END_OF_STREAM)
|
if(status == FLAC__STREAM_DECODER_READ_END_OF_STREAM)
|
||||||
decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM;
|
decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM;
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ typedef struct FLAC__StreamEncoderPrivate {
|
|||||||
FLAC__uint32 *abs_residual; /* workspace where abs(candidate residual) is stored */
|
FLAC__uint32 *abs_residual; /* workspace where abs(candidate residual) is stored */
|
||||||
FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */
|
FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */
|
||||||
unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */
|
unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */
|
||||||
FLAC__BitBuffer frame; /* the current frame being worked on */
|
FLAC__BitBuffer *frame; /* the current frame being worked on */
|
||||||
double loose_mid_side_stereo_frames_exact; /* exact number of frames the encoder will use before trying both independent and mid/side frames again */
|
double loose_mid_side_stereo_frames_exact; /* exact number of frames the encoder will use before trying both independent and mid/side frames again */
|
||||||
unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */
|
unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */
|
||||||
unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */
|
unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */
|
||||||
@@ -195,6 +195,13 @@ FLAC__StreamEncoder *FLAC__stream_encoder_new()
|
|||||||
free(encoder);
|
free(encoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
encoder->private_->frame = FLAC__bitbuffer_new();
|
||||||
|
if(encoder->private_->frame == 0) {
|
||||||
|
free(encoder->private_);
|
||||||
|
free(encoder->protected_);
|
||||||
|
free(encoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
|
||||||
|
|
||||||
@@ -230,7 +237,9 @@ void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder)
|
|||||||
FLAC__ASSERT(encoder != 0);
|
FLAC__ASSERT(encoder != 0);
|
||||||
FLAC__ASSERT(encoder->protected_ != 0);
|
FLAC__ASSERT(encoder->protected_ != 0);
|
||||||
FLAC__ASSERT(encoder->private_ != 0);
|
FLAC__ASSERT(encoder->private_ != 0);
|
||||||
|
FLAC__ASSERT(encoder->private_->frame != 0);
|
||||||
|
|
||||||
|
FLAC__bitbuffer_delete(encoder->private_->frame);
|
||||||
free(encoder->private_);
|
free(encoder->private_);
|
||||||
free(encoder->protected_);
|
free(encoder->protected_);
|
||||||
free(encoder);
|
free(encoder);
|
||||||
@@ -421,15 +430,14 @@ FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
|
|||||||
/* the above function sets the state for us in case of an error */
|
/* the above function sets the state for us in case of an error */
|
||||||
return encoder->protected_->state;
|
return encoder->protected_->state;
|
||||||
}
|
}
|
||||||
FLAC__bitbuffer_init(&encoder->private_->frame);
|
|
||||||
|
if(!FLAC__bitbuffer_init(encoder->private_->frame))
|
||||||
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* write the stream header
|
* write the stream header
|
||||||
*/
|
*/
|
||||||
|
if(!FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN))
|
||||||
if(!FLAC__bitbuffer_clear(&encoder->private_->frame))
|
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
|
||||||
if(!FLAC__bitbuffer_write_raw_uint32(&encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN))
|
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
|
|
||||||
encoder->private_->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;
|
encoder->private_->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;
|
||||||
@@ -445,7 +453,7 @@ FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
|
|||||||
encoder->private_->metadata.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */
|
encoder->private_->metadata.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */
|
||||||
memset(encoder->private_->metadata.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */
|
memset(encoder->private_->metadata.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */
|
||||||
MD5Init(&encoder->private_->md5context);
|
MD5Init(&encoder->private_->md5context);
|
||||||
if(!FLAC__add_metadata_block(&encoder->private_->metadata, &encoder->private_->frame))
|
if(!FLAC__add_metadata_block(&encoder->private_->metadata, encoder->private_->frame))
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
|
|
||||||
if(0 != encoder->protected_->seek_table) {
|
if(0 != encoder->protected_->seek_table) {
|
||||||
@@ -455,7 +463,7 @@ FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
|
|||||||
seek_table_block.is_last = (encoder->protected_->padding == 0 && encoder->protected_->last_metadata_is_last);
|
seek_table_block.is_last = (encoder->protected_->padding == 0 && encoder->protected_->last_metadata_is_last);
|
||||||
seek_table_block.length = encoder->protected_->seek_table->num_points * FLAC__STREAM_METADATA_SEEKPOINT_LEN;
|
seek_table_block.length = encoder->protected_->seek_table->num_points * FLAC__STREAM_METADATA_SEEKPOINT_LEN;
|
||||||
seek_table_block.data.seek_table = *encoder->protected_->seek_table;
|
seek_table_block.data.seek_table = *encoder->protected_->seek_table;
|
||||||
if(!FLAC__add_metadata_block(&seek_table_block, &encoder->private_->frame))
|
if(!FLAC__add_metadata_block(&seek_table_block, encoder->private_->frame))
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,14 +472,22 @@ FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
|
|||||||
padding_block.type = FLAC__METADATA_TYPE_PADDING;
|
padding_block.type = FLAC__METADATA_TYPE_PADDING;
|
||||||
padding_block.is_last = encoder->protected_->last_metadata_is_last;
|
padding_block.is_last = encoder->protected_->last_metadata_is_last;
|
||||||
padding_block.length = encoder->protected_->padding;
|
padding_block.length = encoder->protected_->padding;
|
||||||
if(!FLAC__add_metadata_block(&padding_block, &encoder->private_->frame))
|
if(!FLAC__add_metadata_block(&padding_block, encoder->private_->frame))
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
FLAC__ASSERT(encoder->private_->frame.bits == 0); /* assert that we're byte-aligned before writing */
|
FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
|
||||||
FLAC__ASSERT(encoder->private_->frame.total_consumed_bits == 0); /* assert that no reading of the buffer was done */
|
{
|
||||||
if(encoder->private_->write_callback(encoder, encoder->private_->frame.buffer, encoder->private_->frame.bytes, 0, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_OK)
|
FLAC__byte *buffer;
|
||||||
return encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
|
unsigned bytes;
|
||||||
|
|
||||||
|
FLAC__bitbuffer_get_buffer(encoder->private_->frame, &buffer, &bytes);
|
||||||
|
|
||||||
|
if(encoder->private_->write_callback(encoder, buffer, bytes, 0, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_OK)
|
||||||
|
return encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
|
||||||
|
|
||||||
|
FLAC__bitbuffer_release_buffer(encoder->private_->frame);
|
||||||
|
}
|
||||||
|
|
||||||
/* now that the metadata block is written, we can init this to an absurdly-high value... */
|
/* now that the metadata block is written, we can init this to an absurdly-high value... */
|
||||||
encoder->private_->metadata.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;
|
encoder->private_->metadata.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;
|
||||||
@@ -542,7 +558,7 @@ void FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder)
|
|||||||
free(encoder->private_->raw_bits_per_partition_unaligned);
|
free(encoder->private_->raw_bits_per_partition_unaligned);
|
||||||
encoder->private_->raw_bits_per_partition_unaligned = 0;
|
encoder->private_->raw_bits_per_partition_unaligned = 0;
|
||||||
}
|
}
|
||||||
FLAC__bitbuffer_free(&encoder->private_->frame);
|
FLAC__bitbuffer_free(encoder->private_->frame);
|
||||||
|
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
|
||||||
}
|
}
|
||||||
@@ -973,6 +989,9 @@ FLAC__bool stream_encoder_resize_buffers_(FLAC__StreamEncoder *encoder, unsigned
|
|||||||
|
|
||||||
FLAC__bool stream_encoder_process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
|
FLAC__bool stream_encoder_process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_last_frame)
|
||||||
{
|
{
|
||||||
|
const FLAC__byte *buffer;
|
||||||
|
unsigned bytes;
|
||||||
|
|
||||||
FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
|
FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -995,7 +1014,7 @@ FLAC__bool stream_encoder_process_frame_(FLAC__StreamEncoder *encoder, FLAC__boo
|
|||||||
/*
|
/*
|
||||||
* Zero-pad the frame to a byte_boundary
|
* Zero-pad the frame to a byte_boundary
|
||||||
*/
|
*/
|
||||||
if(!FLAC__bitbuffer_zero_pad_to_byte_boundary(&encoder->private_->frame)) {
|
if(!FLAC__bitbuffer_zero_pad_to_byte_boundary(encoder->private_->frame)) {
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1003,17 +1022,18 @@ FLAC__bool stream_encoder_process_frame_(FLAC__StreamEncoder *encoder, FLAC__boo
|
|||||||
/*
|
/*
|
||||||
* CRC-16 the whole thing
|
* CRC-16 the whole thing
|
||||||
*/
|
*/
|
||||||
FLAC__ASSERT(encoder->private_->frame.bits == 0); /* assert that we're byte-aligned */
|
FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(encoder->private_->frame));
|
||||||
FLAC__ASSERT(encoder->private_->frame.total_consumed_bits == 0); /* assert that no reading of the buffer was done */
|
FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__bitbuffer_get_write_crc16(encoder->private_->frame), FLAC__FRAME_FOOTER_CRC_LEN);
|
||||||
FLAC__bitbuffer_write_raw_uint32(&encoder->private_->frame, FLAC__crc16(encoder->private_->frame.buffer, encoder->private_->frame.bytes), FLAC__FRAME_FOOTER_CRC_LEN);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write it
|
* Write it
|
||||||
*/
|
*/
|
||||||
if(encoder->private_->write_callback(encoder, encoder->private_->frame.buffer, encoder->private_->frame.bytes, encoder->protected_->blocksize, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_OK) {
|
FLAC__bitbuffer_get_buffer(encoder->private_->frame, &buffer, &bytes);
|
||||||
|
if(encoder->private_->write_callback(encoder, buffer, bytes, encoder->protected_->blocksize, encoder->private_->current_frame_number, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_OK) {
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_FATAL_ERROR_WHILE_WRITING;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
FLAC__bitbuffer_release_buffer(encoder->private_->frame);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get ready for the next frame
|
* Get ready for the next frame
|
||||||
@@ -1021,8 +1041,8 @@ FLAC__bool stream_encoder_process_frame_(FLAC__StreamEncoder *encoder, FLAC__boo
|
|||||||
encoder->private_->current_sample_number = 0;
|
encoder->private_->current_sample_number = 0;
|
||||||
encoder->private_->current_frame_number++;
|
encoder->private_->current_frame_number++;
|
||||||
encoder->private_->metadata.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize;
|
encoder->private_->metadata.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize;
|
||||||
encoder->private_->metadata.data.stream_info.min_framesize = min(encoder->private_->frame.bytes, encoder->private_->metadata.data.stream_info.min_framesize);
|
encoder->private_->metadata.data.stream_info.min_framesize = min(bytes, encoder->private_->metadata.data.stream_info.min_framesize);
|
||||||
encoder->private_->metadata.data.stream_info.max_framesize = max(encoder->private_->frame.bytes, encoder->private_->metadata.data.stream_info.max_framesize);
|
encoder->private_->metadata.data.stream_info.max_framesize = max(bytes, encoder->private_->metadata.data.stream_info.max_framesize);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1054,7 +1074,7 @@ FLAC__bool stream_encoder_process_subframes_(FLAC__StreamEncoder *encoder, FLAC_
|
|||||||
/*
|
/*
|
||||||
* Setup the frame
|
* Setup the frame
|
||||||
*/
|
*/
|
||||||
if(!FLAC__bitbuffer_clear(&encoder->private_->frame)) {
|
if(!FLAC__bitbuffer_clear(encoder->private_->frame)) {
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1171,7 +1191,7 @@ FLAC__bool stream_encoder_process_subframes_(FLAC__StreamEncoder *encoder, FLAC_
|
|||||||
|
|
||||||
frame_header.channel_assignment = channel_assignment;
|
frame_header.channel_assignment = channel_assignment;
|
||||||
|
|
||||||
if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, &encoder->private_->frame)) {
|
if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, encoder->private_->frame)) {
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1219,19 +1239,19 @@ FLAC__bool stream_encoder_process_subframes_(FLAC__StreamEncoder *encoder, FLAC_
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* note that encoder_add_subframe_ sets the state for us in case of an error */
|
/* note that encoder_add_subframe_ sets the state for us in case of an error */
|
||||||
if(!stream_encoder_add_subframe_(encoder, &frame_header, left_bps , left_subframe , &encoder->private_->frame))
|
if(!stream_encoder_add_subframe_(encoder, &frame_header, left_bps , left_subframe , encoder->private_->frame))
|
||||||
return false;
|
return false;
|
||||||
if(!stream_encoder_add_subframe_(encoder, &frame_header, right_bps, right_subframe, &encoder->private_->frame))
|
if(!stream_encoder_add_subframe_(encoder, &frame_header, right_bps, right_subframe, encoder->private_->frame))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, &encoder->private_->frame)) {
|
if(!FLAC__frame_add_header(&frame_header, encoder->protected_->streamable_subset, is_last_frame, encoder->private_->frame)) {
|
||||||
encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(channel = 0; channel < encoder->protected_->channels; channel++) {
|
for(channel = 0; channel < encoder->protected_->channels; channel++) {
|
||||||
if(!stream_encoder_add_subframe_(encoder, &frame_header, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], &encoder->private_->frame)) {
|
if(!stream_encoder_add_subframe_(encoder, &frame_header, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) {
|
||||||
/* the above function sets the state for us in case of an error */
|
/* the above function sets the state for us in case of an error */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,12 +114,9 @@ FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetaData *metadata, FLAC__
|
|||||||
|
|
||||||
FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__bool streamable_subset, FLAC__bool is_last_block, FLAC__BitBuffer *bb)
|
FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__bool streamable_subset, FLAC__bool is_last_block, FLAC__BitBuffer *bb)
|
||||||
{
|
{
|
||||||
unsigned u, crc8_start, blocksize_hint, sample_rate_hint;
|
unsigned u, blocksize_hint, sample_rate_hint;
|
||||||
FLAC__byte crc8;
|
|
||||||
|
|
||||||
FLAC__ASSERT(bb->bits == 0); /* assert that we're byte-aligned before writing */
|
FLAC__ASSERT(FLAC__bitbuffer_is_byte_aligned(bb));
|
||||||
|
|
||||||
crc8_start = bb->bytes;
|
|
||||||
|
|
||||||
if(!FLAC__bitbuffer_write_raw_uint32(bb, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN))
|
if(!FLAC__bitbuffer_write_raw_uint32(bb, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN))
|
||||||
return false;
|
return false;
|
||||||
@@ -246,10 +243,7 @@ FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__bool st
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* write the CRC */
|
/* write the CRC */
|
||||||
FLAC__ASSERT(bb->buffer[crc8_start] == 0xff); /* MAGIC NUMBER for the first byte of the sync code */
|
if(!FLAC__bitbuffer_write_raw_uint32(bb, FLAC__bitbuffer_get_write_crc8(bb), FLAC__FRAME_HEADER_CRC_LEN))
|
||||||
FLAC__ASSERT(bb->bits == 0); /* assert that we're byte-aligned */
|
|
||||||
crc8 = FLAC__crc8(bb->buffer+crc8_start, bb->bytes-crc8_start);
|
|
||||||
if(!FLAC__bitbuffer_write_raw_uint32(bb, crc8, FLAC__FRAME_HEADER_CRC_LEN))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user