summaryrefslogtreecommitdiff
path: root/src/libmusepack/streaminfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmusepack/streaminfo.c')
-rw-r--r--src/libmusepack/streaminfo.c280
1 files changed, 0 insertions, 280 deletions
diff --git a/src/libmusepack/streaminfo.c b/src/libmusepack/streaminfo.c
deleted file mode 100644
index 2c6ff1c6f..000000000
--- a/src/libmusepack/streaminfo.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- Copyright (c) 2004, The Musepack Development Team
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the The Musepack Development Team nor the
- names of its contributors may be used to endorse or promote
- products derived from this software without specific prior
- written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/// \file streaminfo.c
-/// Implementation of streaminfo reading functions.
-
-#include "musepack/musepack.h"
-#include "musepack/internal.h"
-
-static const char *
-Stringify(mpc_uint32_t profile) // profile is 0...15, where 7...13 is used
-{
- static const char na[] = "n.a.";
- static const char *Names[] = {
- na, "'Unstable/Experimental'", na, na,
- na, "'quality 0'", "'quality 1'", "'Telephone'",
- "'Thumb'", "'Radio'", "'Standard'", "'Xtreme'",
- "'Insane'", "'BrainDead'", "'quality 9'", "'quality 10'"
- };
-
- return profile >= sizeof(Names) / sizeof(*Names) ? na : Names[profile];
-}
-
-void
-mpc_streaminfo_init(mpc_streaminfo * si)
-{
- memset(si, 0, sizeof(mpc_streaminfo));
-}
-
-// read information from SV8 header
-// not yet implemented
-static mpc_int32_t
-streaminfo_read_header_sv8(mpc_streaminfo * si, mpc_reader * fp)
-{
- return 0;
-}
-
-/// Reads streaminfo from SV7 header.
-static mpc_int32_t
-streaminfo_read_header_sv7(mpc_streaminfo * si, mpc_uint32_t HeaderData[8])
-{
- const mpc_int32_t samplefreqs[4] = { 44100, 48000, 37800, 32000 };
-
- //mpc_uint32_t HeaderData [8];
- mpc_uint16_t Estimatedpeak_title = 0;
-
- if (si->stream_version > 0x71) {
- // Update (si->stream_version);
- return 0;
- }
-
- /*
- if ( !fp->seek ( si->header_position ) ) // seek to header start
- return ERROR_CODE_FILE;
- if ( fp->read ( HeaderData, sizeof HeaderData) != sizeof HeaderData )
- return ERROR_CODE_FILE;
- */
-
- si->bitrate = 0;
- si->frames = HeaderData[1];
- si->is = 0;
- si->ms = (HeaderData[2] >> 30) & 0x0001;
- si->max_band = (HeaderData[2] >> 24) & 0x003F;
- si->block_size = 1;
- si->profile = (HeaderData[2] << 8) >> 28;
- si->profile_name = Stringify(si->profile);
- si->sample_freq = samplefreqs[(HeaderData[2] >> 16) & 0x0003];
- Estimatedpeak_title = (mpc_uint16_t) (HeaderData[2] & 0xFFFF); // read the ReplayGain data
- si->gain_title = (mpc_uint16_t) ((HeaderData[3] >> 16) & 0xFFFF);
- si->peak_title = (mpc_uint16_t) (HeaderData[3] & 0xFFFF);
- si->gain_album = (mpc_uint16_t) ((HeaderData[4] >> 16) & 0xFFFF);
- si->peak_album = (mpc_uint16_t) (HeaderData[4] & 0xFFFF);
- si->is_true_gapless = (HeaderData[5] >> 31) & 0x0001; // true gapless: used?
- si->last_frame_samples = (HeaderData[5] >> 20) & 0x07FF; // true gapless: valid samples for last frame
- si->encoder_version = (HeaderData[6] >> 24) & 0x00FF;
-
- if (si->encoder_version == 0) {
- sprintf(si->encoder, "Buschmann 1.7.0...9, Klemm 0.90...1.05");
- }
- else {
- switch (si->encoder_version % 10) {
- case 0:
- sprintf(si->encoder, "Release %u.%u", si->encoder_version / 100,
- si->encoder_version / 10 % 10);
- break;
- case 2:
- case 4:
- case 6:
- case 8:
- sprintf(si->encoder, "Beta %u.%02u", si->encoder_version / 100,
- si->encoder_version % 100);
- break;
- default:
- sprintf(si->encoder, "--Alpha-- %u.%02u",
- si->encoder_version / 100, si->encoder_version % 100);
- break;
- }
- }
-
- // if ( si->peak_title == 0 ) // there is no correct peak_title contained within header
- // si->peak_title = (mpc_uint16_t)(Estimatedpeak_title * 1.18);
- // if ( si->peak_album == 0 )
- // si->peak_album = si->peak_title; // no correct peak_album, use peak_title
-
- //si->sample_freq = 44100; // AB: used by all files up to SV7
- si->channels = 2;
-
- return ERROR_CODE_OK;
-}
-
-// read information from SV4-SV6 header
-static mpc_int32_t
-streaminfo_read_header_sv6(mpc_streaminfo * si, mpc_uint32_t HeaderData[8])
-{
- //mpc_uint32_t HeaderData [8];
-
- /*
- if ( !fp->seek ( si->header_position ) ) // seek to header start
- return ERROR_CODE_FILE;
- if ( fp->read ( HeaderData, sizeof HeaderData ) != sizeof HeaderData )
- return ERROR_CODE_FILE;
- */
-
- si->bitrate = (HeaderData[0] >> 23) & 0x01FF; // read the file-header (SV6 and below)
- si->is = (HeaderData[0] >> 22) & 0x0001;
- si->ms = (HeaderData[0] >> 21) & 0x0001;
- si->stream_version = (HeaderData[0] >> 11) & 0x03FF;
- si->max_band = (HeaderData[0] >> 6) & 0x001F;
- si->block_size = (HeaderData[0]) & 0x003F;
- si->profile = 0;
- si->profile_name = Stringify((mpc_uint32_t) (-1));
- if (si->stream_version >= 5)
- si->frames = HeaderData[1]; // 32 bit
- else
- si->frames = (HeaderData[1] >> 16); // 16 bit
-
- si->gain_title = 0; // not supported
- si->peak_title = 0;
- si->gain_album = 0;
- si->peak_album = 0;
-
- si->last_frame_samples = 0;
- si->is_true_gapless = 0;
-
- si->encoder_version = 0;
- si->encoder[0] = '\0';
-
- if (si->stream_version == 7)
- return ERROR_CODE_SV7BETA; // are there any unsupported parameters used?
- if (si->bitrate != 0)
- return ERROR_CODE_CBR;
- if (si->is != 0)
- return ERROR_CODE_IS;
- if (si->block_size != 1)
- return ERROR_CODE_BLOCKSIZE;
-
- if (si->stream_version < 6) // Bugfix: last frame was invalid for up to SV5
- si->frames -= 1;
-
- si->sample_freq = 44100; // AB: used by all files up to SV7
- si->channels = 2;
-
- if (si->stream_version < 4 || si->stream_version > 7)
- return ERROR_CODE_INVALIDSV;
-
- return ERROR_CODE_OK;
-}
-
-// reads file header and tags
-mpc_int32_t
-mpc_streaminfo_read(mpc_streaminfo * si, mpc_reader * r)
-{
- mpc_uint32_t HeaderData[8];
- mpc_int32_t Error = 0;
-
- // get header position
- if ((si->header_position = JumpID3v2(r)) < 0) {
- return ERROR_CODE_FILE;
- }
- // seek to first byte of mpc data
- if (!r->seek(r->data, si->header_position)) {
- return ERROR_CODE_FILE;
- }
- if (r->read(r->data, HeaderData, 8 * 4) != 8 * 4) {
- return ERROR_CODE_FILE;
- }
- if (!r->seek(r->data, si->header_position + 6 * 4)) {
- return ERROR_CODE_FILE;
- }
-
- si->total_file_length = r->get_size(r->data);
- si->tag_offset = si->total_file_length;
- if (memcmp(HeaderData, "MP+", 3) == 0) {
-#ifndef MPC_LITTLE_ENDIAN
- mpc_uint32_t ptr;
- for (ptr = 0; ptr < 8; ptr++) {
- HeaderData[ptr] = swap32(HeaderData[ptr]);
- }
-#endif
- si->stream_version = HeaderData[0] >> 24;
-
- // stream version 8
- if ((si->stream_version & 15) >= 8) {
- Error = streaminfo_read_header_sv8(si, r);
- }
- // stream version 7
- else if ((si->stream_version & 15) == 7) {
- Error = streaminfo_read_header_sv7(si, HeaderData);
- }
- }
- else {
- // stream version 4-6
- Error = streaminfo_read_header_sv6(si, HeaderData);
- }
-
- // estimation, exact value needs too much time
- si->pcm_samples = 1152 * si->frames - 576;
-
- if (si->pcm_samples > 0) {
- si->average_bitrate =
- (si->tag_offset -
- si->header_position) * 8.0 * si->sample_freq / si->pcm_samples;
- }
- else {
- si->average_bitrate = 0;
- }
-
- return Error;
-}
-
-double
-mpc_streaminfo_get_length(mpc_streaminfo * si)
-{
- return (double)mpc_streaminfo_get_length_samples(si) /
- (double)si->sample_freq;
-}
-
-mpc_int64_t
-mpc_streaminfo_get_length_samples(mpc_streaminfo * si)
-{
- mpc_int64_t samples = (mpc_int64_t) si->frames * MPC_FRAME_LENGTH;
- if (si->is_true_gapless) {
- samples -= (MPC_FRAME_LENGTH - si->last_frame_samples);
- }
- else {
- samples -= MPC_DECODER_SYNTH_DELAY;
- }
- return samples;
-}