aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/AACFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mp3/AACFrame.cpp')
-rw-r--r--Src/Plugins/Input/in_mp3/AACFrame.cpp94
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