]> git.vomp.tv Git - vompclient.git/commitdiff
Hardware JPEG rendering is now working but not perfectly
authorMarten Richter <marten.richter@freenet.de>
Wed, 20 Aug 2014 18:16:59 +0000 (20:16 +0200)
committerMarten Richter <marten.richter@freenet.de>
Wed, 20 Aug 2014 18:16:59 +0000 (20:16 +0200)
imageomx.cc
imageomx.h
videoomx.cc
videoomx.h

index d82599d6f511772f9c29410e7b0206b345d9ee1c..cd9bc7bb8347d66858515d67ce616ff4fdbffcf8 100644 (file)
@@ -33,6 +33,10 @@ ImageOMX::ImageOMX(OsdVector::PictureReader * treader):OsdVector::PictureDecoder
 
   omx_running=false;
   pictInfValid=false;
+  omx_imag_decode/*dec*/=NULL;
+  omx_egl_render/*dec*/=NULL;
+
+  buf_head_egl=NULL;
 }
 
 ImageOMX::~ImageOMX()
@@ -139,7 +143,6 @@ int ImageOMX::AllocateCodecsOMX(unsigned char * buffer, unsigned int length)
                Log::getInstance()->log("Image", Log::DEBUG,
                                "Init OMX Image decoder failed %x", error);
                video->UnlockClock();
-               DeAllocateCodecsOMX();
                return 0;
        }
 
@@ -150,84 +153,14 @@ int ImageOMX::AllocateCodecsOMX(unsigned char * buffer, unsigned int length)
                Log::getInstance()->log("Image", Log::DEBUG,
                                "Init OMX Image rend OMX_GetParameter failed %x", error);
                video->UnlockClock();
-               DeAllocateCodecsOMX();
                return 0;
        }
        omx_image_input_port = p_param.nStartPortNumber;
        omx_image_output_port = p_param.nStartPortNumber+1;
 
-       error=OMX_GetHandle(&omx_egl_render,VPE_OMX_EGL_REND,NULL,&callbacks);
-
-       if (error!=OMX_ErrorNone){
-               Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer failed %x", error);
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-       error=OMX_GetParameter(omx_egl_render,OMX_IndexParamVideoInit,&p_param);
-       if (error!=OMX_ErrorNone){
-               Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer OMX_GetParameter failed %x", error);
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-           return 0;
-       }
-       omx_egl_input_port=p_param.nStartPortNumber;
-       omx_egl_output_port=p_param.nStartPortNumber+1;
-
-       if (!video->DisablePort(omx_imag_decode,omx_image_input_port) || !video->DisablePort(omx_imag_decode,omx_image_output_port)) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
-                       video->UnlockClock();
-                       DeAllocateCodecsOMX();
-                       return 0;
-       }
-
-
-       if (!video->DisablePort(omx_egl_render,omx_egl_input_port) || !video->DisablePort(omx_egl_render,omx_egl_output_port)) {
-               Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-       if (!video->ChangeComponentState(omx_imag_decode,OMX_StateIdle)) {
-               Log::getInstance()->log("Image", Log::DEBUG, "image decode idle ChangeComponentState");
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-       if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
-               Log::getInstance()->log("Image", Log::DEBUG, "egl render idle ChangeComponentState");
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-
-
-       //Setuo chain
 
 
 
-
-       error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,omx_egl_render,omx_egl_input_port);
-       if (error!=OMX_ErrorNone){
-               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel decode to egl rend failed %x ");
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-       if (!video->EnablePort(omx_imag_decode,omx_image_output_port,false) || !video->EnablePort(omx_egl_render,omx_egl_input_port,false)
-                                       ) {
-               Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder rend failed");
-               video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }
-
-
        OMX_IMAGE_PARAM_PORTFORMATTYPE ft_type;
        memset(&ft_type,0,sizeof(ft_type));
        ft_type.nSize=sizeof(ft_type);
@@ -241,69 +174,39 @@ int ImageOMX::AllocateCodecsOMX(unsigned char * buffer, unsigned int length)
        if (error!=OMX_ErrorNone){
                Log::getInstance()->log("Image", Log::DEBUG, "Init OMX_IndexParamVImagePortFormat failed %x", error);
                video->UnlockClock();
-               DeAllocateCodecsOMX();
                return 0;
        }
 
-
-       if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortEnable,omx_egl_input_port)) {
+       if (!video->DisablePort(omx_imag_decode,omx_image_input_port) || !video->DisablePort(omx_imag_decode,omx_image_output_port)) {
+               Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
                video->UnlockClock();
-               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
-               DeAllocateCodecsOMX();
                return 0;
        }
 
 
-       if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortEnable,omx_image_output_port)) {
+       if (!video->ChangeComponentState(omx_imag_decode,OMX_StateIdle)) {
+               Log::getInstance()->log("Image", Log::DEBUG, "image decode idle ChangeComponentState");
                video->UnlockClock();
-               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
-               DeAllocateCodecsOMX();
                return 0;
        }
 
 
 
-
-
-
        if (!PrepareInputBufsOMX(true, buffer, length)) {
                video->UnlockClock();
                Log::getInstance()->log("Image", Log::DEBUG, "prepare input bufs failed");
-               DeAllocateCodecsOMX();
                return 0;
        }
 
 
 
-/*     error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,omx_aud_rend,omx_rend_input_port);
-       if (error!=OMX_ErrorNone){
-               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel dec to render failed %x", error);
-                video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }*/
-
 
 
-/*     if (!video->EnablePort(omx_aud_dec,omx_codec_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_input_port,false)
-                                               ) {
-               Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMX codec rend failed");
-                video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }*/
 
-/*     if ( !video->CommandFinished(omx_aud_dec,OMX_CommandPortEnable,omx_codec_output_port)
-                       || !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
-                        video->UnlockClock();
-               DeAllocateCodecsOMX();
-               return 0;
-       }*/
 
        if (!video->ChangeComponentState(omx_imag_decode,OMX_StateExecuting)) {
                Log::getInstance()->log("Image", Log::DEBUG, "omx_image_decode ChangeComponentState Execute");
                video->UnlockClock();
-               DeAllocateCodecsOMX();
                return 0;
        }
 
@@ -314,7 +217,6 @@ int ImageOMX::AllocateCodecsOMX(unsigned char * buffer, unsigned int length)
                                        ) {
                Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder inputfailed");
                video->UnlockClock();
-               DeAllocateCodecsOMX();
                return 0;
        }
 
