]> git.vomp.tv Git - vompclient-marten.git/blob - videovpeogl.h
First steps towards Shader MoComp, not displaying properly yet
[vompclient-marten.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 \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 \r
44 //#define EGL_EGLEXT_PROTOTYPES\r
45 \r
46 #include <GLES2/gl2.h>\r
47 #include <EGL/egl.h>\r
48 #include <EGL/eglext.h>\r
49 \r
50 #ifdef VPE_OMX_SUPPORT\r
51 \r
52 #include <IL/OMX_Core.h>\r
53 #include <IL/OMX_Types.h>\r
54 #include <IL/OMX_Component.h>\r
55 #include <IL/OMX_Broadcom.h>\r
56 \r
57 \r
58 struct VPE_OMX_EVENT {\r
59         OMX_IN OMX_HANDLETYPE handle;\r
60         OMX_IN OMX_PTR appdata;\r
61     OMX_IN OMX_EVENTTYPE event_type;\r
62     OMX_IN OMX_U32 data1;\r
63         OMX_IN OMX_U32 data2;\r
64         OMX_IN OMX_PTR event_data;\r
65 };\r
66 \r
67 #endif\r
68 \r
69 #ifdef VPE_LIBAV_SUPPORT\r
70 \r
71 #include <stdint.h>\r
72 extern "C" {\r
73 \r
74 #include <libavcodec/avcodec.h>\r
75 #include <libavcodec/xvmc.h>\r
76 #include <libavformat/avformat.h>\r
77 #include <libavutil/imgutils.h>\r
78 \r
79 \r
80 }\r
81 #include "glmocoshader.h"\r
82 \r
83 struct VPE_FrameBuf\r
84 { //This is a frame bulibaver, nothing fancy just plain memory\r
85         void *data[4];\r
86         unsigned int size[4];\r
87         unsigned int pict_num;\r
88 };\r
89 \r
90 #endif\r
91 \r
92 \r
93 \r
94 \r
95 \r
96 \r
97 struct VPEOGLFrame {\r
98         int type; //1 = YUV400, 2 YUV444\r
99         GLuint textures[3]; // 0=RGB or Y, 1=U 2=V\r
100         int width, height;\r
101         int stride;\r
102 /*\r
103 #ifdef VPE_OMX_SUPPORT\r
104         //OMX\r
105         EGLImageKHR khr_image;\r
106         OMX_BUFFERHEADERTYPE *omx_buf;\r
107 #endif*/\r
108 };\r
109 \r
110 class VideoVPEOGL : public Video, public Thread_TYPE\r
111 {\r
112   public:\r
113     VideoVPEOGL();\r
114     virtual ~VideoVPEOGL();\r
115 \r
116     int init(UCHAR format);\r
117     int shutdown();\r
118 \r
119     int setFormat(UCHAR format);\r
120     int setConnection(UCHAR connection);\r
121     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
122     int setMode(UCHAR mode);\r
123     int setTVsize(UCHAR size);               // Is the TV a widescreen?\r
124     int setDefaultAspect();\r
125     int setSource();\r
126     int setPosition(int x, int y);\r
127     int sync();\r
128     int play();\r
129     int stop();\r
130     int pause();\r
131     int unPause();\r
132     int fastForward();\r
133     int unFastForward();\r
134     int reset();\r
135     int blank();\r
136     int signalOn();\r
137     int signalOff();\r
138     int attachFrameBuffer(); // What does this do?\r
139     ULONG timecodeToFrameNumber(ULLONG timecode);\r
140     ULLONG getCurrentTimestamp();\r
141     bool displayIFrame(const UCHAR* bulibaver, UINT length);\r
142 \r
143     // Writing Data to Videodevice\r
144     virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos);\r
145     virtual UINT DeliverMediaSample(UCHAR* bulibaver, UINT* samplepos);\r
146     virtual long long SetStartOffset(long long curreftime, bool *rsync)\r
147     { *rsync=false; return 0; };\r
148     virtual void ResetTimeOffsets();\r
149 \r
150         virtual bool supportsh264(){return true;};\r
151 \r
152         int WriteOutTS(const unsigned char *bulibaver,int length, int type);\r
153         void WriteOutPATPMT();\r
154 \r
155 \r
156         VPEOGLFrame *getReadyOGLFrame();\r
157         void returnOGLFrame(VPEOGLFrame *frame);\r
158 \r
159 \r
160 \r
161 \r
162         int getLastPacketNum() {return lastpacketnum;}; \r
163 #ifdef DEV\r
164     int test();\r
165     int test2();\r
166 #endif\r
167 \r
168     int initUsingOSDObjects();\r
169     int shutdownUsingOSDObjects() {return shutdown();};\r
170 \r
171 #ifdef VPE_LIBAV_SUPPORT\r
172     int getlibavDecodingMode() {return decoding_mode;};\r
173 \r
174 \r
175 #endif\r
176 \r
177   private:\r
178            int EnterIframePlayback();\r
179            bool iframemode;\r
180 \r
181            UINT DeliverMediaPacket(MediaPacket packet,\r
182                                              const UCHAR* bulibaver,\r
183                                              UINT *samplepos);\r
184            int decoding_backend; //1 omx, 2 libav\r
185 #define VPE_DECODER_OMX 1\r
186 #define VPE_DECODER_libav 2\r
187 \r
188 #ifdef VPE_OMX_SUPPORT\r
189            static OMX_ERRORTYPE EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX_PTR appdata,\r
190            OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,\r
191            OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data);\r
192            static OMX_ERRORTYPE EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);\r
193            static OMX_ERRORTYPE FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);\r
194 \r
195            UINT DeliverMediaPacketOMX(MediaPacket packet,\r
196                                                      const UCHAR* bulibaver,\r
197                                                      UINT *samplepos);\r
198 \r
199            int PrepareInputBufsOMX();\r
200            int DestroyInputBufsOMX();\r
201 \r
202            void AddOmxEvent(VPE_OMX_EVENT  new_event);\r
203            void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* bulibaver);\r
204 \r
205            int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type);\r
206            int CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2);\r
207            int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);\r
208            int DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait=true);\r
209 \r
210 \r
211 \r
212            OMX_HANDLETYPE omx_vid_dec;\r
213            OMX_HANDLETYPE omx_vid_sched;\r
214            OMX_HANDLETYPE omx_vid_rend;\r
215            OMX_HANDLETYPE omx_clock;\r
216 \r
217 \r
218            OMX_U32 omx_codec_input_port;\r
219            OMX_U32 omx_codec_output_port;\r
220            OMX_U32 omx_rend_input_port;\r
221            OMX_U32 omx_rend_output_port;\r
222            OMX_U32 omx_shed_input_port;\r
223            OMX_U32 omx_shed_output_port;\r
224            OMX_U32 omx_shed_clock_port;\r
225            OMX_U32 omx_clock_output_port;\r
226          //  OMX_NALUFORMATSTYPE omx_nalu_format;\r
227 \r
228 \r
229 \r
230            int AllocateCodecsOMX();\r
231            int DeAllocateCodecsOMX();\r
232 \r
233            vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;\r
234            list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
235            Mutex input_bufs_omx_mutex;\r
236            OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
237 \r
238 \r
239            bool omx_running;\r
240            bool omx_first_frame;\r
241 \r
242            Mutex omx_event_mutex;\r
243 \r
244            list<VPE_OMX_EVENT> omx_events;\r
245 \r
246            bool omx_mpeg2;\r
247            bool omx_h264;\r
248 \r
249 \r
250 \r
251 \r
252 #endif\r
253 \r
254 #ifdef VPE_LIBAV_SUPPORT\r
255 \r
256         const static int VPE_NO_XVMC=0;\r
257         const static int VPE_XVMC_MOCOMP=1;\r
258         const static int VPE_XVMC_IDCT=2;\r
259 \r
260         int decoding_mode;\r
261 \r
262         AVCodec *mpeg2codec_libav;\r
263         AVCodecContext *mpeg2codec_context_libav;\r
264         vector<AVFrame*> dec_frame_libav_all;\r
265         list<AVFrame*> dec_frame_libav_free;\r
266         list<AVFrame*> dec_frame_libav_upload_pending;\r
267         AVFrame* dec_frame_libav_uploading;\r
268         AVFrame* dec_frame_libav_decoding;\r
269 \r
270         vector<VPE_FrameBuf*> all_frame_bufs;\r
271         list<VPE_FrameBuf*> free_frame_bufs;\r
272         list<VPE_FrameBuf*> locked_libav_frame_buf;\r
273         list<VPE_FrameBuf*> locked_uploading_frame_buf;\r
274 \r
275         VPE_FrameBuf *getFrameBuf(unsigned int *size); //for libav\r
276         void releaseFrameBufLibav(VPE_FrameBuf*data);\r
277         void lockFrameBufUpload(VPE_FrameBuf* data);\r
278         void releaseFrameBufUpload(VPE_FrameBuf* data);\r
279 \r
280         unsigned int framebuf_framenum;\r
281 \r
282         Mutex vpe_framebuf_mutex;\r
283 \r
284 \r
285 \r
286         AVPacket incom_packet_libav;\r
287         int incom_packet_libav_size;\r
288         Mutex dec_frame_libav_mutex;\r
289 \r
290 \r
291 \r
292         UINT DeliverMediaPacketlibav(MediaPacket packet,const UCHAR* bulibaver,UINT *samplepos);\r
293         int AllocateCodecsLibav();\r
294         int DeAllocateCodecsLibav();\r
295         int DecodePacketlibav();\r
296 \r
297         static enum PixelFormat get_format_libav(struct AVCodecContext *s, const enum PixelFormat *fmt);\r
298         static int get_buffer_libav(struct AVCodecContext *c, AVFrame *pic);\r
299         static int reget_buffer_libav(struct AVCodecContext *c, AVFrame *pic);\r
300         static void release_buffer_libav(struct AVCodecContext *c, AVFrame *pic);\r
301 \r
302         bool libav_running;\r
303         bool libav_hastime; // signals if a pts is now\r
304         long long libav_time;\r
305 \r
306         int libavwidth,libavheight,libavpixfmt;\r
307         GLMocoShader *moco_shader;\r
308 \r
309         \r
310 #endif\r
311 \r
312         vector<VPEOGLFrame*> all_ogl_frames;\r
313         list<VPEOGLFrame*> free_ogl_frames;\r
314         list<VPEOGLFrame*> ready_ogl_frames;\r
315         bool ogl_frame_outside;\r
316         Mutex ogl_frame_mutex;\r
317 \r
318         int AllocateYUV400OglTexture(VPEOGLFrame* outframe,int width,int height,int stride);\r
319         int AllocateYUV444OglTexture(VPEOGLFrame* outframe,int width,int height);\r
320 \r
321         virtual void threadMethod();\r
322         virtual void threadPostStopCleanup();\r
323 \r
324 \r
325 \r
326    bool firstsynched;\r
327    int lastpacketnum;\r
328 \r
329         EGLDisplay egl_display;\r
330         EGLSurface egl_surface;\r
331         EGLContext egl_context;\r
332 #ifdef BENCHMARK_FPS\r
333         unsigned int time_in_decoder;\r
334         unsigned int num_frames;\r
335 #endif\r
336 \r
337     \r
338         MediaPacket mediapacket;\r
339 };\r
340 \r
341 #endif\r