diff options
Diffstat (limited to 'Src/Plugins/Input/in_mp3/AACFrame.cpp')
-rw-r--r-- | Src/Plugins/Input/in_mp3/AACFrame.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/AACFrame.cpp b/Src/Plugins/Input/in_mp3/AACFrame.cpp new file mode 100644 index 00000000..b2e8384d --- /dev/null +++ b/Src/Plugins/Input/in_mp3/AACFrame.cpp @@ -0,0 +1,94 @@ +#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; +}
\ No newline at end of file |