@@ -332,6 +234,10 @@ int ImageOMX::AllocateCodecsOMX(unsigned char * buffer, unsigned int length)
 }
 
 
+
+
+
+
 bool ImageOMX::decodePicture(LoadIndex index, unsigned char * buffer, unsigned int length)
 {
        if (pictInfValid) return false; // does support only one image at a Time;
@@ -344,7 +250,6 @@ bool ImageOMX::decodePicture(LoadIndex index, unsigned char * buffer, unsigned i
        VideoOMX *video=(VideoOMX*)Video::getInstance();
 
 
-
        if (!pictcreat) return false;
        int oldcancelstate;
        int oldcanceltype;
@@ -369,7 +274,7 @@ bool ImageOMX::decodePicture(LoadIndex index, unsigned char * buffer, unsigned i
 
 bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigned int length, EGLPictureCreator* pictcreat, VideoOMX *video)
 {
-
+       static OMX_CALLBACKTYPE callbacks= {&VideoOMX::EventHandler_OMX,&EmptyBufferDone_OMX,&FillBufferDone_OMX};
 
        // Use Buffer
        OMX_BUFFERHEADERTYPE * bufhead;
@@ -408,7 +313,7 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
 
        video->LockClock();
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 3");
+                       "decodePicture 3");
 
        video->WaitForEvent(omx_imag_decode,OMX_EventPortSettingsChanged);
 
@@ -420,7 +325,7 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        port_def_type.nVersion.nVersion=OMX_VERSION;
        port_def_type.nPortIndex=omx_image_output_port;
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 3a");
+                       "decodePicture 3a");
 
        error=OMX_GetParameter(omx_imag_decode,OMX_IndexParamPortDefinition, &port_def_type);
        if (error != OMX_ErrorNone) {
@@ -430,7 +335,7 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
                return false;
        }
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 4");
+                       "decodePicture 4");
 
 
 
@@ -438,51 +343,87 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
 
 
 
-       video->DisablePort(omx_egl_render,omx_egl_output_port,true);
-       Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 4 a");
 
+/*
        video->DisablePort(omx_imag_decode,omx_image_output_port,false);
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 5");
-       video->DisablePort(omx_egl_render,omx_egl_input_port,false);
-       Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 6");
-
-
-
-
+                       "decodePicture 5");
 
        if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortDisable,omx_image_output_port)) {
                video->UnlockClock();
                Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
                return false;
-       }
+       }*/
+
 
