]> git.vomp.tv Git - vompclient.git/commitdiff
Fix shutdown of osdvector and some hdmi related changes#
authorMarten Richter <marten.richter@freenet.de>
Sun, 11 Nov 2012 21:15:05 +0000 (22:15 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sun, 11 Nov 2012 21:15:05 +0000 (22:15 +0100)
osdopenvg.cc
osdopenvg.h
osdvector.cc
videoomx.cc

index 28bc22672bd6cbb5efcae97c860149d157d2bc68..85245dc4f80019c6520e0277acc49c275bf1ba0a 100644 (file)
@@ -302,6 +302,34 @@ int OsdOpenVG::stopUpdate()
        return 1;
 }
 
+void OsdOpenVG::purgeAllReferences()
+{
+       images_ref.clear();
+       styles_ref.clear(); // remove all references
+
+
+       map<void *,ImageIndex>::iterator mitty=monobitmaps.begin();
+       while (mitty!=monobitmaps.end()) {
+               vgDestroyImage((VGImage)(*mitty).second);
+               mitty++;
+       }
+       monobitmaps.clear();
+
+       map<string,ImageIndex>::iterator jitty=jpegs.begin();
+       while (jitty!=jpegs.end()) {
+               vgDestroyImage((VGImage)(*jitty).second);
+               jitty++;
+       }
+       jpegs.clear();
+
+       map<pair<Colour*,unsigned int>,unsigned int>::iterator sitty=styles.begin();
+       while (sitty!=styles.end()) {
+               vgDestroyPaint((VGPaint)(*sitty).second);
+               sitty++;
+       }
+       styles.clear();
+
+}
 
 int OsdOpenVG::shutdown()
 {
@@ -310,27 +338,45 @@ int OsdOpenVG::shutdown()
   initted = 0;
   Log::getInstance()->log("OSD", Log::DEBUG, "shutdown mark1");
   threadStop();
+  Log::getInstance()->log("OSD", Log::DEBUG, "shutdown mark1a");
+  //(((VideoOMX*)Video::getInstance())->shutdownUsingOSDObjects());
+  if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)== EGL_FALSE) {
+         Log::getInstance()->log("OSD", Log::WARN, "Making egl Current failed in shutdown %x",eglGetError());
+  }
+  if (eglBindAPI(EGL_OPENVG_API)==EGL_FALSE) {
+         Log::getInstance()->log("OSD", Log::WARN, "Binding openvg api thread failed! %x",eglGetError());
+  }
+
   Log::getInstance()->log("OSD", Log::DEBUG, "shutdown mark2");
   processTasks();
   Log::getInstance()->log("OSD", Log::DEBUG, "shutdown mark3");
 
   taskmutex.Lock();
   vgmutex.Lock();
-  //(((VideoOMX*)Video::getInstance())->shutdownUsingOSDObjects());
 
 
 
+  //purgeAllReferences();
+
   vgDestroyFont(vgfont);
   vgDestroyFont(vgttfont);
   vgDestroyPaint(vgttpaint);
   destroyPaths();
+  float colclear[]={0.8f,0.8f,0.8f,1.f};
+  vgSetfv(VG_CLEAR_COLOR,4,colclear);
   vgClear(0,0,BACKBUFFER_WIDTH,BACKBUFFER_HEIGHT);
   eglSwapBuffers(egl_display, egl_surface);
   Log::getInstance()->log("OSD", Log::DEBUG, "Making egl current out final");
   eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
-  eglDestroySurface(egl_display,egl_surface);
-  eglDestroyContext(egl_display,egl_context);
-  eglTerminate(egl_display );
+  if (eglDestroySurface(egl_display,egl_surface)==EGL_FALSE) {
+         Log::getInstance()->log("OSD", Log::ERR, "eglDestroySurface failed %x",eglGetError());
+  }
+  if (eglDestroyContext(egl_display,egl_context)==EGL_FALSE) {
+         Log::getInstance()->log("OSD", Log::ERR, "eglDestroyContext failed %x",eglGetError());
+  }
+  if (eglTerminate(egl_display )==EGL_FALSE) {
+         Log::getInstance()->log("OSD", Log::ERR, "eglTerminate failed %x",eglGetError());
+  }
 
   DISPMANX_UPDATE_HANDLE_T  bcm_update;
   bcm_update=vc_dispmanx_update_start(0);
@@ -352,11 +398,15 @@ int OsdOpenVG::shutdown()
 void OsdOpenVG::threadMethod()
 {
        // We have to claim the egl context for this thread
-
+       Log::getInstance()->log("OSD", Log::NOTICE, "Entering drawing thread");
        if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)== EGL_FALSE) {
                Log::getInstance()->log("OSD", Log::WARN, "Making egl Current failed in thread %x",eglGetError());
                return;
        }
