2 * Copyright (C) 2005-2013 Team XBMC
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)
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.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "DVDOverlayContainer.h"
22 #include "DVDInputStreams/DVDInputStreamNavigator.h"
23 #include "threads/SingleLock.h"
25 CDVDOverlayContainer::CDVDOverlayContainer()
30 CDVDOverlayContainer::~CDVDOverlayContainer()
35 void CDVDOverlayContainer::Add(CDVDOverlay* pOverlay)
39 CSingleLock lock(*this);
41 // markup any non ending overlays, to finish
42 // when this new one starts, there can be
43 // multiple overlays queued at same start
44 // point so only stop them when we get a
46 for(int i = m_overlays.size();i>0;)
49 if(m_overlays[i]->iPTSStopTime)
51 if(!m_overlays[i]->replace)
53 if(m_overlays[i]->iPTSStopTime <= pOverlay->iPTSStartTime)
56 if(m_overlays[i]->iPTSStartTime != pOverlay->iPTSStartTime)
57 m_overlays[i]->iPTSStopTime = pOverlay->iPTSStartTime;
60 m_overlays.push_back(pOverlay);
64 VecOverlays* CDVDOverlayContainer::GetOverlays()
69 VecOverlaysIter CDVDOverlayContainer::Remove(VecOverlaysIter itOverlay)
71 VecOverlaysIter itNext;
72 CDVDOverlay* pOverlay = *itOverlay;
75 CSingleLock lock(*this);
76 itNext = m_overlays.erase(itOverlay);
84 void CDVDOverlayContainer::CleanUp(double pts)
86 CSingleLock lock(*this);
88 VecOverlaysIter it = m_overlays.begin();
89 while (it != m_overlays.end())
91 CDVDOverlay* pOverlay = *it;
93 // never delete forced overlays, they are used in menu's
94 // clear takes care of removing them
95 // also if stoptime = 0, it means the next subtitles will use its starttime as the stoptime
96 // which means we cannot delete overlays with stoptime 0
97 if (!pOverlay->bForced && pOverlay->iPTSStopTime <= pts && pOverlay->iPTSStopTime != 0)
99 //CLog::Log(LOGDEBUG,"CDVDOverlay::CleanUp, removing %d", (int)(pts / 1000));
100 //CLog::Log(LOGDEBUG,"CDVDOverlay::CleanUp, remove, start : %d, stop : %d", (int)(pOverlay->iPTSStartTime / 1000), (int)(pOverlay->iPTSStopTime / 1000));
104 else if (pOverlay->bForced)
106 //Check for newer replacements
107 VecOverlaysIter it2 = it;
109 while (!bNewer && ++it2 != m_overlays.end())
111 CDVDOverlay* pOverlay2 = *it2;
112 if (pOverlay2->bForced && pOverlay2->iPTSStartTime <= pts) bNewer = true;
126 void CDVDOverlayContainer::Remove()
128 if (!m_overlays.empty())
130 CDVDOverlay* pOverlay;
133 CSingleLock lock(*this);
135 pOverlay = m_overlays.front();
136 m_overlays.erase(m_overlays.begin());
142 void CDVDOverlayContainer::Clear()
144 while (!m_overlays.empty()) Remove();
147 int CDVDOverlayContainer::GetSize()
149 return m_overlays.size();
152 bool CDVDOverlayContainer::ContainsOverlayType(DVDOverlayType type)
156 CSingleLock lock(*this);
158 VecOverlaysIter it = m_overlays.begin();
159 while (!result && it != m_overlays.end())
161 if (((CDVDOverlay*)*it)->IsOverlayType(type)) result = true;
169 * iAction should be LIBDVDNAV_BUTTON_NORMAL or LIBDVDNAV_BUTTON_CLICKED
171 void CDVDOverlayContainer::UpdateOverlayInfo(CDVDInputStreamNavigator* pStream, CDVDDemuxSPU *pSpu, int iAction)
173 CSingleLock lock(*this);
175 //Update any forced overlays.
176 for(VecOverlays::iterator it = m_overlays.begin(); it != m_overlays.end(); ++it )
178 if ((*it)->IsOverlayType(DVDOVERLAY_TYPE_SPU))
180 CDVDOverlaySpu* pOverlaySpu = (CDVDOverlaySpu*)(*it);
182 // make sure its a forced (menu) overlay
183 // set menu spu color and alpha data if there is a valid menu overlay
184 if (pOverlaySpu->bForced)
186 if(pOverlaySpu->Acquire()->Release() > 1)
188 pOverlaySpu = new CDVDOverlaySpu(*pOverlaySpu);
193 if(pStream->GetCurrentButtonInfo(pOverlaySpu, pSpu, iAction))
195 if(pOverlaySpu->m_overlay)
196 pOverlaySpu->m_overlay->Release();
197 pOverlaySpu->m_overlay = NULL;