[videodb] remove unused seasons table from episode_view
[xbmc.git] / xbmc / cores / VideoPlayer / DVDOverlayContainer.cpp
blobad3b87324dd2d128becbd3cdbb663500f37633b7
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "DVDOverlayContainer.h"
11 #include "DVDCodecs/Overlay/DVDOverlay.h"
12 #include "DVDInputStreams/DVDInputStreamNavigator.h"
14 #include <memory>
15 #include <mutex>
17 CDVDOverlayContainer::~CDVDOverlayContainer()
19 Clear();
22 void CDVDOverlayContainer::ProcessAndAddOverlayIfValid(const std::shared_ptr<CDVDOverlay>& pOverlay)
24 std::unique_lock<CCriticalSection> lock(*this);
26 // markup any non ending overlays, to finish
27 // when this new one starts, there can be
28 // multiple overlays queued at same start
29 // point so only stop them when we get a
30 // new startpoint
31 for(int i = m_overlays.size();i>0;)
33 i--;
34 if(m_overlays[i]->iPTSStopTime)
36 if(!m_overlays[i]->replace)
37 break;
38 if(m_overlays[i]->iPTSStopTime <= pOverlay->iPTSStartTime)
39 break;
42 if (m_overlays[i]->iPTSStartTime != pOverlay->iPTSStartTime)
43 m_overlays[i]->iPTSStopTime = pOverlay->iPTSStartTime;
46 m_overlays.emplace_back(pOverlay);
49 VecOverlays* CDVDOverlayContainer::GetOverlays()
51 return &m_overlays;
54 VecOverlays::iterator CDVDOverlayContainer::Remove(VecOverlays::iterator itOverlay)
56 std::unique_lock<CCriticalSection> lock(*this);
57 return m_overlays.erase(itOverlay);
60 void CDVDOverlayContainer::CleanUp(double pts)
62 std::unique_lock<CCriticalSection> lock(*this);
64 auto it = m_overlays.begin();
65 while (it != m_overlays.end())
67 const std::shared_ptr<CDVDOverlay>& pOverlay = *it;
69 // never delete forced overlays, they are used in menu's
70 // clear takes care of removing them
71 // also if stoptime = 0, it means the next subtitles will use its starttime as the stoptime
72 // which means we cannot delete overlays with stoptime 0
73 if (!pOverlay->bForced && pOverlay->iPTSStopTime <= pts && pOverlay->iPTSStopTime != 0)
75 //CLog::Log(LOGDEBUG,"CDVDOverlay::CleanUp, removing {}", (int)(pts / 1000));
76 //CLog::Log(LOGDEBUG,"CDVDOverlay::CleanUp, remove, start : {}, stop : {}", (int)(pOverlay->iPTSStartTime / 1000), (int)(pOverlay->iPTSStopTime / 1000));
77 it = Remove(it);
78 continue;
80 else if (pOverlay->bForced)
82 //Check for newer replacements
83 auto it2 = it;
84 bool bNewer = false;
85 while (!bNewer && ++it2 != m_overlays.end())
87 const std::shared_ptr<CDVDOverlay>& pOverlay2 = *it2;
88 if (pOverlay2->bForced && pOverlay2->iPTSStartTime <= pts) bNewer = true;
91 if (bNewer)
93 it = Remove(it);
94 continue;
97 ++it;
102 void CDVDOverlayContainer::Flush()
104 std::unique_lock<CCriticalSection> lock(*this);
106 // Flush only the overlays marked as flushable
107 m_overlays.erase(std::remove_if(m_overlays.begin(), m_overlays.end(),
108 [](const std::shared_ptr<CDVDOverlay>& ov) {
109 return ov->IsOverlayContainerFlushable();
111 m_overlays.end());
114 void CDVDOverlayContainer::Clear()
116 std::unique_lock<CCriticalSection> lock(*this);
117 m_overlays.clear();
120 size_t CDVDOverlayContainer::GetSize()
122 return m_overlays.size();
125 bool CDVDOverlayContainer::ContainsOverlayType(DVDOverlayType type)
127 bool result = false;
129 std::unique_lock<CCriticalSection> lock(*this);
131 auto it = m_overlays.begin();
132 while (!result && it != m_overlays.end())
134 if ((*it)->IsOverlayType(type)) result = true;
135 ++it;
138 return result;
142 * iAction should be LIBDVDNAV_BUTTON_NORMAL or LIBDVDNAV_BUTTON_CLICKED
144 void CDVDOverlayContainer::UpdateOverlayInfo(
145 const std::shared_ptr<CDVDInputStreamNavigator>& pStream, CDVDDemuxSPU* pSpu, int iAction)
147 std::unique_lock<CCriticalSection> lock(*this);
149 pStream->CheckButtons();
151 //Update any forced overlays.
152 for(VecOverlays::iterator it = m_overlays.begin(); it != m_overlays.end(); ++it )
154 if ((*it)->IsOverlayType(DVDOVERLAY_TYPE_SPU))
156 auto pOverlaySpu = std::static_pointer_cast<CDVDOverlaySpu>(*it);
158 // make sure its a forced (menu) overlay
159 // set menu spu color and alpha data if there is a valid menu overlay
160 if (pOverlaySpu->bForced)
162 if (pOverlaySpu.use_count() > 1)
164 pOverlaySpu = std::make_shared<CDVDOverlaySpu>(*pOverlaySpu);
165 (*it) = pOverlaySpu;
168 if (pStream->GetCurrentButtonInfo(*pOverlaySpu, pSpu, iAction))
170 pOverlaySpu->m_textureid = 0;