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