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.
12 #include "DVDCodecs/Video/DVDVideoCodec.h"
13 #include "DVDMessageQueue.h"
14 #include "DVDOverlayContainer.h"
15 #include "DVDStreamInfo.h"
16 #include "IVideoPlayer.h"
17 #include "PTSTracker.h"
18 #include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
19 #include "threads/Thread.h"
20 #include "utils/BitstreamStats.h"
24 #define DROP_DROPPED 1
25 #define DROP_VERYLATE 2
26 #define DROP_BUFFER_LEVEL 4
28 class CDemuxStreamVideo
;
34 void AddOutputDropGain(double pts
, int frames
);
40 std::deque
<CGain
> m_gain
;
45 class CVideoPlayerVideo
: public CThread
, public IDVDStreamPlayerVideo
48 CVideoPlayerVideo(CDVDClock
* pClock
,
49 CDVDOverlayContainer
* pOverlayContainer
,
50 CDVDMessageQueue
& parent
,
51 CRenderManager
& renderManager
,
52 CProcessInfo
& processInfo
,
53 double messageQueueTimeSize
);
54 ~CVideoPlayerVideo() override
;
56 bool OpenStream(CDVDStreamInfo hint
) override
;
57 void CloseStream(bool bWaitForBuffers
) override
;
58 void Flush(bool sync
) override
;
59 bool AcceptsData() const override
;
60 bool HasData() const override
;
61 bool IsInited() const override
;
62 void SendMessage(std::shared_ptr
<CDVDMsg
> pMsg
, int priority
= 0) override
;
63 void FlushMessages() override
;
65 void EnableSubtitle(bool bEnable
) override
{ m_bRenderSubs
= bEnable
; }
66 bool IsSubtitleEnabled() override
{ return m_bRenderSubs
; }
67 double GetSubtitleDelay() override
{ return m_iSubtitleDelay
; }
68 void SetSubtitleDelay(double delay
) override
{ m_iSubtitleDelay
= delay
; }
69 bool IsStalled() const override
{ return m_stalled
; }
70 bool IsRewindStalled() const override
{ return m_rewindStalled
; }
71 double GetCurrentPts() override
;
72 double GetOutputDelay() override
; /* returns the expected delay, from that a packet is put in queue */
73 std::string
GetPlayerInfo() override
;
74 int GetVideoBitrate() override
;
75 void SetSpeed(int iSpeed
) override
;
78 CDVDOverlayContainer
* m_pOverlayContainer
;
91 void OnExit() override
;
92 void Process() override
;
94 bool ProcessDecoderOutput(double &frametime
, double &pts
);
95 void SendMessageBack(const std::shared_ptr
<CDVDMsg
>& pMsg
, int priority
= 0);
96 MsgQueueReturnCode
GetMessage(std::shared_ptr
<CDVDMsg
>& pMsg
,
97 std::chrono::milliseconds timeout
,
100 EOutputState
OutputPicture(const VideoPicture
* src
);
101 void ProcessOverlays(const VideoPicture
* pSource
, double pts
);
102 void OpenStream(CDVDStreamInfo
& hint
, std::unique_ptr
<CDVDVideoCodec
> codec
);
104 void ResetFrameRateCalc();
105 void CalcFrameRate();
106 int CalcDropRequirement(double pts
);
108 double m_iSubtitleDelay
;
111 int m_iDroppedFrames
;
112 int m_iDroppedRequest
;
114 double m_fFrameRate
; //framerate of the video currently playing
115 double m_fStableFrameRate
; //place to store calculated framerates
116 int m_iFrameRateCount
; //how many calculated framerates we stored in m_fStableFrameRate
117 bool m_bAllowDrop
; //we can't drop frames until we've calculated the framerate
118 int m_iFrameRateErr
; //how many frames we couldn't calculate the framerate, we give up after a while
119 int m_iFrameRateLength
; //how many seconds we should measure the framerate
120 //this is increased exponentially from CVideoPlayerVideo::CalcFrameRate()
122 bool m_bFpsInvalid
; // needed to ignore fps (e.g. dvd stills)
124 float m_fForcedAspectRatio
;
126 std::atomic_bool m_stalled
= false;
127 std::atomic_bool m_rewindStalled
;
129 IDVDStreamPlayer::ESyncState m_syncState
;
130 std::atomic_bool m_bAbortOutput
;
132 BitstreamStats m_videoStats
;
134 CDVDMessageQueue m_messageQueue
;
135 CDVDMessageQueue
& m_messageParent
;
136 CDVDStreamInfo m_hints
;
137 std::unique_ptr
<CDVDVideoCodec
> m_pVideoCodec
;
138 CPtsTracker m_ptsTracker
;
139 std::list
<DVDMessageListItem
> m_packets
;
140 CDroppingStats m_droppingStats
;
141 CRenderManager
& m_renderManager
;
142 VideoPicture m_picture
;
144 EOutputState m_outputSate
{OUTPUT_NORMAL
};