mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-04 15:11:02 -05:00
94 lines
2.3 KiB
C++
94 lines
2.3 KiB
C++
|
#include "AACFrame.h"
|
||
|
#include "api__in_mp3.h"
|
||
|
#include "resource.h"
|
||
|
#include "in2.h"
|
||
|
extern In_Module mod;
|
||
|
|
||
|
void AACFrame::ReadBuffer( unsigned __int8 *buffer )
|
||
|
{
|
||
|
syncword = ( buffer[ 0 ] << 4 ) | ( buffer[ 1 ] >> 4 );
|
||
|
id = ( buffer[ 1 ] >> 3 ) & 1;
|
||
|
layer = ( buffer[ 1 ] >> 1 ) & 3;
|
||
|
protection = ( buffer[ 1 ] ) & 1;
|
||
|
profile = ( buffer[ 2 ] >> 6 ) & 3;
|
||
|
sampleRateIndex = ( buffer[ 2 ] >> 2 ) & 0xF;
|
||
|
privateBit = ( buffer[ 2 ] >> 1 ) & 1;
|
||
|
channelConfiguration = ( ( buffer[ 2 ] & 1 ) << 2 ) | ( ( buffer[ 3 ] >> 6 ) & 3 );
|
||
|
original = ( buffer[ 3 ] >> 5 ) & 1;
|
||
|
home = ( buffer[ 3 ] >> 4 ) & 1;
|
||
|
|
||
|
//copyright_identification_bit = (buffer[3] >> 3) & 1;
|
||
|
//copyright_identification_start = (buffer[3] >> 2) & 1;
|
||
|
frameLength = ( ( buffer[ 3 ] & 3 ) << 11 ) | ( buffer[ 4 ] << 3 ) | ( ( buffer[ 5 ] >> 5 ) & 7 );
|
||
|
bufferFullness = ( ( buffer[ 5 ] & 0xF8 ) << 5 ) | ( ( buffer[ 6 ] >> 2 ) & 0x3F );
|
||
|
numDataBlocks = buffer[ 6 ] & 3;
|
||
|
}
|
||
|
|
||
|
bool AACFrame::OK()
|
||
|
{
|
||
|
if (syncword == SYNC
|
||
|
&& layer == 0
|
||
|
&& sampleRateIndex < 13
|
||
|
//&& profile != LTP // TODO: can coding technologies decoder do LTP?
|
||
|
)
|
||
|
return true;
|
||
|
else
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
static const unsigned int aac_sratetab[] =
|
||
|
{
|
||
|
96000,
|
||
|
88200,
|
||
|
64000,
|
||
|
48000,
|
||
|
44100,
|
||
|
32000,
|
||
|
24000,
|
||
|
22050,
|
||
|
16000,
|
||
|
12000,
|
||
|
11025,
|
||
|
8000,
|
||
|
7350,
|
||
|
};
|
||
|
|
||
|
int AACFrame::GetSampleRate()
|
||
|
{
|
||
|
return aac_sratetab[sampleRateIndex];
|
||
|
}
|
||
|
|
||
|
static const wchar_t *aac_profiletab[] = {L"Main", L"LC", L"SSR", L"LTP"};
|
||
|
|
||
|
const wchar_t *AACFrame::GetProfileName()
|
||
|
{
|
||
|
return aac_profiletab[profile];
|
||
|
}
|
||
|
|
||
|
//static const char *aac_channels[] = {"Custom", "Mono", "Stereo", "3 channel", "4 channel", "surround", "5.1", "7.1"};
|
||
|
static wchar_t aac_channels_str[64];
|
||
|
static int aac_channels_id[] = {IDS_CUSTOM, IDS_MONO, IDS_STEREO, IDS_3_CHANNEL, IDS_4_CHANNEL, IDS_SURROUND, IDS_5_1, IDS_7_1};
|
||
|
const wchar_t *AACFrame::GetChannelConfigurationName()
|
||
|
{
|
||
|
return WASABI_API_LNGSTRINGW_BUF(aac_channels_id[channelConfiguration],aac_channels_str,64);
|
||
|
}
|
||
|
|
||
|
int AACFrame::GetNumChannels()
|
||
|
{
|
||
|
switch(channelConfiguration)
|
||
|
{
|
||
|
case 7:
|
||
|
return 8;
|
||
|
default:
|
||
|
return channelConfiguration;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int AACFrame::GetMPEGVersion()
|
||
|
{
|
||
|
if (id == 0)
|
||
|
return 2;
|
||
|
else
|
||
|
return 4;
|
||
|
}
|