]> git.vomp.tv Git - vompclient.git/blob - videoomx.h
Preparations for dynamic mode switching
[vompclient.git] / videoomx.h
1 /*\r
2     Copyright 2004-2005 Chris Tallon 2009,2012 Marten Richter\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 \r
22 #ifndef VIDEOOMX_H\r
23 #define VIDEOOMX_H\r
24 \r
25 #include "mutex.h"\r
26 \r
27 \r
28 #include <stdio.h>\r
29 #include <unistd.h>\r
30 #include <fcntl.h>\r
31 #include <sys/ioctl.h>\r
32 #include <string.h>\r
33 \r
34 #include <stdint.h>\r
35 \r
36 #include <list>\r
37 #include <vector>\r
38 \r
39 #include "defines.h"\r
40 #include "video.h"\r
41 #include "threadsystem.h"\r
42 \r
43 #define OMX_SKIP64BIT\r
44 \r
45 #include <IL/OMX_Core.h>\r
46 #include <IL/OMX_Types.h>\r
47 #include <IL/OMX_Component.h>\r
48 #include <IL/OMX_Broadcom.h>\r
49 \r
50 \r
51 struct VPE_OMX_EVENT {\r
52         OMX_IN OMX_HANDLETYPE handle;\r
53         OMX_IN OMX_PTR appdata;\r
54     OMX_IN OMX_EVENTTYPE event_type;\r
55     OMX_IN OMX_U32 data1;\r
56         OMX_IN OMX_U32 data2;\r
57         OMX_IN OMX_PTR event_data;\r
58 };\r
59 \r
60 \r
61 \r
62 \r
63 class AudioVPE;\r
64 \r
65 class VideoOMX : public Video\r
66 {\r
67   friend class AudioOMX;\r
68   public:\r
69     VideoOMX();\r
70     virtual ~VideoOMX();\r
71 \r
72     int init(UCHAR format);\r
73     int shutdown();\r
74 \r
75     UCHAR getSupportedFormats() { return COMPOSITERGB | HDMI;};\r
76     UINT supportedTVsize() { return ASPECT4X3|ASPECT16X9|ASPECT14X9 ;};\r
77     UCHAR supportedTVFormats() { return NTSC|PAL|PAL_M|NTSC_J;};\r
78 \r
79     int setFormat(UCHAR format);\r
80     int setConnection(UCHAR connection);\r
81     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
82     int setMode(UCHAR mode);\r
83     int setTVsize(UCHAR size);               // Is the TV a widescreen?\r
84 \r
85     void executePendingModeChanges();\r
86     int setDefaultAspect();\r
87     int setSource();\r
88     int setPosition(int x, int y);\r
89     int sync();\r
90     int play();\r
91     int stop();\r
92     int pause();\r
93     int unPause();\r
94     int fastForward();\r
95     int unFastForward();\r
96     int reset();\r
97     int blank();\r
98     int signalOn();\r
99     int signalOff();\r
100     int attachFrameBuffer(); // What does this do?\r
101     ULONG timecodeToFrameNumber(ULLONG timecode);\r
102     ULLONG getCurrentTimestamp();\r
103     bool displayIFrame(const UCHAR* bulibaver, UINT length);\r
104 \r
105     virtual bool dtsTimefix(){return false;} //please we need dts time values\r
106     virtual int getTeletextBufferFaktor(){return 5;};\r
107 \r
108     // Writing Data to Videodevice\r
109     virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos);\r
110     virtual UINT DeliverMediaSample(UCHAR* bulibaver, UINT* samplepos);\r
111 \r
112 \r
113         virtual bool supportsh264(){return true;};\r
114 \r
115         int WriteOutTS(const unsigned char *bulibaver,int length, int type);\r
116         void WriteOutPATPMT();\r
117 \r
118 \r
119 \r
120         virtual long long SetStartOffset(long long curreftime, bool *rsync);\r
121         long long SetStartAudioOffset(long long curreftime, bool *rsync);\r
122         virtual void ResetTimeOffsets();\r
123 \r
124         bool loadOptionsfromServer(VDR* vdr);\r
125         bool saveOptionstoServer();\r
126         bool addOptionsToPanes(int panenumber,Options *options,WOptionPane* pane);\r
127         bool handleOptionChanges(Option* option);\r
128 \r
129 \r
130 #ifdef DEV\r
131     int test();\r
132     int test2();\r
133 #endif\r
134 \r
135 \r
136 \r
137     static inline OMX_TICKS intToOMXTicks(long long pts) {\r
138         OMX_TICKS temp;\r
139         temp.nLowPart=pts;\r
140         temp.nHighPart=pts>>32;\r
141         return temp;\r
142     }\r
143 \r
144 \r
145 \r
146   private:\r
147            int EnterIframePlayback();\r
148            bool iframemode;\r
149            bool InIframemode() {return iframemode;};\r
150 \r
151            UINT DeliverMediaPacket(MediaPacket packet,const UCHAR* bulibaver,UINT *samplepos);\r
152 \r
153 #define VPE_DECODER_OMX 1\r
154 \r
155 \r
156 \r
157            bool offsetnotset;\r
158            bool offsetvideonotset;\r
159            bool offsetaudionotset;\r
160            long long startoffset;\r
161            long long lastrefvideotime;\r
162            long long lastrefaudiotime;\r
163           // long long cur_pts;
164            long long lastreftimeOMX;\r
165            ULLONG lastreftimePTS;\r
166 \r
167         //   long long playbacktimeoffset; //this is the offset between the media time and system clock\r
168         //   long long pausetimecode;\r
169            bool paused;\r
170 \r
171          /*  static long long GetCurrentSystemTime();\r
172            static void WaitUntil(long long time);\r
173            void FrameWaitforDisplay(long long pts);\r
174            bool FrameSkip(long long pts);\r
175            bool skipping;\r
176            void AdjustAudioPTS(long long pts);*/\r
177 \r
178 \r
179 \r
180 \r
181            static OMX_ERRORTYPE EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX_PTR appdata,\r
182            OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,\r
183            OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data);\r
184            static OMX_ERRORTYPE EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);\r
185            static OMX_ERRORTYPE FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);\r
186 \r
187            UINT DeliverMediaPacketOMX(MediaPacket packet,\r
188                                                      const UCHAR* bulibaver,\r
189                                                      UINT *samplepos);\r
190 \r
191            bool detectIFrame(const UCHAR *buffer,unsigned int length);\r
192 \r
193            int PrepareInputBufsOMX();\r
194            int DestroyInputBufsOMX();\r
195 \r
196            void AddOmxEvent(VPE_OMX_EVENT  new_event);\r
197            void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* bulibaver);\r
198 \r
199            int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type);\r
200            int CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2);\r
201            int WaitForEvent(OMX_HANDLETYPE handle,OMX_U32 event);\r
202            int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);\r
203            int DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait=true);\r
204            int clearEvents();\r
205 \r
206 \r
207        int setClockExecutingandRunning();\r
208        int initClock();\r
209        void destroyClock();\r
210        int idleClock();\r
211        int getClockAudioandInit(OMX_HANDLETYPE *p_omx_clock,OMX_U32 *p_omx_clock_output_port);\r
212        int getClockVideoandInit();\r
213        void LockClock() {clock_mutex.Lock();};\r
214        void UnlockClock() {clock_mutex.Unlock();};\r
215        OMX_ERRORTYPE ProtOMXEmptyThisBuffer(OMX_HANDLETYPE handle, OMX_BUFFERHEADERTYPE* buffer);\r
216        void clockPause();\r
217        void clockUnpause();\r
218 \r
219        void interlaceSwitch4Demux();\r
220 \r
221        Mutex clock_mutex; //clock mutex is now responsible for all omx stuff\r
222        long long cur_clock_time;\r
223 \r
224 \r
225 \r
226            OMX_HANDLETYPE omx_vid_dec;\r
227            OMX_HANDLETYPE omx_vid_sched;\r
228            OMX_HANDLETYPE omx_vid_deint;\r
229            OMX_HANDLETYPE omx_vid_rend;\r
230            OMX_HANDLETYPE omx_clock;\r
231            int clock_references;\r
232            bool dodeint; //deinterlacer was activated in omx filtergraph\r
233            bool deint_first_frame; //handle frame change\r
234            void DeinterlaceFix();\r
235 \r
236 \r
237            OMX_U32 omx_codec_input_port;\r
238            OMX_U32 omx_codec_output_port;\r
239            OMX_U32 omx_deint_input_port;\r
240            OMX_U32 omx_deint_output_port;\r
241            OMX_U32 omx_rend_input_port;\r
242            OMX_U32 omx_shed_input_port;\r
243            OMX_U32 omx_shed_output_port;\r
244            OMX_U32 omx_shed_clock_port;\r
245            OMX_U32 omx_clock_output_port;\r
246          //  OMX_NALUFORMATSTYPE omx_nalu_format;\r
247 \r
248 \r
249 \r
250            int AllocateCodecsOMX();\r
251            int DeAllocateCodecsOMX();\r
252            int FlushRenderingPipe();\r
253 \r
254            vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;\r
255            list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
256            Mutex input_bufs_omx_mutex;\r
257            OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
258 \r
259            void PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer);\r
260 \r
261 \r
262 \r
263            bool omx_running;\r
264            bool omx_first_frame;\r
265 \r
266            Mutex omx_event_mutex;\r
267 \r
268            list<VPE_OMX_EVENT> omx_events;\r
269 \r
270            bool omx_mpeg2;\r
271            bool omx_h264;\r
272            float xpos,ypos;\r
273            int deinterlace;\r
274            void updateMode();//called internally to adjust for different parameters\r
275            void selectVideoMode(int interlaced);\r
276            UCHAR tvsystem;\r
277            bool signalon;\r
278            bool pendingmodechange;\r
279            bool hdmi;\r
280            int outputinterlaced;\r
281 \r
282 \r
283 \r
284    bool firstsynched;\r
285 \r
286     \r
287    vector<MediaPacket> mediapackets;\r
288 };\r
289 \r
290 #endif\r