]> git.vomp.tv Git - vompclient.git/commitdiff
Hardware accelerated decoding is now working
authorMarten Richter <marten.richter@freenet.de>
Sat, 23 Aug 2014 14:05:40 +0000 (16:05 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 23 Aug 2014 14:05:40 +0000 (16:05 +0200)
imageomx.cc
videoomx.cc
videoomx.h

index cd9bc7bb8347d66858515d67ce616ff4fdbffcf8..e12b86ad9b3fa76f1d409593ff889e5fb0f28f98 100644 (file)
@@ -241,12 +241,12 @@ 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;
-       Log::getInstance()->log("Image", Log::DEBUG,
-                                       "decodePicture 1");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                                     "decodePicture 1");
        EGLPictureCreator * pictcreat =dynamic_cast<EGLPictureCreator*>(Osd::getInstance());
        if (buffer[0]!= 0xff || buffer[1] !=0xd8) return false; // Jpeg magic numbers
-       Log::getInstance()->log("Image", Log::DEBUG,
-                                               "decodePicture 2");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                                             "decodePicture 2");
        VideoOMX *video=(VideoOMX*)Video::getInstance();
 
 
@@ -312,8 +312,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
 
 
        video->LockClock();
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 3");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 3");
 
        video->WaitForEvent(omx_imag_decode,OMX_EventPortSettingsChanged);
 
@@ -324,8 +324,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        port_def_type.nSize=sizeof(port_def_type);
        port_def_type.nVersion.nVersion=OMX_VERSION;
        port_def_type.nPortIndex=omx_image_output_port;
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 3a");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 3a");
 
        error=OMX_GetParameter(omx_imag_decode,OMX_IndexParamPortDefinition, &port_def_type);
        if (error != OMX_ErrorNone) {
@@ -334,8 +334,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
                video->UnlockClock();
                return false;
        }
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 4");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 4");
 
 
 
@@ -370,8 +370,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        }
 
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 5 6");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 5 6");
        error=OMX_GetHandle(&omx_egl_render,VPE_OMX_EGL_REND,NULL,&callbacks);
 
        if (error!=OMX_ErrorNone){
@@ -510,8 +510,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
                return 0;
        }
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 7");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 7");
        video->WaitForEvent(omx_egl_render,OMX_EventPortSettingsChanged);
 
        Log::getInstance()->log("Image", Log::DEBUG,
@@ -538,8 +538,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        }
        buf_head_egl->pAppPrivate=this;
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 8 a");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 8 a");
 
        video->EnablePort(omx_imag_decode,omx_image_output_port,false);
 
@@ -561,12 +561,12 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        }
 
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 9");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 9");
        //video->EnablePort(omx_egl_render,omx_egl_output_port,false);
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture 10");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture 10");
 
        omx_egl_filled = false;
        error = OMX_FillThisBuffer(omx_egl_render, buf_head_egl);
@@ -591,8 +591,8 @@ bool ImageOMX::intDecodePicture(LoadIndex index, unsigned char * buffer, unsigne
        }
        omx_egl_filled = false;
 
-       Log::getInstance()->log("Image", Log::DEBUG,
-                       "decodePicture left");
+//     Log::getInstance()->log("Image", Log::DEBUG,
+//                     "decodePicture left");
 
 
 
@@ -732,13 +732,13 @@ int ImageOMX::DeAllocateCodecsOMX()
        OMX_ERRORTYPE error;
        omx_running=false;
        VideoOMX *video=(VideoOMX*)Video::getInstance();
-        Log::getInstance()->log("Image", Log::DEBUG, "enter deallocatecodecsomx");
+//      Log::getInstance()->log("Image", Log::DEBUG, "enter deallocatecodecsomx");
 
 
 
-   Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 1");
+//   Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 1");
 
-   Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 2");
+//   Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 2");
 
    video->LockClock();
        if (omx_imag_decode/*dec*/) {
@@ -769,7 +769,7 @@ int ImageOMX::DeAllocateCodecsOMX()
 
 
 
-               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 3");
+//             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) {
@@ -783,7 +783,7 @@ int ImageOMX::DeAllocateCodecsOMX()
                                Log::getInstance()->log("Image", Log::DEBUG, "omx_egl_render ChangeComponentState");
                        }
 