-       if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortDisable,omx_egl_input_port)) {
-               video->UnlockClock();
-               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
-               return false;
-       }
 
        port_def_type.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
        port_def_type.format.image.nSliceHeight = 16;
        port_def_type.format.image.nStride = 0;
        error = OMX_SetParameter(omx_imag_decode, OMX_IndexParamPortDefinition,
-                                       &port_def_type);
+                       &port_def_type);
        if (error != OMX_ErrorNone) {
                Log::getInstance()->log("Image", Log::DEBUG,
-                                       "Set OMX_IndexParamPortDefinition1 failed %x", error);
+                               "Set OMX_IndexParamPortDefinition1 failed %x", error);
                video->UnlockClock();
                return false;
        }
 
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                                       "decodePicture 5 6");
+                       "decodePicture 5 6");
+       error=OMX_GetHandle(&omx_egl_render,VPE_OMX_EGL_REND,NULL,&callbacks);
+
+       if (error!=OMX_ErrorNone){
+               Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer failed %x", error);
+               video->UnlockClock();
+               return false;
+       }
+
+       OMX_PORT_PARAM_TYPE p_param;
+       memset(&p_param,0,sizeof(p_param));
+       p_param.nSize=sizeof(p_param);
+       p_param.nVersion.nVersion=OMX_VERSION;
+
+       error=OMX_GetParameter(omx_egl_render,OMX_IndexParamVideoInit,&p_param);
+       if (error!=OMX_ErrorNone){
+               Log::getInstance()->log("Image", Log::DEBUG, "Init OMX EGL renderer OMX_GetParameter failed %x", error);
+               video->UnlockClock();
+               return false;
+       }
+       omx_egl_input_port=p_param.nStartPortNumber;
+       omx_egl_output_port=p_param.nStartPortNumber+1;
+
+
+
+
+       if (!video->DisablePort(omx_egl_render,omx_egl_input_port) || !video->DisablePort(omx_egl_render,omx_egl_output_port)) {
+               Log::getInstance()->log("Image", Log::DEBUG, "Disable Ports OMX Image decoder failed");
+               video->UnlockClock();
+               return false;
+       }
+
+
+       if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+               Log::getInstance()->log("Image", Log::DEBUG, "egl render idle ChangeComponentState");
+               video->UnlockClock();
+               return false;
+       }
+
+
+
+       //Setuo chain
+
+/*     if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortDisable,omx_egl_input_port)) {
+               video->UnlockClock();
+               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
+               return false;
+       }*/
+
 
 
-/*     port_def_type.nPortIndex=omx_egl_input_port;
+
+       /*      port_def_type.nPortIndex=omx_egl_input_port;
        error = OMX_SetParameter(omx_egl_render, OMX_IndexParamPortDefinition,
                                &port_def_type);
        if (error != OMX_ErrorNone) {
@@ -522,11 +463,11 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
                return false;
        }
        Log::getInstance()->log("Image", Log::DEBUG,
-                                       "getEGLPict %x",pictInf.reference);
+                       "getEGLPict %x",pictInf.reference);
 
        port_def_type.format.video.pNativeWindow = egl_display;
        error = OMX_SetParameter(omx_egl_render, OMX_IndexParamPortDefinition,
-                               &port_def_type);
+                       &port_def_type);
        if (error != OMX_ErrorNone) {
                Log::getInstance()->log("Image", Log::DEBUG,
                                "Set OMX_IndexParamPortDefinition3 failed %x", error);
@@ -539,12 +480,48 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
 
 
 
+
+
+
+
+       error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,omx_egl_render,omx_egl_input_port);
+       if (error!=OMX_ErrorNone){
+               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel decode to egl rend failed %x ");
+               video->UnlockClock();
+               return 0;
+       }
+
+       if (!video->EnablePort(omx_imag_decode,omx_image_output_port,false) || !video->EnablePort(omx_egl_render,omx_egl_input_port,false)
+       ) {
+               Log::getInstance()->log("Image", Log::DEBUG, "Enable Ports OMXdecoder rend failed");
+               video->UnlockClock();
+               return 0;
+       }
+
+       if ( !video->CommandFinished(omx_imag_decode,OMX_CommandPortEnable,omx_image_output_port)) {
+               video->UnlockClock();
+               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end iop");
+               return 0;
+       }
+
+       if ( !video->CommandFinished(omx_egl_render,OMX_CommandPortEnable,omx_egl_input_port)) {
+               video->UnlockClock();
+               Log::getInstance()->log("Image", Log::DEBUG, "commandfinishes end eip");
+               return 0;
+       }
+
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 7");
+                       "decodePicture 7");
        video->WaitForEvent(omx_egl_render,OMX_EventPortSettingsChanged);
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 8");
+                       "decodePicture 8");
+
+
+
+
+
+
 
        error=OMX_SendCommand(omx_egl_render/*dec*/,OMX_CommandPortEnable,omx_egl_output_port/*codec*/,0);
        if (error!=OMX_ErrorNone){
@@ -552,7 +529,7 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
                return 0;
        }
 
