aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/LAMEinfo.h
blob: d8e6db04dce29674948f0a6e2f332faba0433e61 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef NULLSOFT_LAMEINFOH
#define NULLSOFT_LAMEINFOH


#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)
#include <memory.h>
#pragma intrinsic(memset)
struct LAMEinfo
{
	LAMEinfo() 
	{
		memset(this, 0, sizeof(LAMEinfo));
	}

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

		// LAME
	char lameTag[10]; // 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 encoderDelay;
	unsigned short padding;
	int encodingMethod;
};

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(unsigned char *buffer, LAMEinfo *lameInfo);

class MPEGFrame
{
public:
	int GetNumChannels();

	void ReadBuffer(const unsigned char *buffer);
	bool IsSync();
	int GetBitrate();
	int GetPadding();
	int HeaderSize();
	int GetSampleRate() const;
	int FrameSize();
	const char *GetMPEGVersionString();
	const char *GetChannelModeString();
	const char *GetEmphasisString();
	int GetLayer();
	bool IsCRC();
	bool IsCopyright();
	bool IsOriginal();
	int MPEGFrame::GetSamplesPerFrame() const;
	
	enum
	{
		NotPadded=0,
		Padded=1,
		CRC = 0,
		NoProtection = 1,
		Stereo = 0,
		JointStereo = 1,
		DualChannel = 2,
		Mono = 3,
		MPEG1 = 3,
		MPEG2 = 2,
    MPEG_Error = 1,
		MPEG2_5 = 0,
		Layer1 = 3,
		Layer2 = 2,
		Layer3 = 1,
    LayerError = 0,
		Emphasis_None = 0,
		Emphasis_50_15_ms = 1,
		Emphasis_reserved = 2,
		Emphasis_CCIT_J_17 = 3,
	};

	unsigned int sync:11, 
mpegVersion:2, 
layer:2, 
protection:1,
bitrateIndex:4, 
paddingBit:1,
privateBit:1, 
channelMode:2, 
modeExtension:2, 
sampleRateIndex:2, 
copyright:1, 
original:1, 
emphasis:2;
};


#endif