STDMETHODIMP CSSFInputPinHepler::Receive( IMediaSample* pSample ) { REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; HRESULT hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); bool fInvalidate = false; if(m_mt.majortype == MEDIATYPE_Subtitle) { if(m_mt.subtype == MEDIASUBTYPE_SSF) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { m_pSSF->Append(tStart, tStop, str); } else { XY_LOG_WARN("Empty data"); } } } return S_OK; }
__int64 CDSMSplitterFile::Read(__int64 len, CStringW& str) { char c; CStringA s; __int64 i = 0; while(i++ < len && (c = (char)BitRead(8)) != 0) s += c; str = UTF8To16(s); return i; }
bool SkypeMoodMsgHandler::HandleMessage(HWND hWnd, COPYDATASTRUCT* pCDS) { bool bMsgHandled = false; if (hWnd && hWnd == m_hWndSkype) { bMsgHandled = true; CString msg = UTF8To16((char*)pCDS->lpData); TRACE(_T("SkypeMoodMsgHandler::HandleMessage --> %s\n"), msg); } return bMsgHandled; }
BOOL CSubtitleUpDlg::OnInitDialog() { __super::OnInitDialog(); m_progress.SetParent(&m_status); m_progress.UpdateWindow(); int n = 0, curPos = 0; CArray<int> columnWidth; CString strColumnWidth(AfxGetApp()->GetProfileString(IDS_R_DLG_SUBTITLEUP, IDS_RS_DLG_SUBTITLEUP_COLWIDTH)); CString token(strColumnWidth.Tokenize(_T(","), curPos)); while (!token.IsEmpty()) { if (_stscanf_s(token, L"%d", &n) == 1) { columnWidth.Add(n); token = strColumnWidth.Tokenize(_T(","), curPos); } else { throw 1; } } m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_LABELTIP); m_list.SetImageList(&m_pMainFrame->m_pSubtitlesProviders->GetImageList(), LVSIL_SMALL); if (columnWidth.GetCount() != COL_TOTAL_COLUMNS) { // default sizes columnWidth.RemoveAll(); columnWidth.Add(120); columnWidth.Add(75); columnWidth.Add(250); } m_list.InsertColumn(COL_PROVIDER, ResStr(IDS_SUBDL_DLG_PROVIDER_COL), LVCFMT_LEFT, columnWidth[COL_PROVIDER]); m_list.InsertColumn(COL_USERNAME, ResStr(IDS_SUBUL_DLG_USERNAME_COL), LVCFMT_LEFT, columnWidth[COL_USERNAME]); m_list.InsertColumn(COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_COL), LVCFMT_LEFT, columnWidth[COL_STATUS]); m_list.SetRedraw(FALSE); m_list.DeleteAllItems(); int i = 0; for (const auto& iter : m_pMainFrame->m_pSubtitlesProviders->Providers()) { if (iter->Flags(SPF_UPLOAD)) { int iItem = m_list.InsertItem((int)i++, CString(iter->Name().c_str()), iter->GetIconIndex()); m_list.SetItemText(iItem, COL_USERNAME, UTF8To16(iter->UserName().c_str())); m_list.SetItemText(iItem, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_READY)); m_list.SetCheck(iItem, iter->Enabled(SPF_UPLOAD)); m_list.SetItemData(iItem, (DWORD_PTR)(iter.get())); } } m_list.SetRedraw(TRUE); m_list.Invalidate(); m_list.UpdateWindow(); UpdateData(FALSE); AddAnchor(IDC_LIST1, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_BUTTON1, BOTTOM_RIGHT); AddAnchor(IDC_BUTTON2, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDC_STATUSBAR, BOTTOM_LEFT, BOTTOM_RIGHT); const CSize s(500, 250); SetMinTrackSize(s); EnableSaveRestore(IDS_R_DLG_SUBTITLEUP, TRUE); return TRUE; }
void CSubtitleUpDlg::OnRightClick(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR; if (lpnmlv->iItem >= 0 && lpnmlv->iSubItem >= 0) { auto& s = AfxGetAppSettings(); SubtitlesProvider& provider = *(SubtitlesProvider*)(m_list.GetItemData(lpnmlv->iItem)); enum { SET_CREDENTIALS = 0x1000, RESET_CREDENTIALS, MOVE_UP, MOVE_DOWN, OPEN_URL }; CMenu m; m.CreatePopupMenu(); m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) ? MF_ENABLED : MF_DISABLED), SET_CREDENTIALS, ResStr(IDS_SUBMENU_SETUP)); m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) && !provider.UserName().empty() ? MF_ENABLED : MF_DISABLED), RESET_CREDENTIALS, ResStr(IDS_SUBMENU_RESET)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | (lpnmlv->iItem > 0 ? MF_ENABLED : MF_DISABLED), MOVE_UP, ResStr(IDS_SUBMENU_MOVEUP)); m.AppendMenu(MF_STRING | (lpnmlv->iItem < m_list.GetItemCount() - 1 ? MF_ENABLED : MF_DISABLED), MOVE_DOWN, ResStr(IDS_SUBMENU_MOVEDOWN)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, OPEN_URL, ResStr(IDS_SUBMENU_OPENURL)); CPoint pt = lpnmlv->ptAction; ::MapWindowPoints(lpnmlv->hdr.hwndFrom, HWND_DESKTOP, &pt, 1); switch (m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, pt.x, pt.y, this)) { case OPEN_URL: provider.OpenUrl(); break; case SET_CREDENTIALS: { CString szUser(UTF8To16(provider.UserName().c_str())); CString szPass(UTF8To16(provider.Password().c_str())); CString szDomain(provider.Name().c_str()); if (ERROR_SUCCESS == PromptForCredentials(GetSafeHwnd(), ResStr(IDS_SUB_CREDENTIALS_TITLE), ResStr(IDS_SUB_CREDENTIALS_MSG) + CString(provider.Url().c_str()), szDomain, szUser, szPass, /*&bSave*/nullptr)) { provider.UserName((const char*)UTF16To8(szUser)); provider.Password((const char*)UTF16To8(szPass)); m_list.SetItemText(lpnmlv->iItem, 1, szUser); s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str()); s.SaveSettings(); } break; } case RESET_CREDENTIALS: provider.UserName(""); provider.Password(""); m_list.SetItemText(lpnmlv->iItem, 1, _T("")); s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str()); s.SaveSettings(); break; case MOVE_UP: { m_pMainFrame->m_pSubtitlesProviders->MoveUp(lpnmlv->iItem); ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd()); s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str()); s.SaveSettings(); break; } case MOVE_DOWN: { m_pMainFrame->m_pSubtitlesProviders->MoveDown(lpnmlv->iItem); ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd()); s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str()); s.SaveSettings(); break; } default: break; } } }
void CWebServer::OnRequest(CWebClientSocket* pClient, CStringA& hdr, CStringA& body) { CPath p(AToT(pClient->m_path)); CStringA ext = p.GetExtension().MakeLower(); CStringA mime; if (ext.IsEmpty()) { mime = "text/html"; } else { m_mimes.Lookup(ext, mime); } hdr = "HTTP/1.0 200 OK\r\n"; bool fHandled = false, fCGI = false; if (!fHandled && m_webroot.IsDirectory()) { CStringA tmphdr; fHandled = fCGI = CallCGI(pClient, tmphdr, body, mime); if (fHandled) { tmphdr.Replace("\r\n", "\n"); CAtlList<CStringA> hdrlines; ExplodeMin(tmphdr, hdrlines, '\n'); POSITION pos = hdrlines.GetHeadPosition(); while (pos) { POSITION cur = pos; CAtlList<CStringA> sl; CStringA key = Explode(hdrlines.GetNext(pos), sl, ':', 2); if (sl.GetCount() < 2) { continue; } key.Trim().MakeLower(); if (key == "content-type") { mime = sl.GetTail().Trim(); hdrlines.RemoveAt(cur); } else if (key == "content-length") { hdrlines.RemoveAt(cur); } } tmphdr = Implode(hdrlines, "\r\n"); hdr += tmphdr + "\r\n"; } } RequestHandler rh = NULL; if (!fHandled && m_internalpages.Lookup(pClient->m_path, rh) && (pClient->*rh)(hdr, body, mime)) { if (mime.IsEmpty()) { mime = "text/html"; } CString redir; if (pClient->m_get.Lookup("redir", redir) || pClient->m_post.Lookup("redir", redir)) { if (redir.IsEmpty()) { redir = '/'; } hdr = "HTTP/1.0 302 Found\r\n" "Location: " + CStringA(redir) + "\r\n"; return; } fHandled = true; } if (!fHandled && m_webroot.IsDirectory()) { fHandled = LoadPage(0, body, UTF8To16(pClient->m_path)); } UINT resid; if (!fHandled && m_downloads.Lookup(pClient->m_path, resid) && (LoadResource(resid, body, _T("FILE")) || LoadResource(resid, body, _T("PNG")))) { if (mime.IsEmpty()) { mime = "application/octet-stream"; } fHandled = true; } if (!fHandled) { hdr = mime == "text/html" ? "HTTP/1.0 301 Moved Permanently\r\n" "Location: /404.html\r\n" : "HTTP/1.0 404 Not Found\r\n"; return; } if ((mime == "text/html" || mime == "text/javascript") && !fCGI) { if (mime == "text/html") { hdr += "Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n" "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\n" "Pragma: no-cache\r\n"; CStringA debug; if (AfxGetAppSettings().fWebServerPrintDebugInfo) { debug += "<br><hr>\r\n"; debug += "<div id=\"debug\">"; CStringA key; POSITION pos; { CStringA value; pos = pClient->m_hdrlines.GetStartPosition(); while (pos) { pClient->m_hdrlines.GetNextAssoc(pos, key, value); debug += "HEADER[" + key + "] = " + value + "\r\n"; } } debug += "cmd: " + pClient->m_cmd + "\r\n"; debug += "path: " + pClient->m_path + "\r\n"; debug += "ver: " + pClient->m_ver + "\r\n"; { CString value; pos = pClient->m_get.GetStartPosition(); while (pos) { pClient->m_get.GetNextAssoc(pos, key, value); debug += "GET[" + HtmlSpecialChars(key) + "] = " + HtmlSpecialChars(UTF8(value)) + "\r\n"; } pos = pClient->m_post.GetStartPosition(); while (pos) { pClient->m_post.GetNextAssoc(pos, key, value); debug += "POST[" + HtmlSpecialChars(key) + "] = " + HtmlSpecialChars(UTF8(value)) + "\r\n"; } pos = pClient->m_cookie.GetStartPosition(); while (pos) { pClient->m_cookie.GetNextAssoc(pos, key, value); debug += "COOKIE[" + HtmlSpecialChars(key) + "] = " + HtmlSpecialChars(UTF8(value)) + "\r\n"; } pos = pClient->m_request.GetStartPosition(); while (pos) { pClient->m_request.GetNextAssoc(pos, key, value); debug += "REQUEST[" + HtmlSpecialChars(key) + "] = " + HtmlSpecialChars(UTF8(value)) + "\r\n"; } } debug += "</div>"; } body.Replace("[debug]", debug); } body.Replace("[browserpath]", "/browser.html"); body.Replace("[commandpath]", "/command.html"); body.Replace("[controlspath]", "/controls.html"); body.Replace("[indexpath]", "/index.html"); body.Replace("[path]", pClient->m_path); body.Replace("[setposcommand]", CMD_SETPOS); body.Replace("[setvolumecommand]", CMD_SETVOLUME); body.Replace("[wmcname]", "wm_command"); // TODO: add more general tags to replace } // gzip if (AfxGetAppSettings().fWebServerUseCompression && !body.IsEmpty() && hdr.Find("Content-Encoding:") < 0 && ext != ".png" && ext != ".jpeg" && ext != ".gif") do { CStringA accept_encoding; pClient->m_hdrlines.Lookup("accept-encoding", accept_encoding); accept_encoding.MakeLower(); CAtlList<CStringA> sl; ExplodeMin(accept_encoding, sl, ','); if (!sl.Find("gzip")) { break; } // Allocate deflate state z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; int ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY); if (ret != Z_OK) { ASSERT(0); break; } int gzippedBuffLen = body.GetLength(); BYTE* gzippedBuff = DEBUG_NEW BYTE[gzippedBuffLen]; // Compress strm.avail_in = body.GetLength(); strm.next_in = (Bytef*)(LPCSTR)body; strm.avail_out = gzippedBuffLen; strm.next_out = gzippedBuff; ret = deflate(&strm, Z_FINISH); if (ret != Z_STREAM_END || strm.avail_in != 0) { ASSERT(0); deflateEnd(&strm); delete [] gzippedBuff; break; } gzippedBuffLen -= strm.avail_out; memcpy(body.GetBufferSetLength(gzippedBuffLen), gzippedBuff, gzippedBuffLen); // Clean up deflateEnd(&strm); delete [] gzippedBuff; hdr += "Content-Encoding: gzip\r\n"; } while (0); CStringA content; content.Format( "Content-Type: %s\r\n" "Content-Length: %d\r\n", mime, body.GetLength()); hdr += content; }
STDMETHODIMP CSubtitleInputPin::Receive(IMediaSample* pSample) { HRESULT hr; hr = __super::Receive(pSample); if(FAILED(hr)) return hr; CAutoLock cAutoLock(&m_csReceive); REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); bool fInvalidate = false; if(m_mt.majortype == MEDIATYPE_Text) { CAutoLock cAutoLock(m_pSubLock); CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; if(!strncmp((char*)pData, __GAB1__, strlen(__GAB1__))) { char* ptr = (char*)&pData[strlen(__GAB1__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if(tag == __GAB1_LANGUAGE__) { pRTS->m_name = CString(ptr); } else if(tag == __GAB1_ENTRY__) { pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr+4)); fInvalidate = true; } else if(tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_ENTRY_UNICODE__) { pRTS->Add((WCHAR*)(ptr+8), true, *(int*)ptr, *(int*)(ptr+4)); fInvalidate = true; } ptr += size; } } else if(!strncmp((char*)pData, __GAB2__, strlen(__GAB2__))) { char* ptr = (char*)&pData[strlen(__GAB2__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if(tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_RAWTEXTSUBTITLE__) { pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, pRTS->m_name); fInvalidate = true; } ptr += size; } } else if(pData != 0 && len > 1 && *pData != 0) { CStringA str((char*)pData, len); str.Replace("\r\n", "\n"); str.Trim(); if(!str.IsEmpty()) { pRTS->Add(AToW(str), false, (int)(tStart / 10000), (int)(tStop / 10000)); fInvalidate = true; } } } else if(m_mt.majortype == MEDIATYPE_Subtitle) { CAutoLock cAutoLock(m_pSubLock); if(m_mt.subtype == MEDIASUBTYPE_UTF8) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { pRTS->Add(str, true, (int)(tStart / 10000), (int)(tStop / 10000)); fInvalidate = true; } } else if(m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if(sl.GetCount() == (size_t)fields) { stse.readorder = wcstol(sl.RemoveHead(), NULL, 10); stse.layer = wcstol(sl.RemoveHead(), NULL, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); if(fields == 10) stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if(!stse.str.IsEmpty()) { pRTS->Add(stse.str, true, (int)(tStart / 10000), (int)(tStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); fInvalidate = true; } } } else if(m_mt.subtype == MEDIASUBTYPE_SSF) { ssf::CRenderer* pSSF = (ssf::CRenderer*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { pSSF->Append(tStart, tStop, str); fInvalidate = true; } } else if(m_mt.subtype == MEDIASUBTYPE_VOBSUB) { CVobSubStream* pVSS = (CVobSubStream*)(ISubStream*)m_pSubStream; pVSS->Add(tStart, tStop, pData, len); } else if (IsHdmvSub(&m_mt)) { CAutoLock cAutoLock(m_pSubLock); CRenderedHdmvSubtitle* pHdmvSubtitle = (CRenderedHdmvSubtitle*)(ISubStream*)m_pSubStream; pHdmvSubtitle->ParseSample (pSample); } } if(fInvalidate) { TRACE(_T("InvalidateSubtitle(%I64d, ..)\n"), tStart); // IMPORTANT: m_pSubLock must not be locked when calling this InvalidateSubtitle(tStart, m_pSubStream); } hr = S_OK; return hr; }
bool CSubtitleDlDlg::Parse() { // Parse raw list isdb_movie m; isdb_subtitle sub; CAtlList<CStringA> sl; Explode(m_pTA->raw_list, sl, '\n'); CString str; POSITION pos = sl.GetHeadPosition(); while (pos) { str = sl.GetNext(pos); CStringA param = str.Left(max(0, str.Find('='))); CStringA value = str.Mid(str.Find('=') + 1); if (param == "ticket") { m_pTA->ticket = value; } else if (param == "movie") { m.reset(); Explode(value, m.titles, '|'); } else if (param == "subtitle") { sub.reset(); sub.id = atoi(value); } else if (param == "name") { sub.name = value; } else if (param == "discs") { sub.discs = atoi(value); } else if (param == "disc_no") { sub.disc_no = atoi(value); } else if (param == "format") { sub.format = value; } else if (param == "iso639_2") { sub.iso639_2 = value; } else if (param == "language") { sub.language = value; } else if (param == "nick") { sub.nick = value; } else if (param == "email") { sub.email = value; } else if (param == "" && value == "endsubtitle") { m.subs.AddTail(sub); } else if (param == "" && value == "endmovie") { m_pTA->raw_movies.AddTail(m); } else if (param == "" && value == "end") { break; } } // Parse movies pos = m_pTA->raw_movies.GetHeadPosition(); while (pos) { isdb_movie& raw_movie = m_pTA->raw_movies.GetNext(pos); isdb_movie_parsed p; CStringA titlesA = Implode(raw_movie.titles, '|'); titlesA.Replace("|", ", "); p.titles = UTF8To16(titlesA); p.checked = false; POSITION pos2 = raw_movie.subs.GetHeadPosition(); while (pos2) { const isdb_subtitle& s = raw_movie.subs.GetNext(pos2); p.name = UTF8To16(s.name); p.language = s.language; p.format = s.format; p.disc.Format(_T("%d/%d"), s.disc_no, s.discs); p.ptr = reinterpret_cast<DWORD_PTR>(&s); m_parsed_movies.Add(p); } } bool ret = true; if (m_parsed_movies.GetCount() == 0) { ret = false; } return ret; }
REFERENCE_TIME CSubtitleInputPin::DecodeSample(const CAutoPtr<SubtitleSample>& pSample) { bool bInvalidate = false; if (m_mt.majortype == MEDIATYPE_Text) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; char* pData = (char*)pSample->data.data(); if (!strncmp(pData, __GAB1__, strlen(__GAB1__))) { char* ptr = &pData[strlen(__GAB1__) + 1]; char* end = &pData[pSample->data.size()]; while (ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if (tag == __GAB1_LANGUAGE__) { pRTS->m_name = CString(ptr); } else if (tag == __GAB1_ENTRY__) { pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr + 4)); bInvalidate = true; } else if (tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if (tag == __GAB1_ENTRY_UNICODE__) { pRTS->Add((WCHAR*)(ptr + 8), true, *(int*)ptr, *(int*)(ptr + 4)); bInvalidate = true; } ptr += size; } } else if (!strncmp(pData, __GAB2__, strlen(__GAB2__))) { char* ptr = &pData[strlen(__GAB2__) + 1]; char* end = &pData[pSample->data.size()]; while (ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if (tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if (tag == __GAB1_RAWTEXTSUBTITLE__) { pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, pRTS->m_name); bInvalidate = true; } ptr += size; } } else if (pSample->data.size() > 1 && *pData != '\0') { CStringA str(pData, (int)pSample->data.size()); str.Replace("\r\n", "\n"); str.Trim(); if (!str.IsEmpty()) { pRTS->Add(AToW(str), false, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000)); bInvalidate = true; } } } else if (m_mt.majortype == MEDIATYPE_Subtitle) { if (m_mt.subtype == MEDIASUBTYPE_UTF8) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pSample->data.data(), (int)pSample->data.size())).Trim(); if (!str.IsEmpty()) { pRTS->Add(str, true, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000)); bInvalidate = true; } } else if (m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pSample->data.data(), (int)pSample->data.size())).Trim(); if (!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if (sl.GetCount() == (size_t)fields) { stse.readorder = wcstol(sl.RemoveHead(), nullptr, 10); stse.layer = wcstol(sl.RemoveHead(), nullptr, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), nullptr, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), nullptr, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), nullptr, 10); if (fields == 10) { stse.marginRect.bottom = wcstol(sl.RemoveHead(), nullptr, 10); } stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if (!stse.str.IsEmpty()) { pRTS->Add(stse.str, true, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); bInvalidate = true; } } } else if (m_mt.subtype == MEDIASUBTYPE_VOBSUB) { CVobSubStream* pVSS = (CVobSubStream*)(ISubStream*)m_pSubStream; pVSS->Add(pSample->rtStart, pSample->rtStop, pSample->data.data(), (int)pSample->data.size()); } else if (IsRLECodedSub(&m_mt)) { CRLECodedSubtitle* pRLECodedSubtitle = (CRLECodedSubtitle*)(ISubStream*)m_pSubStream; pRLECodedSubtitle->ParseSample(pSample->rtStart, pSample->rtStop, pSample->data.data(), (int)pSample->data.size()); } } return bInvalidate ? pSample->rtStart : -1; }
BOOL CSubtitleDlDlg::OnInitDialog() { __super::OnInitDialog(); AddAnchor(IDC_LIST1, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_CHECK1, BOTTOM_LEFT); AddAnchor(IDOK, BOTTOM_RIGHT); CSize s(200, 150); SetMinTrackSize(s); m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT); m_list.InsertColumn(COL_FILENAME, _T("File"), LVCFMT_LEFT, 160); m_list.InsertColumn(COL_LANGUAGE, _T("Language"), LVCFMT_CENTER, 80); m_list.InsertColumn(COL_FORMAT, _T("Format"), LVCFMT_CENTER, 50); m_list.InsertColumn(COL_DISC, _T("Disc"), LVCFMT_CENTER, 50); m_list.InsertColumn(COL_TITLES, _T("Title(s)"), LVCFMT_LEFT, 300); m_onoff.Create(IDB_ONOFF, 12, 3, 0xffffff); m_list.SetImageList(&m_onoff, LVSIL_SMALL); int i = 0; POSITION pos = m_movies.GetHeadPosition(); while(pos) { isdb_movie& m = m_movies.GetNext(pos); CStringA titlesA = Implode(m.titles, '|'); titlesA.Replace("|", ", "); CString titles = UTF8To16(titlesA); POSITION pos2 = m.subs.GetHeadPosition(); while(pos2) { isdb_subtitle& s = m.subs.GetNext(pos2); CString name = UTF8To16(s.name); CString language = s.language; CString format = s.format; CString disc; disc.Format(_T("%d/%d"), s.disc_no, s.discs); int iItem = m_list.InsertItem(i++, _T("")); m_list.SetItemData(iItem, (DWORD_PTR)&s); m_list.SetItemText(iItem, COL_FILENAME, name); m_list.SetItemText(iItem, COL_LANGUAGE, language); m_list.SetItemText(iItem, COL_FORMAT, format); m_list.SetItemText(iItem, COL_DISC, disc); m_list.SetItemText(iItem, COL_TITLES, titles); } } m_selsubs.RemoveAll(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
STDMETHODIMP CTextSubtitleInputPinHepler::Receive( IMediaSample* pSample ) { REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; HRESULT hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); if(m_mt.majortype == MEDIATYPE_Text) { if(!strncmp((char*)pData, __GAB1__, strlen(__GAB1__))) { char* ptr = (char*)&pData[strlen(__GAB1__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if(tag == __GAB1_LANGUAGE__) { m_pRTS->m_name = CString(ptr); } else if(tag == __GAB1_ENTRY__) { m_pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr+4)); } else if(tag == __GAB1_LANGUAGE_UNICODE__) { m_pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_ENTRY_UNICODE__) { m_pRTS->Add((WCHAR*)(ptr+8), true, *(int*)ptr, *(int*)(ptr+4)); } ptr += size; } } else if(!strncmp((char*)pData, __GAB2__, strlen(__GAB2__))) { char* ptr = (char*)&pData[strlen(__GAB2__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if(tag == __GAB1_LANGUAGE_UNICODE__) { m_pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_RAWTEXTSUBTITLE__) { m_pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, m_pRTS->m_name); } ptr += size; } } else if(pData != 0 && len > 1 && *pData != 0) { CStringA str((char*)pData, len); str.Replace("\r\n", "\n"); str.Trim(); if(!str.IsEmpty()) { m_pRTS->Add(AToW(str), false, (int)(tStart / 10000), (int)(tStop / 10000)); } } else { XY_LOG_WARN("Unexpected data"); } } else if(m_mt.majortype == MEDIATYPE_Subtitle) { if(m_mt.subtype == MEDIASUBTYPE_UTF8) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { m_pRTS->Add(str, true, (int)(tStart / 10000), (int)(tStop / 10000)); } else { XY_LOG_WARN("Empty data"); } } else if(m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if(sl.GetCount() == fields) { stse.readorder = wcstol(sl.RemoveHead(), NULL, 10); stse.layer = wcstol(sl.RemoveHead(), NULL, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); if(fields == 10) stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if(!stse.str.IsEmpty()) { m_pRTS->Add(stse.str, true, (int)(tStart / 10000), (int)(tStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); } } else { XY_LOG_WARN("Empty data"); } } else { XY_LOG_WARN("Unsupported media type "<<XyUuidToString(m_mt.subtype)); } } else { XY_LOG_WARN("Unsupported media type "<<XyUuidToString(m_mt.majortype)); } return S_OK; }