-                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 4");
+//                     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) {
@@ -791,7 +791,7 @@ int ImageOMX::DeAllocateCodecsOMX()
 
                        }
 
-                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 5");
+//                     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) {
@@ -799,13 +799,13 @@ int ImageOMX::DeAllocateCodecsOMX()
 
                        }
 
-                       Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6");
+//                     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");
+//                     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) {
@@ -823,26 +823,19 @@ int ImageOMX::DeAllocateCodecsOMX()
                buf_head_egl=NULL;
 
 
-
-
-
-
-
-               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 b");
-
-
+//             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_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");
+//             Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 6 c");
 
 
                DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
 
-               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 7");
+//             Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 7");
 
                //todo flushing
                if (!video->DisablePort(omx_imag_decode,omx_image_output_port,true)) {
@@ -870,7 +863,7 @@ int ImageOMX::DeAllocateCodecsOMX()
                }
 
 
-               Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 8");
+//             Log::getInstance()->log("Image", Log::DEBUG, "deallocatecodecsomx mark 8");
 
 
                //error=OMX_FreeHandle(omx_aud_dec);
@@ -886,6 +879,8 @@ int ImageOMX::DeAllocateCodecsOMX()
                }
                video->UnlockClock();
 
+               video->clearEventsForComponent(omx_imag_decode);
+               video->clearEventsForComponent(omx_egl_render); // removes spurious error messages
                omx_imag_decode/*dec*/=NULL;
                omx_egl_render/*dec*/=NULL;
 
@@ -893,7 +888,7 @@ int ImageOMX::DeAllocateCodecsOMX()
 
                video->UnlockClock();
        }
-         Log::getInstance()->log("Image", Log::DEBUG, "leave deallocate codecs OMX");
+//       Log::getInstance()->log("Image", Log::DEBUG, "leave deallocate codecs OMX");
 
        return 1;
 }
index 81a37d4708c5260899c8b3f8a6952d2205c81986..629860281dabe3aafedaab57be1f50fa84cd070a 100644 (file)
@@ -136,7 +136,7 @@ OMX_ERRORTYPE VideoOMX::EventHandler_OMX(OMX_IN OMX_HANDLETYPE handle,OMX_IN OMX
           OMX_IN OMX_EVENTTYPE event_type,OMX_IN OMX_U32 data1,
           OMX_IN OMX_U32 data2,OMX_IN OMX_PTR event_data) {
 
-       Log::getInstance()->log("Video", Log::NOTICE, "eventHandler %x %x %x %x %x",handle,event_type,data1,data2,event_data);
+       //Log::getInstance()->log("Video", Log::NOTICE, "eventHandler %x %x %x %x %x",handle,event_type,data1,data2,event_data);
 
        struct VPE_OMX_EVENT  new_event;
        new_event.handle=handle;
@@ -1735,6 +1735,23 @@ int VideoOMX::clearEvents()
        return 1;
 }
 
+int VideoOMX::clearEventsForComponent(OMX_HANDLETYPE handle)
+{
+       omx_event_mutex.Lock();
+       list<VPE_OMX_EVENT>::iterator itty=omx_events.begin();
+       while (itty!=omx_events.end()) {
+               VPE_OMX_EVENT current=*itty;
+               if (current.handle==handle) { //this is ours
+                       itty=omx_events.erase(itty);
+                       continue;
+               }
+               itty++;
+
+       }
+       omx_event_mutex.Unlock();
+       return 1;
+}
+
 void VideoOMX::checkForStalledBuffers()
 {
        //Log::getInstance()->log("Video", Log::DEBUG, "Check stalled");
index 5a2c39cce95a21f3c49c592710bee5781e25db2c..8e72a510d2a4a15f636246229992f197537715c6 100644 (file)
@@ -211,6 +211,7 @@ class VideoOMX : public Video
           int EnablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait);
           int DisablePort(OMX_HANDLETYPE handle,OMX_U32 port,bool wait=true);
           int clearEvents();
+          int clearEventsForComponent(OMX_HANDLETYPE handle);
           void checkForStalledBuffers();