-       OMX_BUFFERHEADERTYPE *buf_head_egl=NULL;
+
        error=OMX_UseEGLImage(omx_egl_render/*dec*/,&buf_head_egl,omx_egl_output_port/*codec*/, this, pictInf.reference);
        if (error!=OMX_ErrorNone){
                Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_UseEGLImage failed %x", error);
@@ -562,7 +539,7 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        buf_head_egl->pAppPrivate=this;
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                                       "decodePicture 8 a");
+                       "decodePicture 8 a");
 
        video->EnablePort(omx_imag_decode,omx_image_output_port,false);
 
@@ -575,21 +552,21 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
 
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                                       "decodePicture 8 end");
+                       "decodePicture 8 end");
 
        if (!video->ChangeComponentState(omx_egl_render,OMX_StateExecuting)) {
                Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_rendd ChangeComponentState Execute");
-                video->UnlockClock();
+               video->UnlockClock();
                return false;
        }
 
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 9");
+                       "decodePicture 9");
        //video->EnablePort(omx_egl_render,omx_egl_output_port,false);
 
        Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 10");
+                       "decodePicture 10");
 
        omx_egl_filled = false;
        error = OMX_FillThisBuffer(omx_egl_render, buf_head_egl);
@@ -604,30 +581,21 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        while (!omx_egl_filled) {
 
                count++;
-               if (count>100) {
+               if (count>500) {
                        Log::getInstance()->log("Image", Log::DEBUG, "No one filled my buffer");
-                    return false;
+                       return false;
                }
-               MILLISLEEP(10);
+               MILLISLEEP(1);
 
 
        }
        omx_egl_filled = false;
-       video->LockClock();
-
-       error=OMX_FreeBuffer(omx_egl_render/*dec*/, omx_egl_output_port/*codec*/,buf_head_egl);
-       if (error!=OMX_ErrorNone){
-               Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_FreeBuffer 2 failed %x", error);
-               return false;
-    }
 
+       Log::getInstance()->log("Image", Log::DEBUG,
+                       "decodePicture left");
 
 
-       video->UnlockClock();
-       Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture left");
 
-       DeAllocateCodecsOMX();
        pictInfValid=true;
        return true;
 
@@ -780,18 +748,28 @@ int ImageOMX::DeAllocateCodecsOMX()
                        Log::getInstance()->log("Image", Log::DEBUG, "omx_imag_decode ChangeComponentState");
                }
 
-               if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+               if (omx_egl_render) {
+
+                       if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+                       }
+                       /*if (!video->ChangeComponentState(omx_egl_render,OMX_StateLoaded,false)) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+                       }*/
                }
 
+       /*      if (!video->ChangeComponentState(omx_imag_decode,OMX_StateLoaded,false)) {
+                       Log::getInstance()->log("Image", Log::DEBUG, "omx_imag_decode ChangeComponentState");
+               }*/
+
+
+
         // TODO proper deinit sequence
                // first flush all buffers
 
-               error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_input_port, NULL);
-               if (error!=OMX_ErrorNone) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
 
-               }
+
+               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 3");
 
                error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_output_port, NULL);
                if (error!=OMX_ErrorNone) {
@@ -799,30 +777,68 @@ int ImageOMX::DeAllocateCodecsOMX()
 
                }
 
-               error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_input_port, NULL);
-               if (error!=OMX_ErrorNone) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+               if (omx_egl_render) {
 
-               }
+                       if (!video->ChangeComponentState(omx_egl_render,OMX_StateIdle)) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
+                       }
+
+                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 4");
+
+                       error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_input_port, NULL);
+                       if (error!=OMX_ErrorNone) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+
+                       }
+
+                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 5");
+
+                       error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_output_port, NULL);
+                       if (error!=OMX_ErrorNone) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
+
+                       }
 
-               error=OMX_SendCommand(omx_egl_render,OMX_CommandFlush, omx_egl_output_port, NULL);
+                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6");
+
+                       if (!video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_input_port) ||
+                                       !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_output_port)) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
+                       }
+                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 a");
+               }
+               error=OMX_SendCommand(omx_imag_decode,OMX_CommandFlush, omx_image_input_port, NULL);
                if (error!=OMX_ErrorNone) {
                        Log::getInstance()->log("Image", Log::DEBUG, "OMX_Flush rend in failed %x", error);
 
                }
 
