Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/filters/reader/CDDAReader/CDDAReader.cpp')
-rw-r--r--src/filters/reader/CDDAReader/CDDAReader.cpp73
1 files changed, 57 insertions, 16 deletions
diff --git a/src/filters/reader/CDDAReader/CDDAReader.cpp b/src/filters/reader/CDDAReader/CDDAReader.cpp
index bf7182e85..8a3cd1f35 100644
--- a/src/filters/reader/CDDAReader/CDDAReader.cpp
+++ b/src/filters/reader/CDDAReader/CDDAReader.cpp
@@ -21,6 +21,7 @@
#include "stdafx.h"
#include <algorithm>
+#include <vector>
#ifdef STANDALONE_FILTER
#include <InitGuid.h>
#endif
@@ -133,7 +134,7 @@ STDMETHODIMP CCDDAReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
CMediaType mt;
mt.majortype = MEDIATYPE_Stream;
- mt.subtype = MEDIASUBTYPE_WAVE;
+ mt.subtype = m_stream.IsDTS() ? MEDIASUBTYPE_DTS : MEDIASUBTYPE_WAVE;
m_mt = mt;
return S_OK;
@@ -275,6 +276,8 @@ CCDDAStream::CCDDAStream()
m_header.frm.pcm.wf.nBlockAlign = m_header.frm.pcm.wf.nChannels * m_header.frm.pcm.wBitsPerSample / 8;
m_header.frm.pcm.wf.nAvgBytesPerSec = m_header.frm.pcm.wf.nSamplesPerSec * m_header.frm.pcm.wf.nBlockAlign;
m_header.data.hdr.chunkID = DataID;
+
+ m_bDTS = false;
}
CCDDAStream::~CCDDAStream()
@@ -342,6 +345,39 @@ bool CCDDAStream::Load(const WCHAR* fnw)
m_header.riff.hdr.chunkSize = (long)(m_llLength + sizeof(m_header) - 8);
m_header.data.hdr.chunkSize = (long)(m_llLength);
+ // Detect DTS Music Disk
+ m_bDTS = false;
+
+ // DCA syncwords
+ const DWORD DCA_MARKER_RAW_BE = 0x7FFE8001;
+ const DWORD DCA_MARKER_RAW_LE = 0xFE7F0180;
+ const DWORD DCA_MARKER_14B_BE = 0x1FFFE800;
+ const DWORD DCA_MARKER_14B_LE = 0xFF1F00E8;
+ UINT nMarkerFound = 0, nAttempt = 0;
+ DWORD marker = DWORD_MAX;
+
+ std::vector<BYTE> data(16384);
+ DWORD dwSizeRead = 0;
+ while (SUCCEEDED(Read(data.data(), (DWORD)data.size(), TRUE, &dwSizeRead)) && dwSizeRead && nAttempt < (4 + nMarkerFound)) {
+ nAttempt++;
+
+ for (DWORD i = 0; i < dwSizeRead; i++) {
+ marker = (marker << 8) | data[i];
+ if ((marker == DCA_MARKER_14B_LE && (i < dwSizeRead - 2) && (data[i + 1] & 0xF0) == 0xF0 && data[i + 2] == 0x07)
+ || (marker == DCA_MARKER_14B_BE && (i < dwSizeRead - 2) && data[i + 1] == 0x07 && (data[i + 2] & 0xF0) == 0xF0)
+ || marker == DCA_MARKER_RAW_LE || marker == DCA_MARKER_RAW_BE) {
+ nMarkerFound++;
+ }
+ }
+ dwSizeRead = 0;
+
+ if (nMarkerFound >= 4) {
+ m_bDTS = true;
+ break;
+ }
+ }
+ SetPointer(0);
+
CDROM_READ_TOC_EX TOCEx;
ZeroMemory(&TOCEx, sizeof(TOCEx));
TOCEx.Format = CDROM_READ_TOC_EX_FORMAT_CDTEXT;
@@ -384,15 +420,15 @@ bool CCDDAStream::Load(const WCHAR* fnw)
const int lenW = _countof(pDesc->WText);
CString text = !pDesc->Unicode
- ? CString(CStringA((CHAR*)pDesc->Text, lenU))
- : CString(CStringW((WCHAR*)pDesc->WText, lenW));
+ ? CString(CStringA((CHAR*)pDesc->Text, lenU))
+ : CString(CStringW((WCHAR*)pDesc->WText, lenW));
int tlen = text.GetLength();
CString tmp = (tlen < 12 - 1)
- ? (!pDesc->Unicode
- ? CString(CStringA((CHAR*)pDesc->Text + tlen + 1, lenU - (tlen + 1)))
- : CString(CStringW((WCHAR*)pDesc->WText + tlen + 1, lenW - (tlen + 1))))
- : _T("");
+ ? (!pDesc->Unicode
+ ? CString(CStringA((CHAR*)pDesc->Text + tlen + 1, lenU - (tlen + 1)))
+ : CString(CStringW((WCHAR*)pDesc->WText + tlen + 1, lenW - (tlen + 1))))
+ : _T("");
if (pDesc->PackType < 0x80 || pDesc->PackType >= 0x80 + 0x10) {
continue;
@@ -437,15 +473,17 @@ HRESULT CCDDAStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDW
LONGLONG pos = m_llPosition;
size_t len = dwBytesToRead;
- if (pos < sizeof(m_header) && len > 0) {
- size_t l = std::min(len, size_t(sizeof(m_header) - pos));
- memcpy(pbBuffer, &((BYTE*)&m_header)[pos], l);
- pbBuffer += l;
- pos += l;
- len -= l;
- }
+ if (!m_bDTS) {
+ if (pos < sizeof(m_header) && len > 0) {
+ size_t l = std::min(len, size_t(sizeof(m_header) - pos));
+ memcpy(pbBuffer, &((BYTE*)&m_header)[pos], l);
+ pbBuffer += l;
+ pos += l;
+ len -= l;
+ }
- pos -= sizeof(m_header);
+ pos -= sizeof(m_header);
+ }
while (pos >= 0 && pos < m_llLength && len > 0) {
RAW_READ_INFO rawreadinfo;
@@ -486,7 +524,10 @@ HRESULT CCDDAStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDW
LONGLONG CCDDAStream::Size(LONGLONG* pSizeAvailable)
{
- LONGLONG size = sizeof(m_header) + m_llLength;
+ LONGLONG size = m_llLength;
+ if (!m_bDTS) {
+ size += sizeof(m_header);
+ }
if (pSizeAvailable) {
*pSizeAvailable = size;
}