aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfuzzard <fuzzard@users.noreply.github.com>2023-06-28 14:21:28 +1000
committerGitHub <noreply@github.com>2023-06-28 14:21:28 +1000
commitbf29ff1fab7f9450b48cc2cffe8beee0bc53331e (patch)
treed93cf5d7d88acca93e4d5416327a9adbbc63e904
parentdac271df8c540a8b27b7728268e597d8223f4928 (diff)
parenteb85829058e27d9c92ccc1449cbd650186c01c17 (diff)
Merge pull request #23411 from HiassofT/nexus-eac3-backport
[Nexus] Backport E-AC3 fixes from master
-rw-r--r--xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp318
1 files changed, 172 insertions, 146 deletions
diff --git a/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp b/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp
index 1489a8be7f..f12a0253e1 100644
--- a/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp
+++ b/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp
@@ -13,50 +13,34 @@
#include <algorithm>
#include <string.h>
-#define DTS_PREAMBLE_14BE 0x1FFFE800
-#define DTS_PREAMBLE_14LE 0xFF1F00E8
-#define DTS_PREAMBLE_16BE 0x7FFE8001
-#define DTS_PREAMBLE_16LE 0xFE7F0180
-#define DTS_PREAMBLE_HD 0x64582025
-#define DTS_PREAMBLE_XCH 0x5a5a5a5a
-#define DTS_PREAMBLE_XXCH 0x47004a03
-#define DTS_PREAMBLE_X96K 0x1d95f262
-#define DTS_PREAMBLE_XBR 0x655e315e
-#define DTS_PREAMBLE_LBR 0x0a801921
-#define DTS_PREAMBLE_XLL 0x41a29547
-#define DTS_SFREQ_COUNT 16
-#define MAX_EAC3_BLOCKS 6
+#define DTS_PREAMBLE_14BE 0x1FFFE800
+#define DTS_PREAMBLE_14LE 0xFF1F00E8
+#define DTS_PREAMBLE_16BE 0x7FFE8001
+#define DTS_PREAMBLE_16LE 0xFE7F0180
+#define DTS_PREAMBLE_HD 0x64582025
+#define DTS_PREAMBLE_XCH 0x5a5a5a5a
+#define DTS_PREAMBLE_XXCH 0x47004a03
+#define DTS_PREAMBLE_X96K 0x1d95f262
+#define DTS_PREAMBLE_XBR 0x655e315e
+#define DTS_PREAMBLE_LBR 0x0a801921
+#define DTS_PREAMBLE_XLL 0x41a29547
+#define DTS_SFREQ_COUNT 16
+#define MAX_EAC3_BLOCKS 6
#define UNKNOWN_DTS_EXTENSION 255
-static const uint16_t AC3Bitrates [] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640};
-static const uint16_t AC3FSCod [] = {48000, 44100, 32000, 0};
-static const uint8_t AC3BlkCod [] = {1, 2, 3, 6};
-static const uint8_t AC3Channels [] = {2, 1, 2, 3, 3, 4, 4, 5};
-static const uint8_t DTSChannels [] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
-static const uint8_t THDChanMap [] = {2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1};
+static const uint16_t AC3Bitrates[] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
+ 192, 224, 256, 320, 384, 448, 512, 576, 640};
+static const uint16_t AC3FSCod[] = {48000, 44100, 32000, 0};
+static const uint8_t AC3BlkCod[] = {1, 2, 3, 6};
+static const uint8_t AC3Channels[] = {2, 1, 2, 3, 3, 4, 4, 5};
+static const uint8_t DTSChannels[] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
+static const uint8_t THDChanMap[] = {2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1};
-static const uint32_t DTSSampleRates[DTS_SFREQ_COUNT] =
-{
- 0 ,
- 8000 ,
- 16000 ,
- 32000 ,
- 64000 ,
- 128000,
- 11025 ,
- 22050 ,
- 44100 ,
- 88200 ,
- 176400,
- 12000 ,
- 24000 ,
- 48000 ,
- 96000 ,
- 192000
-};
-
-CAEStreamParser::CAEStreamParser() :
- m_syncFunc (&CAEStreamParser::DetectType)
+static const uint32_t DTSSampleRates[DTS_SFREQ_COUNT] = {0, 8000, 16000, 32000, 64000, 128000,
+ 11025, 22050, 44100, 88200, 176400, 12000,
+ 24000, 48000, 96000, 192000};
+
+CAEStreamParser::CAEStreamParser() : m_syncFunc(&CAEStreamParser::DetectType)
{
av_crc_init(m_crcTrueHD, 0, 16, 0x2D, sizeof(m_crcTrueHD));
}
@@ -74,9 +58,7 @@ double CAEStreamInfo::GetDuration() const
break;
case STREAM_TYPE_TRUEHD:
int rate;
- if (m_sampleRate == 48000 ||
- m_sampleRate == 96000 ||
- m_sampleRate == 192000)
+ if (m_sampleRate == 48000 || m_sampleRate == 96000 || m_sampleRate == 192000)
rate = 192000;
else
rate = 176400;
@@ -120,7 +102,10 @@ void CAEStreamParser::Reset()
m_hasSync = false;
}
-int CAEStreamParser::AddData(uint8_t *data, unsigned int size, uint8_t **buffer/* = NULL */, unsigned int *bufferSize/* = 0 */)
+int CAEStreamParser::AddData(uint8_t* data,
+ unsigned int size,
+ uint8_t** buffer,
+ unsigned int* bufferSize)
{
if (size == 0)
{
@@ -154,7 +139,7 @@ int CAEStreamParser::AddData(uint8_t *data, unsigned int size, uint8_t **buffer/
unsigned int consumed = 0;
unsigned int offset = 0;
unsigned int room = sizeof(m_buffer) - m_bufferSize;
- while(true)
+ while (true)
{
if (!size)
{
@@ -181,12 +166,12 @@ int CAEStreamParser::AddData(uint8_t *data, unsigned int size, uint8_t **buffer/
break;
else
{
- /* lost sync */
+ // lost sync
m_syncFunc = &CAEStreamParser::DetectType;
m_info.m_type = CAEStreamInfo::STREAM_TYPE_NULL;
m_info.m_repeat = 1;
- /* if the buffer is full, or the offset < the buffer size */
+ // if the buffer is full, or the offset < the buffer size
if (m_bufferSize == sizeof(m_buffer) || offset < m_bufferSize)
{
m_bufferSize -= offset;
@@ -196,16 +181,16 @@ int CAEStreamParser::AddData(uint8_t *data, unsigned int size, uint8_t **buffer/
}
}
- /* if we got here, we acquired sync on the buffer */
+ // if we got here, we acquired sync on the buffer
- /* align the buffer */
+ // align the buffer
if (offset)
{
m_bufferSize -= offset;
memmove(m_buffer, m_buffer + offset, m_bufferSize);
}
- /* bytes to skip until the next packet */
+ // bytes to skip until the next packet
m_skipBytes = std::max(0, (int)m_fsize - (int)m_bufferSize);
if (m_skipBytes)
{
@@ -223,56 +208,52 @@ int CAEStreamParser::AddData(uint8_t *data, unsigned int size, uint8_t **buffer/
}
}
-void CAEStreamParser::GetPacket(uint8_t **buffer, unsigned int *bufferSize)
+void CAEStreamParser::GetPacket(uint8_t** buffer, unsigned int* bufferSize)
{
- /* if the caller wants the packet */
+ // if the caller wants the packet
if (buffer)
{
- /* if it is dtsHD and we only want the core, just fetch that */
+ // if it is dtsHD and we only want the core, just fetch that
unsigned int size = m_fsize;
if (m_info.m_type == CAEStreamInfo::STREAM_TYPE_DTSHD_CORE)
size = m_coreSize;
- /* make sure the buffer is allocated and big enough */
+ // make sure the buffer is allocated and big enough
if (!*buffer || !bufferSize || *bufferSize < size)
{
- delete[] *buffer;
+ delete[] * buffer;
*buffer = new uint8_t[size];
}
- /* copy the data into the buffer and update the size */
+ // copy the data into the buffer and update the size
memcpy(*buffer, m_buffer, size);
if (bufferSize)
*bufferSize = size;
}
- /* remove the parsed data from the buffer */
+ // remove the parsed data from the buffer
m_bufferSize -= m_fsize;
memmove(m_buffer, m_buffer + m_fsize, m_bufferSize);
m_fsize = 0;
m_coreSize = 0;
}
-/* SYNC FUNCTIONS */
+// SYNC FUNCTIONS
-/*
- This function looks for sync words across the types in parallel, and only does an exhaustive
- test if it finds a syncword. Once sync has been established, the relevant sync function sets
- m_syncFunc to itself. This function will only be called again if total sync is lost, which
- allows is to switch stream types on the fly much like a real receiver does.
-*/
-unsigned int CAEStreamParser::DetectType(uint8_t *data, unsigned int size)
+// This function looks for sync words across the types in parallel, and only does an exhaustive
+// test if it finds a syncword. Once sync has been established, the relevant sync function sets
+// m_syncFunc to itself. This function will only be called again if total sync is lost, which
+// allows is to switch stream types on the fly much like a real receiver does.
+unsigned int CAEStreamParser::DetectType(uint8_t* data, unsigned int size)
{
- unsigned int skipped = 0;
+ unsigned int skipped = 0;
unsigned int possible = 0;
while (size > 8)
{
- /* if it could be DTS */
+ // if it could be DTS
unsigned int header = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
- if (header == DTS_PREAMBLE_14LE ||
- header == DTS_PREAMBLE_14BE ||
- header == DTS_PREAMBLE_16LE ||
+ if (header == DTS_PREAMBLE_14LE || header == DTS_PREAMBLE_14BE || header == DTS_PREAMBLE_16LE ||
header == DTS_PREAMBLE_16BE)
{
unsigned int skip = SyncDTS(data, size);
@@ -282,7 +263,7 @@ unsigned int CAEStreamParser::DetectType(uint8_t *data, unsigned int size)
possible = skipped;
}
- /* if it could be AC3 */
+ // if it could be AC3
if (data[0] == 0x0b && data[1] == 0x77)
{
unsigned int skip = SyncAC3(data, size);
@@ -292,7 +273,7 @@ unsigned int CAEStreamParser::DetectType(uint8_t *data, unsigned int size)
possible = skipped;
}
- /* if it could be TrueHD */
+ // if it could be TrueHD
if (data[4] == 0xf8 && data[5] == 0x72 && data[6] == 0x6f && data[7] == 0xba)
{
unsigned int skip = SyncTrueHD(data, size);
@@ -302,7 +283,7 @@ unsigned int CAEStreamParser::DetectType(uint8_t *data, unsigned int size)
possible = skipped;
}
- /* move along one byte */
+ // move along one byte
--size;
++skipped;
++data;
@@ -311,23 +292,26 @@ unsigned int CAEStreamParser::DetectType(uint8_t *data, unsigned int size)
return possible ? possible : skipped;
}
-bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncing, bool wantEAC3dependent)
+bool CAEStreamParser::TrySyncAC3(uint8_t* data,
+ unsigned int size,
+ bool resyncing,
+ bool wantEAC3dependent)
{
if (size < 8)
return false;
- /* look for an ac3 sync word */
+ // look for an ac3 sync word
if (data[0] != 0x0b || data[1] != 0x77)
return false;
- uint8_t bsid = data[5] >> 3;
+ uint8_t bsid = data[5] >> 3;
uint8_t acmod = data[6] >> 5;
uint8_t lfeon;
int8_t pos = 4;
if ((acmod & 0x1) && (acmod != 0x1))
pos -= 2;
- if (acmod & 0x4 )
+ if (acmod & 0x4)
pos -= 2;
if (acmod == 0x2)
pos -= 2;
@@ -341,7 +325,7 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
if (bsid <= 10)
{
- /* Normal AC-3 */
+ // Normal AC-3
if (wantEAC3dependent)
return false;
@@ -351,41 +335,50 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
if (fscod == 3 || frmsizecod > 37)
return false;
- /* get the details we need to check crc1 and framesize */
+ // get the details we need to check crc1 and framesize
unsigned int bitRate = AC3Bitrates[frmsizecod >> 1];
unsigned int framesize = 0;
switch (fscod)
{
- case 0: framesize = bitRate * 2; break;
- case 1: framesize = (320 * bitRate / 147 + (frmsizecod & 1 ? 1 : 0)); break;
- case 2: framesize = bitRate * 4; break;
+ case 0:
+ framesize = bitRate * 2;
+ break;
+ case 1:
+ framesize = (320 * bitRate / 147 + (frmsizecod & 1 ? 1 : 0));
+ break;
+ case 2:
+ framesize = bitRate * 4;
+ break;
}
m_fsize = framesize << 1;
m_info.m_sampleRate = AC3FSCod[fscod];
- /* dont do extensive testing if we have not lost sync */
+ // dont do extensive testing if we have not lost sync
if (m_info.m_type == CAEStreamInfo::STREAM_TYPE_AC3 && !resyncing)
return true;
- /* this may be the main stream of EAC3 */
+ // this may be the main stream of EAC3
unsigned int fsizeMain = m_fsize;
unsigned int reqBytes = fsizeMain + 8;
- if (size < reqBytes) {
- /* not enough data to check for E-AC3 dependent frame, request more */
+ if (size < reqBytes)
+ {
+ // not enough data to check for E-AC3 dependent frame, request more
m_needBytes = reqBytes;
m_fsize = 0;
- /* no need to resync => return true */
+ // no need to resync => return true
return true;
}
- if (TrySyncAC3(data + fsizeMain, size - fsizeMain, resyncing, /*wantEAC3dependent*/ true)) {
- /* concatenate the main and dependent frames */
+ m_info.m_ac3FrameSize = fsizeMain;
+ if (TrySyncAC3(data + fsizeMain, size - fsizeMain, resyncing, true))
+ {
+ // concatenate the main and dependent frames
m_fsize += fsizeMain;
return true;
}
unsigned int crc_size;
- /* if we have enough data, validate the entire packet, else try to validate crc2 (5/8 of the packet) */
+ // if we have enough data, validate the entire packet, else try to validate crc2 (5/8 of the packet)
if (framesize <= size)
crc_size = framesize - 1;
else
@@ -395,12 +388,12 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
if (av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &data[2], crc_size * 2))
return false;
- /* if we get here, we can sync */
+ // if we get here, we can sync
m_hasSync = true;
m_info.m_channels = AC3Channels[acmod] + lfeon;
m_syncFunc = &CAEStreamParser::SyncAC3;
m_info.m_type = CAEStreamInfo::STREAM_TYPE_AC3;
- m_info.m_ac3FrameSize = m_fsize;
+ m_info.m_ac3FrameSize += m_fsize;
m_info.m_repeat = 1;
CLog::Log(LOGINFO, "CAEStreamParser::TrySyncAC3 - AC3 stream detected ({} channels, {}Hz)",
@@ -446,6 +439,28 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
m_fsize = framesize << 1;
m_info.m_repeat = MAX_EAC3_BLOCKS / blocks;
+ // EAC3 can have a dependent stream too
+ if (!wantEAC3dependent)
+ {
+ unsigned int fsizeMain = m_fsize;
+ unsigned int reqBytes = fsizeMain + 8;
+ if (size < reqBytes)
+ {
+ // not enough data to check for E-AC3 dependent frame, request more
+ m_needBytes = reqBytes;
+ m_fsize = 0;
+ // no need to resync => return true
+ return true;
+ }
+ m_info.m_ac3FrameSize = fsizeMain;
+ if (TrySyncAC3(data + fsizeMain, size - fsizeMain, resyncing, true))
+ {
+ // concatenate the main and dependent frames
+ m_fsize += fsizeMain;
+ return true;
+ }
+ }
+
if (m_info.m_type == CAEStreamInfo::STREAM_TYPE_EAC3 && m_hasSync && !resyncing)
return true;
@@ -454,7 +469,7 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
m_info.m_channels = AC3Channels[acmod] + lfeon;
m_syncFunc = &CAEStreamParser::SyncAC3;
m_info.m_type = CAEStreamInfo::STREAM_TYPE_EAC3;
- m_info.m_ac3FrameSize = m_fsize;
+ m_info.m_ac3FrameSize += m_fsize;
CLog::Log(LOGINFO, "CAEStreamParser::TrySyncAC3 - E-AC3 stream detected ({} channels, {}Hz)",
m_info.m_channels, m_info.m_sampleRate);
@@ -462,14 +477,14 @@ bool CAEStreamParser::TrySyncAC3(uint8_t *data, unsigned int size, bool resyncin
}
}
-unsigned int CAEStreamParser::SyncAC3(uint8_t *data, unsigned int size)
+unsigned int CAEStreamParser::SyncAC3(uint8_t* data, unsigned int size)
{
unsigned int skip = 0;
for (; size - skip > 7; ++skip, ++data)
{
bool resyncing = (skip != 0);
- if (TrySyncAC3(data, size - skip, resyncing, /*wantEAC3dependent*/ false))
+ if (TrySyncAC3(data, size - skip, resyncing, false))
return skip;
}
@@ -479,7 +494,7 @@ unsigned int CAEStreamParser::SyncAC3(uint8_t *data, unsigned int size)
return skip;
}
-unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
+unsigned int CAEStreamParser::SyncDTS(uint8_t* data, unsigned int size)
{
if (size < 13)
{
@@ -504,7 +519,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
switch (header)
{
- /* 14bit BE */
+ // 14bit BE
case DTS_PREAMBLE_14BE:
if (data[4] != 0x07 || (data[5] & 0xf0) != 0xf0)
continue;
@@ -516,11 +531,11 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
ext_type = ((data[11] & 0xe) >> 1);
sfreq = data[9] & 0xF;
lfe = (data[12] & 0x18) >> 3;
- m_info.m_dataIsLE = false;
+ m_info.m_dataIsLE = false;
bits = 14;
break;
- /* 14bit LE */
+ // 14bit LE
case DTS_PREAMBLE_14LE:
if (data[5] != 0x07 || (data[4] & 0xf0) != 0xf0)
continue;
@@ -536,7 +551,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
bits = 14;
break;
- /* 16bit BE */
+ // 16bit BE
case DTS_PREAMBLE_16BE:
dtsBlocks = (((data[4] & 0x1) << 7) | ((data[5] & 0xFC) >> 2)) + 1;
m_fsize = (((((data[5] & 0x3) << 8) | data[6]) << 4) | ((data[7] & 0xF0) >> 4)) + 1;
@@ -550,7 +565,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
bits = 16;
break;
- /* 16bit LE */
+ // 16bit LE
case DTS_PREAMBLE_16LE:
dtsBlocks = (((data[5] & 0x1) << 7) | ((data[4] & 0xFC) >> 2)) + 1;
m_fsize = (((((data[4] & 0x3) << 8) | data[7]) << 4) | ((data[6] & 0xF0) >> 4)) + 1;
@@ -571,7 +586,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
if (sfreq == 0 || sfreq >= DTS_SFREQ_COUNT)
continue;
- /* make sure the framesize is sane */
+ // make sure the framesize is sane
if (m_fsize < 96 || m_fsize > 16384)
continue;
@@ -579,9 +594,15 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
CAEStreamInfo::DataType dataType;
switch (dtsBlocks << 5)
{
- case 512 : dataType = CAEStreamInfo::STREAM_TYPE_DTS_512 ; break;
- case 1024: dataType = CAEStreamInfo::STREAM_TYPE_DTS_1024; break;
- case 2048: dataType = CAEStreamInfo::STREAM_TYPE_DTS_2048; break;
+ case 512:
+ dataType = CAEStreamInfo::STREAM_TYPE_DTS_512;
+ break;
+ case 1024:
+ dataType = CAEStreamInfo::STREAM_TYPE_DTS_1024;
+ break;
+ case 2048:
+ dataType = CAEStreamInfo::STREAM_TYPE_DTS_2048;
+ break;
default:
invalid = true;
break;
@@ -590,31 +611,36 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
if (invalid)
continue;
- /* adjust the fsize for 14 bit streams */
+ // adjust the fsize for 14 bit streams
if (bits == 14)
m_fsize = m_fsize / 14 * 16;
- /* we need enough data to check for DTS-HD */
+ // we need enough data to check for DTS-HD
if (size - skip < m_fsize + 10)
{
- /* we can assume DTS sync at this point */
- m_syncFunc = &CAEStreamParser::SyncDTS;
+ // we can assume DTS sync at this point
+ m_syncFunc = &CAEStreamParser::SyncDTS;
m_needBytes = m_fsize + 10;
- m_fsize = 0;
+ m_fsize = 0;
return skip;
}
- /* look for DTS-HD */
- hd_sync = (data[m_fsize] << 24) | (data[m_fsize + 1] << 16) | (data[m_fsize + 2] << 8) | data[m_fsize + 3];
+ // look for DTS-HD
+ hd_sync = (data[m_fsize] << 24) | (data[m_fsize + 1] << 16) | (data[m_fsize + 2] << 8) |
+ data[m_fsize + 3];
if (hd_sync == DTS_PREAMBLE_HD)
{
int hd_size;
bool blownup = (data[m_fsize + 5] & 0x20) != 0;
if (blownup)
- hd_size = (((data[m_fsize + 6] & 0x01) << 19) | (data[m_fsize + 7] << 11) | (data[m_fsize + 8] << 3) | ((data[m_fsize + 9] & 0xe0) >> 5)) + 1;
+ hd_size = (((data[m_fsize + 6] & 0x01) << 19) | (data[m_fsize + 7] << 11) |
+ (data[m_fsize + 8] << 3) | ((data[m_fsize + 9] & 0xe0) >> 5)) +
+ 1;
else
- hd_size = (((data[m_fsize + 6] & 0x1f) << 11) | (data[m_fsize + 7] << 3) | ((data[m_fsize + 8] & 0xe0) >> 5)) + 1;
+ hd_size = (((data[m_fsize + 6] & 0x1f) << 11) | (data[m_fsize + 7] << 3) |
+ ((data[m_fsize + 8] & 0xe0) >> 5)) +
+ 1;
int header_size;
if (blownup)
@@ -622,17 +648,16 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
else
header_size = (((data[m_fsize + 5] & 0x1f) << 3) | ((data[m_fsize + 6] & 0xe0) >> 5)) + 1;
- hd_sync = data[m_fsize + header_size] << 24 | data[m_fsize + header_size + 1] << 16 | data[m_fsize + header_size + 2] << 8 | data[m_fsize + header_size + 3];
+ hd_sync = data[m_fsize + header_size] << 24 | data[m_fsize + header_size + 1] << 16 |
+ data[m_fsize + header_size + 2] << 8 | data[m_fsize + header_size + 3];
- /* set the type according to core or not */
+ // set the type according to core or not
if (m_coreOnly)
dataType = CAEStreamInfo::STREAM_TYPE_DTSHD_CORE;
else if (hd_sync == DTS_PREAMBLE_XLL)
dataType = CAEStreamInfo::STREAM_TYPE_DTSHD_MA;
- else if (hd_sync == DTS_PREAMBLE_XCH ||
- hd_sync == DTS_PREAMBLE_XXCH ||
- hd_sync == DTS_PREAMBLE_X96K ||
- hd_sync == DTS_PREAMBLE_XBR ||
+ else if (hd_sync == DTS_PREAMBLE_XCH || hd_sync == DTS_PREAMBLE_XXCH ||
+ hd_sync == DTS_PREAMBLE_X96K || hd_sync == DTS_PREAMBLE_XBR ||
hd_sync == DTS_PREAMBLE_LBR)
dataType = CAEStreamInfo::STREAM_TYPE_DTSHD;
else
@@ -643,7 +668,8 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
}
unsigned int sampleRate = DTSSampleRates[sfreq];
- if (!m_hasSync || skip || dataType != m_info.m_type || sampleRate != m_info.m_sampleRate || dtsBlocks != m_dtsBlocks)
+ if (!m_hasSync || skip || dataType != m_info.m_type || sampleRate != m_info.m_sampleRate ||
+ dtsBlocks != m_dtsBlocks)
{
m_hasSync = true;
m_info.m_type = dataType;
@@ -655,7 +681,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
if (dataType == CAEStreamInfo::STREAM_TYPE_DTSHD_MA)
{
- m_info.m_channels += 2; /* FIXME: this needs to be read out, not sure how to do that yet */
+ m_info.m_channels += 2; // FIXME: this needs to be read out, not sure how to do that yet
m_info.m_dtsPeriod = (192000 * (8 >> 1)) * (m_dtsBlocks << 5) / m_info.m_sampleRate;
}
else if (dataType == CAEStreamInfo::STREAM_TYPE_DTSHD)
@@ -664,7 +690,8 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
}
else
{
- m_info.m_dtsPeriod = (m_info.m_sampleRate * (2 >> 1)) * (m_dtsBlocks << 5) / m_info.m_sampleRate;
+ m_info.m_dtsPeriod =
+ (m_info.m_sampleRate * (2 >> 1)) * (m_dtsBlocks << 5) / m_info.m_sampleRate;
}
std::string type;
@@ -713,7 +740,7 @@ unsigned int CAEStreamParser::SyncDTS(uint8_t *data, unsigned int size)
return skip;
}
- /* lost sync */
+ // lost sync
CLog::Log(LOGINFO, "CAEStreamParser::SyncDTS - DTS sync lost");
m_hasSync = false;
return skip;
@@ -727,28 +754,28 @@ inline unsigned int CAEStreamParser::GetTrueHDChannels(const uint16_t chanmap)
return channels;
}
-unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
+unsigned int CAEStreamParser::SyncTrueHD(uint8_t* data, unsigned int size)
{
unsigned int left = size;
unsigned int skip = 0;
- /* if MLP */
+ // if MLP
for (; left; ++skip, ++data, --left)
{
- /* if we dont have sync and there is less the 8 bytes, then break out */
+ // if we dont have sync and there is less the 8 bytes, then break out
if (!m_hasSync && left < 8)
return size;
- /* if its a major audio unit */
- uint16_t length = ((data[0] & 0x0F) << 8 | data[1]) << 1;
+ // if its a major audio unit
+ uint16_t length = ((data[0] & 0x0F) << 8 | data[1]) << 1;
uint32_t syncword = ((((data[4] << 8 | data[5]) << 8) | data[6]) << 8) | data[7];
if (syncword == 0xf8726fba)
{
- /* we need 32 bytes to sync on a master audio unit */
+ // we need 32 bytes to sync on a master audio unit
if (left < 32)
return skip;
- /* get the rate and ensure its valid */
+ // get the rate and ensure its valid
int rate = (data[8] & 0xf0) >> 4;
if (rate == 0xF)
continue;
@@ -756,7 +783,7 @@ unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
unsigned int major_sync_size = 28;
if (data[29] & 1)
{
- /* extension(s) present, look up count */
+ // extension(s) present, look up count
int extension_count = data[30] >> 4;
major_sync_size += 2 + extension_count * 2;
}
@@ -764,17 +791,17 @@ unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
if (left < 4 + major_sync_size)
return skip;
- /* verify the crc of the audio unit */
+ // verify the crc of the audio unit
uint16_t crc = av_crc(m_crcTrueHD, 0, data + 4, major_sync_size - 4);
crc ^= (data[4 + major_sync_size - 3] << 8) | data[4 + major_sync_size - 4];
if (((data[4 + major_sync_size - 1] << 8) | data[4 + major_sync_size - 2]) != crc)
continue;
- /* get the sample rate and substreams, we have a valid master audio unit */
+ // get the sample rate and substreams, we have a valid master audio unit
m_info.m_sampleRate = (rate & 0x8 ? 44100 : 48000) << (rate & 0x7);
m_substreams = (data[20] & 0xF0) >> 4;
- /* get the number of encoded channels */
+ // get the number of encoded channels
uint16_t channel_map = ((data[10] & 0x1F) << 8) | data[11];
if (!channel_map)
channel_map = (data[9] << 1) | (data[10] >> 7);
@@ -794,16 +821,16 @@ unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
}
else
{
- /* we cant sink to a subframe until we have the information from a master audio unit */
+ // we cant sink to a subframe until we have the information from a master audio unit
if (!m_hasSync)
continue;
- /* if there is not enough data left to verify the packet, just return the skip amount */
+ // if there is not enough data left to verify the packet, just return the skip amount
if (left < (unsigned int)m_substreams * 4)
return skip;
- /* verify the parity */
- int p = 0;
+ // verify the parity
+ int p = 0;
uint8_t check = 0;
for (int i = -1; i < m_substreams; ++i)
{
@@ -816,11 +843,11 @@ unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
}
}
- /* if the parity nibble does not match */
+ // if the parity nibble does not match
if ((((check >> 4) ^ check) & 0xF) != 0xF)
{
- /* lost sync */
- m_hasSync = false;
+ // lost sync
+ m_hasSync = false;
CLog::Log(LOGINFO, "CAEStreamParser::SyncTrueHD - Sync Lost");
continue;
}
@@ -832,8 +859,7 @@ unsigned int CAEStreamParser::SyncTrueHD(uint8_t *data, unsigned int size)
}
}
- /* lost sync */
- m_hasSync = false;
+ // lost sync
+ m_hasSync = false;
return skip;
}
-