+       if (eglBindAPI(EGL_OPENVG_API)==EGL_FALSE) {
+               Log::getInstance()->log("OSD", Log::WARN, "Binding openvg api thread failed! %x",eglGetError());
+               return;
+       }
        int ts=0;
        while (true)
        {
@@ -373,7 +423,12 @@ void OsdOpenVG::threadMethod()
                        }
                        if (processTasks()) ts=0;
                }
-               threadCheckExit();
+               if (!threadIsActive()) {
+                       if (eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT )== EGL_FALSE) {
+                                  Log::getInstance()->log("OSD", Log::WARN, "Making egl Current out thread failed");
+                       }
+                       threadCheckExit();
+               }
                if (ts!=0) {
                        struct timespec target_time;
                        clock_gettime(CLOCK_REALTIME,&target_time);
@@ -388,7 +443,7 @@ void OsdOpenVG::threadMethod()
                }
                //Sleep(1);
        }
-       //eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+       eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
 }
 
 
@@ -396,13 +451,9 @@ void OsdOpenVG::threadPostStopCleanup()
 {
        //Doing nothing
        //goo;
+       Log::getInstance()->log("OSD", Log::NOTICE, "Exiting drawing thread");
 }
 
-
-
-
-
-
 void OsdOpenVG::InternalRendering(){
        vgmutex.Lock();
     float colclear[]={1.f,1.0f,1.f,1.f};
index 9a1e9ac3483d0491fd66842856e7341d9b6d2ec6..44e88fef6ddece9b7d09b02afb6bdf89ac0a9292 100644 (file)
@@ -117,6 +117,7 @@ protected:
     bool haveOpenVGResponse(unsigned int id,unsigned int * resp);
     unsigned int  putOpenVGCommand(OpenVGCommand& comm,bool wait);
     unsigned int handleTask(OpenVGCommand& command);
+    void purgeAllReferences();
     unsigned int wait_id;
 
     FT_Library  ft_library;
index 322ee4bc2f1eedd995b7b2fc16dea8030e5652e5..457cd808d0d238e2543a67832ede0cae5cc61fb8 100644 (file)
@@ -73,7 +73,7 @@ int OsdVector::restore()
                curdraw++;
        }
        //also clear all handles, they are now invalid, no need to release them
-       images_ref.clear();;
+       images_ref.clear();
        monobitmaps.clear();
        jpegs.clear();
        styles.clear();
index 918b71ab91561bf03301cf5d68007f41fe731af6..44f89da2ff2aa17e8b4743efa3ccc8e1f13cf4c9 100644 (file)
@@ -603,8 +603,10 @@ int VideoOMX::signalOff()
 {
        //TODO reinit osd
        Log::getInstance()->log("Video", Log::NOTICE, "signalOff");
-       vc_tv_power_off();
        Osd::getInstance()->stopUpdate(); // turn off drawing thread
+       Remote::getInstance()->shutdown();
+       vc_tv_power_off();
+       Remote::getInstance()->init("");
        signalon=false;
     return 1;
 }
@@ -612,8 +614,8 @@ int VideoOMX::signalOff()
 int VideoOMX::signalOn()
 {
   if (!signalon)  {
-         Log::getInstance()->log("Video", Log::NOTICE, "signalOn");
          Osd::getInstance()->shutdown();
+         Log::getInstance()->log("Video", Log::NOTICE, "signalOn");
          selectVideoMode(0);
          Osd::getInstance()->restore();
          Osd::getInstance()->init((void*)"");
@@ -652,16 +654,21 @@ int VideoOMX::sync()
 }
 
 void VideoOMX::interlaceSwitch4Demux() {
-       return ;
+       return;
        Demuxer *demux=Demuxer::getInstance();
        if ( (outputinterlaced && !demux->getInterlaced())
                        || (!outputinterlaced && demux->getInterlaced())) {
                if (hdmi && (demux->getHorizontalSize()>720 ||  demux->getInterlaced() )) { // only switch if hdmi and HD or interlaced SD material
                        Log::getInstance()->log("Video", Log::NOTICE, "switch interlacing %d",demux->getInterlaced());
+
+                       //OMX_Deinit();
+                       int set_interlaced=0;
+                       if (demux->getHorizontalSize()>720  && demux->getInterlaced()) {
+                               set_interlaced=1;
+                       }
+                       selectVideoMode(set_interlaced);
+                       //OMX_Init();
                        Osd::getInstance()->shutdown();
-                       OMX_Deinit();
-                       selectVideoMode(demux->getInterlaced());
-                       OMX_Init();
                        Osd::getInstance()->restore();
                        Osd::getInstance()->init((void*)"");
                        BoxStack::getInstance()->redrawAllBoxes();