2 Copyright 2004-2005 Chris Tallon, 2009 Marten Richter
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "videovpeogl.h"
23 #include "mtdraspberry.h"
25 #include "osdopengl.h"
30 //A lot of parts of this file are heavily inspired by xbmc omx implementations
32 VideoVPEOGL::VideoVPEOGL()
36 #ifdef VPE_OMX_SUPPORT
40 cur_input_buf_omx=NULL;
41 omx_h264=omx_mpeg2=true;
44 #ifdef VPE_FFMPEG_SUPPORT
45 mpeg2codec_context_ff=NULL;
51 VideoVPEOGL::~VideoVPEOGL()
56 int VideoVPEOGL::init(UCHAR tformat)
58 if (initted) return 0;
61 // if ((fdVideo = open("/dev/vdec_dev", O_WRONLY)) < 0) return 0;
63 if (!setFormat(tformat)) { shutdown(); return 0; }
64 if (!setConnection(COMPOSITERGB)) { shutdown(); return 0; }
65 if (!setAspectRatio(ASPECT4X3)) { shutdown(); return 0; }
66 if (!setMode(NORMAL)) { shutdown(); return 0; }
67 if (!setSource()) { shutdown(); return 0; }
68 if (!attachFrameBuffer()) { shutdown(); return 0; }
72 /* if (format == PAL) setLetterboxBorder("38");
73 else setLetterboxBorder("31");*/
84 int VideoVPEOGL::initUsingOSDObjects()
86 EGLDisplay i_egl_display;
87 EGLSurface i_egl_surface;
88 EGLContext i_egl_context;
89 OsdOpenGL *osd=(OsdOpenGL*)osd->getInstance();
90 osd->getEGLObjs(&i_egl_display,&i_egl_surface,&i_egl_context);
92 egl_display=i_egl_display;
93 egl_surface=i_egl_surface;
94 egl_context=i_egl_context;
97 #ifdef VPE_OMX_SUPPORT
98 // we are called before the audio
101 if (error!=OMX_ErrorNone) {
102 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX failed %x", error);
106 //our callbacks move to play?
110 #ifdef VPE_FFMPEG_SUPPORT
113 mpeg2codec_ff=avcodec_find_decoder(CODEC_ID_MPEG2VIDEO);
114 //mpeg2codec_ff=avcodec_find_decoder(CODEC_ID_MPEG2VIDEO_XVMC);
115 if (mpeg2codec_ff==NULL) {
116 Log::getInstance()->log("Video", Log::DEBUG, "Find ffmpeg mpeg2 codec failed");
125 #ifdef VPE_OMX_SUPPORT
127 OMX_ERRORTYPE VideoVPEOGL::EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX_PTR appdata,
128 OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,
129 OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data) {
131 Log::getInstance()->log("Video", Log::NOTICE, "eventHandler %x %x %x %x %x",handle,event_type,data1,data2,event_data);
133 struct VPE_OMX_EVENT new_event;
134 new_event.handle=handle;
135 new_event.appdata=appdata;
136 new_event.event_type=event_type;
137 new_event.data1=data1;
138 new_event.data2=data2;
139 new_event.event_data=event_data;
141 VideoVPEOGL *video=(VideoVPEOGL *)getInstance();
142 video->AddOmxEvent(new_event);
144 /* switch (event_type) {
145 case OMX_EventCmdComplete: {
150 return OMX_ErrorNone;
154 void VideoVPEOGL::AddOmxEvent(VPE_OMX_EVENT new_event)
156 omx_event_mutex.Lock();
157 omx_events.push_back(new_event);
158 omx_event_mutex.Unlock();
162 OMX_ERRORTYPE VideoVPEOGL::EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer){
164 Log::getInstance()->log("Video", Log::NOTICE, "EmptyBufferDone");
165 VideoVPEOGL *video=(VideoVPEOGL *)getInstance();
166 video->ReturnEmptyOMXBuffer(buffer);
167 return OMX_ErrorNone;
171 void VideoVPEOGL::ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* buffer){
172 input_bufs_omx_mutex.Lock();
173 Log::getInstance()->log("Video", Log::NOTICE, "ReturnEmptyOMXBuffer %d",input_bufs_omx_free.size());
174 input_bufs_omx_free.push_back(buffer);
175 Log::getInstance()->log("Video", Log::NOTICE, "ReturnEmptyOMXBuffer %d",input_bufs_omx_free.size());
176 input_bufs_omx_mutex.Unlock();
179 OMX_ERRORTYPE VideoVPEOGL::FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* buffer) {
180 Log::getInstance()->log("Video", Log::NOTICE, "FillBufferDone");
181 return OMX_ErrorNone;
186 int VideoVPEOGL::shutdown()
188 if (!initted) return 0;
192 #ifdef VPE_OMX_SUPPORT
193 DeAllocateCodecsOMX();
196 #ifdef VPE_FFMPEG_SUPPORT
197 DeAllocateCodecsFFMPEG();
199 eglDestroyContext(egl_display,egl_context);
207 int VideoVPEOGL::setTVsize(UCHAR ttvsize)
211 // Override the aspect ratio usage, temporarily use to set the video chip mode
212 if (!setAspectRatio(tvsize)) { shutdown(); return 0; }
214 if ((fdVideo = open("/dev/vdec_dev", O_WRONLY)) < 0) return 0;
215 if (!setSource()) { shutdown(); return 0; }
216 if (!attachFrameBuffer()) { shutdown(); return 0; }
218 // Reopening the fd causes the scart aspect line to go back to 4:3
219 // Set this again to the same as the tv screen size
220 if (!setAspectRatio(tvsize)) { shutdown(); return 0; }
222 // mode == LETTERBOX is invalid if the TV is widescreen
223 if (tvsize == ASPECT16X9) setMode(NORMAL);
228 int VideoVPEOGL::setDefaultAspect()
230 return setAspectRatio(tvsize);
235 int VideoVPEOGL::setFormat(UCHAR tformat)
237 if (!initted) return 0;
238 if ((tformat != PAL) && (tformat != NTSC)) return 0;
241 // if (ioctl(fdVideo, AV_SET_VID_DISP_FMT, format) != 0) return 0;
257 int VideoVPEOGL::setConnection(UCHAR tconnection)
259 if (!initted) return 0;
260 if ((tconnection != COMPOSITERGB) && (tconnection != SVIDEO)) return 0;
261 connection = tconnection;
263 // if (ioctl(fdVideo, AV_SET_VID_OUTPUT, connection) != 0) return 0;
267 int VideoVPEOGL::setAspectRatio(UCHAR taspectRatio)
269 if (!initted) return 0;
270 if ((taspectRatio != ASPECT4X3) && (taspectRatio != ASPECT16X9)) return 0;
271 aspectRatio = taspectRatio;
273 Log::getInstance()->log("Video", Log::DEBUG, "Setting aspect to %i", aspectRatio);
275 // if (ioctl(fdVideo, AV_SET_VID_RATIO, aspectRatio) != 0) return 0;
279 int VideoVPEOGL::setMode(UCHAR tmode)
281 if (!initted) return 0;
283 if ((tmode == LETTERBOX) && (tvsize == ASPECT16X9)) return 0; // invalid mode
285 if ((tmode != NORMAL) && (tmode != LETTERBOX) && (tmode != UNKNOWN2) && (tmode != QUARTER) && (tmode != EIGHTH)
286 && (tmode != ZOOM) && (tmode != UNKNOWN6)) return 0;
289 // if (ioctl(fdVideo, AV_SET_VID_MODE, mode) != 0) return 0;
293 int VideoVPEOGL::signalOff()
295 // if (ioctl(fdVideo, AV_SET_VID_DENC, 0) != 0) return 0;
299 int VideoVPEOGL::signalOn()
301 // if (ioctl(fdVideo, AV_SET_VID_DENC, 1) != 0) return 0;
305 int VideoVPEOGL::setSource()
307 if (!initted) return 0;
309 // What does this do...
310 // if (ioctl(fdVideo, AV_SET_VID_SRC, 1) != 0) return 0;
314 int VideoVPEOGL::setPosition(int x, int y)
316 if (!initted) return 0;
318 // vid_pos_regs_t pos_d;
322 /* vid_pos_regs_t pos_d;
324 memset(&pos_d, 0, sizeof(pos_d));
349 pos_d.y = 100; // Top left X
350 pos_d.x = 50; // Top left Y
358 // if (ioctl(fdVideo, AV_SET_VID_POSITION, &pos_d) != 0) return 0;
362 int VideoVPEOGL::sync()
364 if (!initted) return 0;
366 // if (ioctl(fdVideo, AV_SET_VID_SYNC, 2) != 0) return 0;
373 int VideoVPEOGL::play()
375 if (!initted) return 0;
377 #ifdef VPE_OMX_SUPPORT
380 if (!omx_h264) doomx=false;
382 if (!omx_mpeg2) doomx=false;
385 if (AllocateCodecsOMX()) {
386 decoding_backend=VPE_DECODER_OMX;
388 // Otherwise fall back to ffmpeg
392 Log::getInstance()->log("Video", Log::NOTICE, "Allocate Codecs OMX failed assume h264 unsupported");
395 Log::getInstance()->log("Video", Log::NOTICE, "Allocate Codecs OMX failed assume mpeg2 unsupported");
400 #ifdef VPE_FFMPEG_SUPPORT
401 if (AllocateCodecsFFMPEG()) {
402 decoding_backend=VPE_DECODER_FFMPEG;
404 // Otherwise fall back to ffmpeg
413 #ifdef VPE_OMX_SUPPORT
414 int VideoVPEOGL::AllocateCodecsOMX()
417 static OMX_CALLBACKTYPE callbacks= {&EventHandler_OMX,&EmptyBufferDone_OMX,&FillBufferDone_OMX};
419 Log::getInstance()->log("Video", Log::NOTICE, "Allocate Codecs OMX");
420 //Clock, move later to audio
424 error=OMX_GetHandle(&omx_clock,VPE_OMX_CLOCK,NULL,&callbacks);
427 if (error!=OMX_ErrorNone){
428 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX clock failed %x", error);
429 DeAllocateCodecsOMX();
435 OMX_PORT_PARAM_TYPE p_param;
436 memset(&p_param,0,sizeof(p_param));
437 p_param.nSize=sizeof(p_param);
438 p_param.nVersion.nVersion=OMX_VERSION;
439 error=OMX_GetParameter(omx_clock,OMX_IndexParamOtherInit,&p_param);
440 if (error!=OMX_ErrorNone){
441 Log::getInstance()->log("Video", Log::DEBUG, "Init clock OMX_GetParameter failed %x", error);
442 DeAllocateCodecsOMX();
445 omx_clock_output_port=p_param.nStartPortNumber;
447 for (unsigned int i=0;i<p_param.nPorts;i++) {
448 if (!DisablePort(omx_clock,p_param.nStartPortNumber+i) ) {
449 Log::getInstance()->log("Video", Log::DEBUG, "Disable Ports OMX clock failed %d",i);
450 DeAllocateCodecsOMX();
456 OMX_TIME_CONFIG_CLOCKSTATETYPE clock_conf;
457 memset(&clock_conf,0,sizeof(clock_conf));
458 clock_conf.nSize=sizeof(clock_conf);
459 clock_conf.nVersion.nVersion=OMX_VERSION;
460 clock_conf.eState=OMX_TIME_ClockStateWaitingForStartTime;
461 clock_conf.nStartTime=0;
462 clock_conf.nOffset=0;
463 clock_conf.nWaitMask=OMX_CLOCKPORT0;
464 error=OMX_SetParameter(omx_clock,OMX_IndexConfigTimeClockState,&clock_conf);
465 if (error!=OMX_ErrorNone){
466 Log::getInstance()->log("Video", Log::DEBUG, "Clock IndexConfigTimeClockState failed %x", error);
467 DeAllocateCodecsOMX();
474 error=OMX_GetHandle(&omx_vid_dec,VPE_OMX_H264_DECODER,NULL,&callbacks);
476 error=OMX_GetHandle(&omx_vid_dec,VPE_OMX_MPEG2_DECODER,NULL,&callbacks);
479 if (error!=OMX_ErrorNone){
480 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video decoder failed %x", error);
481 DeAllocateCodecsOMX();
487 memset(&p_param,0,sizeof(p_param));
488 p_param.nSize=sizeof(p_param);
489 p_param.nVersion.nVersion=OMX_VERSION;
490 error=OMX_GetParameter(omx_vid_dec,OMX_IndexParamVideoInit,&p_param);
491 if (error!=OMX_ErrorNone){
492 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX h264 decoder OMX_GetParameter failed %x", error);
493 DeAllocateCodecsOMX();
496 omx_codec_input_port=p_param.nStartPortNumber;
497 omx_codec_output_port=p_param.nStartPortNumber+1;
499 if (!DisablePort(omx_vid_dec,omx_codec_input_port) || !DisablePort(omx_vid_dec,omx_codec_output_port)) {
500 Log::getInstance()->log("Video", Log::DEBUG, "Disable Ports OMX video decoder failed");
501 DeAllocateCodecsOMX();
506 OMX_PARAM_BRCMVIDEODECODEERRORCONCEALMENTTYPE conceal;
507 memset(&conceal,0,sizeof(conceal));
508 conceal.nSize=sizeof(conceal);
509 conceal.nVersion.nVersion=OMX_VERSION;
510 conceal.bStartWithValidFrame=OMX_FALSE;
512 error=OMX_SetParameter(omx_vid_dec,OMX_IndexParamBrcmVideoDecodeErrorConcealment,&conceal);
513 if (error!=OMX_ErrorNone){
514 Log::getInstance()->log("Video", Log::DEBUG, "OMX_IndexParamBrcmVideoDecodeErrorConcealment failed %x", error);
515 DeAllocateCodecsOMX();
520 error=OMX_GetHandle(&omx_vid_sched,VPE_OMX_VIDEO_SCHED,NULL,&callbacks);
521 if (error!=OMX_ErrorNone){
522 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video scheduler failed %x", error);
523 DeAllocateCodecsOMX();
529 error=OMX_GetParameter(omx_vid_sched,OMX_IndexParamVideoInit,&p_param);
530 if (error!=OMX_ErrorNone){
531 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video scheduler OMX_GetParameter failed %x", error);
532 DeAllocateCodecsOMX();
535 omx_shed_input_port=p_param.nStartPortNumber;
536 omx_shed_output_port=p_param.nStartPortNumber+1;
539 error=OMX_GetParameter(omx_vid_sched,OMX_IndexParamOtherInit,&p_param);
540 if (error!=OMX_ErrorNone){
541 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video scheduler OMX_GetParameter failed %x", error);
542 DeAllocateCodecsOMX();
545 omx_shed_clock_port=p_param.nStartPortNumber;
548 if (!DisablePort(omx_vid_sched,omx_shed_input_port) || !DisablePort(omx_vid_sched,omx_shed_output_port)
549 || !DisablePort(omx_vid_sched,omx_shed_clock_port)) {
550 Log::getInstance()->log("Video", Log::DEBUG, "Disable Ports OMX video shed failed");
551 DeAllocateCodecsOMX();
556 error=OMX_GetHandle(&omx_vid_rend,VPE_OMX_VIDEO_REND,NULL,&callbacks);
557 if (error!=OMX_ErrorNone){
558 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video rend failed %x", error);
559 DeAllocateCodecsOMX();
563 error=OMX_GetParameter(omx_vid_rend,OMX_IndexParamVideoInit,&p_param);
564 if (error!=OMX_ErrorNone){
565 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX video rend OMX_GetParameter failed %x", error);
566 DeAllocateCodecsOMX();
569 omx_rend_input_port=p_param.nStartPortNumber;
570 //omx_rend_output_port=p_param.nStartPortNumber+1;
573 if (!DisablePort(omx_vid_rend,omx_rend_input_port) /*|| !DisablePort(omx_vid_rend,omx_rend_output_port)*/
575 Log::getInstance()->log("Video", Log::DEBUG, "Disable Ports OMX video rend failed");
576 DeAllocateCodecsOMX();
589 /* error=OMX_SendCommand(omx_vid_dec,OMX_CommandStateSet,OMX_StateIdle,0);
590 if (error!=OMX_ErrorNone){
591 Log::getInstance()->log("Video", Log::DEBUG, "vid_dec Send Command to OMX State Idle %x", error);
598 OMX_VIDEO_PARAM_PORTFORMATTYPE ft_type;
599 memset(&ft_type,0,sizeof(ft_type));
600 ft_type.nSize=sizeof(ft_type);
601 ft_type.nVersion.nVersion=OMX_VERSION;
603 ft_type.nPortIndex=omx_codec_input_port;
605 ft_type.eCompressionFormat=OMX_VIDEO_CodingAVC;
607 ft_type.eCompressionFormat=OMX_VIDEO_CodingMPEG2;
610 Demuxer* demux=Demuxer::getInstance();
612 ft_type.xFramerate=0;//25*(1<<16);//demux->getFrameRate()*(1<<16);
613 Log::getInstance()->log("Video", Log::DEBUG, "Framerate: %d",demux->getFrameRate());
614 error=OMX_SetParameter(omx_vid_dec,OMX_IndexParamVideoPortFormat,&ft_type);
615 if (error!=OMX_ErrorNone){
616 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX_IndexParamVideoPortFormat failed %x", error);
617 DeAllocateCodecsOMX();
622 if (!ChangeComponentState(omx_vid_dec,OMX_StateIdle)) {
623 Log::getInstance()->log("Video", Log::DEBUG, "vid_dec ChangeComponentState");
624 DeAllocateCodecsOMX();
629 if (!PrepareInputBufsOMX()) {
630 DeAllocateCodecsOMX();
635 if (!ChangeComponentState(omx_clock,OMX_StateIdle)) {
636 Log::getInstance()->log("Video", Log::DEBUG, "omx_clock ChangeComponentState Idle");
637 DeAllocateCodecsOMX();
641 error=OMX_SetupTunnel(omx_clock,omx_clock_output_port,omx_vid_sched,omx_shed_clock_port);
642 if (error!=OMX_ErrorNone){
643 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel clock to sched failed %x %d %d", error,omx_clock_output_port,omx_shed_clock_port);
644 DeAllocateCodecsOMX();
648 if (!EnablePort(omx_clock,omx_clock_output_port,false) || !EnablePort(omx_vid_sched,omx_shed_clock_port,false)
650 Log::getInstance()->log("Video", Log::DEBUG, "Enable Ports OMX clock shed failed");
651 DeAllocateCodecsOMX();
655 if ( !CommandFinished(omx_vid_sched,OMX_CommandPortEnable,omx_shed_clock_port)) {
656 DeAllocateCodecsOMX();
660 error=OMX_SetupTunnel(omx_vid_dec,omx_codec_output_port,omx_vid_sched,omx_shed_input_port);
661 if (error!=OMX_ErrorNone){
662 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel dec to sched failed %x", error);
663 DeAllocateCodecsOMX();
669 if (!EnablePort(omx_vid_dec,omx_codec_output_port,false) || !EnablePort(omx_vid_sched,omx_shed_input_port,false)
671 Log::getInstance()->log("Video", Log::DEBUG, "Enable Ports OMX codec shed failed");
672 DeAllocateCodecsOMX();
676 if ( !CommandFinished(omx_vid_sched,OMX_CommandPortEnable,omx_shed_input_port)) {
679 if (!ChangeComponentState(omx_vid_sched,OMX_StateIdle)) {
680 Log::getInstance()->log("Video", Log::DEBUG, "vid_sched idle ChangeComponentState");
681 DeAllocateCodecsOMX();
684 if (!CommandFinished(omx_clock,OMX_CommandPortEnable,omx_clock_output_port)
685 ||!CommandFinished(omx_vid_dec,OMX_CommandPortEnable,omx_codec_output_port)){
686 DeAllocateCodecsOMX();
690 if (!ChangeComponentState(omx_vid_dec,OMX_StateExecuting)) {
691 Log::getInstance()->log("Video", Log::DEBUG, "omx_vid_dec ChangeComponentState Execute");
692 DeAllocateCodecsOMX();
696 error=OMX_SetupTunnel(omx_vid_sched,omx_shed_output_port,omx_vid_rend,omx_rend_input_port);
697 if (error!=OMX_ErrorNone){
698 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel sched to rend failed %x", error);
699 DeAllocateCodecsOMX();
703 if (!EnablePort(omx_vid_sched,omx_shed_output_port,false) || !EnablePort(omx_vid_rend,omx_rend_input_port,false)
705 Log::getInstance()->log("Video", Log::DEBUG, "Enable Ports OMX shed rend failed");
706 DeAllocateCodecsOMX();
710 if (!CommandFinished(omx_vid_sched,OMX_CommandPortEnable,omx_shed_output_port)
711 || !CommandFinished(omx_vid_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
712 DeAllocateCodecsOMX();
716 if (!ChangeComponentState(omx_vid_rend,OMX_StateIdle)) {
717 Log::getInstance()->log("Video", Log::DEBUG, "vid_rend ChangeComponentState");
718 DeAllocateCodecsOMX();
723 if (!ChangeComponentState(omx_vid_sched,OMX_StateExecuting)) {
724 Log::getInstance()->log("Video", Log::DEBUG, "omx_vid_sched ChangeComponentState Execute");
725 DeAllocateCodecsOMX();
729 if (!ChangeComponentState(omx_vid_rend,OMX_StateExecuting)) {
730 Log::getInstance()->log("Video", Log::DEBUG, "omx_vid_rend ChangeComponentState Execute");
731 DeAllocateCodecsOMX();
736 OMX_CONFIG_DISPLAYREGIONTYPE dispconf;
737 memset(&dispconf,0,sizeof(dispconf));
738 dispconf.nSize=sizeof(dispconf);
739 dispconf.nVersion.nVersion=OMX_VERSION;
741 dispconf.nPortIndex=omx_rend_input_port;
743 dispconf.set=OMX_DISPLAY_SET_LAYER ;
745 error=OMX_SetParameter(omx_vid_rend,OMX_IndexConfigDisplayRegion,&dispconf);
746 if (error!=OMX_ErrorNone){
747 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX_IndexConfigDisplayRegion failed %x", error);
748 DeAllocateCodecsOMX();
752 /* dispconf.set=OMX_DISPLAY_SET_FULLSCREEN ;
753 dispconf.fullscreen=OMX_FALSE;
754 error=OMX_SetParameter(omx_vid_rend,OMX_IndexConfigDisplayRegion,&dispconf);
755 if (error!=OMX_ErrorNone){
756 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX_IndexConfigDisplayRegion failed %x", error);
757 DeAllocateCodecsOMX();
761 dispconf.set=OMX_DISPLAY_SET_DEST_RECT;
762 dispconf.dest_rect.x_offset=100;
763 dispconf.dest_rect.y_offset=100;
764 dispconf.dest_rect.width=640;
765 dispconf.dest_rect.height=480;
766 error=OMX_SetParameter(omx_vid_rend,OMX_IndexConfigDisplayRegion,&dispconf);
767 if (error!=OMX_ErrorNone){
768 Log::getInstance()->log("Video", Log::DEBUG, "Init OMX_IndexConfigDisplayRegion failed %x", error);
769 DeAllocateCodecsOMX();
776 if (!ChangeComponentState(omx_clock,OMX_StateExecuting)) {
777 Log::getInstance()->log("Video", Log::DEBUG, "omx_clock ChangeComponentState Exccute");
778 DeAllocateCodecsOMX();
788 int VideoVPEOGL::ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type)
791 error=OMX_SendCommand(handle,OMX_CommandStateSet,type,0);
792 if (error!=OMX_ErrorNone){
793 Log::getInstance()->log("Video", Log::DEBUG, "handle %x Send Command to OMX State %x %x",handle,type, error);
797 if (!CommandFinished(handle,OMX_CommandStateSet,type)) {
805 int VideoVPEOGL::EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait)
808 error=OMX_SendCommand(handle,OMX_CommandPortEnable,port,0);
809 if (error!=OMX_ErrorNone){
810 Log::getInstance()->log("Video", Log::DEBUG, "handle %x Send Command to enable port %x %x",handle,port, error);
815 if (!CommandFinished(handle,OMX_CommandPortEnable,port)) {
823 int VideoVPEOGL::DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait)
826 error=OMX_SendCommand(handle,OMX_CommandPortDisable,port,0);
827 if (error!=OMX_ErrorNone){
828 Log::getInstance()->log("Video", Log::DEBUG, "handle %x Send Command to disable port %x %x",handle,port, error);
833 if (!CommandFinished(handle,OMX_CommandPortDisable,port)) {
844 int VideoVPEOGL::CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2)
848 omx_event_mutex.Lock();
849 list<VPE_OMX_EVENT>::iterator itty=omx_events.begin();
850 while (itty!=omx_events.end()) {
852 VPE_OMX_EVENT current=*itty;
853 if (current.handle==handle) { //this is ours
854 if (current.event_type==OMX_EventError) {
855 omx_events.erase(itty);
856 omx_event_mutex.Unlock();
859 } else if (current.event_type==OMX_EventCmdComplete && current.data1==command && current.data2==data2) {
860 omx_events.erase(itty);
861 omx_event_mutex.Unlock();
868 omx_event_mutex.Unlock();
873 Log::getInstance()->log("Video", Log::DEBUG, "CommandFinished waited too long %x %x %x",handle,command, data2);
882 int VideoVPEOGL::PrepareInputBufsOMX()
885 OMX_PARAM_PORTDEFINITIONTYPE port_def_type;
886 memset(&port_def_type,0,sizeof(port_def_type));
887 port_def_type.nSize=sizeof(port_def_type);
888 port_def_type.nVersion.nVersion=OMX_VERSION;
889 port_def_type.nPortIndex=omx_codec_input_port;
891 error=OMX_GetParameter(omx_vid_dec,OMX_IndexParamPortDefinition, &port_def_type);
893 if (error!=OMX_ErrorNone){
894 Log::getInstance()->log("Video", Log::DEBUG, "Get OMX OMX_IndexParamPortDefinition failed %x", error);
896 /* Log::getInstance()->log("Video", Log::DEBUG, "Port para %d %d %d %d %d %d %d", port_def_type.nBufferCountActual,
897 port_def_type.nBufferCountMin,port_def_type.nBufferSize,port_def_type.bEnabled,port_def_type.bPopulated,
898 port_def_type.bBuffersContiguous,port_def_type.nBufferAlignment);*/
900 port_def_type.nBufferCountActual=60;
902 error=OMX_SetParameter(omx_vid_dec,OMX_IndexParamPortDefinition, &port_def_type);
904 if (error!=OMX_ErrorNone){
905 Log::getInstance()->log("Video", Log::DEBUG, "Set OMX OMX_IndexParamPortDefinition failed %x", error);
909 error=OMX_SendCommand(omx_vid_dec,OMX_CommandPortEnable,omx_codec_input_port,0);
910 if (error!=OMX_ErrorNone){
911 Log::getInstance()->log("Video", Log::DEBUG, "Prepare Input bufs Send Command to enable port %x", error);
915 input_bufs_omx_mutex.Lock();
916 for (unsigned int i=0; i< port_def_type.nBufferCountActual;i++) {
918 // unsigned char* new_buffer_data=(unsigned char*)malloc(port_def_type.nBufferSize);
919 OMX_BUFFERHEADERTYPE *buf_head=NULL;
920 /* error=OMX_UseBuffer(omx_vid_dec,&buf_head,omx_codec_input_port,NULL,port_def_type.nBufferSize,new_buffer_data);
921 if (error!=OMX_ErrorNone){
922 Log::getInstance()->log("Video", Log::DEBUG, "Use OMX_UseBuffer failed %x", error);
923 input_bufs_omx_mutex.Unlock();
926 error=OMX_AllocateBuffer(omx_vid_dec,&buf_head,omx_codec_input_port,NULL,port_def_type.nBufferSize);
927 if (error!=OMX_ErrorNone){
928 Log::getInstance()->log("Video", Log::DEBUG, "Use OMX_AllocateBuffer failed %x", error);
929 input_bufs_omx_mutex.Unlock();
932 input_bufs_omx_all.push_back(buf_head);
933 input_bufs_omx_free.push_back(buf_head);
935 omx_first_frame=true;
938 cur_input_buf_omx=NULL;
939 input_bufs_omx_mutex.Unlock();
942 Log::getInstance()->log("Video", Log::DEBUG, "PrepareInputBufsOMX mark3");
943 if (!CommandFinished(omx_vid_dec,OMX_CommandPortEnable,omx_codec_input_port)) {
946 Log::getInstance()->log("Video", Log::DEBUG, "PrepareInputBufsOMX mark4");
951 int VideoVPEOGL::DestroyInputBufsOMX()
955 cur_input_buf_omx=NULL;
956 input_bufs_omx_mutex.Lock();
957 for (int i=0; i< input_bufs_omx_all.size();i++) {
958 // free(input_bufs_omx_all[i]->pBuffer);
959 // input_bufs_omx_all[i]->pBuffer=NULL;
960 error=OMX_FreeBuffer(omx_vid_dec,omx_codec_input_port,input_bufs_omx_all[i]);
961 if (error!=OMX_ErrorNone){
962 Log::getInstance()->log("Video", Log::DEBUG, "Use OMX_FreeBuffer failed %x", error);
963 input_bufs_omx_mutex.Unlock();
967 input_bufs_omx_all.clear();
968 input_bufs_omx_free.clear();
969 input_bufs_omx_mutex.Unlock();
976 int VideoVPEOGL::DeAllocateCodecsOMX()
981 // first flush all buffers
983 error=OMX_SendCommand(omx_vid_dec,OMX_CommandFlush, omx_codec_output_port, NULL);
984 if (error!=OMX_ErrorNone){
985 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush codec out failed %x", error);
989 error=OMX_SendCommand(omx_vid_sched,OMX_CommandFlush, omx_shed_input_port, NULL);
990 if (error!=OMX_ErrorNone){
991 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush shed in failed %x", error);
995 if (!CommandFinished(omx_vid_dec,OMX_CommandFlush,omx_codec_output_port) ||
996 !CommandFinished(omx_vid_sched,OMX_CommandFlush,omx_shed_input_port)) {
997 Log::getInstance()->log("Video", Log::DEBUG, "flush cmd codec shed failed");
1000 error=OMX_SendCommand(omx_clock,OMX_CommandFlush, omx_clock_output_port, NULL);
1001 if (error!=OMX_ErrorNone){
1002 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush clock out failed %x", error);
1006 error=OMX_SendCommand(omx_vid_sched,OMX_CommandFlush, omx_shed_clock_port, NULL);
1007 if (error!=OMX_ErrorNone){
1008 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush shed clock failed %x", error);
1012 if (!CommandFinished(omx_clock,OMX_CommandFlush,omx_clock_output_port) ||
1013 !CommandFinished(omx_vid_sched,OMX_CommandFlush,omx_shed_clock_port)) {
1014 Log::getInstance()->log("Video", Log::DEBUG, "flush cmd clock shed failed");
1017 error=OMX_SendCommand(omx_vid_sched,OMX_CommandFlush, omx_shed_output_port, NULL);
1018 if (error!=OMX_ErrorNone) {
1019 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush shed out failed %x", error);
1023 error=OMX_SendCommand(omx_vid_rend,OMX_CommandFlush, omx_rend_input_port, NULL);
1024 if (error!=OMX_ErrorNone) {
1025 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush rend in failed %x", error);
1029 if (!CommandFinished(omx_vid_sched,OMX_CommandFlush,omx_shed_output_port) ||
1030 !CommandFinished(omx_vid_rend,OMX_CommandFlush,omx_rend_input_port)) {
1031 Log::getInstance()->log("Video", Log::DEBUG, "flush cmd shed rend failed");
1037 error=OMX_SendCommand(omx_vid_dec,OMX_CommandFlush, omx_codec_input_port, NULL);
1038 if (error!=OMX_ErrorNone){
1039 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Flush codec out failed %x", error);
1044 if (!CommandFinished(omx_vid_dec,OMX_CommandFlush,omx_codec_input_port)) {
1045 Log::getInstance()->log("Video", Log::DEBUG, "flush cmd codec input failed");
1048 DestroyInputBufsOMX();
1051 if (!DisablePort(omx_vid_rend,omx_rend_input_port,true)) {
1052 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 1");
1054 if (!DisablePort(omx_vid_sched,omx_shed_output_port,true)) {
1055 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 2 ");
1058 error=OMX_SetupTunnel(omx_vid_rend,omx_rend_input_port,NULL,NULL);
1059 if (error!=OMX_ErrorNone){
1060 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1064 error=OMX_SetupTunnel(omx_vid_sched,omx_shed_output_port,NULL,NULL);
1065 if (error!=OMX_ErrorNone){
1066 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1070 if (!DisablePort(omx_vid_sched,omx_shed_input_port,true)) {
1071 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 3");
1074 if (!DisablePort(omx_vid_sched,omx_shed_clock_port,true)) {
1075 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 4");
1078 if (!DisablePort(omx_clock,omx_clock_output_port,true)) {
1079 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 5");
1081 if (!DisablePort(omx_vid_dec,omx_codec_output_port,true)) {
1082 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 6");
1087 if (!DisablePort(omx_vid_dec,omx_codec_input_port,true)) {
1088 Log::getInstance()->log("Video", Log::DEBUG, "Disable Tunnel Port failed 7");
1092 error=OMX_SetupTunnel(omx_vid_sched,omx_shed_input_port,NULL,NULL);
1093 if (error!=OMX_ErrorNone){
1094 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1097 error=OMX_SetupTunnel(omx_vid_sched,omx_shed_clock_port,NULL,NULL);
1098 if (error!=OMX_ErrorNone){
1099 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1103 error=OMX_SetupTunnel(omx_clock,omx_clock_output_port,NULL,NULL);
1104 if (error!=OMX_ErrorNone){
1105 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1109 error=OMX_SetupTunnel(omx_vid_dec,omx_codec_output_port,NULL,NULL);
1110 if (error!=OMX_ErrorNone){
1111 Log::getInstance()->log("Video", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
1119 error=OMX_FreeHandle(omx_vid_dec);
1120 error=OMX_FreeHandle(omx_vid_sched);
1121 error=OMX_FreeHandle(omx_vid_rend);
1122 error=OMX_FreeHandle(omx_clock);
1124 if (error!=OMX_ErrorNone) {
1125 Log::getInstance()->log("Video", Log::DEBUG, "FreeHandle failed %d", error);
1135 #ifdef VPE_FFMPEG_SUPPORT
1137 int VideoVPEOGL::AllocateCodecsFFMPEG()
1139 Log::getInstance()->log("Video", Log::NOTICE, "AllocateCodecsFFmpeg");
1140 mpeg2codec_context_ff=avcodec_alloc_context();
1141 if (mpeg2codec_context_ff==NULL) {
1142 Log::getInstance()->log("Video", Log::DEBUG, "Creating ffmpeg codec context failed");
1145 if(avcodec_open(mpeg2codec_context_ff, mpeg2codec_ff)<0) {
1146 Log::getInstance()->log("Video", Log::DEBUG, "Opening ffmpeg codec failed");
1149 dec_frame_ff=avcodec_alloc_frame(); // may be we need multiple frames, if we want to use async texture upload
1150 if (!dec_frame_ff) {
1151 Log::getInstance()->log("Video", Log::DEBUG, "Allocating dec_frame failed");
1159 int VideoVPEOGL::DeAllocateCodecsFFMPEG()
1161 Log::getInstance()->log("Video", Log::NOTICE, "DeAllocateCodecsFFmpeg");
1163 av_free(dec_frame_ff);
1166 if (mpeg2codec_context_ff) {
1167 avcodec_close(mpeg2codec_context_ff);
1168 av_free(mpeg2codec_context_ff);
1169 mpeg2codec_context_ff=NULL;
1184 int VideoVPEOGL::stop()
1186 if (!initted) return 0;
1188 #ifdef VPE_OMX_SUPPORT
1189 //Check if ffmpeg mode
1190 if (decoding_backend==VPE_DECODER_OMX) DeAllocateCodecsOMX();
1197 // if (ioctl(fdVideo, AV_SET_VID_STOP, 0) != 0) return 0;
1201 int VideoVPEOGL::reset()
1203 if (!initted) return 0;
1205 // if (ioctl(fdVideo, AV_SET_VID_RESET, 0x11) != 0) return 0;
1209 int VideoVPEOGL::pause()
1211 if (!initted) return 0;
1213 // if (ioctl(fdVideo, AV_SET_VID_PAUSE, 0) != 0) return 0;
1217 int VideoVPEOGL::unPause() // FIXME get rid - same as play!!
1219 if (!initted) return 0;
1220 // if (ioctl(fdVideo, AV_SET_VID_PLAY, 0) != 0) return 0;
1224 int VideoVPEOGL::fastForward()
1226 if (!initted) return 0;
1228 // if (ioctl(fdVideo, AV_SET_VID_FFWD, 1) != 0) return 0;
1232 int VideoVPEOGL::unFastForward()
1234 if (!initted) return 0;
1236 // if (ioctl(fdVideo, AV_SET_VID_RESET, 0x11) != 0) return 0; // don't need this.
1238 //// if (ioctl(fdVideo, AV_SET_VID_PLAY, 0) != 0) return 0;
1242 int VideoVPEOGL::attachFrameBuffer()
1244 if (!initted) return 0;
1246 // if (ioctl(fdVideo, AV_SET_VID_FB, 0) != 0) return 0;
1250 int VideoVPEOGL::blank(void)
1252 // if (ioctl(fdVideo, AV_SET_VID_FB, 1) != 0) return 0;
1253 // if (ioctl(fdVideo, AV_SET_VID_FB, 0) != 0) return 0;
1257 ULLONG VideoVPEOGL::getCurrentTimestamp()
1259 /* sync_data_t timestamps;
1260 if (ioctl(fdVideo, AV_GET_VID_TIMESTAMPS, ×tamps) == 0)
1262 // FIXME are these the right way around?
1264 timestamps.stc = (timestamps.stc >> 31 ) | (timestamps.stc & 1);
1265 timestamps.pts = (timestamps.pts >> 31 ) | (timestamps.pts & 1);
1267 return timestamps.stc;
1276 ULONG VideoVPEOGL::timecodeToFrameNumber(ULLONG timecode)
1278 if (format == PAL) return (ULONG)(((double)timecode / (double)90000) * (double)25);
1279 else return (ULONG)(((double)timecode / (double)90000) * (double)30);
1283 int VideoVPEOGL::test()
1288 // return ioctl(fdVideo, AV_SET_VID_STC, &stc);
1295 int VideoVPEOGL::test2()
1301 void VideoVPEOGL::PrepareMediaSample(const MediaPacketList& mplist,UINT samplepos)
1303 mediapacket = mplist.front();
1306 UINT VideoVPEOGL::DeliverMediaSample(UCHAR* buffer, UINT *samplepos)
1308 DeliverMediaPacket(mediapacket, buffer, samplepos);
1309 if (*samplepos == mediapacket.length) {
1316 UINT VideoVPEOGL::DeliverMediaPacket(MediaPacket packet,
1317 const UCHAR* buffer,
1320 if (packet.type == MPTYPE_VIDEO_H264)
1328 switch (decoding_backend) {
1329 default: case 0: return 0; // no backend runnigng
1330 #ifdef VPE_OMX_SUPPORT
1331 case VPE_DECODER_OMX: return DeliverMediaPacketOMX(packet,buffer,samplepos);
1333 #ifdef VPE_FFMPEG_SUPPORT
1334 case VPE_DECODER_FFMPEG: return DeliverMediaPacketFFMPEG(packet,buffer,samplepos);
1339 #ifdef VPE_OMX_SUPPORT
1340 UINT VideoVPEOGL::DeliverMediaPacketOMX(MediaPacket packet,
1341 const UCHAR* buffer,
1346 //Later add fail back code for ffmpeg
1348 *samplepos+=packet.length;
1349 return packet.length;
1353 if (!omx_running) return 0; // if we are not runnig do not do this
1356 OMX_ERRORTYPE error;
1358 OMX_PARAM_PORTDEFINITIONTYPE port_image;
1359 memset(&port_image,0,sizeof(port_image));
1360 port_image.nSize=sizeof(port_image);
1361 port_image.nVersion.nVersion=OMX_VERSION;
1362 port_image.nPortIndex =omx_codec_output_port;
1363 error=OMX_GetParameter(omx_vid_dec,OMX_IndexParamPortDefinition, &port_image);
1364 if (error!= OMX_ErrorNone){
1365 Log::getInstance()->log("Video", Log::DEBUG, "OMX_GetParameter failed %x", error);
1367 Log::getInstance()->log("Video", Log::DEBUG, "Image port %d %d", port_image.format.video.nFrameWidth , port_image.format.video.nFrameHeight);
1369 /*First Check, if we have an audio sample*/
1373 return 0; //Not in iframe mode!
1377 if (packet.disconti) {
1379 if (cur_input_buf_omx) {
1380 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1381 if (error!=OMX_ErrorNone){
1382 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1384 cur_input_buf_omx=NULL;
1388 /*Inspect PES-Header */
1390 OMX_STATETYPE temp_state;
1391 OMX_GetState(omx_vid_dec,&temp_state);
1393 if (*samplepos==0) {//stripheader
1394 headerstrip=buffer[packet.pos_buffer+8]+9/*is this right*/;
1395 //headerstrip+=6; //h264
1396 *samplepos+=headerstrip;
1397 if ( packet.synched ) {
1399 if (cur_input_buf_omx) {
1400 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1401 if (error!=OMX_ErrorNone){
1402 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1405 cur_input_buf_omx=NULL;//write out old data
1407 // reftime1=packet.presentation_time;
1408 // reftime2=reftime1+1;
1411 if (!firstsynched) {//
1412 *samplepos=packet.length;//if we have not processed at least one
1413 return packet.length;//synched packet ignore it!
1418 if (!cur_input_buf_omx) {
1419 input_bufs_omx_mutex.Lock();
1420 if (input_bufs_omx_free.size()==0) {
1421 input_bufs_omx_mutex.Unlock();
1422 Log::getInstance()->log("Video", Log::DEBUG, "Deliver MediaPacket no free sample");
1423 return 0; // we do not have a free media sample
1426 cur_input_buf_omx=input_bufs_omx_free.front();
1427 cur_input_buf_omx->nFilledLen=0;
1428 cur_input_buf_omx->nOffset=0;
1429 cur_input_buf_omx->nTimeStamp=0;
1430 input_bufs_omx_free.pop_front();
1431 input_bufs_omx_mutex.Unlock();
1437 if (cur_input_buf_omx->nFilledLen==0) {//will only be changed on first packet
1438 /*if (packet.disconti) {
1439 ms->SetDiscontinuity(TRUE);
1441 ms->SetDiscontinuity(FALSE);
1443 //if (packet.synched) {
1445 //lastreftimePTS=packet.pts;
1446 if (omx_first_frame) { // TODO time
1447 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_STARTTIME;
1448 omx_first_frame=false;
1454 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
1457 // ms->SetSyncPoint(TRUE);
1461 unsigned int haveToCopy=packet.length-*samplepos;
1463 while (haveToCopy> (cur_input_buf_omx->nAllocLen-cur_input_buf_omx->nFilledLen)) {
1464 unsigned int cancopy=cur_input_buf_omx->nAllocLen-cur_input_buf_omx->nFilledLen;
1465 memcpy(cur_input_buf_omx->pBuffer+cur_input_buf_omx->nFilledLen,buffer+packet.pos_buffer+*samplepos,cancopy);
1466 haveToCopy-=cancopy;
1467 cur_input_buf_omx->nFilledLen+=cancopy;
1468 *samplepos+=cancopy;
1469 // push old buffer out
1471 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1472 if (error!=OMX_ErrorNone){
1473 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1476 input_bufs_omx_mutex.Lock();
1477 if (input_bufs_omx_free.size()==0) {
1478 input_bufs_omx_mutex.Unlock();
1479 //Log::getInstance()->log("Video", Log::DEBUG, "Deliver MediaPacket no free sample");
1480 return *samplepos; // we do not have a free media sample
1482 cur_input_buf_omx=input_bufs_omx_free.front();
1483 cur_input_buf_omx->nFilledLen=0;
1484 cur_input_buf_omx->nOffset=0;
1485 cur_input_buf_omx->nTimeStamp=0;
1486 input_bufs_omx_free.pop_front();
1487 input_bufs_omx_mutex.Unlock();
1489 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
1492 memcpy(cur_input_buf_omx->pBuffer+cur_input_buf_omx->nFilledLen,
1493 buffer+packet.pos_buffer+*samplepos,haveToCopy);
1494 cur_input_buf_omx->nFilledLen+=haveToCopy;
1498 *samplepos+=haveToCopy;
1507 #ifdef VPE_FFMPEG_SUPPORT
1508 UINT VideoVPEOGL::DeliverMediaPacketFFMPEG(MediaPacket packet,
1509 const UCHAR* buffer,
1514 //Later add fail back code for ffmpeg
1516 *samplepos+=packet.length;
1517 return packet.length;
1521 if (!omx_running) return 0; // if we are not runnig do not do this
1524 OMX_ERRORTYPE error;
1526 OMX_PARAM_PORTDEFINITIONTYPE port_image;
1527 memset(&port_image,0,sizeof(port_image));
1528 port_image.nSize=sizeof(port_image);
1529 port_image.nVersion.nVersion=OMX_VERSION;
1530 port_image.nPortIndex =omx_codec_output_port;
1531 error=OMX_GetParameter(omx_vid_dec,OMX_IndexParamPortDefinition, &port_image);
1532 if (error!= OMX_ErrorNone){
1533 Log::getInstance()->log("Video", Log::DEBUG, "OMX_GetParameter failed %x", error);
1535 Log::getInstance()->log("Video", Log::DEBUG, "Image port %d %d", port_image.format.video.nFrameWidth , port_image.format.video.nFrameHeight);
1537 /*First Check, if we have an audio sample*/
1541 return 0; //Not in iframe mode!
1545 if (packet.disconti) {
1547 if (cur_input_buf_omx) {
1548 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1549 if (error!=OMX_ErrorNone){
1550 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1552 cur_input_buf_omx=NULL;
1556 /*Inspect PES-Header */
1558 OMX_STATETYPE temp_state;
1559 OMX_GetState(omx_vid_dec,&temp_state);
1561 if (*samplepos==0) {//stripheader
1562 headerstrip=buffer[packet.pos_buffer+8]+9/*is this right*/;
1563 //headerstrip+=6; //h264
1564 *samplepos+=headerstrip;
1565 if ( packet.synched ) {
1567 if (cur_input_buf_omx) {
1568 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1569 if (error!=OMX_ErrorNone){
1570 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1573 cur_input_buf_omx=NULL;//write out old data
1575 // reftime1=packet.presentation_time;
1576 // reftime2=reftime1+1;
1579 if (!firstsynched) {//
1580 *samplepos=packet.length;//if we have not processed at least one
1581 return packet.length;//synched packet ignore it!
1586 if (!cur_input_buf_omx) {
1587 input_bufs_omx_mutex.Lock();
1588 if (input_bufs_omx_free.size()==0) {
1589 input_bufs_omx_mutex.Unlock();
1590 Log::getInstance()->log("Video", Log::DEBUG, "Deliver MediaPacket no free sample");
1591 return 0; // we do not have a free media sample
1594 cur_input_buf_omx=input_bufs_omx_free.front();
1595 cur_input_buf_omx->nFilledLen=0;
1596 cur_input_buf_omx->nOffset=0;
1597 cur_input_buf_omx->nTimeStamp=0;
1598 input_bufs_omx_free.pop_front();
1599 input_bufs_omx_mutex.Unlock();
1605 if (cur_input_buf_omx->nFilledLen==0) {//will only be changed on first packet
1606 /*if (packet.disconti) {
1607 ms->SetDiscontinuity(TRUE);
1609 ms->SetDiscontinuity(FALSE);
1611 //if (packet.synched) {
1613 //lastreftimePTS=packet.pts;
1614 if (omx_first_frame) { // TODO time
1615 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_STARTTIME;
1616 omx_first_frame=false;
1622 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
1625 // ms->SetSyncPoint(TRUE);
1629 unsigned int haveToCopy=packet.length-*samplepos;
1631 while (haveToCopy> (cur_input_buf_omx->nAllocLen-cur_input_buf_omx->nFilledLen)) {
1632 unsigned int cancopy=cur_input_buf_omx->nAllocLen-cur_input_buf_omx->nFilledLen;
1633 memcpy(cur_input_buf_omx->pBuffer+cur_input_buf_omx->nFilledLen,buffer+packet.pos_buffer+*samplepos,cancopy);
1634 haveToCopy-=cancopy;
1635 cur_input_buf_omx->nFilledLen+=cancopy;
1636 *samplepos+=cancopy;
1637 // push old buffer out
1639 OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
1640 if (error!=OMX_ErrorNone){
1641 Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
1644 input_bufs_omx_mutex.Lock();
1645 if (input_bufs_omx_free.size()==0) {
1646 input_bufs_omx_mutex.Unlock();
1647 //Log::getInstance()->log("Video", Log::DEBUG, "Deliver MediaPacket no free sample");
1648 return *samplepos; // we do not have a free media sample
1650 cur_input_buf_omx=input_bufs_omx_free.front();
1651 cur_input_buf_omx->nFilledLen=0;
1652 cur_input_buf_omx->nOffset=0;
1653 cur_input_buf_omx->nTimeStamp=0;
1654 input_bufs_omx_free.pop_front();
1655 input_bufs_omx_mutex.Unlock();
1657 cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
1660 memcpy(cur_input_buf_omx->pBuffer+cur_input_buf_omx->nFilledLen,
1661 buffer+packet.pos_buffer+*samplepos,haveToCopy);
1662 cur_input_buf_omx->nFilledLen+=haveToCopy;
1666 *samplepos+=haveToCopy;
1681 void VideoVPEOGL::ResetTimeOffsets()
1685 bool VideoVPEOGL::displayIFrame(const UCHAR* buffer, UINT length)
1687 //write(fdVideo, buffer, length);
1688 if (!iframemode) EnterIframePlayback();
1689 // WriteOutTS(buffer,length, h264?MPTYPE_VIDEO_H264 :MPTYPE_VIDEO_MPEG2 );
1695 int VideoVPEOGL::EnterIframePlayback()