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; }