+               if (buf_head_egl) {
+                       error=OMX_FreeBuffer(omx_egl_render/*dec*/, omx_egl_output_port/*codec*/,buf_head_egl);
+                       if (error!=OMX_ErrorNone){
+                               Log::getInstance()->log("Image", Log::DEBUG, "Use OMX_FreeBuffer 2 failed %x", error);
+                       }
+               }
+
+               buf_head_egl=NULL;
+
+
+
+
 
 
 
-               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6");
+               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 b");
+
+
 
                if (!video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_input_port) ||
-                       !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_input_port) ||
-                       !video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_output_port) ||
-                       !video->CommandFinished(omx_egl_render,OMX_CommandFlush,omx_egl_output_port)) {
-                               Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
+                               !video->CommandFinished(omx_imag_decode,OMX_CommandFlush,omx_image_output_port) ) {
+                       Log::getInstance()->log("Image", Log::DEBUG, "flush cmd clock shed failed");
                }
 
+               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 c");
+
 
                DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
 
@@ -833,24 +849,24 @@ int ImageOMX::DeAllocateCodecsOMX()
                        Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 1");
                }
 
+               if (omx_egl_render) {
 
-               if (!video->DisablePort(omx_egl_render,omx_egl_input_port,true)) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 4");
-               }
-
-
+                       if (!video->DisablePort(omx_egl_render,omx_egl_input_port,true)) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "Disable Tunnel Port failed 4");
+                       }
 
 
-               error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,NULL,NULL);
-               if (error!=OMX_ErrorNone) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
+                       error=OMX_SetupTunnel(omx_imag_decode,omx_image_output_port,NULL,NULL);
+                       if (error!=OMX_ErrorNone) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
 
-               }
+                       }
 
-               error=OMX_SetupTunnel(omx_egl_render,omx_egl_input_port,NULL,NULL);
-               if (error!=OMX_ErrorNone) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
+                       error=OMX_SetupTunnel(omx_egl_render,omx_egl_input_port,NULL,NULL);
+                       if (error!=OMX_ErrorNone) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "OMX_Setup tunnel teardown failed %x", error);
 
+                       }
                }
 
 
@@ -862,9 +878,11 @@ int ImageOMX::DeAllocateCodecsOMX()
                if (error!=OMX_ErrorNone) {
                        Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
                }
-               error=OMX_FreeHandle(omx_egl_render);
-               if (error!=OMX_ErrorNone) {
-                       Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
+               if (omx_egl_render) {
+                       error=OMX_FreeHandle(omx_egl_render);
+                       if (error!=OMX_ErrorNone) {
+                               Log::getInstance()->log("Image", Log::DEBUG, "FreeHandle failed %d", error);
+                       }
                }
                video->UnlockClock();
 
index 292ead1569d542164f64bcf098abd4540e0b4583..dbc2af7476e5d2bf07dde2d72a272ce59d473132 100644 (file)
@@ -95,6 +95,8 @@ class ImageOMX : public OsdVector::PictureDecoder
     bool omx_first_frame;
     bool omx_egl_filled;
 
+    OMX_BUFFERHEADERTYPE *buf_head_egl;
+
     int initted;
 
   protected:
index b23b4d1bc01008bf88105ed708496294d45d3ace..81a37d4708c5260899c8b3f8a6952d2205c81986 100644 (file)
@@ -1599,7 +1599,7 @@ int VideoOMX::setClockExecutingandRunning()
 }
 
 
-int VideoOMX::ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type) //needs to be called with locked mutex
+int VideoOMX::ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type,bool wait) //needs to be called with locked mutex
 {
        OMX_ERRORTYPE error;
        error=OMX_SendCommand(handle,OMX_CommandStateSet,type,0);
@@ -1608,8 +1608,10 @@ int VideoOMX::ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type) //n
                return 0;
        }
 
-       if (!CommandFinished(handle,OMX_CommandStateSet,type)) {
-               return 0;
+       if (wait) {
+               if (!CommandFinished(handle,OMX_CommandStateSet,type)) {
+                       return 0;
+               }
        }
 
        return 1;
index 5885e387513c06b36bdfa2c1f98dacfa19be4e96..5a2c39cce95a21f3c49c592710bee5781e25db2c 100644 (file)
@@ -205,7 +205,7 @@ class VideoOMX : public Video
           void AddOmxEvent(VPE_OMX_EVENT  new_event);
           void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* bulibaver);
 
-          int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type);
+          int ChangeComponentState(OMX_HANDLETYPE handle,OMX_STATETYPE type, bool wait=true);
           int CommandFinished(OMX_HANDLETYPE handle,OMX_U32 command,OMX_U32 data2);
           int WaitForEvent(OMX_HANDLETYPE handle,OMX_U32 event,int wait=200);
           int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);