CRenderedHdmvSubtitle::CRenderedHdmvSubtitle(CCritSec* pLock, SUBTITLE_TYPE nType, const CString& name, LCID lcid) : CSubPicProviderImpl(pLock) , m_name(name) , m_lcid(lcid) , m_nType(nType) { switch (m_nType) { case ST_DVB : m_pSub = DNew CDVBSub(); if (name.IsEmpty() || (name == _T("Unknown"))) m_name = _T("DVB"); break; case ST_HDMV : m_pSub = DNew CHdmvSub(); if (name.IsEmpty() || (name == _T("Unknown"))) m_name = _T("PGS"); break; default : ASSERT (FALSE); m_pSub = NULL; } m_rtStart = 0; }
// // HdmvSubtitleProvider // HdmvSubtitleProvider::HdmvSubtitleProvider( CCritSec* pLock, SUBTITLE_TYPE nType , const CString& name, LCID lcid ) : CUnknown(NAME("HdmvSubtitleProvider"), NULL) , m_name(name), m_lcid(lcid) { switch (nType) { case ST_DVB : m_pSub = DEBUG_NEW CDVBSub(); if (name.IsEmpty() || (name == _T("Unknown"))) m_name = "DVB Embedded Subtitle"; m_helper = DEBUG_NEW HdmvSubtitleProviderImpl(m_pSub); break; case ST_HDMV : m_pSub = DEBUG_NEW CHdmvSub(); if (name.IsEmpty() || (name == _T("Unknown"))) m_name = "HDMV Embedded Subtitle"; m_helper = DEBUG_NEW HdmvSubtitleProviderImpl(m_pSub); break; default : ASSERT (FALSE); m_pSub = NULL; m_helper = NULL; } m_rtStart = 0; }
CRenderedHdmvSubtitle::CRenderedHdmvSubtitle(CCritSec* pLock, SUBTITLE_TYPE nType, const CString& name, LCID lcid) : CSubPicProviderImpl(pLock) , m_name(name) , m_lcid(lcid) { switch (nType) { case ST_DVB: m_pSub = DEBUG_NEW CDVBSub(); if (name.IsEmpty() || (name == _T("Unknown"))) { m_name = "DVB Embedded Subtitle"; } break; case ST_HDMV: m_pSub = DEBUG_NEW CHdmvSub(); if (name.IsEmpty() || (name == _T("Unknown"))) { m_name = "HDMV Embedded Subtitle"; } break; default: ASSERT(FALSE); m_pSub = nullptr; } m_rtStart = 0; }
HRESULT CSubtitleInputPin::CompleteConnect(IPin* pReceivePin) { InvalidateSamples(); if (m_mt.majortype == MEDIATYPE_Text) { if (!(m_pSubStream = DEBUG_NEW CRenderedTextSubtitle(m_pSubLock))) { return E_FAIL; } CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; pRTS->m_name = CString(GetPinName(pReceivePin)) + _T(" (embeded)"); pRTS->m_dstScreenSize = CSize(384, 288); pRTS->CreateDefaultStyle(DEFAULT_CHARSET); } else if (m_mt.majortype == MEDIATYPE_Subtitle) { SUBTITLEINFO* psi = (SUBTITLEINFO*)m_mt.pbFormat; DWORD dwOffset = 0; CString name; LCID lcid = 0; if (psi != nullptr) { dwOffset = psi->dwOffset; name = ISO6392ToLanguage(psi->IsoLang); lcid = ISO6392ToLcid(psi->IsoLang); CString trackName(psi->TrackName); trackName.Trim(); if (!trackName.IsEmpty()) { if (!name.IsEmpty()) { if (trackName[0] != _T('(') && trackName[0] != _T('[')) { name += _T(","); } name += _T(" "); } name += trackName; } if (name.IsEmpty()) { name = _T("Unknown"); } } name.Replace(_T(""), _T("")); name.Replace(_T(""), _T("")); if (m_mt.subtype == MEDIASUBTYPE_UTF8 /*|| m_mt.subtype == MEDIASUBTYPE_USF*/ || m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { if (!(m_pSubStream = DEBUG_NEW CRenderedTextSubtitle(m_pSubLock))) { return E_FAIL; } CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; pRTS->m_name = name; pRTS->m_lcid = lcid; pRTS->m_dstScreenSize = CSize(384, 288); pRTS->CreateDefaultStyle(DEFAULT_CHARSET); if (dwOffset > 0 && m_mt.cbFormat - dwOffset > 0) { CMediaType mt = m_mt; if (mt.pbFormat[dwOffset + 0] != 0xef && mt.pbFormat[dwOffset + 1] != 0xbb && mt.pbFormat[dwOffset + 2] != 0xfb) { dwOffset -= 3; mt.pbFormat[dwOffset + 0] = 0xef; mt.pbFormat[dwOffset + 1] = 0xbb; mt.pbFormat[dwOffset + 2] = 0xbf; } pRTS->Open(mt.pbFormat + dwOffset, mt.cbFormat - dwOffset, DEFAULT_CHARSET, pRTS->m_name); } } else if (m_mt.subtype == MEDIASUBTYPE_VOBSUB) { if (!(m_pSubStream = DEBUG_NEW CVobSubStream(m_pSubLock))) { return E_FAIL; } CVobSubStream* pVSS = (CVobSubStream*)(ISubStream*)m_pSubStream; pVSS->Open(name, m_mt.pbFormat + dwOffset, m_mt.cbFormat - dwOffset); } else if (IsRLECodedSub(&m_mt)) { if (m_mt.subtype == MEDIASUBTYPE_DVB_SUBTITLES) { m_pSubStream = DEBUG_NEW CDVBSub(m_pSubLock, name, lcid); } else { m_pSubStream = DEBUG_NEW CPGSSub(m_pSubLock, name, lcid); } if (!m_pSubStream) { return E_FAIL; } } } AddSubStream(m_pSubStream); return __super::CompleteConnect(pReceivePin); }