Blame src/libmpg123/parse.c

Packit c32a2d
/*
Packit c32a2d
	parse: spawned from common; clustering around stream/frame parsing
Packit c32a2d
Packit c32a2d
	copyright ?-2014 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp & Thomas Orgis
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mpg123lib_intern.h"
Packit c32a2d
Packit c32a2d
#include <sys/stat.h>
Packit c32a2d
#include <fcntl.h>
Packit c32a2d
Packit c32a2d
#include "getbits.h"
Packit c32a2d
Packit c32a2d
#if defined (WANT_WIN32_SOCKETS)
Packit c32a2d
#include <winsock2.h>
Packit c32a2d
#include <ws2tcpip.h>
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* a limit for number of frames in a track; beyond that unsigned long may not be enough to hold byte addresses */
Packit c32a2d
#ifdef HAVE_LIMITS_H
Packit c32a2d
#include <limits.h>
Packit c32a2d
#endif
Packit c32a2d
#ifndef ULONG_MAX
Packit c32a2d
/* hm, is this portable across preprocessors? */
Packit c32a2d
#define ULONG_MAX ((unsigned long)-1)
Packit c32a2d
#endif
Packit c32a2d
#define TRACK_MAX_FRAMES ULONG_MAX/4/1152
Packit c32a2d
Packit c32a2d
#include "mpeghead.h"
Packit c32a2d
Packit c32a2d
#include "debug.h"
Packit c32a2d
Packit c32a2d
#define bsbufid(fr) (fr)->bsbuf==(fr)->bsspace[0] ? 0 : ((fr)->bsbuf==fr->bsspace[1] ? 1 : ( (fr)->bsbuf==(fr)->bsspace[0]+512 ? 2 : ((fr)->bsbuf==fr->bsspace[1]+512 ? 3 : -1) ) )
Packit c32a2d
Packit c32a2d
/* PARSE_GOOD and PARSE_BAD have to be 1 and 0 (TRUE and FALSE), others can vary. */
Packit c32a2d
enum parse_codes
Packit c32a2d
{
Packit c32a2d
	 PARSE_MORE = MPG123_NEED_MORE
Packit c32a2d
	,PARSE_ERR  = MPG123_ERR
Packit c32a2d
	,PARSE_END  = 10 /* No more audio data to find. */
Packit c32a2d
	,PARSE_GOOD = 1 /* Everything's fine. */
Packit c32a2d
	,PARSE_BAD  = 0 /* Not fine (invalid data). */
Packit c32a2d
	,PARSE_RESYNC = 2 /* Header not good, go into resync. */
Packit c32a2d
	,PARSE_AGAIN  = 3 /* Really start over, throw away and read a new header, again. */
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* bitrates for [mpeg1/2][layer] */
Packit c32a2d
static const int tabsel_123[2][3][16] =
Packit c32a2d
{
Packit c32a2d
	{
Packit c32a2d
		{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
Packit c32a2d
		{0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
Packit c32a2d
		{0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,}
Packit c32a2d
	},
Packit c32a2d
	{
Packit c32a2d
		{0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
Packit c32a2d
		{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
Packit c32a2d
		{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}
Packit c32a2d
	}
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
static const long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
Packit c32a2d
Packit c32a2d
static int decode_header(mpg123_handle *fr,unsigned long newhead, int *freeformat_count);
Packit c32a2d
static int skip_junk(mpg123_handle *fr, unsigned long *newheadp, long *headcount);
Packit c32a2d
static int do_readahead(mpg123_handle *fr, unsigned long newhead);
Packit c32a2d
static int wetwork(mpg123_handle *fr, unsigned long *newheadp);
Packit c32a2d
Packit c32a2d
/* These two are to be replaced by one function that gives all the frame parameters (for outsiders).*/
Packit c32a2d
/* Those functions are unsafe regarding bad arguments (inside the mpg123_handle), but just returning anything would also be unsafe, the caller code has to be trusted. */
Packit c32a2d
Packit c32a2d
int frame_bitrate(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	return tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index];
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
long frame_freq(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	return freqs[fr->sampling_frequency];
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* compiler is smart enought to inline this one or should I really do it as macro...? */
Packit c32a2d
static int head_check(unsigned long head)
Packit c32a2d
{
Packit c32a2d
	if
Packit c32a2d
	(
Packit c32a2d
		((head & HDR_SYNC) != HDR_SYNC)
Packit c32a2d
		||
Packit c32a2d
		/* layer: 01,10,11 is 1,2,3; 00 is reserved */
Packit c32a2d
		(!(HDR_LAYER_VAL(head)))
Packit c32a2d
		||
Packit c32a2d
		/* 1111 means bad bitrate */
Packit c32a2d
		(HDR_BITRATE_VAL(head) == 0xf)
Packit c32a2d
		||
Packit c32a2d
		/* sampling freq: 11 is reserved */
Packit c32a2d
		(HDR_SAMPLERATE_VAL(head) == 0x3)
Packit c32a2d
		/* here used to be a mpeg 2.5 check... re-enabled 2.5 decoding due to lack of evidence that it is really not good */
Packit c32a2d
	)
Packit c32a2d
	{
Packit c32a2d
		return FALSE;
Packit c32a2d
	}
Packit c32a2d
	/* if no check failed, the header is valid (hopefully)*/
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		return TRUE;
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* This is moderately sized buffers. Int offset is enough. */
Packit c32a2d
static unsigned long bit_read_long(unsigned char *buf, int *offset)
Packit c32a2d
{
Packit c32a2d
	unsigned long val =  /* 32 bit value */
Packit c32a2d
		(((unsigned long) buf[*offset])   << 24)
Packit c32a2d
	|	(((unsigned long) buf[*offset+1]) << 16)
Packit c32a2d
	|	(((unsigned long) buf[*offset+2]) << 8)
Packit c32a2d
	|	 ((unsigned long) buf[*offset+3]);
Packit c32a2d
	*offset += 4;
Packit c32a2d
	return val;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static unsigned short bit_read_short(unsigned char *buf, int *offset)
Packit c32a2d
{
Packit c32a2d
	unsigned short val = /* 16 bit value */
Packit c32a2d
		(((unsigned short) buf[*offset]  ) << 8)
Packit c32a2d
	|	 ((unsigned short) buf[*offset+1]);
Packit c32a2d
	*offset += 2;
Packit c32a2d
	return val;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static int check_lame_tag(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	int i;
Packit c32a2d
	unsigned long xing_flags;
Packit c32a2d
	unsigned long long_tmp;
Packit c32a2d
	/*
Packit c32a2d
		going to look for Xing or Info at some position after the header
Packit c32a2d
		                                   MPEG 1  MPEG 2/2.5 (LSF)
Packit c32a2d
		Stereo, Joint Stereo, Dual Channel  32      17
Packit c32a2d
		Mono                                17       9
Packit c32a2d
	*/
Packit c32a2d
	int lame_offset = (fr->stereo == 2)
Packit c32a2d
	? (fr->lsf ? 17 : 32)
Packit c32a2d
	: (fr->lsf ? 9  : 17);
Packit c32a2d
Packit c32a2d
	if(fr->p.flags & MPG123_IGNORE_INFOFRAME) goto check_lame_tag_no;
Packit c32a2d
Packit c32a2d
	debug("do we have lame tag?");
Packit c32a2d
	/*
Packit c32a2d
		Note: CRC or not, that does not matter here.
Packit c32a2d
		But, there is any combination of Xing flags in the wild. There are headers
Packit c32a2d
		without the search index table! I cannot assume a reasonable minimal size
Packit c32a2d
		for the actual data, have to check if each byte of information is present.
Packit c32a2d
		But: 4 B Info/Xing + 4 B flags is bare minimum.
Packit c32a2d
	*/
Packit c32a2d
	if(fr->framesize < lame_offset+8) goto check_lame_tag_no;
Packit c32a2d
Packit c32a2d
	/* only search for tag when all zero before it (apart from checksum) */
Packit c32a2d
	for(i=2; i < lame_offset; ++i) if(fr->bsbuf[i] != 0) goto check_lame_tag_no;
Packit c32a2d
Packit c32a2d
	debug("possibly...");
Packit c32a2d
	if
Packit c32a2d
	(
Packit c32a2d
		   (fr->bsbuf[lame_offset]   == 'I')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+1] == 'n')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+2] == 'f')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+3] == 'o')
Packit c32a2d
	)
Packit c32a2d
	{
Packit c32a2d
		/* We still have to see what there is */
Packit c32a2d
	}
Packit c32a2d
	else if
Packit c32a2d
	(
Packit c32a2d
		   (fr->bsbuf[lame_offset]   == 'X')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+1] == 'i')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+2] == 'n')
Packit c32a2d
		&& (fr->bsbuf[lame_offset+3] == 'g')
Packit c32a2d
	)
Packit c32a2d
	{
Packit c32a2d
		fr->vbr = MPG123_VBR; /* Xing header means always VBR */
Packit c32a2d
	}
Packit c32a2d
	else goto check_lame_tag_no;
Packit c32a2d
Packit c32a2d
	/* we have one of these headers... */
Packit c32a2d
	if(VERBOSE2) fprintf(stderr, "Note: Xing/Lame/Info header detected\n");
Packit c32a2d
	lame_offset += 4; 
Packit c32a2d
	xing_flags = bit_read_long(fr->bsbuf, &lame_offset);
Packit c32a2d
	debug1("Xing: flags 0x%08lx", xing_flags);
Packit c32a2d
Packit c32a2d
	/* From now on, I have to carefully check if the announced data is actually
Packit c32a2d
	   there! I'm always returning 'yes', though.  */
Packit c32a2d
	#define check_bytes_left(n) if(fr->framesize < lame_offset+n) \
Packit c32a2d
		goto check_lame_tag_yes
Packit c32a2d
	if(xing_flags & 1) /* total bitstream frames */
Packit c32a2d
	{
Packit c32a2d
		check_bytes_left(4); long_tmp = bit_read_long(fr->bsbuf, &lame_offset);
Packit c32a2d
		if(fr->p.flags & MPG123_IGNORE_STREAMLENGTH)
Packit c32a2d
		{
Packit c32a2d
			if(VERBOSE3) fprintf(stderr
Packit c32a2d
			,	"Note: Ignoring Xing frames because of MPG123_IGNORE_STREAMLENGTH\n");
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			/* Check for endless stream, but: TRACK_MAX_FRAMES sensible at all? */
Packit c32a2d
			fr->track_frames = long_tmp > TRACK_MAX_FRAMES ? 0 : (off_t) long_tmp;
Packit c32a2d
#ifdef GAPLESS
Packit c32a2d
			/* All or nothing: Only if encoder delay/padding is known, we'll cut
Packit c32a2d
			   samples for gapless. */
Packit c32a2d
			if(fr->p.flags & MPG123_GAPLESS)
Packit c32a2d
			frame_gapless_init(fr, fr->track_frames, 0, 0);
Packit c32a2d
#endif
Packit c32a2d
			if(VERBOSE3) fprintf(stderr, "Note: Xing: %lu frames\n", long_tmp);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	if(xing_flags & 0x2) /* total bitstream bytes */
Packit c32a2d
	{
Packit c32a2d
		check_bytes_left(4); long_tmp = bit_read_long(fr->bsbuf, &lame_offset);
Packit c32a2d
		if(fr->p.flags & MPG123_IGNORE_STREAMLENGTH)
Packit c32a2d
		{
Packit c32a2d
			if(VERBOSE3) fprintf(stderr
Packit c32a2d
			,	"Note: Ignoring Xing bytes because of MPG123_IGNORE_STREAMLENGTH\n");
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			/* The Xing bitstream length, at least as interpreted by the Lame
Packit c32a2d
			   encoder, encompasses all data from the Xing header frame on,
Packit c32a2d
			   ignoring leading ID3v2 data. Trailing tags (ID3v1) seem to be 
Packit c32a2d
			   included, though. */
Packit c32a2d
			if(fr->rdat.filelen < 1)
Packit c32a2d
			fr->rdat.filelen = (off_t) long_tmp + fr->audio_start; /* Overflow? */
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				if((off_t)long_tmp != fr->rdat.filelen - fr->audio_start && NOQUIET)
Packit c32a2d
				{ /* 1/filelen instead of 1/(filelen-start), my decision */
Packit c32a2d
					double diff = 100.0/fr->rdat.filelen
Packit c32a2d
					            * ( fr->rdat.filelen - fr->audio_start
Packit c32a2d
					                - (off_t)long_tmp );
Packit c32a2d
					if(diff < 0.) diff = -diff;
Packit c32a2d
Packit c32a2d
					if(VERBOSE3) fprintf(stderr
Packit c32a2d
					,	"Note: Xing stream size %lu differs by %f%% from determined/given file size!\n"
Packit c32a2d
					,	long_tmp, diff);
Packit c32a2d
Packit c32a2d
					if(diff > 1. && NOQUIET) fprintf(stderr
Packit c32a2d
					,	"Warning: Xing stream size off by more than 1%%, fuzzy seeking may be even more fuzzy than by design!\n");
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
Packit c32a2d
			if(VERBOSE3) fprintf(stderr, "Note: Xing: %lu bytes\n", long_tmp);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	if(xing_flags & 0x4) /* TOC */
Packit c32a2d
	{
Packit c32a2d
		check_bytes_left(100);
Packit c32a2d
		frame_fill_toc(fr, fr->bsbuf+lame_offset);
Packit c32a2d
		lame_offset += 100;
Packit c32a2d
	}
Packit c32a2d
	if(xing_flags & 0x8) /* VBR quality */
Packit c32a2d
	{
Packit c32a2d
		check_bytes_left(4); long_tmp = bit_read_long(fr->bsbuf, &lame_offset);
Packit c32a2d
		if(VERBOSE3) fprintf(stderr, "Note: Xing: quality = %lu\n", long_tmp);
Packit c32a2d
	}
Packit c32a2d
	/*
Packit c32a2d
		Either zeros/nothing, or:
Packit c32a2d
			0-8: LAME3.90a
Packit c32a2d
			9: revision/VBR method
Packit c32a2d
			10: lowpass
Packit c32a2d
			11-18: ReplayGain
Packit c32a2d
			19: encoder flags
Packit c32a2d
			20: ABR 
Packit c32a2d
			21-23: encoder delays
Packit c32a2d
	*/
Packit c32a2d
	check_bytes_left(24); /* I'm interested in 24 B of extra info. */
Packit c32a2d
	if(fr->bsbuf[lame_offset] != 0)
Packit c32a2d
	{
Packit c32a2d
		unsigned char lame_vbr;
Packit c32a2d
		float replay_gain[2] = {0,0};
Packit c32a2d
		float peak = 0;
Packit c32a2d
		float gain_offset = 0; /* going to be +6 for old lame that used 83dB */
Packit c32a2d
		char nb[10];
Packit c32a2d
		off_t pad_in;
Packit c32a2d
		off_t pad_out;
Packit c32a2d
		memcpy(nb, fr->bsbuf+lame_offset, 9);
Packit c32a2d
		nb[9] = 0;
Packit c32a2d
		if(VERBOSE3) fprintf(stderr, "Note: Info: Encoder: %s\n", nb);
Packit c32a2d
		if(!strncmp("LAME", nb, 4))
Packit c32a2d
		{
Packit c32a2d
			/* Lame versions before 3.95.1 used 83 dB reference level, later
Packit c32a2d
			   versions 89 dB. We stick with 89 dB as being "normal", adding
Packit c32a2d
			   6 dB. */
Packit c32a2d
			unsigned int major, minor;
Packit c32a2d
			char rest[6];
Packit c32a2d
			rest[0] = 0;
Packit c32a2d
			if(sscanf(nb+4, "%u.%u%s", &major, &minor, rest) >= 2)
Packit c32a2d
			{
Packit c32a2d
				debug3("LAME: %u/%u/%s", major, minor, rest);
Packit c32a2d
				/* We cannot detect LAME 3.95 reliably (same version string as
Packit c32a2d
				   3.95.1), so this is a blind spot. Everything < 3.95 is safe,
Packit c32a2d
				   though. */
Packit c32a2d
				if(major < 3 || (major == 3 && minor < 95))
Packit c32a2d
				{
Packit c32a2d
					gain_offset = 6;
Packit c32a2d
					if(VERBOSE3) fprintf(stderr
Packit c32a2d
					,	"Note: Info: Old LAME detected, using ReplayGain preamp of %f dB.\n"
Packit c32a2d
					,	gain_offset);
Packit c32a2d
				}
Packit c32a2d
			}
Packit c32a2d
			else if(VERBOSE3) fprintf(stderr
Packit c32a2d
			,	"Note: Info: Cannot determine LAME version.\n");
Packit c32a2d
		}
Packit c32a2d
		lame_offset += 9; /* 9 in */ 
Packit c32a2d
Packit c32a2d
		/* The 4 big bits are tag revision, the small bits vbr method. */
Packit c32a2d
		lame_vbr = fr->bsbuf[lame_offset] & 15;
Packit c32a2d
		lame_offset += 1; /* 10 in */
Packit c32a2d
		if(VERBOSE3)
Packit c32a2d
		{
Packit c32a2d
			fprintf(stderr, "Note: Info: rev %u\n", fr->bsbuf[lame_offset] >> 4);
Packit c32a2d
			fprintf(stderr, "Note: Info: vbr mode %u\n", lame_vbr);
Packit c32a2d
		}
Packit c32a2d
		switch(lame_vbr)
Packit c32a2d
		{
Packit c32a2d
			/* from rev1 proposal... not sure if all good in practice */
Packit c32a2d
			case 1:
Packit c32a2d
			case 8: fr->vbr = MPG123_CBR; break;
Packit c32a2d
			case 2:
Packit c32a2d
			case 9: fr->vbr = MPG123_ABR; break;
Packit c32a2d
			default: fr->vbr = MPG123_VBR; /* 00==unknown is taken as VBR */
Packit c32a2d
		}
Packit c32a2d
		lame_offset += 1; /* 11 in, skipping lowpass filter value */
Packit c32a2d
Packit c32a2d
		/* ReplayGain peak ampitude, 32 bit float -- why did I parse it as int
Packit c32a2d
		   before??	Ah, yes, Lame seems to store it as int since some day in 2003;
Packit c32a2d
		   I've only seen zeros anyway until now, bah! */
Packit c32a2d
		if
Packit c32a2d
		(
Packit c32a2d
			   (fr->bsbuf[lame_offset]   != 0)
Packit c32a2d
			|| (fr->bsbuf[lame_offset+1] != 0)
Packit c32a2d
			|| (fr->bsbuf[lame_offset+2] != 0)
Packit c32a2d
			|| (fr->bsbuf[lame_offset+3] != 0)
Packit c32a2d
		)
Packit c32a2d
		{
Packit c32a2d
			debug("Wow! Is there _really_ a non-zero peak value? Now is it stored as float or int - how should I know?");
Packit c32a2d
			/* byte*peak_bytes = (byte*) &pea;;
Packit c32a2d
			... endianess ... just copy bytes to avoid floating point operation on unaligned memory?
Packit c32a2d
			peak_bytes[0] = ...
Packit c32a2d
			peak = *(float*) (fr->bsbuf+lame_offset); */
Packit c32a2d
		}
Packit c32a2d
		if(VERBOSE3) fprintf(stderr
Packit c32a2d
		,	"Note: Info: peak = %f (I won't use this)\n", peak);
Packit c32a2d
		peak = 0; /* until better times arrived */
Packit c32a2d
		lame_offset += 4; /* 15 in */
Packit c32a2d
Packit c32a2d
		/* ReplayGain values - lame only writes radio mode gain...
Packit c32a2d
		   16bit gain, 3 bits name, 3 bits originator, sign (1=-, 0=+),
Packit c32a2d
		   dB value*10 in 9 bits (fixed point) ignore the setting if name or
Packit c32a2d
		   originator == 000!
Packit c32a2d
		   radio      0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 1
Packit c32a2d
		   audiophile 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 */
Packit c32a2d
		for(i =0; i < 2; ++i)
Packit c32a2d
		{
Packit c32a2d
			unsigned char gt     =  fr->bsbuf[lame_offset] >> 5;
Packit c32a2d
			unsigned char origin = (fr->bsbuf[lame_offset] >> 2) & 0x7;
Packit c32a2d
			float factor         = (fr->bsbuf[lame_offset] & 0x2) ? -0.1f : 0.1f;
Packit c32a2d
			unsigned short gain  = bit_read_short(fr->bsbuf, &lame_offset) & 0x1ff; /* 19 in (2 cycles) */
Packit c32a2d
			if(origin == 0 || gt < 1 || gt > 2) continue;
Packit c32a2d
Packit c32a2d
			--gt;
Packit c32a2d
			replay_gain[gt] = factor * (float) gain;
Packit c32a2d
			/* Apply gain offset for automatic origin. */
Packit c32a2d
			if(origin == 3) replay_gain[gt] += gain_offset;
Packit c32a2d
		}
Packit c32a2d
		if(VERBOSE3) 
Packit c32a2d
		{
Packit c32a2d
			fprintf(stderr, "Note: Info: Radio Gain = %03.1fdB\n"
Packit c32a2d
			,	replay_gain[0]);
Packit c32a2d
			fprintf(stderr, "Note: Info: Audiophile Gain = %03.1fdB\n"
Packit c32a2d
			,	replay_gain[1]);
Packit c32a2d
		}
Packit c32a2d
		for(i=0; i < 2; ++i)
Packit c32a2d
		{
Packit c32a2d
			if(fr->rva.level[i] <= 0)
Packit c32a2d
			{
Packit c32a2d
				fr->rva.peak[i] = 0; /* TODO: use parsed peak? */
Packit c32a2d
				fr->rva.gain[i] = replay_gain[i];
Packit c32a2d
				fr->rva.level[i] = 0;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		lame_offset += 1; /* 20 in, skipping encoding flags byte */
Packit c32a2d
Packit c32a2d
		/* ABR rate */
Packit c32a2d
		if(fr->vbr == MPG123_ABR)
Packit c32a2d
		{
Packit c32a2d
			fr->abr_rate = fr->bsbuf[lame_offset];
Packit c32a2d
			if(VERBOSE3) fprintf(stderr, "Note: Info: ABR rate = %u\n"
Packit c32a2d
			,	fr->abr_rate);
Packit c32a2d
		}
Packit c32a2d
		lame_offset += 1; /* 21 in */
Packit c32a2d
	
Packit c32a2d
		/* Encoder delay and padding, two 12 bit values
Packit c32a2d
		   ... lame does write them from int. */
Packit c32a2d
		pad_in  = ( (((int) fr->bsbuf[lame_offset])   << 4)
Packit c32a2d
		          | (((int) fr->bsbuf[lame_offset+1]) >> 4) );
Packit c32a2d
		pad_out = ( (((int) fr->bsbuf[lame_offset+1]) << 8)
Packit c32a2d
		          |  ((int) fr->bsbuf[lame_offset+2])       ) & 0xfff;
Packit c32a2d
		lame_offset += 3; /* 24 in */
Packit c32a2d
		if(VERBOSE3) fprintf(stderr, "Note: Encoder delay = %i; padding = %i\n"
Packit c32a2d
		,	(int)pad_in, (int)pad_out);
Packit c32a2d
		#ifdef GAPLESS
Packit c32a2d
		if(fr->p.flags & MPG123_GAPLESS)
Packit c32a2d
		frame_gapless_init(fr, fr->track_frames, pad_in, pad_out);
Packit c32a2d
		#endif
Packit c32a2d
		/* final: 24 B LAME data */
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
check_lame_tag_yes:
Packit c32a2d
	/* switch buffer back ... */
Packit c32a2d
	fr->bsbuf = fr->bsspace[fr->bsnum]+512;
Packit c32a2d
	fr->bsnum = (fr->bsnum + 1) & 1;
Packit c32a2d
	return 1;
Packit c32a2d
check_lame_tag_no:
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Just tell if the header is some mono. */
Packit c32a2d
static int header_mono(unsigned long newhead)
Packit c32a2d
{
Packit c32a2d
	return HDR_CHANNEL_VAL(newhead) == MPG_MD_MONO ? TRUE : FALSE;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* true if the two headers will work with the same decoding routines */
Packit c32a2d
static int head_compatible(unsigned long fred, unsigned long bret)
Packit c32a2d
{
Packit c32a2d
	return ( (fred & HDR_CMPMASK) == (bret & HDR_CMPMASK)
Packit c32a2d
		&&       header_mono(fred) == header_mono(bret)    );
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static void halfspeed_prepare(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	/* save for repetition */
Packit c32a2d
	if(fr->p.halfspeed && fr->lay == 3)
Packit c32a2d
	{
Packit c32a2d
		debug("halfspeed - reusing old bsbuf ");
Packit c32a2d
		memcpy (fr->ssave, fr->bsbuf, fr->ssize);
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* If this returns 1, the next frame is the repetition. */
Packit c32a2d
static int halfspeed_do(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	/* Speed-down hack: Play it again, Sam (the frame, I mean). */
Packit c32a2d
	if (fr->p.halfspeed) 
Packit c32a2d
	{
Packit c32a2d
		if(fr->halfphase) /* repeat last frame */
Packit c32a2d
		{
Packit c32a2d
			debug("repeat!");
Packit c32a2d
			fr->to_decode = fr->to_ignore = TRUE;
Packit c32a2d
			--fr->halfphase;
Packit c32a2d
			fr->bitindex = 0;
Packit c32a2d
			fr->wordpointer = (unsigned char *) fr->bsbuf;
Packit c32a2d
			if(fr->lay == 3) memcpy (fr->bsbuf, fr->ssave, fr->ssize);
Packit c32a2d
			if(fr->error_protection) fr->crc = getbits(fr, 16); /* skip crc */
Packit c32a2d
			return 1;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			fr->halfphase = fr->p.halfspeed - 1;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* 
Packit c32a2d
	Temporary macro until we got this worked out.
Packit c32a2d
	Idea is to filter out special return values that shall trigger direct jumps to end / resync / read again. 
Packit c32a2d
	Particularily, the generic ret==PARSE_BAD==0 and ret==PARSE_GOOD==1 are not affected.
Packit c32a2d
*/
Packit c32a2d
#define JUMP_CONCLUSION(ret) \
Packit c32a2d
{ \
Packit c32a2d
if(ret < 0){ debug1("%s", ret == MPG123_NEED_MORE ? "need more" : "read error"); goto read_frame_bad; } \
Packit c32a2d
else if(ret == PARSE_AGAIN) goto read_again; \
Packit c32a2d
else if(ret == PARSE_RESYNC) goto init_resync; \
Packit c32a2d
else if(ret == PARSE_END){ ret=0; goto read_frame_bad; } \
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	That's a big one: read the next frame. 1 is success, <= 0 is some error
Packit c32a2d
	Special error READER_MORE means: Please feed more data and try again.
Packit c32a2d
*/
Packit c32a2d
int read_frame(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	/* TODO: rework this thing */
Packit c32a2d
	int freeformat_count = 0;
Packit c32a2d
	unsigned long newhead;
Packit c32a2d
	off_t framepos;
Packit c32a2d
	int ret;
Packit c32a2d
	/* stuff that needs resetting if complete frame reading fails */
Packit c32a2d
	int oldsize  = fr->framesize;
Packit c32a2d
	int oldphase = fr->halfphase;
Packit c32a2d
Packit c32a2d
	/* The counter for the search-first-header loop.
Packit c32a2d
	   It is persistent outside the loop to prevent seemingly endless loops
Packit c32a2d
	   when repeatedly headers are found that do not have valid followup headers. */
Packit c32a2d
	long headcount = 0;
Packit c32a2d
Packit c32a2d
	fr->fsizeold=fr->framesize;       /* for Layer3 */
Packit c32a2d
Packit c32a2d
	if(halfspeed_do(fr) == 1) return 1;
Packit c32a2d
Packit c32a2d
read_again:
Packit c32a2d
	/* In case we are looping to find a valid frame, discard any buffered data before the current position.
Packit c32a2d
	   This is essential to prevent endless looping, always going back to the beginning when feeder buffer is exhausted. */
Packit c32a2d
	if(fr->rd->forget != NULL) fr->rd->forget(fr);
Packit c32a2d
Packit c32a2d
	debug2("trying to get frame %"OFF_P" at %"OFF_P, (off_p)fr->num+1, (off_p)fr->rd->tell(fr));
Packit c32a2d
	if((ret = fr->rd->head_read(fr,&newhead)) <= 0){ debug1("need more? (%i)", ret); goto read_frame_bad;}
Packit c32a2d
Packit c32a2d
init_resync:
Packit c32a2d
Packit c32a2d
#ifdef SKIP_JUNK
Packit c32a2d
	if(!fr->firsthead && !head_check(newhead))
Packit c32a2d
	{
Packit c32a2d
		ret = skip_junk(fr, &newhead, &headcount);
Packit c32a2d
		JUMP_CONCLUSION(ret);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	ret = head_check(newhead);
Packit c32a2d
	if(ret) ret = decode_header(fr, newhead, &freeformat_count);
Packit c32a2d
Packit c32a2d
	JUMP_CONCLUSION(ret); /* That only continues for ret == PARSE_BAD or PARSE_GOOD. */
Packit c32a2d
	if(ret == PARSE_BAD)
Packit c32a2d
	{ /* Header was not good. */
Packit c32a2d
		ret = wetwork(fr, &newhead); /* Messy stuff, handle junk, resync ... */
Packit c32a2d
		JUMP_CONCLUSION(ret);
Packit c32a2d
		/* Normally, we jumped already. If for some reason everything's fine to continue, do continue. */
Packit c32a2d
		if(ret != PARSE_GOOD) goto read_frame_bad;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	if(!fr->firsthead)
Packit c32a2d
	{
Packit c32a2d
		ret = do_readahead(fr, newhead);
Packit c32a2d
		/* readahead can fail mit NEED_MORE, in which case we must also make the just read header available again for next go */
Packit c32a2d
		if(ret < 0) fr->rd->back_bytes(fr, 4);
Packit c32a2d
		JUMP_CONCLUSION(ret);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* Now we should have our valid header and proceed to reading the frame. */
Packit c32a2d
Packit c32a2d
	/* if filepos is invalid, so is framepos */
Packit c32a2d
	framepos = fr->rd->tell(fr) - 4;
Packit c32a2d
	/* flip/init buffer for Layer 3 */
Packit c32a2d
	{
Packit c32a2d
		unsigned char *newbuf = fr->bsspace[fr->bsnum]+512;
Packit c32a2d
		/* read main data into memory */
Packit c32a2d
		if((ret=fr->rd->read_frame_body(fr,newbuf,fr->framesize))<0)
Packit c32a2d
		{
Packit c32a2d
			/* if failed: flip back */
Packit c32a2d
			debug("need more?");
Packit c32a2d
			goto read_frame_bad;
Packit c32a2d
		}
Packit c32a2d
		fr->bsbufold = fr->bsbuf;
Packit c32a2d
		fr->bsbuf = newbuf;
Packit c32a2d
	}
Packit c32a2d
	fr->bsnum = (fr->bsnum + 1) & 1;
Packit c32a2d
Packit c32a2d
	if(!fr->firsthead)
Packit c32a2d
	{
Packit c32a2d
		fr->firsthead = newhead; /* _now_ it's time to store it... the first real header */
Packit c32a2d
		/* This is the first header of our current stream segment.
Packit c32a2d
		   It is only the actual first header of the whole stream when fr->num is still below zero!
Packit c32a2d
		   Think of resyncs where firsthead has been reset for format flexibility. */
Packit c32a2d
		if(fr->num < 0)
Packit c32a2d
		{
Packit c32a2d
			fr->audio_start = framepos;
Packit c32a2d
			/* Only check for LAME  tag at beginning of whole stream
Packit c32a2d
			   ... when there indeed is one in between, it's the user's problem. */
Packit c32a2d
			if(fr->lay == 3 && check_lame_tag(fr) == 1)
Packit c32a2d
			{ /* ...in practice, Xing/LAME tags are layer 3 only. */
Packit c32a2d
				if(fr->rd->forget != NULL) fr->rd->forget(fr);
Packit c32a2d
Packit c32a2d
				fr->oldhead = 0;
Packit c32a2d
				goto read_again;
Packit c32a2d
			}
Packit c32a2d
			/* now adjust volume */
Packit c32a2d
			do_rva(fr);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		debug2("fr->firsthead: %08lx, audio_start: %li", fr->firsthead, (long int)fr->audio_start);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
  fr->bitindex = 0;
Packit c32a2d
  fr->wordpointer = (unsigned char *) fr->bsbuf;
Packit c32a2d
	/* Question: How bad does the floating point value get with repeated recomputation?
Packit c32a2d
	   Also, considering that we can play the file or parts of many times. */
Packit c32a2d
	if(++fr->mean_frames != 0)
Packit c32a2d
	{
Packit c32a2d
		fr->mean_framesize = ((fr->mean_frames-1)*fr->mean_framesize+compute_bpf(fr)) / fr->mean_frames ;
Packit c32a2d
	}
Packit c32a2d
	++fr->num; /* 0 for first frame! */
Packit c32a2d
	debug4("Frame %"OFF_P" %08lx %i, next filepos=%"OFF_P, 
Packit c32a2d
	(off_p)fr->num, newhead, fr->framesize, (off_p)fr->rd->tell(fr));
Packit c32a2d
	if(!(fr->state_flags & FRAME_FRANKENSTEIN) && (
Packit c32a2d
		(fr->track_frames > 0 && fr->num >= fr->track_frames)
Packit c32a2d
#ifdef GAPLESS
Packit c32a2d
		|| (fr->gapless_frames > 0 && fr->num >= fr->gapless_frames)
Packit c32a2d
#endif
Packit c32a2d
	))
Packit c32a2d
	{
Packit c32a2d
		fr->state_flags |= FRAME_FRANKENSTEIN;
Packit c32a2d
		if(NOQUIET) fprintf(stderr, "\nWarning: Encountered more data after announced end of track (frame %"OFF_P"/%"OFF_P"). Frankenstein!\n", (off_p)fr->num, 
Packit c32a2d
#ifdef GAPLESS
Packit c32a2d
		fr->gapless_frames > 0 ? (off_p)fr->gapless_frames : 
Packit c32a2d
#endif
Packit c32a2d
		(off_p)fr->track_frames);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	halfspeed_prepare(fr);
Packit c32a2d
Packit c32a2d
	/* index the position */
Packit c32a2d
	fr->input_offset = framepos;
Packit c32a2d
#ifdef FRAME_INDEX
Packit c32a2d
	/* Keep track of true frame positions in our frame index.
Packit c32a2d
	   but only do so when we are sure that the frame number is accurate... */
Packit c32a2d
	if((fr->state_flags & FRAME_ACCURATE) && FI_NEXT(fr->index, fr->num))
Packit c32a2d
	fi_add(&fr->index, framepos);
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	if(fr->silent_resync > 0) --fr->silent_resync;
Packit c32a2d
Packit c32a2d
	if(fr->rd->forget != NULL) fr->rd->forget(fr);
Packit c32a2d
Packit c32a2d
	fr->to_decode = fr->to_ignore = TRUE;
Packit c32a2d
	if(fr->error_protection) fr->crc = getbits(fr, 16); /* skip crc */
Packit c32a2d
Packit c32a2d
	/*
Packit c32a2d
		Let's check for header change after deciding that the new one is good
Packit c32a2d
		and actually having read a frame.
Packit c32a2d
Packit c32a2d
		header_change > 1: decoder structure has to be updated
Packit c32a2d
		Preserve header_change value from previous runs if it is serious.
Packit c32a2d
		If we still have a big change pending, it should be dealt with outside,
Packit c32a2d
		fr->header_change set to zero afterwards.
Packit c32a2d
	*/
Packit c32a2d
	if(fr->header_change < 2)
Packit c32a2d
	{
Packit c32a2d
		fr->header_change = 2; /* output format change is possible... */
Packit c32a2d
		if(fr->oldhead)        /* check a following header for change */
Packit c32a2d
		{
Packit c32a2d
			if(fr->oldhead == newhead) fr->header_change = 0;
Packit c32a2d
			else
Packit c32a2d
			/* Headers that match in this test behave the same for the outside world.
Packit c32a2d
			   namely: same decoding routines, same amount of decoded data. */
Packit c32a2d
			if(head_compatible(fr->oldhead, newhead))
Packit c32a2d
			fr->header_change = 1;
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				fr->state_flags |= FRAME_FRANKENSTEIN;
Packit c32a2d
				if(NOQUIET)
Packit c32a2d
				fprintf(stderr, "\nWarning: Big change (MPEG version, layer, rate). Frankenstein stream?\n");
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		else if(fr->firsthead && !head_compatible(fr->firsthead, newhead))
Packit c32a2d
		{
Packit c32a2d
			fr->state_flags |= FRAME_FRANKENSTEIN;
Packit c32a2d
			if(NOQUIET)
Packit c32a2d
			fprintf(stderr, "\nWarning: Big change from first (MPEG version, layer, rate). Frankenstein stream?\n");
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	fr->oldhead = newhead;
Packit c32a2d
Packit c32a2d
	return 1;
Packit c32a2d
read_frame_bad:
Packit c32a2d
	/* Also if we searched for valid data in vein, we can forget skipped data.
Packit c32a2d
	   Otherwise, the feeder would hold every dead old byte in memory until the first valid frame! */
Packit c32a2d
	if(fr->rd->forget != NULL) fr->rd->forget(fr);
Packit c32a2d
Packit c32a2d
	fr->silent_resync = 0;
Packit c32a2d
	if(fr->err == MPG123_OK) fr->err = MPG123_ERR_READER;
Packit c32a2d
	fr->framesize = oldsize;
Packit c32a2d
	fr->halfphase = oldphase;
Packit c32a2d
	/* That return code might be inherited from some feeder action, or reader error. */
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
 * read ahead and find the next MPEG header, to guess framesize
Packit c32a2d
 * return value: success code
Packit c32a2d
 *  PARSE_GOOD: found a valid frame size (stored in the handle).
Packit c32a2d
 * <0: error codes, possibly from feeder buffer (NEED_MORE)
Packit c32a2d
 *  PARSE_BAD: cannot get the framesize for some reason and shall silentry try the next possible header (if this is no free format stream after all...)
Packit c32a2d
 */
Packit c32a2d
static int guess_freeformat_framesize(mpg123_handle *fr, unsigned long oldhead)
Packit c32a2d
{
Packit c32a2d
	long i;
Packit c32a2d
	int ret;
Packit c32a2d
	unsigned long head;
Packit c32a2d
	if(!(fr->rdat.flags & (READER_SEEKABLE|READER_BUFFERED)))
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error("Cannot look for freeformat frame size with non-seekable and non-buffered stream!");
Packit c32a2d
Packit c32a2d
		return PARSE_BAD;
Packit c32a2d
	}
Packit c32a2d
	if((ret=fr->rd->head_read(fr,&head))<=0)
Packit c32a2d
	return ret;
Packit c32a2d
Packit c32a2d
	/* We are already 4 bytes into it */
Packit c32a2d
	for(i=4;i
Packit c32a2d
	{
Packit c32a2d
		if((ret=fr->rd->head_shift(fr,&head))<=0) return ret;
Packit c32a2d
Packit c32a2d
		/* No head_check needed, the mask contains all relevant bits. */
Packit c32a2d
		if((head & HDR_SAMEMASK) == (oldhead & HDR_SAMEMASK))
Packit c32a2d
		{
Packit c32a2d
			fr->rd->back_bytes(fr,i+1);
Packit c32a2d
			fr->framesize = i-3;
Packit c32a2d
			return PARSE_GOOD; /* Success! */
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	fr->rd->back_bytes(fr,i);
Packit c32a2d
	return PARSE_BAD;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
 * decode a header and write the information
Packit c32a2d
 * into the frame structure
Packit c32a2d
 * Return values are compatible with those of read_frame, namely:
Packit c32a2d
 *  1: success
Packit c32a2d
 *  0: no valid header
Packit c32a2d
 * <0: some error
Packit c32a2d
 * You are required to do a head_check() before calling!
Packit c32a2d
 */
Packit c32a2d
static int decode_header(mpg123_handle *fr,unsigned long newhead, int *freeformat_count)
Packit c32a2d
{
Packit c32a2d
#ifdef DEBUG /* Do not waste cycles checking the header twice all the time. */
Packit c32a2d
	if(!head_check(newhead))
Packit c32a2d
	{
Packit c32a2d
		error1("trying to decode obviously invalid header 0x%08lx", newhead);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	/* For some reason, the layer and sampling freq settings used to be wrapped
Packit c32a2d
	   in a weird conditional including MPG123_NO_RESYNC. What was I thinking?
Packit c32a2d
	   This information has to be consistent. */
Packit c32a2d
	fr->lay = 4 - HDR_LAYER_VAL(newhead);
Packit c32a2d
Packit c32a2d
	if(HDR_VERSION_VAL(newhead) & 0x2)
Packit c32a2d
	{
Packit c32a2d
		fr->lsf = (HDR_VERSION_VAL(newhead) & 0x1) ? 0 : 1;
Packit c32a2d
		fr->mpeg25 = 0;
Packit c32a2d
		fr->sampling_frequency = HDR_SAMPLERATE_VAL(newhead) + (fr->lsf*3);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		fr->lsf = 1;
Packit c32a2d
		fr->mpeg25 = 1;
Packit c32a2d
		fr->sampling_frequency = 6 + HDR_SAMPLERATE_VAL(newhead);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	#ifdef DEBUG
Packit c32a2d
	/* seen a file where this varies (old lame tag without crc, track with crc) */
Packit c32a2d
	if((HDR_CRC_VAL(newhead)^0x1) != fr->error_protection) debug("changed crc bit!");
Packit c32a2d
	#endif
Packit c32a2d
	fr->error_protection = HDR_CRC_VAL(newhead)^0x1;
Packit c32a2d
	fr->bitrate_index    = HDR_BITRATE_VAL(newhead);
Packit c32a2d
	fr->padding          = HDR_PADDING_VAL(newhead);
Packit c32a2d
	fr->extension        = HDR_PRIVATE_VAL(newhead);
Packit c32a2d
	fr->mode             = HDR_CHANNEL_VAL(newhead);
Packit c32a2d
	fr->mode_ext         = HDR_CHANEX_VAL(newhead);
Packit c32a2d
	fr->copyright        = HDR_COPYRIGHT_VAL(newhead);
Packit c32a2d
	fr->original         = HDR_ORIGINAL_VAL(newhead);
Packit c32a2d
	fr->emphasis         = HDR_EMPHASIS_VAL(newhead);
Packit c32a2d
	fr->freeformat       = !(newhead & HDR_BITRATE);
Packit c32a2d
Packit c32a2d
	fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
Packit c32a2d
Packit c32a2d
	/* we can't use tabsel_123 for freeformat, so trying to guess framesize... */
Packit c32a2d
	if(fr->freeformat)
Packit c32a2d
	{
Packit c32a2d
		/* when we first encounter the frame with freeformat, guess framesize */
Packit c32a2d
		if(fr->freeformat_framesize < 0)
Packit c32a2d
		{
Packit c32a2d
			int ret;
Packit c32a2d
			*freeformat_count += 1;
Packit c32a2d
			if(*freeformat_count > 5)
Packit c32a2d
			{
Packit c32a2d
				if(VERBOSE3) error("You fooled me too often. Refusing to guess free format frame size _again_.");
Packit c32a2d
				return PARSE_BAD;
Packit c32a2d
			}
Packit c32a2d
			ret = guess_freeformat_framesize(fr, newhead);
Packit c32a2d
			if(ret == PARSE_GOOD)
Packit c32a2d
			{
Packit c32a2d
				fr->freeformat_framesize = fr->framesize - fr->padding;
Packit c32a2d
				if(VERBOSE2)
Packit c32a2d
				fprintf(stderr, "Note: free format frame size %li\n", fr->freeformat_framesize);
Packit c32a2d
			}
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				if(ret == MPG123_NEED_MORE)
Packit c32a2d
				debug("Need more data to guess free format frame size.");
Packit c32a2d
				else if(VERBOSE3)
Packit c32a2d
				error("Encountered free format header, but failed to guess frame size.");
Packit c32a2d
Packit c32a2d
				return ret;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		/* freeformat should be CBR, so the same framesize can be used at the 2nd reading or later */
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			fr->framesize = fr->freeformat_framesize + fr->padding;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	switch(fr->lay)
Packit c32a2d
	{
Packit c32a2d
#ifndef NO_LAYER1
Packit c32a2d
		case 1:
Packit c32a2d
			fr->spf = 384;
Packit c32a2d
			fr->do_layer = do_layer1;
Packit c32a2d
			if(!fr->freeformat)
Packit c32a2d
			{
Packit c32a2d
				fr->framesize  = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
Packit c32a2d
				fr->framesize /= freqs[fr->sampling_frequency];
Packit c32a2d
				fr->framesize  = ((fr->framesize+fr->padding)<<2)-4;
Packit c32a2d
			}
Packit c32a2d
		break;
Packit c32a2d
#endif
Packit c32a2d
#ifndef NO_LAYER2
Packit c32a2d
		case 2:
Packit c32a2d
			fr->spf = 1152;
Packit c32a2d
			fr->do_layer = do_layer2;
Packit c32a2d
			if(!fr->freeformat)
Packit c32a2d
			{
Packit c32a2d
				debug2("bitrate index: %i (%i)", fr->bitrate_index, tabsel_123[fr->lsf][1][fr->bitrate_index] );
Packit c32a2d
				fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
Packit c32a2d
				fr->framesize /= freqs[fr->sampling_frequency];
Packit c32a2d
				fr->framesize += fr->padding - 4;
Packit c32a2d
			}
Packit c32a2d
		break;
Packit c32a2d
#endif
Packit c32a2d
#ifndef NO_LAYER3
Packit c32a2d
		case 3:
Packit c32a2d
			fr->spf = fr->lsf ? 576 : 1152; /* MPEG 2.5 implies LSF.*/
Packit c32a2d
			fr->do_layer = do_layer3;
Packit c32a2d
			if(fr->lsf)
Packit c32a2d
			fr->ssize = (fr->stereo == 1) ? 9 : 17;
Packit c32a2d
			else
Packit c32a2d
			fr->ssize = (fr->stereo == 1) ? 17 : 32;
Packit c32a2d
Packit c32a2d
			if(fr->error_protection)
Packit c32a2d
			fr->ssize += 2;
Packit c32a2d
Packit c32a2d
			if(!fr->freeformat)
Packit c32a2d
			{
Packit c32a2d
				fr->framesize  = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
Packit c32a2d
				fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf);
Packit c32a2d
				fr->framesize = fr->framesize + fr->padding - 4;
Packit c32a2d
			}
Packit c32a2d
		break;
Packit c32a2d
#endif 
Packit c32a2d
		default:
Packit c32a2d
			if(NOQUIET) error1("Layer type %i not supported in this build!", fr->lay); 
Packit c32a2d
Packit c32a2d
			return PARSE_BAD;
Packit c32a2d
	}
Packit c32a2d
	if (fr->framesize > MAXFRAMESIZE)
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error1("Frame size too big: %d", fr->framesize+4-fr->padding);
Packit c32a2d
Packit c32a2d
		return PARSE_BAD;
Packit c32a2d
	}
Packit c32a2d
	return PARSE_GOOD;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
void set_pointer(mpg123_handle *fr, long backstep)
Packit c32a2d
{
Packit c32a2d
	fr->wordpointer = fr->bsbuf + fr->ssize - backstep;
Packit c32a2d
	if (backstep)
Packit c32a2d
	memcpy(fr->wordpointer,fr->bsbufold+fr->fsizeold-backstep,backstep);
Packit c32a2d
Packit c32a2d
	fr->bitindex = 0; 
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/********************************/
Packit c32a2d
Packit c32a2d
double compute_bpf(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	return (fr->framesize > 0) ? fr->framesize + 4.0 : 1.0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int attribute_align_arg mpg123_spf(mpg123_handle *mh)
Packit c32a2d
{
Packit c32a2d
	if(mh == NULL) return MPG123_ERR;
Packit c32a2d
Packit c32a2d
	return mh->firsthead ? mh->spf : MPG123_ERR;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
double attribute_align_arg mpg123_tpf(mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	static int bs[4] = { 0,384,1152,1152 };
Packit c32a2d
	double tpf;
Packit c32a2d
	if(fr == NULL || !fr->firsthead) return MPG123_ERR;
Packit c32a2d
Packit c32a2d
	tpf = (double) bs[fr->lay];
Packit c32a2d
	tpf /= freqs[fr->sampling_frequency] << (fr->lsf);
Packit c32a2d
	return tpf;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int attribute_align_arg mpg123_position(mpg123_handle *fr, off_t no, off_t buffsize,
Packit c32a2d
	off_t  *current_frame,   off_t  *frames_left,
Packit c32a2d
	double *current_seconds, double *seconds_left)
Packit c32a2d
{
Packit c32a2d
	double tpf;
Packit c32a2d
	double dt = 0.0;
Packit c32a2d
	off_t cur, left;
Packit c32a2d
	double curs, lefts;
Packit c32a2d
Packit c32a2d
	if(!fr || !fr->rd) return MPG123_ERR;
Packit c32a2d
Packit c32a2d
	no += fr->num; /* no starts out as offset */
Packit c32a2d
	cur = no;
Packit c32a2d
	tpf = mpg123_tpf(fr);
Packit c32a2d
	if(buffsize > 0 && fr->af.rate > 0 && fr->af.channels > 0)
Packit c32a2d
	{
Packit c32a2d
		dt = (double) buffsize / fr->af.rate / fr->af.channels;
Packit c32a2d
		if(fr->af.encoding & MPG123_ENC_16) dt *= 0.5;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	left = 0;
Packit c32a2d
Packit c32a2d
	if((fr->track_frames != 0) && (fr->track_frames >= fr->num)) left = no < fr->track_frames ? fr->track_frames - no : 0;
Packit c32a2d
	else
Packit c32a2d
	if(fr->rdat.filelen >= 0)
Packit c32a2d
	{
Packit c32a2d
		double bpf;
Packit c32a2d
		off_t t = fr->rd->tell(fr);
Packit c32a2d
		bpf = fr->mean_framesize ? fr->mean_framesize : compute_bpf(fr);
Packit c32a2d
		left = (off_t)((double)(fr->rdat.filelen-t)/bpf);
Packit c32a2d
		/* no can be different for prophetic purposes, file pointer is always associated with fr->num! */
Packit c32a2d
		if(fr->num != no)
Packit c32a2d
		{
Packit c32a2d
			if(fr->num > no) left += fr->num - no;
Packit c32a2d
			else
Packit c32a2d
			{
Packit c32a2d
				if(left >= (no - fr->num)) left -= no - fr->num;
Packit c32a2d
				else left = 0; /* uh, oh! */
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		/* I totally don't understand why we should re-estimate the given correct(?) value */
Packit c32a2d
		/* fr->num = (unsigned long)((double)t/bpf); */
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* beginning with 0 or 1?*/
Packit c32a2d
	curs = (double) no*tpf-dt;
Packit c32a2d
	lefts = (double)left*tpf+dt;
Packit c32a2d
#if 0
Packit c32a2d
	curs = curs < 0 ? 0.0 : curs;
Packit c32a2d
#endif
Packit c32a2d
	if(left < 0 || lefts < 0)
Packit c32a2d
	{ /* That is the case for non-seekable streams. */
Packit c32a2d
		left  = 0;
Packit c32a2d
		lefts = 0.0;
Packit c32a2d
	}
Packit c32a2d
	if(current_frame != NULL) *current_frame = cur;
Packit c32a2d
	if(frames_left   != NULL) *frames_left   = left;
Packit c32a2d
	if(current_seconds != NULL) *current_seconds = curs;
Packit c32a2d
	if(seconds_left    != NULL) *seconds_left   = lefts;
Packit c32a2d
	return MPG123_OK;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int get_songlen(mpg123_handle *fr,int no)
Packit c32a2d
{
Packit c32a2d
	double tpf;
Packit c32a2d
	
Packit c32a2d
	if(!fr)
Packit c32a2d
		return 0;
Packit c32a2d
	
Packit c32a2d
	if(no < 0) {
Packit c32a2d
		if(!fr->rd || fr->rdat.filelen < 0)
Packit c32a2d
			return 0;
Packit c32a2d
		no = (int) ((double) fr->rdat.filelen / compute_bpf(fr));
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	tpf = mpg123_tpf(fr);
Packit c32a2d
	return (int) (no*tpf);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* first attempt of read ahead check to find the real first header; cannot believe what junk is out there! */
Packit c32a2d
static int do_readahead(mpg123_handle *fr, unsigned long newhead)
Packit c32a2d
{
Packit c32a2d
	unsigned long nexthead = 0;
Packit c32a2d
	int hd = 0;
Packit c32a2d
	off_t start, oret;
Packit c32a2d
	int ret;
Packit c32a2d
Packit c32a2d
	if( ! (!fr->firsthead && fr->rdat.flags & (READER_SEEKABLE|READER_BUFFERED)) )
Packit c32a2d
	return PARSE_GOOD;
Packit c32a2d
Packit c32a2d
	start = fr->rd->tell(fr);
Packit c32a2d
Packit c32a2d
	debug2("doing ahead check with BPF %d at %"OFF_P, fr->framesize+4, (off_p)start);
Packit c32a2d
	/* step framesize bytes forward and read next possible header*/
Packit c32a2d
	if((oret=fr->rd->skip_bytes(fr, fr->framesize))<0)
Packit c32a2d
	{
Packit c32a2d
		if(oret==READER_ERROR && NOQUIET) error("cannot seek!");
Packit c32a2d
Packit c32a2d
		return oret == MPG123_NEED_MORE ? PARSE_MORE : PARSE_ERR;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* Read header, seek back. */
Packit c32a2d
	hd = fr->rd->head_read(fr,&nexthead);
Packit c32a2d
	if( fr->rd->back_bytes(fr, fr->rd->tell(fr)-start) < 0 )
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error("Cannot seek back!");
Packit c32a2d
Packit c32a2d
		return PARSE_ERR;
Packit c32a2d
	}
Packit c32a2d
	if(hd == MPG123_NEED_MORE) return PARSE_MORE;
Packit c32a2d
Packit c32a2d
	debug1("After fetching next header, at %"OFF_P, (off_p)fr->rd->tell(fr));
Packit c32a2d
	if(!hd)
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) warning("Cannot read next header, a one-frame stream? Duh...");
Packit c32a2d
		return PARSE_END;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	debug2("does next header 0x%08lx match first 0x%08lx?", nexthead, newhead);
Packit c32a2d
	if(!head_check(nexthead) || !head_compatible(newhead, nexthead))
Packit c32a2d
	{
Packit c32a2d
		debug("No, the header was not valid, start from beginning...");
Packit c32a2d
		fr->oldhead = 0; /* start over */
Packit c32a2d
		/* try next byte for valid header */
Packit c32a2d
		if((ret=fr->rd->back_bytes(fr, 3))<0)
Packit c32a2d
		{
Packit c32a2d
			if(NOQUIET) error("Cannot seek 3 bytes back!");
Packit c32a2d
Packit c32a2d
			return PARSE_ERR;
Packit c32a2d
		}
Packit c32a2d
		return PARSE_AGAIN;
Packit c32a2d
	}
Packit c32a2d
	else return PARSE_GOOD;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static int handle_id3v2(mpg123_handle *fr, unsigned long newhead)
Packit c32a2d
{
Packit c32a2d
	int ret;
Packit c32a2d
	fr->oldhead = 0; /* Think about that. Used to be present only for skipping of junk, not resync-style wetwork. */
Packit c32a2d
	ret = parse_new_id3(fr, newhead);
Packit c32a2d
	if     (ret < 0) return ret;
Packit c32a2d
#ifndef NO_ID3V2
Packit c32a2d
	else if(ret > 0){ debug("got ID3v2"); fr->metaflags  |= MPG123_NEW_ID3|MPG123_ID3; }
Packit c32a2d
	else debug("no useful ID3v2");
Packit c32a2d
#endif
Packit c32a2d
	return PARSE_AGAIN;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
static int handle_apetag(mpg123_handle *fr, unsigned long newhead)
Packit c32a2d
{
Packit c32a2d
	unsigned char apebuf[28];
Packit c32a2d
	unsigned long val;
Packit c32a2d
	int i, ret;
Packit c32a2d
Packit c32a2d
	fr->oldhead = 0;
Packit c32a2d
Packit c32a2d
	/* Apetag headers are 32 bytes, newhead contains 4, read the rest */
Packit c32a2d
	if((ret=fr->rd->fullread(fr,apebuf,28)) < 0) return ret;
Packit c32a2d
Packit c32a2d
	/* Apetags start with "APETAGEX", "APET" is already tested. */
Packit c32a2d
	if(strncmp((char *)apebuf,"AGEX",4) != 0)
Packit c32a2d
		goto apetag_bad;
Packit c32a2d
Packit c32a2d
	/* Version must be 2.000 / 2000 */
Packit c32a2d
	val = (apebuf[7]<<24)|(apebuf[6]<<16)|(apebuf[5]<<8)|apebuf[4];
Packit c32a2d
	if(val != 2000)
Packit c32a2d
		goto apetag_bad;
Packit c32a2d
Packit c32a2d
	/* Last 8 bytes must be 0 */
Packit c32a2d
	for(i=20; i<28; i++)
Packit c32a2d
		if(apebuf[i])
Packit c32a2d
			goto apetag_bad;
Packit c32a2d
Packit c32a2d
	/* Looks good, skip the rest. */
Packit c32a2d
	val = (apebuf[11]<<24)|(apebuf[10]<<16)|(apebuf[9]<<8)|apebuf[8];
Packit c32a2d
	if((ret=fr->rd->skip_bytes(fr,val)) < 0) return ret;
Packit c32a2d
Packit c32a2d
	return PARSE_AGAIN;
Packit c32a2d
Packit c32a2d
apetag_bad:	
Packit c32a2d
	if(fr->rd->back_bytes(fr,31) < 0 && NOQUIET)
Packit c32a2d
		error("Cannot seek 31 bytes back!");
Packit c32a2d
Packit c32a2d
	return PARSE_AGAIN; /* Give the resync code a chance to fix things */
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Advance a byte in stream to get next possible header and forget 
Packit c32a2d
   buffered data if possible (for feed reader). */
Packit c32a2d
#define FORGET_INTERVAL 1024 /* Used by callers to set forget flag each <n> bytes. */
Packit c32a2d
static int forget_head_shift(mpg123_handle *fr, unsigned long *newheadp, int forget)
Packit c32a2d
{
Packit c32a2d
	int ret;
Packit c32a2d
	if((ret=fr->rd->head_shift(fr,newheadp))<=0) return ret;
Packit c32a2d
	/* Try to forget buffered data as early as possible to speed up parsing where
Packit c32a2d
	   new data needs to be added for resync (and things would be re-parsed again
Packit c32a2d
	   and again because of the start from beginning after hitting end). */
Packit c32a2d
	if(forget && fr->rd->forget != NULL)
Packit c32a2d
	{
Packit c32a2d
		/* Ensure that the last 4 bytes stay in buffers for reading the header
Packit c32a2d
		   anew. */
Packit c32a2d
		if(!fr->rd->back_bytes(fr, 4))
Packit c32a2d
		{
Packit c32a2d
			fr->rd->forget(fr);
Packit c32a2d
			fr->rd->back_bytes(fr, -4);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	return ret; /* No surprise here, error already triggered early return. */
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* watch out for junk/tags on beginning of stream by invalid header */
Packit c32a2d
static int skip_junk(mpg123_handle *fr, unsigned long *newheadp, long *headcount)
Packit c32a2d
{
Packit c32a2d
	int ret;
Packit c32a2d
	int freeformat_count = 0;
Packit c32a2d
	long limit = 65536;
Packit c32a2d
	unsigned long newhead = *newheadp;
Packit c32a2d
	unsigned int forgetcount = 0;
Packit c32a2d
	/* check for id3v2; first three bytes (of 4) are "ID3" */
Packit c32a2d
	if((newhead & (unsigned long) 0xffffff00) == (unsigned long) 0x49443300)
Packit c32a2d
	{
Packit c32a2d
		return handle_id3v2(fr, newhead);
Packit c32a2d
	}
Packit c32a2d
	else if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr,"Note: Junk at the beginning (0x%08lx)\n",newhead);
Packit c32a2d
Packit c32a2d
	/* I even saw RIFF headers at the beginning of MPEG streams ;( */
Packit c32a2d
	if(newhead == ('R'<<24)+('I'<<16)+('F'<<8)+'F')
Packit c32a2d
	{
Packit c32a2d
		if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr, "Note: Looks like a RIFF header.\n");
Packit c32a2d
Packit c32a2d
		if((ret=fr->rd->head_read(fr,&newhead))<=0) return ret;
Packit c32a2d
Packit c32a2d
		while(newhead != ('d'<<24)+('a'<<16)+('t'<<8)+'a')
Packit c32a2d
		{
Packit c32a2d
			if(++forgetcount > FORGET_INTERVAL) forgetcount = 0;
Packit c32a2d
			if((ret=forget_head_shift(fr,&newhead,!forgetcount))<=0) return ret;
Packit c32a2d
		}
Packit c32a2d
		if((ret=fr->rd->head_read(fr,&newhead))<=0) return ret;
Packit c32a2d
Packit c32a2d
		if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr,"Note: Skipped RIFF header!\n");
Packit c32a2d
Packit c32a2d
		fr->oldhead = 0;
Packit c32a2d
		*newheadp = newhead;
Packit c32a2d
		return PARSE_AGAIN;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/*
Packit c32a2d
		Unhandled junk... just continue search for a header, stepping in single bytes through next 64K.
Packit c32a2d
		This is rather identical to the resync loop.
Packit c32a2d
	*/
Packit c32a2d
	debug("searching for header...");
Packit c32a2d
	*newheadp = 0; /* Invalidate the external value. */
Packit c32a2d
	ret = 0; /* We will check the value after the loop. */
Packit c32a2d
Packit c32a2d
	/* We prepare for at least the 64K bytes as usual, unless
Packit c32a2d
	   user explicitly wanted more (even infinity). Never less. */
Packit c32a2d
	if(fr->p.resync_limit < 0 || fr->p.resync_limit > limit)
Packit c32a2d
	limit = fr->p.resync_limit;
Packit c32a2d
Packit c32a2d
	do
Packit c32a2d
	{
Packit c32a2d
		++(*headcount);
Packit c32a2d
		if(limit >= 0 && *headcount >= limit) break;				
Packit c32a2d
Packit c32a2d
		if(++forgetcount > FORGET_INTERVAL) forgetcount = 0;
Packit c32a2d
		if((ret=forget_head_shift(fr, &newhead, !forgetcount))<=0) return ret;
Packit c32a2d
Packit c32a2d
		if(head_check(newhead) && (ret=decode_header(fr, newhead, &freeformat_count))) break;
Packit c32a2d
	} while(1);
Packit c32a2d
	if(ret<0) return ret;
Packit c32a2d
Packit c32a2d
	if(limit >= 0 && *headcount >= limit)
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error1("Giving up searching valid MPEG header after %li bytes of junk.", *headcount);
Packit c32a2d
		return PARSE_END;
Packit c32a2d
	}
Packit c32a2d
	else debug1("hopefully found one at %"OFF_P, (off_p)fr->rd->tell(fr));
Packit c32a2d
Packit c32a2d
	/* If the new header ist good, it is already decoded. */
Packit c32a2d
	*newheadp = newhead;
Packit c32a2d
	return PARSE_GOOD;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* The newhead is bad, so let's check if it is something special, otherwise just resync. */
Packit c32a2d
static int wetwork(mpg123_handle *fr, unsigned long *newheadp)
Packit c32a2d
{
Packit c32a2d
	int ret = PARSE_ERR;
Packit c32a2d
	unsigned long newhead = *newheadp;
Packit c32a2d
	*newheadp = 0;
Packit c32a2d
Packit c32a2d
	/* Classic ID3 tags. Read, then start parsing again. */
Packit c32a2d
	if((newhead & 0xffffff00) == ('T'<<24)+('A'<<16)+('G'<<8))
Packit c32a2d
	{
Packit c32a2d
		fr->id3buf[0] = (unsigned char) ((newhead >> 24) & 0xff);
Packit c32a2d
		fr->id3buf[1] = (unsigned char) ((newhead >> 16) & 0xff);
Packit c32a2d
		fr->id3buf[2] = (unsigned char) ((newhead >> 8)  & 0xff);
Packit c32a2d
		fr->id3buf[3] = (unsigned char) ( newhead        & 0xff);
Packit c32a2d
Packit c32a2d
		if((ret=fr->rd->fullread(fr,fr->id3buf+4,124)) < 0) return ret;
Packit c32a2d
Packit c32a2d
		fr->metaflags  |= MPG123_NEW_ID3|MPG123_ID3;
Packit c32a2d
		fr->rdat.flags |= READER_ID3TAG; /* that marks id3v1 */
Packit c32a2d
		if(VERBOSE3) fprintf(stderr,"Note: Skipped ID3v1 tag.\n");
Packit c32a2d
Packit c32a2d
		return PARSE_AGAIN;
Packit c32a2d
	}
Packit c32a2d
	/* This is similar to initial junk skipping code... */
Packit c32a2d
	/* Check for id3v2; first three bytes (of 4) are "ID3" */
Packit c32a2d
	if((newhead & (unsigned long) 0xffffff00) == (unsigned long) 0x49443300)
Packit c32a2d
	{
Packit c32a2d
		return handle_id3v2(fr, newhead);
Packit c32a2d
	}
Packit c32a2d
	/* Check for an apetag header */
Packit c32a2d
	if(newhead == ('A'<<24)+('P'<<16)+('E'<<8)+'T')
Packit c32a2d
	{
Packit c32a2d
		return handle_apetag(fr, newhead);
Packit c32a2d
	}
Packit c32a2d
	else if(NOQUIET && fr->silent_resync == 0)
Packit c32a2d
	{
Packit c32a2d
		fprintf(stderr,"Note: Illegal Audio-MPEG-Header 0x%08lx at offset %"OFF_P".\n",
Packit c32a2d
			newhead, (off_p)fr->rd->tell(fr)-4);
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	/* Now we got something bad at hand, try to recover. */
Packit c32a2d
Packit c32a2d
	if(NOQUIET && (newhead & 0xffffff00) == ('b'<<24)+('m'<<16)+('p'<<8)) fprintf(stderr,"Note: Could be a BMP album art.\n");
Packit c32a2d
Packit c32a2d
	if( !(fr->p.flags & MPG123_NO_RESYNC) )
Packit c32a2d
	{
Packit c32a2d
		long try = 0;
Packit c32a2d
		long limit = fr->p.resync_limit;
Packit c32a2d
		unsigned int forgetcount = 0;
Packit c32a2d
Packit c32a2d
		/* If a resync is needed the bitreservoir of previous frames is no longer valid */
Packit c32a2d
		fr->bitreservoir = 0;
Packit c32a2d
Packit c32a2d
		if(NOQUIET && fr->silent_resync == 0) fprintf(stderr, "Note: Trying to resync...\n");
Packit c32a2d
Packit c32a2d
		do /* ... shift the header with additional single bytes until be found something that could be a header. */
Packit c32a2d
		{
Packit c32a2d
			++try;
Packit c32a2d
			if(limit >= 0 && try >= limit) break;				
Packit c32a2d
Packit c32a2d
			if(++forgetcount > FORGET_INTERVAL) forgetcount = 0;
Packit c32a2d
			if((ret=forget_head_shift(fr,&newhead,!forgetcount)) <= 0)
Packit c32a2d
			{
Packit c32a2d
				*newheadp = newhead;
Packit c32a2d
				if(NOQUIET) fprintf (stderr, "Note: Hit end of (available) data during resync.\n");
Packit c32a2d
Packit c32a2d
				return ret ? ret : PARSE_END;
Packit c32a2d
			}
Packit c32a2d
			if(VERBOSE3) debug3("resync try %li at %"OFF_P", got newhead 0x%08lx", try, (off_p)fr->rd->tell(fr),  newhead);
Packit c32a2d
		} while(!head_check(newhead));
Packit c32a2d
Packit c32a2d
		*newheadp = newhead;
Packit c32a2d
		if(NOQUIET && fr->silent_resync == 0) fprintf (stderr, "Note: Skipped %li bytes in input.\n", try);
Packit c32a2d
Packit c32a2d
		/* Now we either got something that could be a header, or we gave up. */
Packit c32a2d
		if(limit >= 0 && try >= limit)
Packit c32a2d
		{
Packit c32a2d
			if(NOQUIET)
Packit c32a2d
			error1("Giving up resync after %li bytes - your stream is not nice... (maybe increasing resync limit could help).", try);
Packit c32a2d
Packit c32a2d
			fr->err = MPG123_RESYNC_FAIL;
Packit c32a2d
			return PARSE_ERR;
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			debug1("Found possibly valid header 0x%lx... unsetting oldhead to reinit stream.", newhead);
Packit c32a2d
			fr->oldhead = 0;
Packit c32a2d
			return PARSE_RESYNC;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		if(NOQUIET) error("not attempting to resync...");
Packit c32a2d
Packit c32a2d
		fr->err = MPG123_OUT_OF_SYNC;
Packit c32a2d
		return PARSE_ERR;
Packit c32a2d
	}
Packit c32a2d
	/* Control never goes here... we return before that. */
Packit c32a2d
}