]> git.vomp.tv Git - vompclient.git/blob - player.h
Add some VT switching and locking
[vompclient.git] / player.h
1 /*\r
2     Copyright 2004-2008 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 #ifndef PLAYER_H\r
22 #define PLAYER_H\r
23 \r
24 #include <stdio.h>\r
25 #include <stdlib.h>\r
26 #ifndef WIN32\r
27 #include <sys/time.h>\r
28 #endif\r
29 #include <time.h>\r
30 \r
31 #include "threadsystem.h"\r
32 \r
33 #include "callback.h"\r
34 #include "defines.h"\r
35 #include "vfeed.h"\r
36 #include "afeed.h"\r
37 #include "tfeed.h"\r
38 \r
39 #include "teletextdecodervbiebu.h"\r
40 \r
41 class MessageQueue;\r
42 class Audio;\r
43 class Video;\r
44 class VDR;\r
45 class Log;\r
46 class Demuxer;\r
47 class OSDReceiver;\r
48 class DVBSubtitles;\r
49 class Channel;\r
50 \r
51 class Player : public Thread_TYPE, public Callback\r
52 {\r
53   public:\r
54     Player(MessageQueue* messageQueue, void* messageReceiver, OSDReceiver* osdReceiver);\r
55     virtual ~Player();\r
56 \r
57     int init(bool p_isPesRecording,double framespersec);\r
58     int shutdown();\r
59     void setStartFrame(ULONG frameNum);\r
60     void setLengthBytes(ULLONG length);\r
61     void setLengthFrames(ULONG length);\r
62     void setAudioChannel(int newChannel, int type);\r
63     void setSubtitleChannel(int newChannel);\r
64     bool toggleSubtitles();\r
65     void turnSubtitlesOn(bool ison); \r
66     bool isSubtitlesOn() { return subtitlesShowing; }\r
67 \r
68     void play();\r
69     void stop();\r
70     void pause();\r
71     void playpause();\r
72     void fastForward();\r
73     void fastBackward();\r
74     void jumpToPercent(double percent);\r
75     void skipForward(int seconds);\r
76     void skipBackward(int seconds);\r
77     void jumpToMark(int mark);\r
78     void jumpToFrameP(int newFrame);\r
79 \r
80     UCHAR getState() { return state; }\r
81     ULONG getCurrentFrameNum();\r
82     ULONG getLengthFrames();\r
83     UCHAR getIScanRate() { return ifactor; }\r
84     bool* getDemuxerMpegAudioChannels();\r
85     bool* getDemuxerAc3AudioChannels();\r
86     bool* getDemuxerSubtitleChannels();\r
87     int *getTeletxtSubtitlePages();\r
88     int getCurrentAudioChannel();\r
89     int getCurrentSubtitleChannel();\r
90     bool isPesRecording() { return is_pesrecording; }\r
91     Channel getDemuxerChannel();\r
92 \r
93    TeletextDecoderVBIEBU * getTeletextDecoder() { return teletext; }\r
94 \r
95     void call(void*); // for callback interface\r
96 \r
97     const static UCHAR S_PLAY = 1;\r
98     const static UCHAR S_PAUSE_P = 2;\r
99     const static UCHAR S_PAUSE_I = 3;\r
100     const static UCHAR S_FFWD = 4;\r
101     const static UCHAR S_FBWD = 5;\r
102     const static UCHAR S_STOP = 6;\r
103     const static UCHAR S_JUMP = 7;\r
104     const static UCHAR S_JUMP_PI = 8; // Jump to Pause_I mode\r
105 \r
106     // Player events\r
107 \r
108     // FIXME so far this just duplicates the old system + the wss\r
109 \r
110     const static UCHAR CONNECTION_LOST = 1;\r
111     const static UCHAR STOP_PLAYBACK = 2;\r
112     const static UCHAR STREAM_END = 3;\r
113     const static UCHAR ASPECT43 = 4;\r
114     const static UCHAR ASPECT169 = 5;\r
115 \r
116 #ifdef DEV\r
117     void test1();\r
118     void test2();\r
119 #endif\r
120 \r
121   protected:\r
122     void threadMethod();\r
123     void threadPostStopCleanup();\r
124 \r
125   private:\r
126     void switchState(UCHAR newState, ULONG jumpFrame=0);\r
127 \r
128     void threadFeedPlay();\r
129     void threadFeedScan();\r
130     void threadPTSFeedScan();\r
131 \r
132     void doConnectionLost();\r
133     void restartAtFrame(ULONG newFrame);\r
134     void restartAtFramePI(ULONG newFrame);\r
135 \r
136     bool subtitlesShowing;\r
137     MessageQueue* messageQueue;\r
138     void* messageReceiver;\r
139     OSDReceiver* osdReceiver;\r
140     Log* logger;\r
141     Audio* audio;\r
142     Video* video;\r
143     Demuxer* demuxer;\r
144     DVBSubtitles* subtitles;\r
145     VDR* vdr;\r
146     VFeed vfeed;\r
147     AFeed afeed;\r
148     TFeed tfeed;\r
149     TeletextDecoderVBIEBU *teletext;\r
150   \r
151     \r
152 \r
153     bool initted;\r
154     bool startup;\r
155     bool videoStartup;\r
156 \r
157     bool is_pesrecording;\r
158         double fps;\r
159 \r
160 #ifndef WIN32\r
161     pthread_mutex_t mutex;\r
162 #else\r
163     HANDLE mutex;\r
164 #endif\r
165     void lock();\r
166     void unLock();\r
167 \r
168     ULLONG lengthBytes;\r
169     ULONG lengthFrames;\r
170     ULONG currentFrameNumber;\r
171     UINT blockSize;\r
172     UINT startupBlockSize;\r
173     UCHAR* threadBuffer;\r
174     UCHAR state;\r
175     UCHAR ifactor;\r
176 };\r
177 \r
178 #endif\r
179 \r
180 \r
181 /*\r
182 \r
183 Possible states:\r
184 \r
185 Play, Pause, FFwd, FBwd, (Stop), [Jump]\r
186 \r
187                     Possible  Working\r
188 \r
189 Play   -> PauseP       *         *\r
190        -> PauseI\r
191        -> FFwd         *         *\r
192        -> FBwd         *         *\r
193        -> Stop         *         *\r
194        -> Jump         *         *\r
195        -> Jump_PI      *         *\r
196 \r
197 PauseP -> Play         *         *\r
198        -> PauseI\r
199        -> FFwd         *         *\r
200        -> FBwd         *         *\r
201        -> Stop         *         *\r
202        -> Jump         *         *\r
203        -> Jump_PI      *         *\r
204 \r
205 PauseI -> Play         *         *\r
206        -> PauseP\r
207        -> FFwd         *         *\r
208        -> FBwd         *         *\r
209        -> Stop         *         *\r
210        -> Jump         *         *\r
211        -> Jump_PI      *         *\r
212 \r
213 FFwd   -> Play         *         *\r
214        -> PauseP\r
215        -> PauseI       *         *\r
216        -> FBwd         *         *\r
217        -> Stop         *         *\r
218        -> Jump         *         *\r
219        -> Jump_PI      *         *\r
220 \r
221 FBwd   -> Play         *         *\r
222        -> PauseP\r
223        -> PauseI       *         *\r
224        -> FFwd         *         *\r
225        -> Stop         *         *\r
226        -> Jump         *         *\r
227        -> Jump_PI      *         *\r
228 \r
229 Stop   -> Play         *         *\r
230        -> PauseP\r
231        -> PauseI\r
232        -> FFwd\r
233        -> FBwd\r
234        -> Jump\r
235        -> Jump_PI\r
236 \r
237 */\r