]> git.vomp.tv Git - vompclient.git/blob - videovpeogl.h
Bugfix + Initial fallback to ffmpeg, no decoding yet
[vompclient.git] / videovpeogl.h
1 /*\r
2     Copyright 2004-2005 Chris Tallon 2009 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 VIDEOVPEOGL_H\r
23 #define VIDEOVPEOGL_H\r
24 \r
25 #include "mutex.h"\r
26 \r
27 #include <stdio.h>\r
28 #include <unistd.h>\r
29 #include <fcntl.h>\r
30 #include <sys/ioctl.h>\r
31 #include <string.h>\r
32 \r
33 #include <stdint.h>\r
34 \r
35 #include <list>\r
36 #include <vector>\r
37 \r
38 #include "defines.h"\r
39 #include "video.h"\r
40 \r
41 //#define EGL_EGLEXT_PROTOTYPES\r
42 \r
43 #include <GLES2/gl2.h>\r
44 #include <EGL/egl.h>\r
45 #include <EGL/eglext.h>\r
46 \r
47 #ifdef VPE_OMX_SUPPORT\r
48 \r
49 #include <IL/OMX_Core.h>\r
50 #include <IL/OMX_Types.h>\r
51 #include <IL/OMX_Component.h>\r
52 #include <IL/OMX_Broadcom.h>\r
53 \r
54 \r
55 struct VPE_OMX_EVENT {\r
56         OMX_IN OMX_HANDLETYPE handle;\r
57         OMX_IN OMX_PTR appdata;\r
58     OMX_IN OMX_EVENTTYPE event_type;\r
59     OMX_IN OMX_U32 data1;\r
60         OMX_IN OMX_U32 data2;\r
61         OMX_IN OMX_PTR event_data;\r
62 };\r
63 \r
64 #endif\r
65 \r
66 #ifdef VPE_FFMPEG_SUPPORT\r
67 extern "C" {\r
68 #include <libavcodec/avcodec.h>\r
69 #include <libavformat/avformat.h>\r
70 }\r
71 #endif\r
72 \r
73 \r
74 \r
75 \r
76 \r
77 /*\r
78 struct VPEOGLFrame {\r
79         int type; //1 = RGB, 2 YUV\r
80         GLuint textures[3]; // 0=RGB or Y, 1=U 2=V\r
81 \r
82 #ifdef VPE_OMX_SUPPORT\r
83         //OMX\r
84         EGLImageKHR khr_image;\r
85         OMX_BUFFERHEADERTYPE *omx_buf;\r
86 #endif\r
87 };*/\r
88 \r
89 class VideoVPEOGL : public Video\r
90 {\r
91   public:\r
92     VideoVPEOGL();\r
93     virtual ~VideoVPEOGL();\r
94 \r
95     int init(UCHAR format);\r
96     int shutdown();\r
97 \r
98     int setFormat(UCHAR format);\r
99     int setConnection(UCHAR connection);\r
100     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
101     int setMode(UCHAR mode);\r
102     int setTVsize(UCHAR size);               // Is the TV a widescreen?\r
103     int setDefaultAspect();\r
104     int setSource();\r
105     int setPosition(int x, int y);\r
106     int sync();\r
107     int play();\r
108     int stop();\r
109     int pause();\r
110     int unPause();\r
111     int fastForward();\r
112     int unFastForward();\r
113     int reset();\r
114     int blank();\r
115     int signalOn();\r
116     int signalOff();\r
117     int attachFrameBuffer(); // What does this do?\r
118     ULONG timecodeToFrameNumber(ULLONG timecode);\r
119     ULLONG getCurrentTimestamp();\r
120     bool displayIFrame(const UCHAR* buffer, UINT length);\r
121 \r
122     // Writing Data to Videodevice\r
123     virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos);\r
124     virtual UINT DeliverMediaSample(UCHAR* buffer, UINT* samplepos);\r
125     virtual long long SetStartOffset(long long curreftime, bool *rsync)\r
126     { *rsync=false; return 0; };\r
127     virtual void ResetTimeOffsets();\r
128 \r
129         virtual bool supportsh264(){return true;};\r
130 \r
131         int WriteOutTS(const unsigned char *buffer,int length, int type);\r
132         void WriteOutPATPMT();\r
133 \r
134 \r
135 \r
136 \r
137 \r
138 \r
139         int getLastPacketNum() {return lastpacketnum;}; \r
140 #ifdef DEV\r
141     int test();\r
142     int test2();\r
143 #endif\r
144 \r
145     int initUsingOSDObjects();\r
146     int shutdownUsingOSDObjects() {return shutdown();};\r
147 \r
148   private:\r
149            int EnterIframePlayback();\r
150            bool iframemode;\r
151 \r
152            UINT DeliverMediaPacket(MediaPacket packet,\r
153                                              const UCHAR* buffer,\r
154                                              UINT *samplepos);\r
155            int decoding_backend; //1 omx, 2 ffmpeg\r
156 #define VPE_DECODER_OMX 1\r
157 #define VPE_DECODER_FFMPEG 2\r
158 \r
159 #ifdef VPE_OMX_SUPPORT\r
160            static OMX_ERRORTYPE EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX_PTR appdata,\r
161            OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,\r
162            OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data);\r
163            static OMX_ERRORTYPE EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer);\r
164            static OMX_ERRORTYPE FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer);\r
165 \r
166            UINT DeliverMediaPacketOMX(MediaPacket packet,\r
167                                                      const UCHAR* buffer,\r
168                                                      UINT *samplepos);\r
169 \r
170            int PrepareInputBufsOMX();\r
171            int DestroyInputBufsOMX();\r
172 \r
173            void AddOmxEvent(VPE_OMX_EVENT  new_event);\r
174            void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* buffer);\r
175 \r
176            int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type);\r
177            int CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2);\r
178            int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);\r
179            int DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait=true);\r
180 \r
181 \r
182 \r
183            OMX_HANDLETYPE omx_vid_dec;\r
184            OMX_HANDLETYPE omx_vid_sched;\r
185            OMX_HANDLETYPE omx_vid_rend;\r
186            OMX_HANDLETYPE omx_clock;\r
187 \r
188 \r
189            OMX_U32 omx_codec_input_port;\r
190            OMX_U32 omx_codec_output_port;\r
191            OMX_U32 omx_rend_input_port;\r
192            OMX_U32 omx_rend_output_port;\r
193            OMX_U32 omx_shed_input_port;\r
194            OMX_U32 omx_shed_output_port;\r
195            OMX_U32 omx_shed_clock_port;\r
196            OMX_U32 omx_clock_output_port;\r
197          //  OMX_NALUFORMATSTYPE omx_nalu_format;\r
198 \r
199 \r
200 \r
201            int AllocateCodecsOMX();\r
202            int DeAllocateCodecsOMX();\r
203 \r
204            vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;\r
205            list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
206            Mutex input_bufs_omx_mutex;\r
207            OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
208 \r
209 \r
210            bool omx_running;\r
211            bool omx_first_frame;\r
212 \r
213            Mutex omx_event_mutex;\r
214 \r
215            list<VPE_OMX_EVENT> omx_events;\r
216 \r
217            bool omx_mpeg2;\r
218            bool omx_h264;\r
219 \r
220 \r
221 \r
222 \r
223 #endif\r
224 \r
225 #ifdef VPE_FFMPEG_SUPPORT\r
226         AVCodec *mpeg2codec_ff;\r
227         AVCodecContext *mpeg2codec_context_ff;\r
228         AVFrame *dec_frame_ff;\r
229 \r
230 \r
231 \r
232         UINT DeliverMediaPacketFFMPEG(MediaPacket packet,const UCHAR* buffer,UINT *samplepos);\r
233         int AllocateCodecsFFMPEG();\r
234         int DeAllocateCodecsFFMPEG();\r
235         \r
236 #endif\r
237 \r
238 \r
239    bool firstsynched;\r
240           int lastpacketnum;\r
241 \r
242         EGLDisplay egl_display;\r
243         EGLSurface egl_surface;\r
244         EGLContext egl_context;\r
245 \r
246 \r
247 \r
248     \r
249         MediaPacket mediapacket;\r
250 };\r
251 \r
252 #endif\r