HRESULT CSubtitleInputPin::CompleteConnect(IPin* pReceivePin) { if(m_mt.majortype == MEDIATYPE_Text) { if(!(m_pSubStream = DNew 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 != NULL) { dwOffset = psi->dwOffset; name = ISO6392ToLanguage(psi->IsoLang); lcid = ISO6392ToLcid(psi->IsoLang); if(name.IsEmpty()) name = _T("Unknown"); if(wcslen(psi->TrackName) > 0) name += _T(" (") + CString(psi->TrackName) + _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 = DNew 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_SSF) { if(!(m_pSubStream = DNew ssf::CRenderer(m_pSubLock))) return E_FAIL; ssf::CRenderer* pSSF = (ssf::CRenderer*)(ISubStream*)m_pSubStream; pSSF->Open(ssf::MemoryInputStream(m_mt.pbFormat + dwOffset, m_mt.cbFormat - dwOffset, false, false), name); } else if(m_mt.subtype == MEDIASUBTYPE_VOBSUB) { if(!(m_pSubStream = DNew 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 (IsHdmvSub(&m_mt)) { if(!(m_pSubStream = DNew CRenderedHdmvSubtitle(m_pSubLock, (m_mt.subtype == MEDIASUBTYPE_DVB_SUBTITLES) ? ST_DVB : ST_HDMV))) return E_FAIL; } } AddSubStream(m_pSubStream); return __super::CompleteConnect(pReceivePin); }
HRESULT CSubtitleInputPin::CompleteConnect(IPin* pReceivePin) { 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 (IsHdmvSub(&m_mt)) { if (!(m_pSubStream = DEBUG_NEW CRenderedHdmvSubtitle(m_pSubLock, (m_mt.subtype == MEDIASUBTYPE_DVB_SUBTITLES) ? ST_DVB : ST_HDMV, name, lcid))) { return E_FAIL; } } } AddSubStream(m_pSubStream); return __super::CompleteConnect(pReceivePin); }