All pastes #2047968 Raw Edit

Mine

public text v1 · immutable
#2047968 ·published 2011-04-18 23:28 UTC
rendered paste body
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;
}