#pragma once
#include "foundation/types.h"
#include "MPEGHeader.h"
#define FRAMES_FLAG     0x0001
#define BYTES_FLAG      0x0002
#define TOC_FLAG        0x0004
#define VBR_SCALE_FLAG  0x0008

#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)

struct LAMEInfo
{
	LAMEInfo();
	uint64_t GetSeekPoint(double percent) const; /* 0 <= percent <= 1.0 */
	int Read(const MPEGHeader &frame, const uint8_t *buffer, size_t bufferlen);
	double GetLengthSeconds() const;
	uint64_t GetSamples() const;
	uint32_t GetFrames() const;

	bool Flag(int flag) const;
	int GetGaps(size_t *pregap, size_t *postgap);
protected:
	int version;
	int sample_rate;
	int samples_per_frame;

	int cbr; // set to 1 if the file is actually just CBR
	// Xing
	int flags;        // from Xing header data
	uint32_t frames;  // total bit stream frames from Xing header data
	uint64_t bytes;   // total bit stream bytes from Xing header data
	int vbr_scale;    // encoded vbr scale from Xing header data
	uint8_t toc[100]; // pointer to unsigned char toc_buffer[100]
	// may be NULL if toc not desired

	// LAME
	char encoder[32]; // 9 characters, but we'll add an extra NULL just in case
	float peak;
	float replaygain_album_gain;
	float replaygain_track_gain;
	unsigned short lowpass;
	unsigned short encoder_delay;
	unsigned short padding;
	uint8_t encoding_method;
	uint8_t tag_revision;
	uint8_t abr_bitrate;
	uint32_t music_length;
	uint16_t music_crc;
	uint16_t tag_crc;
};

enum
{
	ENCODING_METHOD_LAME = 0,
	ENCODING_METHOD_CBR = 1,
	ENCODING_METHOD_ABR = 2,
	ENCODING_METHOD_VBR1 = 3,
	ENCODING_METHOD_VBR2 = 4,
	ENCODING_METHOD_VBR3 = 5,
	ENCODING_METHOD_VBR4 = 6,
	ENCODING_METHOD_CBR_2PASS = 8,
	ENCODING_METHOD_ABR_2PASS = 9,
};

int ReadLAMEInfo(const MPEGHeader &frame, const uint8_t *buffer, LAMEInfo *lameInfo);