2 Copyright 2004-2005 Chris Tallon 2009 Marten Richter
\r
4 This file is part of VOMP.
\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
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
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
22 #ifndef VIDEOVPEOGL_H
\r
23 #define VIDEOVPEOGL_H
\r
30 #include <sys/ioctl.h>
\r
38 #include "defines.h"
\r
41 //#define EGL_EGLEXT_PROTOTYPES
\r
43 #include <GLES2/gl2.h>
\r
44 #include <EGL/egl.h>
\r
45 #include <EGL/eglext.h>
\r
47 #ifdef VPE_OMX_SUPPORT
\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
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
66 #ifdef VPE_FFMPEG_SUPPORT
\r
68 #include <libavcodec/avcodec.h>
\r
69 #include <libavformat/avformat.h>
\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
82 #ifdef VPE_OMX_SUPPORT
\r
84 EGLImageKHR khr_image;
\r
85 OMX_BUFFERHEADERTYPE *omx_buf;
\r
89 class VideoVPEOGL : public Video
\r
93 virtual ~VideoVPEOGL();
\r
95 int init(UCHAR format);
\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
105 int setPosition(int x, int y);
\r
112 int unFastForward();
\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
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
129 virtual bool supportsh264(){return true;};
\r
131 int WriteOutTS(const unsigned char *buffer,int length, int type);
\r
132 void WriteOutPATPMT();
\r
139 int getLastPacketNum() {return lastpacketnum;};
\r
145 int initUsingOSDObjects();
\r
146 int shutdownUsingOSDObjects() {return shutdown();};
\r
149 int EnterIframePlayback();
\r
152 UINT DeliverMediaPacket(MediaPacket packet,
\r
153 const UCHAR* buffer,
\r
155 int decoding_backend; //1 omx, 2 ffmpeg
\r
156 #define VPE_DECODER_OMX 1
\r
157 #define VPE_DECODER_FFMPEG 2
\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
166 UINT DeliverMediaPacketOMX(MediaPacket packet,
\r
167 const UCHAR* buffer,
\r
170 int PrepareInputBufsOMX();
\r
171 int DestroyInputBufsOMX();
\r
173 void AddOmxEvent(VPE_OMX_EVENT new_event);
\r
174 void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* buffer);
\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
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
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
201 int AllocateCodecsOMX();
\r
202 int DeAllocateCodecsOMX();
\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
211 bool omx_first_frame;
\r
213 Mutex omx_event_mutex;
\r
215 list<VPE_OMX_EVENT> omx_events;
\r
225 #ifdef VPE_FFMPEG_SUPPORT
\r
226 AVCodec *mpeg2codec_ff;
\r
227 AVCodecContext *mpeg2codec_context_ff;
\r
228 AVFrame *dec_frame_ff;
\r
232 UINT DeliverMediaPacketFFMPEG(MediaPacket packet,const UCHAR* buffer,UINT *samplepos);
\r
233 int AllocateCodecsFFMPEG();
\r
234 int DeAllocateCodecsFFMPEG();
\r
242 EGLDisplay egl_display;
\r
243 EGLSurface egl_surface;
\r
244 EGLContext egl_context;
\r
249 MediaPacket mediapacket;
\r