]> git.vomp.tv Git - vompclient.git/blob - videovpeogl.h
Add input buffer for ffmpeg, fix broken decoding
[vompclient.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_FFMPEG_SUPPORT\r
69 \r
70 #include <stdint.h>\r
71 extern "C" {\r
72 \r
73 #include <libavcodec/avcodec.h>\r
74 #include <libavformat/avformat.h>\r
75 }\r
76 #endif\r
77 \r
78 \r
79 \r
80 \r
81 \r
82 \r
83 struct VPEOGLFrame {\r
84         int type; //1 = YUV, 2 RGB\r
85         GLuint textures[3]; // 0=RGB or Y, 1=U 2=V\r
86         int width, height;\r
87         int stride;\r
88 /*\r
89 #ifdef VPE_OMX_SUPPORT\r
90         //OMX\r
91         EGLImageKHR khr_image;\r
92         OMX_BUFFERHEADERTYPE *omx_buf;\r
93 #endif*/\r
94 };\r
95 \r
96 class VideoVPEOGL : public Video, public Thread_TYPE\r
97 {\r
98   public:\r
99     VideoVPEOGL();\r
100     virtual ~VideoVPEOGL();\r
101 \r
102     int init(UCHAR format);\r
103     int shutdown();\r
104 \r
105     int setFormat(UCHAR format);\r
106     int setConnection(UCHAR connection);\r
107     int setAspectRatio(UCHAR aspectRatio);   // This one does the pin 8 scart widescreen switching\r
108     int setMode(UCHAR mode);\r
109     int setTVsize(UCHAR size);               // Is the TV a widescreen?\r
110     int setDefaultAspect();\r
111     int setSource();\r
112     int setPosition(int x, int y);\r
113     int sync();\r
114     int play();\r
115     int stop();\r
116     int pause();\r
117     int unPause();\r
118     int fastForward();\r
119     int unFastForward();\r
120     int reset();\r
121     int blank();\r
122     int signalOn();\r
123     int signalOff();\r
124     int attachFrameBuffer(); // What does this do?\r
125     ULONG timecodeToFrameNumber(ULLONG timecode);\r
126     ULLONG getCurrentTimestamp();\r
127     bool displayIFrame(const UCHAR* buffer, UINT length);\r
128 \r
129     // Writing Data to Videodevice\r
130     virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos);\r
131     virtual UINT DeliverMediaSample(UCHAR* buffer, UINT* samplepos);\r
132     virtual long long SetStartOffset(long long curreftime, bool *rsync)\r
133     { *rsync=false; return 0; };\r
134     virtual void ResetTimeOffsets();\r
135 \r
136         virtual bool supportsh264(){return true;};\r
137 \r
138         int WriteOutTS(const unsigned char *buffer,int length, int type);\r
139         void WriteOutPATPMT();\r
140 \r
141 \r
142         VPEOGLFrame *getReadyOGLFrame();\r
143         void returnOGLFrame(VPEOGLFrame *frame);\r
144 \r
145 \r
146 \r
147 \r
148         int getLastPacketNum() {return lastpacketnum;}; \r
149 #ifdef DEV\r
150     int test();\r
151     int test2();\r
152 #endif\r
153 \r
154     int initUsingOSDObjects();\r
155     int shutdownUsingOSDObjects() {return shutdown();};\r
156 \r
157   private:\r
158            int EnterIframePlayback();\r
159            bool iframemode;\r
160 \r
161            UINT DeliverMediaPacket(MediaPacket packet,\r
162                                              const UCHAR* buffer,\r
163                                              UINT *samplepos);\r
164            int decoding_backend; //1 omx, 2 ffmpeg\r
165 #define VPE_DECODER_OMX 1\r
166 #define VPE_DECODER_FFMPEG 2\r
167 \r
168 #ifdef VPE_OMX_SUPPORT\r
169            static OMX_ERRORTYPE EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX_PTR appdata,\r
170            OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,\r
171            OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data);\r
172            static OMX_ERRORTYPE EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer);\r
173            static OMX_ERRORTYPE FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer);\r
174 \r
175            UINT DeliverMediaPacketOMX(MediaPacket packet,\r
176                                                      const UCHAR* buffer,\r
177                                                      UINT *samplepos);\r
178 \r
179            int PrepareInputBufsOMX();\r
180            int DestroyInputBufsOMX();\r
181 \r
182            void AddOmxEvent(VPE_OMX_EVENT  new_event);\r
183            void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* buffer);\r
184 \r
185            int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type);\r
186            int CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2);\r
187            int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);\r
188            int DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait=true);\r
189 \r
190 \r
191 \r
192            OMX_HANDLETYPE omx_vid_dec;\r
193            OMX_HANDLETYPE omx_vid_sched;\r
194            OMX_HANDLETYPE omx_vid_rend;\r
195            OMX_HANDLETYPE omx_clock;\r
196 \r
197 \r
198            OMX_U32 omx_codec_input_port;\r
199            OMX_U32 omx_codec_output_port;\r
200            OMX_U32 omx_rend_input_port;\r
201            OMX_U32 omx_rend_output_port;\r
202            OMX_U32 omx_shed_input_port;\r
203            OMX_U32 omx_shed_output_port;\r
204            OMX_U32 omx_shed_clock_port;\r
205            OMX_U32 omx_clock_output_port;\r
206          //  OMX_NALUFORMATSTYPE omx_nalu_format;\r
207 \r
208 \r
209 \r
210            int AllocateCodecsOMX();\r
211            int DeAllocateCodecsOMX();\r
212 \r
213            vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;\r
214            list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
215            Mutex input_bufs_omx_mutex;\r
216            OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
217 \r
218 \r
219            bool omx_running;\r
220            bool omx_first_frame;\r
221 \r
222            Mutex omx_event_mutex;\r
223 \r
224            list<VPE_OMX_EVENT> omx_events;\r
225 \r
226            bool omx_mpeg2;\r
227            bool omx_h264;\r
228 \r
229 \r
230 \r
231 \r
232 #endif\r
233 \r
234 #ifdef VPE_FFMPEG_SUPPORT\r
235         AVCodec *mpeg2codec_ff;\r
236         AVCodecContext *mpeg2codec_context_ff;\r
237         vector<AVFrame*> dec_frame_ff_all;\r
238         list<AVFrame*> dec_frame_ff_free;\r
239         list<AVFrame*> dec_frame_ff_upload_pending;\r
240         AVFrame* dec_frame_ff_uploading;\r
241         AVFrame* dec_frame_ff_decoding;\r
242 \r
243         AVPacket incom_packet_ff;\r
244         int incom_packet_ff_size;\r
245         Mutex dec_frame_ff_mutex;\r
246 \r
247 \r
248 \r
249         UINT DeliverMediaPacketFFMPEG(MediaPacket packet,const UCHAR* buffer,UINT *samplepos);\r
250         int AllocateCodecsFFMPEG();\r
251         int DeAllocateCodecsFFMPEG();\r
252         int DecodePacketFFMPEG();\r
253         bool ffmpeg_running;\r
254         bool ffmpeg_hastime; // signals if a pts is now\r
255         long long ffmpeg_time;\r
256 \r
257         int ffwidth,ffheight,ffpixfmt;\r
258 \r
259         \r
260 #endif\r
261 \r
262         vector<VPEOGLFrame*> all_ogl_frames;\r
263         list<VPEOGLFrame*> free_ogl_frames;\r
264         list<VPEOGLFrame*> ready_ogl_frames;\r
265         bool ogl_frame_outside;\r
266         Mutex ogl_frame_mutex;\r
267 \r
268         int AllocateYUVOglTexture(VPEOGLFrame* outframe,int width,int height,int stride);\r
269 \r
270         virtual void threadMethod();\r
271         virtual void threadPostStopCleanup();\r
272 \r
273 \r
274 \r
275    bool firstsynched;\r
276    int lastpacketnum;\r
277 \r
278         EGLDisplay egl_display;\r
279         EGLSurface egl_surface;\r
280         EGLContext egl_context;\r
281 #ifdef BENCHMARK_FPS\r
282         unsigned int time_in_decoder;\r
283         unsigned int num_frames;\r
284 #endif\r
285 \r
286     \r
287         MediaPacket mediapacket;\r
288 };\r
289 \r
290 #endif\r