summaryrefslogtreecommitdiff
path: root/hlsPlayer.h
blob: 111a367933b5220c8c0c52e4d5eb9ed2b49d3a0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef HLSPLAYER_H
#define HLSPLAYER_H

#include <string>
#include <iostream>
#include <sstream>

#include <vdr/thread.h>
#include <vdr/player.h>
#include <vdr/ringbuffer.h>
#include <vdr/tools.h>

#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/URI.h>

#include "m3u8Parser.h"
#include "Config.h"
#include "PVideo.h"
#include "Media.h"

class cHlsSegmentLoader : public cThread
{
private:
	int m_ringBufferSize;
	unsigned int m_segmentsToBuffer;
	unsigned int m_lastLoadedSegment;
	bool m_bufferFilled;
	bool m_newList;

	uchar* m_pBuffer;

	Poco::Net::HTTPClientSession* m_pClientSession;
	Poco::URI m_startUri;
	std::string m_sessionUriPart;
	std::string m_segmentUriPart;
	std::string m_sessionCookie;

	cM3u8Parser m_startParser;
	cM3u8Parser m_indexParser;

	bool ConnectToServer(void);
	void CloseConnection(void);
	bool LoadStartList(void);
	bool LoadIndexList(void);
	std::string GetSegmentUri(int segmentIndex) const;
	int GetSegmentSize(int segmentIndex);
	bool LoadSegment(std::string uri);
	int EstimateSegmentSize();
	bool LoadLists(void);
	void ResizeRingbuffer(int newsize);
	

protected:
	void Action(void);
	bool DoLoad(void);

public:
	cHlsSegmentLoader(std::string startm3u8);
	~cHlsSegmentLoader();

	cRingBufferLinear*  m_pRingbuffer;
	bool BufferFilled(void);
	bool Active(void);
	bool StopLoader(void);
	bool LoadM3u8(std::string uri);
	void AddHeader(Poco::Net::HTTPRequest& req);
	void Ping(void);
};

class cHlsPlayer : public cPlayer, cThread
{
private:
	int AudioIndexOffset;
	cHlsSegmentLoader* m_pSegmentLoader;
	plexclient::Video* m_pVideo;

	int m_jumpOffset;
	int m_timeOffset;
	bool m_doJump;
	bool m_isBuffering;

	int m_videoLenght;
	int m_actualSegment;
	int m_actualTime;
	long m_lastValidSTC;
	
	unsigned long long m_tLastTime;
	unsigned long long m_tTimeSum;
	bool m_bFirstPlay;
	cTimeMs m_tTimer;

	enum ePlayModes { pmPlay, pmPause };
	ePlayModes playMode;

	virtual void Activate(bool On);
	int GetPlayedSeconds(void);
	void CountPlayedSeconds(void);
	void ResetPlayedSeconds(void);
	void ReportProgress(bool stopped = false);
	void SetWatched(void);

protected:
	void Action(void);
	bool DoPlay(void);


public:
	//static cMutex s_mutex;
	cHlsPlayer(std::string startm3u8, plexclient::Video* Video, int offset = 0);
	~cHlsPlayer();

	virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false);
	virtual bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
	virtual double FramesPerSecond(void);
	virtual void SetAudioTrack(eTrackType Type, const tTrackId *TrackId);
	void Pause(void);
	void Play(void);
	void Stop(void);
	bool Active(void);
	void JumpTo(int seconds);
	void JumpRelative(int seconds);
	void SetAudioAndSubtitleTracks(void);

};

#endif // HLSPLAYER_H