bool CDVDSubtitleParserSubrip::Open(CDVDStreamInfo &hints) { if (!CDVDSubtitleParserText::Open()) return false; CDVDSubtitleTagSami TagConv; if (!TagConv.Init()) return false; char line[1024]; CStdString strLine; while (m_pStream->ReadLine(line, sizeof(line))) { strLine = line; strLine.Trim(); if (strLine.length() > 0) { char sep; int hh1, mm1, ss1, ms1, hh2, mm2, ss2, ms2; int c = sscanf(strLine.c_str(), "%d%c%d%c%d%c%d --> %d%c%d%c%d%c%d\n", &hh1, &sep, &mm1, &sep, &ss1, &sep, &ms1, &hh2, &sep, &mm2, &sep, &ss2, &sep, &ms2); if (c == 1) { // numbering, skip it } else if (c == 14) // time info { CDVDOverlayText* pOverlay = new CDVDOverlayText(); pOverlay->Acquire(); // increase ref count with one so that we can hold a handle to this overlay pOverlay->iPTSStartTime = ((double)(((hh1 * 60 + mm1) * 60) + ss1) * 1000 + ms1) * (DVD_TIME_BASE / 1000); pOverlay->iPTSStopTime = ((double)(((hh2 * 60 + mm2) * 60) + ss2) * 1000 + ms2) * (DVD_TIME_BASE / 1000); while (m_pStream->ReadLine(line, sizeof(line))) { strLine = line; strLine.Trim(); // empty line, next subtitle is about to start if (strLine.length() <= 0) break; TagConv.ConvertLine(pOverlay, strLine.c_str(), strLine.length()); } TagConv.CloseTag(pOverlay); m_collection.Add(pOverlay); } } } m_collection.Sort(); return true; }
bool CDVDSubtitleParserSami::Open(CDVDStreamInfo &hints) { if (!CDVDSubtitleParserText::Open()) return false; char line[1024]; CRegExp reg(true); if (!reg.RegComp("<SYNC START=([0-9]+)>")) return false; CStdString strFileName; CStdString strClassID; strFileName = CUtil::GetFileName(m_filename); CDVDSubtitleTagSami TagConv; if (!TagConv.Init()) return false; TagConv.LoadHead(m_pStream); if (TagConv.m_Langclass.size() >= 2) { for (unsigned int i = 0; i < TagConv.m_Langclass.size(); i++) { if (strFileName.Find(TagConv.m_Langclass[i].Name, 9) == 9) { strClassID = TagConv.m_Langclass[i].ID.ToLower(); break; } } } const char *lang = NULL; if (!strClassID.IsEmpty()) lang = strClassID.c_str(); CDVDOverlayText* pOverlay = NULL; while (m_pStream->ReadLine(line, sizeof(line))) { if ((strlen(line) > 0) && (line[strlen(line) - 1] == '\r')) line[strlen(line) - 1] = 0; int pos = reg.RegFind(line); const char* text = line; if (pos > -1) { CStdString start = reg.GetMatch(1); if(pOverlay) { TagConv.ConvertLine(pOverlay, text, pos, lang); pOverlay->iPTSStopTime = (double)atoi(start.c_str()) * DVD_TIME_BASE / 1000; pOverlay->Release(); TagConv.CloseTag(pOverlay); } pOverlay = new CDVDOverlayText(); pOverlay->Acquire(); // increase ref count with one so that we can hold a handle to this overlay pOverlay->iPTSStartTime = (double)atoi(start.c_str()) * DVD_TIME_BASE / 1000; pOverlay->iPTSStopTime = DVD_NOPTS_VALUE; m_collection.Add(pOverlay); text += pos + reg.GetFindLen(); } if(pOverlay) TagConv.ConvertLine(pOverlay, text, strlen(text), lang); } m_collection.Sort(); return true; }
int CDVDOverlayCodecText::Decode(DemuxPacket *pPacket) { if(m_pOverlay) SAFE_RELEASE(m_pOverlay); if(!pPacket) return OC_ERROR; uint8_t *data = pPacket->pData; int size = pPacket->iSize; m_pOverlay = new CDVDOverlayText(); CDVDOverlayCodec::GetAbsoluteTimes(m_pOverlay->iPTSStartTime, m_pOverlay->iPTSStopTime, pPacket, m_pOverlay->replace); char *start, *end, *p; start = (char*)data; end = (char*)data + size; p = (char*)data; if (m_bIsSSA) { // currently just skip the prefixed ssa fields (8 fields) int nFieldCount = 8; while (nFieldCount > 0 && start < end) { if (*start == ',') nFieldCount--; start++; p++; } } CDVDSubtitleTagSami TagConv; bool Taginit = TagConv.Init(); while(p<end) { if(*p == '{') { if(p>start) { if(Taginit) TagConv.ConvertLine(m_pOverlay, start, p-start); else m_pOverlay->AddElement(new CDVDOverlayText::CElementText(start, p-start)); } start = p+1; while(*p != '}' && p<end) p++; char* override = (char*)malloc(p-start + 1); memcpy(override, start, p-start); override[p-start] = '\0'; CLog::Log(LOGINFO, "%s - Skipped formatting tag %s", __FUNCTION__, override); free(override); start = p+1; } p++; }