int CDVDAudioCodecPassthrough::Decode(BYTE* pData, int iSize)
{
if (iSize <= 0) return 0;
unsigned int size = m_bufferSize;
unsigned int used = m_info.AddData(pData, iSize, &m_buffer, &size);
m_bufferSize = std::max(m_bufferSize, size);
/* if we have a frame */
if (size)
{
/* FIXME: this should be moved into a MAT packer class */
/* we need to pack 24 TrueHD audio units into the unknown MAT format before packing into IEC958 */
if (m_info.GetDataType() == CAEStreamInfo::STREAM_TYPE_TRUEHD)
{
/* magic MAT format values, meaning is unknown at this point */
const uint8_t mat_start_code [20] = { 0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83, 0x49, 0x80, 0x77, 0xE0 };
const uint8_t mat_middle_code[12] = { 0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0 };
const uint8_t mat_end_code [16] = { 0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11 };
/* if the buffer has not been setup yet */
if (!m_trueHD)
{
/* create the buffer and copy in the MAT codes */
m_trueHD = new uint8_t[MAT_FRAME_SIZE];
memset(m_trueHD, 0, MAT_FRAME_SIZE);
memcpy(m_trueHD, mat_start_code, sizeof(mat_start_code));
memcpy(m_trueHD + (12 * TRUEHD_FRAME_OFFSET) + MAT_MIDDLE_CODE_OFFSET, mat_middle_code, sizeof(mat_middle_code));
memcpy(m_trueHD + MAT_FRAME_SIZE - sizeof(mat_end_code), mat_end_code, sizeof(mat_end_code));
}
if (m_trueHDPos == 0 ) memcpy(m_trueHD + (m_trueHDPos * TRUEHD_FRAME_OFFSET) + sizeof(mat_start_code ), m_buffer, size);
else if (m_trueHDPos == 12) memcpy(m_trueHD + (m_trueHDPos * TRUEHD_FRAME_OFFSET) + sizeof(mat_middle_code), m_buffer, size);
else memcpy(m_trueHD + (m_trueHDPos * TRUEHD_FRAME_OFFSET), m_buffer, size);
/* if we have a full frame */
if (++m_trueHDPos == 24)
{
m_trueHDPos = 0;
m_dataSize = CAEPackIEC958::PackTrueHD(m_trueHD, MAT_FRAME_SIZE, m_packedBuffer);
}
}
else
{
/* pack the data into an IEC958 frame */
CAEPackIEC958::PackFunc pack = m_info.GetPackFunc();
if (pack)
m_dataSize = pack(m_buffer, size, m_packedBuffer);
}
}
return used;
}