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