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.
9 #include "DVDOverlayContainer.h"
11 #include "DVDCodecs/Overlay/DVDOverlay.h"
12 #include "DVDInputStreams/DVDInputStreamNavigator.h"
17 CDVDOverlayContainer::~CDVDOverlayContainer()
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
31 for(int i
= m_overlays
.size();i
>0;)
34 if(m_overlays
[i
]->iPTSStopTime
)
36 if(!m_overlays
[i
]->replace
)
38 if(m_overlays
[i
]->iPTSStopTime
<= pOverlay
->iPTSStartTime
)
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()
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));
80 else if (pOverlay
->bForced
)
82 //Check for newer replacements
85 while (!bNewer
&& ++it2
!= m_overlays
.end())
87 const std::shared_ptr
<CDVDOverlay
>& pOverlay2
= *it2
;
88 if (pOverlay2
->bForced
&& pOverlay2
->iPTSStartTime
<= pts
) bNewer
= true;
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();
114 void CDVDOverlayContainer::Clear()
116 std::unique_lock
<CCriticalSection
> lock(*this);
120 size_t CDVDOverlayContainer::GetSize()
122 return m_overlays
.size();
125 bool CDVDOverlayContainer::ContainsOverlayType(DVDOverlayType type
)
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;
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
);
168 if (pStream
->GetCurrentButtonInfo(*pOverlaySpu
, pSpu
, iAction
))
170 pOverlaySpu
->m_textureid
= 0;