fixed: #9682 - Surplus carriage return in sami subtitle
[xbmc:marcelowas-xbmc.git] / xbmc / cores / dvdplayer / DVDSubtitles / DVDSubtitleParserSami.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "DVDSubtitleParserSami.h"
23 #include "DVDCodecs/Overlay/DVDOverlayText.h"
24 #include "DVDClock.h"
25 #include "utils/RegExp.h"
26 #include "DVDStreamInfo.h"
27 #include "StdString.h"
28 #include "SamiTagConvertor.h"
29 #include "Util.h"
30
31 using namespace std;
32
33 CDVDSubtitleParserSami::CDVDSubtitleParserSami(CDVDSubtitleStream* pStream, const string& filename)
34     : CDVDSubtitleParserText(pStream, filename)
35 {
36
37 }
38
39 CDVDSubtitleParserSami::~CDVDSubtitleParserSami()
40 {
41   Dispose();
42 }
43
44 bool CDVDSubtitleParserSami::Open(CDVDStreamInfo &hints)
45 {
46   if (!CDVDSubtitleParserText::Open())
47     return false;
48
49   char line[1024];
50
51   CRegExp reg(true);
52   if (!reg.RegComp("<SYNC START=([0-9]+)>"))
53     return false;
54
55   CStdString strFileName;
56   CStdString strClassID;
57   strFileName = CUtil::GetFileName(m_filename);
58
59   SamiTagConvertor TagConv;
60   if (!TagConv.Init())
61     return false;
62   TagConv.LoadHead(m_pStream);
63   if (TagConv.m_Langclass.size() >= 2)
64   {
65     for (unsigned int i = 0; i < TagConv.m_Langclass.size(); i++)
66     {
67       if (strFileName.Find(TagConv.m_Langclass[i].Name, 9) == 9)
68       {
69         strClassID = TagConv.m_Langclass[i].ID.ToLower();
70         break;
71       }
72     }
73   }
74   const char *lang = NULL;
75   if (!strClassID.IsEmpty())
76     lang = strClassID.c_str();
77
78   CDVDOverlayText* pOverlay = NULL;
79   while (m_pStream->ReadLine(line, sizeof(line)))
80   {
81     if ((strlen(line) > 0) && (line[strlen(line) - 1] == '\r'))
82       line[strlen(line) - 1] = 0;
83
84     int pos = reg.RegFind(line);
85     const char* text = line;
86     if (pos > -1)
87     {
88       CStdString start = reg.GetMatch(1);
89       if(pOverlay)
90       {
91         TagConv.ConvertLine(pOverlay, text, pos, lang);
92         pOverlay->iPTSStopTime  = (double)atoi(start.c_str()) * DVD_TIME_BASE / 1000;
93         pOverlay->Release();
94         TagConv.CloseTag(pOverlay);
95       }
96
97       pOverlay = new CDVDOverlayText();
98       pOverlay->Acquire(); // increase ref count with one so that we can hold a handle to this overlay
99
100       pOverlay->iPTSStartTime = (double)atoi(start.c_str()) * DVD_TIME_BASE / 1000;
101       pOverlay->iPTSStopTime  = DVD_NOPTS_VALUE;
102       m_collection.Add(pOverlay);
103       text += pos + reg.GetFindLen();
104     }
105     if(pOverlay)
106       TagConv.ConvertLine(pOverlay, text, strlen(text), lang);
107   }
108   m_collection.Sort();
109   return true;
110 }
111