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