package com.wavpack.decoder;
/*
** MetadataUtils.java
**
** Copyright (c) 2007 - 2008 Peter McQuillan
**
** All Rights Reserved.
**
** Distributed under the BSD Software License (see license.txt)
**
*/
class MetadataUtils {
static int read_metadata_buff(WavpackContext wpc, WavpackMetadata wpmd) {
long bytes_to_read;
short tchar;
if (wpmd.bytecount >= wpc.stream.wphdr.ckSize) {
// we have read all the data in this block
return Defines.FALSE;
}
try {
wpmd.id = (short) wpc.infile.readUnsignedByte();
tchar = (short) wpc.infile.readUnsignedByte();
}
catch (Exception e) {
wpmd.status = 1;
return Defines.FALSE;
}
wpmd.bytecount += 2;
wpmd.byte_length = tchar << 1;
if ((wpmd.id & Defines.ID_LARGE) != 0) {
wpmd.id &= ~Defines.ID_LARGE;
try {
tchar = (short) wpc.infile.readUnsignedByte();
}
catch (Exception e) {
wpmd.status = 1;
return Defines.FALSE;
}
wpmd.byte_length += (int) tchar << 9;
try {
tchar = (short) wpc.infile.readUnsignedByte();
}
catch (Exception e) {
wpmd.status = 1;
return Defines.FALSE;
}
wpmd.byte_length += (int) tchar << 17;
wpmd.bytecount += 2;
}
if ((wpmd.id & Defines.ID_ODD_SIZE) != 0) {
wpmd.id &= ~Defines.ID_ODD_SIZE;
wpmd.byte_length--;
}
if (wpmd.byte_length == 0 || wpmd.id == Defines.ID_WV_BITSTREAM) {
wpmd.hasdata = Defines.FALSE;
return Defines.TRUE;
}
bytes_to_read = wpmd.byte_length + (wpmd.byte_length & 1);
wpmd.bytecount += bytes_to_read;
if (bytes_to_read > wpc.read_buffer.length) {
int bytes_read;
wpmd.hasdata = Defines.FALSE;
while (bytes_to_read > wpc.read_buffer.length) {
try {
bytes_read = wpc.infile.read(wpc.read_buffer, 0, wpc.read_buffer.length);
if (bytes_read != wpc.read_buffer.length) {
return Defines.FALSE;
}
}
catch (Exception e) {
return Defines.FALSE;
}
bytes_to_read -= wpc.read_buffer.length;
}
} else {
wpmd.hasdata = Defines.TRUE;
wpmd.data = wpc.read_buffer;
}
if (bytes_to_read != 0) {
int bytes_read;
try {
bytes_read = wpc.infile.read(wpc.read_buffer, 0, (int) bytes_to_read);
if (bytes_read != (int) bytes_to_read) {
wpmd.hasdata = Defines.FALSE;
return Defines.FALSE;
}
}
catch (Exception e) {
wpmd.hasdata = Defines.FALSE;
return Defines.FALSE;
}
}
return Defines.TRUE;
}
static int process_metadata(WavpackContext wpc, WavpackMetadata wpmd) {
WavpackStream wps = wpc.stream;
switch (wpmd.id) {
case Defines.ID_DUMMY: {
return Defines.TRUE;
}
case Defines.ID_DECORR_TERMS: {
return UnpackUtils.read_decorr_terms(wps, wpmd);
}
case Defines.ID_DECORR_WEIGHTS: {
return UnpackUtils.read_decorr_weights(wps, wpmd);
}
case Defines.ID_DECORR_SAMPLES: {
return UnpackUtils.read_decorr_samples(wps, wpmd);
}
case Defines.ID_ENTROPY_VARS: {
return WordsUtils.read_entropy_vars(wps, wpmd);
}
case Defines.ID_HYBRID_PROFILE: {
return WordsUtils.read_hybrid_profile(wps, wpmd);
}
case Defines.ID_FLOAT_INFO: {
return FloatUtils.read_float_info(wps, wpmd);
}
case Defines.ID_INT32_INFO: {
return UnpackUtils.read_int32_info(wps, wpmd);
}
case Defines.ID_CHANNEL_INFO: {
return UnpackUtils.read_channel_info(wpc, wpmd);
}
case Defines.ID_SAMPLE_RATE: {
return UnpackUtils.read_sample_rate(wpc, wpmd);
}
case Defines.ID_CONFIG_BLOCK: {
return UnpackUtils.read_config_info(wpc, wpmd);
}
case Defines.ID_WV_BITSTREAM: {
return UnpackUtils.init_wv_bitstream(wpc, wpmd);
}
case Defines.ID_SHAPING_WEIGHTS:
case Defines.ID_WVC_BITSTREAM:
case Defines.ID_WVX_BITSTREAM: {
return Defines.TRUE;
}
default: {
if ((wpmd.id & Defines.ID_OPTIONAL_DATA) != 0) {
return Defines.TRUE;
} else {
return Defines.FALSE;
}
}
}
}
}