LCID ProbeLangForLCID(LPCSTR code) { if(strlen(code) == 3) { return ISO6392ToLcid(code); } else if (strlen(code) >= 2) { return ISO6391ToLcid(code); } return 0; }
HRESULT CHdmvClipInfo::ReadProgramInfo() { BYTE number_of_program_sequences; BYTE number_of_streams_in_ps; LARGE_INTEGER Pos; m_Streams.RemoveAll(); Pos.QuadPart = ProgramInfo_start_address; SetFilePointerEx(m_hFile, Pos, NULL, FILE_BEGIN); ReadDword(); //length ReadByte(); //reserved_for_word_align number_of_program_sequences = (BYTE)ReadByte(); int iStream = 0; for (size_t i = 0; i < number_of_program_sequences; i++) { ReadDword(); //SPN_program_sequence_start ReadShort(); //program_map_PID number_of_streams_in_ps = (BYTE)ReadByte(); //number_of_streams_in_ps ReadByte(); //reserved_for_future_use for (size_t stream_index = 0; stream_index < number_of_streams_in_ps; stream_index++) { m_Streams.SetCount(iStream + 1); m_Streams[iStream].m_PID = ReadShort(); // stream_PID // == StreamCodingInfo Pos.QuadPart = 0; SetFilePointerEx(m_hFile, Pos, &Pos, FILE_CURRENT); Pos.QuadPart += ReadByte() + 1; // length m_Streams[iStream].m_Type = (PES_STREAM_TYPE)ReadByte(); switch (m_Streams[iStream].m_Type) { case VIDEO_STREAM_MPEG1: case VIDEO_STREAM_MPEG2: case VIDEO_STREAM_H264: case VIDEO_STREAM_VC1: { UINT8 Temp = ReadByte(); BDVM_VideoFormat VideoFormat = (BDVM_VideoFormat)(Temp >> 4); BDVM_FrameRate FrameRate = (BDVM_FrameRate)(Temp & 0xf); Temp = ReadByte(); BDVM_AspectRatio AspectRatio = (BDVM_AspectRatio)(Temp >> 4); m_Streams[iStream].m_VideoFormat = VideoFormat; m_Streams[iStream].m_FrameRate = FrameRate; m_Streams[iStream].m_AspectRatio = AspectRatio; } break; case AUDIO_STREAM_MPEG1: case AUDIO_STREAM_MPEG2: case AUDIO_STREAM_LPCM: case AUDIO_STREAM_AC3: case AUDIO_STREAM_DTS: case AUDIO_STREAM_AC3_TRUE_HD: case AUDIO_STREAM_AC3_PLUS: case AUDIO_STREAM_DTS_HD: case AUDIO_STREAM_DTS_HD_MASTER_AUDIO: case SECONDARY_AUDIO_AC3_PLUS: case SECONDARY_AUDIO_DTS_HD: { UINT8 Temp = ReadByte(); BDVM_ChannelLayout ChannelLayout = (BDVM_ChannelLayout)(Temp >> 4); BDVM_SampleRate SampleRate = (BDVM_SampleRate)(Temp & 0xF); ReadBuffer((BYTE*)m_Streams[iStream].m_LanguageCode, 3); m_Streams[iStream].m_LanguageCode[3] = '\0'; m_Streams[iStream].m_LCID = ISO6392ToLcid(m_Streams[iStream].m_LanguageCode); m_Streams[iStream].m_ChannelLayout = ChannelLayout; m_Streams[iStream].m_SampleRate = SampleRate; } break; case PRESENTATION_GRAPHICS_STREAM: case INTERACTIVE_GRAPHICS_STREAM: { ReadBuffer((BYTE*)m_Streams[iStream].m_LanguageCode, 3); m_Streams[iStream].m_LanguageCode[3] = '\0'; m_Streams[iStream].m_LCID = ISO6392ToLcid(m_Streams[iStream].m_LanguageCode); } break; case SUBTITLE_STREAM: { ReadByte(); // Should this really be here? ReadBuffer((BYTE*)m_Streams[iStream].m_LanguageCode, 3); m_Streams[iStream].m_LanguageCode[3] = '\0'; m_Streams[iStream].m_LCID = ISO6392ToLcid(m_Streams[iStream].m_LanguageCode); } break; default: break; } iStream++; SetFilePointerEx(m_hFile, Pos, NULL, FILE_BEGIN); } } return S_OK; }
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); }
STDMETHODIMP_(CSubtitleInputPinHelper*) CSubtitleInputPin::CreateHelper( const CMediaType& mt, IPin* pReceivePin ) { XY_LOG_INFO(XY_LOG_VAR_2_STR(pReceivePin)); CSubtitleInputPinHelper *ret = NULL; if(mt.majortype == MEDIATYPE_Text) { XY_LOG_INFO("Create CTextSubtitleInputPinHepler"); CRenderedTextSubtitle* pRTS = DEBUG_NEW CRenderedTextSubtitle(m_pSubLock); pRTS->m_name = CString(GetPinName(pReceivePin)) + _T(" (embeded)"); pRTS->m_dstScreenSize = CSize(384, 288); ret = DEBUG_NEW CTextSubtitleInputPinHepler(pRTS, m_mt); } else if(mt.majortype == MEDIATYPE_Subtitle) { SUBTITLEINFO* psi = (SUBTITLEINFO*)mt.pbFormat; DWORD dwOffset = 0; CString name; LCID lcid = 0; if (psi != NULL) { 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(""));//CAUTION: VS may show name.Replace(_T(""),_T("")), however there is a character in the first _T("") name.Replace(_T(""), _T(""));//CAUTION: VS may show name.Replace(_T(""),_T("")), however there is a character in the first _T("") if(mt.subtype == MEDIASUBTYPE_UTF8 /*|| m_mt.subtype == MEDIASUBTYPE_USF*/ || mt.subtype == MEDIASUBTYPE_SSA || mt.subtype == MEDIASUBTYPE_ASS || mt.subtype == MEDIASUBTYPE_ASS2) { XY_LOG_INFO("Create CTextSubtitleInputPinHepler"); CRenderedTextSubtitle* pRTS = DEBUG_NEW CRenderedTextSubtitle(m_pSubLock); pRTS->m_name = name; pRTS->m_lcid = lcid; pRTS->m_dstScreenSize = CSize(384, 288); if(dwOffset > 0 && mt.cbFormat - dwOffset > 0) { CMediaType mt1 = mt; if(mt1.pbFormat[dwOffset+0] != 0xef && mt1.pbFormat[dwOffset+1] != 0xbb && mt1.pbFormat[dwOffset+2] != 0xfb) { dwOffset -= 3; mt1.pbFormat[dwOffset+0] = 0xef; mt1.pbFormat[dwOffset+1] = 0xbb; mt1.pbFormat[dwOffset+2] = 0xbf; } pRTS->Open(mt1.pbFormat + dwOffset, mt1.cbFormat - dwOffset, DEFAULT_CHARSET, pRTS->m_name); } ret = DEBUG_NEW CTextSubtitleInputPinHepler(pRTS, m_mt); } else if(mt.subtype == MEDIASUBTYPE_SSF) { XY_LOG_INFO("Create CSSFInputPinHepler"); ssf::CRenderer* pSSF = DEBUG_NEW ssf::CRenderer(m_pSubLock); pSSF->Open(ssf::MemoryInputStream(mt.pbFormat + dwOffset, mt.cbFormat - dwOffset, false, false), name); ret = DEBUG_NEW CSSFInputPinHepler(pSSF, m_mt); } else if(mt.subtype == MEDIASUBTYPE_VOBSUB) { XY_LOG_INFO("Create CVobsubInputPinHepler"); CVobSubStream* pVSS = DEBUG_NEW CVobSubStream(m_pSubLock); pVSS->Open(name, mt.pbFormat + dwOffset, mt.cbFormat - dwOffset); ret = DEBUG_NEW CVobsubInputPinHepler(pVSS, m_mt); } else if (IsHdmvSub(&mt)) { XY_LOG_INFO("Create CHdmvInputPinHepler"); CRenderedHdmvSubtitle *hdmv_sub = DEBUG_NEW CRenderedHdmvSubtitle(m_pSubLock, (mt.subtype == MEDIASUBTYPE_DVB_SUBTITLES) ? ST_DVB : ST_HDMV, name, lcid); ret = DEBUG_NEW CHdmvInputPinHepler(hdmv_sub, m_mt); } } return ret; }