void CDVDPlayerSubtitle::GetCurrentSubtitle(CStdString& strSubtitle, double pts) { strSubtitle = ""; Process(pts); // TODO: move to separate thread? CSingleLock lock(*m_pOverlayContainer); VecOverlays* pOverlays = m_pOverlayContainer->GetOverlays(); if (pOverlays) { for(vector<CDVDOverlay*>::iterator it = pOverlays->begin();it != pOverlays->end();it++) { CDVDOverlay* pOverlay = *it; if (pOverlay->IsOverlayType(DVDOVERLAY_TYPE_TEXT) && (pOverlay->iPTSStartTime <= pts) && (pOverlay->iPTSStopTime >= pts || pOverlay->iPTSStopTime == 0LL)) { CDVDOverlayText::CElement* e = ((CDVDOverlayText*)pOverlay)->m_pHead; while (e) { if (e->IsElementType(CDVDOverlayText::ELEMENT_TYPE_TEXT)) { CDVDOverlayText::CElementText* t = (CDVDOverlayText::CElementText*)e; strSubtitle += t->m_text; strSubtitle += "\n"; } e = e->pNext; } } } } strSubtitle.TrimRight('\n'); }
COverlayText::COverlayText(CDVDOverlayText * src) { CDVDOverlayText::CElement* e = src->m_pHead; while (e) { if (e->IsElementType(CDVDOverlayText::ELEMENT_TYPE_TEXT)) { CDVDOverlayText::CElementText* t = (CDVDOverlayText::CElementText*)e; m_text += t->GetText(); m_text += "\n"; } e = e->pNext; } // Avoid additional line breaks while(StringUtils::EndsWith(m_text, "\n")) m_text = StringUtils::Left(m_text, m_text.length() - 1); // Remove HTML-like tags from the subtitles until StringUtils::Replace(m_text, "\\r", ""); StringUtils::Replace(m_text, "\r", ""); StringUtils::Replace(m_text, "\\n", "[CR]"); StringUtils::Replace(m_text, "\n", "[CR]"); StringUtils::Replace(m_text, "<br>", "[CR]"); StringUtils::Replace(m_text, "\\N", "[CR]"); StringUtils::Replace(m_text, "<i>", "[I]"); StringUtils::Replace(m_text, "</i>", "[/I]"); StringUtils::Replace(m_text, "<b>", "[B]"); StringUtils::Replace(m_text, "</b>", "[/B]"); StringUtils::Replace(m_text, "<u>", ""); StringUtils::Replace(m_text, "<p>", ""); StringUtils::Replace(m_text, "<P>", ""); StringUtils::Replace(m_text, " ", ""); StringUtils::Replace(m_text, "</u>", ""); StringUtils::Replace(m_text, "</i", "[/I]"); // handle tags which aren't closed properly (happens). StringUtils::Replace(m_text, "</b", "[/B]"); StringUtils::Replace(m_text, "</u", ""); m_layout = GetFontLayout(); m_subalign = CSettings::Get().GetInt("subtitles.align"); if (m_subalign == SUBTITLE_ALIGN_MANUAL) { m_align = ALIGN_SUBTITLE; m_pos = POSITION_RELATIVE; m_x = 0.0f; m_y = 0.0f; } else { m_align = ALIGN_VIDEO; m_pos = POSITION_RELATIVE; m_x = 0.5f; if(m_subalign == SUBTITLE_ALIGN_TOP_INSIDE || m_subalign == SUBTITLE_ALIGN_TOP_OUTSIDE) m_y = 0.0f; else m_y = 1.0f; } m_width = 0; m_height = 0; }