From dd593ab0ef5b0d15c79b7e8eb909ed79f070cd97 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 25 May 2009 15:53:17 +0200 Subject: [PATCH] add support for blueray PMT streamtypes for LPCM, AC3, DTS, add more registration descriptors --- lib/dvb/decoder.cpp | 3 +++ lib/dvb/decoder.h | 2 +- lib/dvb/pmt.cpp | 32 +++++++++++++++++++++++++++++--- lib/dvb/pmt.h | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 82ade40..114e383 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -198,6 +198,9 @@ int eDVBAudio::startPid(int pid, int type) case aAACHE: bypass = 9; break; + case aLPCM: + bypass = 6; + break; } eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass); diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index 3bfc70c..b53638b 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -13,7 +13,7 @@ private: ePtr m_demux; int m_fd, m_fd_demux, m_dev, m_is_freezed; public: - enum { aMPEG, aAC3, aDTS, aAAC, aAACHE }; + enum { aMPEG, aAC3, aDTS, aAAC, aAACHE, aLPCM }; eDVBAudio(eDVBDemux *demux, int dev); enum { aMonoLeft, aStereo, aMonoRight }; void setChannel(int channel); diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index da45c8e..13ed6b9 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -258,8 +258,26 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) isaudio = 1; audio.type = audioStream::atAACHE; } + case 0x80: // user private ... but blueray LPCM + if (!isvideo && !isaudio) + { + isaudio = 1; + audio.type = audioStream::atLPCM; + } + case 0x81: // user private ... but blueray AC3 + if (!isvideo && !isaudio) + { + isaudio = 1; + audio.type = audioStream::atAC3; + } + case 0x82: // Blueray DTS (dvb user private...) + case 0xA2: // Blueray secondary DTS + if (!isvideo && !isaudio) + { + isaudio = 1; + audio.type = audioStream::atDTS; + } case 0x06: // PES Private - case 0x81: // user private case 0xEA: // TS_PSI_ST_SMPTE_VC1 for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); desc != (*es)->getDescriptors()->end(); ++desc) @@ -363,11 +381,19 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) int format_identifier = (descr[2] << 24) | (descr[3] << 16) | (descr[4] << 8) | (descr[5]); switch (format_identifier) { - case 0x41432d33: + case 0x44545331 ... 0x44545333: // DTS1/DTS2/DTS3 + isaudio = 1; + audio.type = audioStream::atDTS; + break; + case 0x41432d33: // == 'AC-3' isaudio = 1; audio.type = audioStream::atAC3; break; - case 0x56432d31: + case 0x42535344: // == 'BSSD' (LPCM) + isaudio = 1; + audio.type = audioStream::atLPCM; + break; + case 0x56432d31: // == 'VC-1' if (descr[6] == 0x01) // subdescriptor tag { if (descr[7] >= 0x90) // profile_level diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index cabc6ac..e27135e 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -142,7 +142,7 @@ public: struct audioStream { int pid; - enum { atMPEG, atAC3, atDTS, atAAC, atAACHE }; + enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM }; int type; // mpeg2, ac3, dts, ... int component_tag; -- 2.7.4