]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Preparations for dynamic mode switching
authorMarten Richter <marten.richter@freenet.de>
Sun, 4 Nov 2012 15:11:01 +0000 (16:11 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sun, 4 Nov 2012 15:11:01 +0000 (16:11 +0100)
audioomx.cc
osdopenvg.cc
osdopenvg.h
remotelinux.cc
videoomx.cc
videoomx.h

index de9264e5dfac1ceb80ce428a3ee3edfe5976f1e8..4d3f5b50f486010e3f424fb594e2885c80224ba9 100644 (file)
@@ -546,6 +546,8 @@ int AudioOMX::play() {
        lastAType=MPTYPE_MPEG_AUDIO;
        Log::getInstance()->log("Audio", Log::DEBUG, "enter play");
 
+       ((VideoOMX*)Video::getInstance())->interlaceSwitch4Demux(); // switch resolution if necessary
+
        if (!AllocateCodecsOMX()) {
                return 0;
        }
index 709fa360f2edd1935fe255bfba5003c98c41d827..b78a1b4d28d34d8030e4e4cf9e47e38c13f0b03a 100644 (file)
@@ -57,6 +57,7 @@ OsdOpenVG::OsdOpenVG()
   mode=0;\r
   aspect_correction=1.;\r
 \r
+  freetype_inited=false;\r
   wait_id=1;\r
 \r
 }\r
@@ -69,6 +70,7 @@ OsdOpenVG::~OsdOpenVG()
                shutdown();\r
   }\r
 \r
+  if (freetype_inited) FT_Done_Face(ft_face);\r
 \r
   vgmutex.Unlock();\r
   taskmutex.Unlock();\r
@@ -316,7 +318,8 @@ int OsdOpenVG::shutdown()
   vgmutex.Lock();\r
   //(((VideoOMX*)Video::getInstance())->shutdownUsingOSDObjects());\r
 \r
-  FT_Done_Face(ft_face);\r
+\r
+\r
   vgDestroyFont(vgfont);\r
   vgDestroyFont(vgttfont);\r
   vgDestroyPaint(vgttpaint);\r
@@ -466,24 +469,28 @@ unsigned int OsdOpenVG::loadTTchar(cTeletextChar c)
 \r
 int  OsdOpenVG::loadFont()\r
 {\r
-       int error=FT_Init_FreeType(&ft_library);\r
+       int error;\r
        float font_size=16.f;\r
-       if (error)\r
-       {\r
-               Log::getInstance()->log("OSD", Log::WARN, "Could not load freetype %x",error);\r
-               return 0;\r
-       }\r
+       if (!freetype_inited) {\r
+               error=FT_Init_FreeType(&ft_library);\r
+               if (error)\r
+               {\r
+                       Log::getInstance()->log("OSD", Log::WARN, "Could not load freetype %x",error);\r
+                       return 0;\r
+               }\r
 \r
-       error=FT_New_Memory_Face(ft_library,font_data,font_data_end-font_data,0,&ft_face );\r
-       if (error) {\r
-               Log::getInstance()->log("OSD", Log::WARN, "Could not load font face %x",error);\r
-               return 0;\r
-       }\r
-       error=FT_Set_Char_Size(ft_face,0,font_size*64,0,0 /*dpi*/);\r
-       if (error) {\r
-               FT_Done_Face(ft_face);\r
-               Log::getInstance()->log("OSD", Log::WARN, "Could not set  face size %x",error);\r
-               return 0;\r
+               error=FT_New_Memory_Face(ft_library,font_data,font_data_end-font_data,0,&ft_face );\r
+               if (error) {\r
+                       Log::getInstance()->log("OSD", Log::WARN, "Could not load font face %x",error);\r
+                       return 0;\r
+               }\r
+               error=FT_Set_Char_Size(ft_face,0,font_size*64,0,0 /*dpi*/);\r
+               if (error) {\r
+                       FT_Done_Face(ft_face);\r
+                       Log::getInstance()->log("OSD", Log::WARN, "Could not set  face size %x",error);\r
+                       return 0;\r
+               }\r
+               freetype_inited=true;\r
        }\r
        vgfont=vgCreateFont(0);\r
        FT_ULong cur_char;\r
index 97b19a475fe68c67144c5532b3bce18f5be91450..6882c9ce6c7e1fb202943517a62cfb49da39964c 100644 (file)
@@ -154,6 +154,7 @@ protected:
        EGLConfig egl_ourconfig;\r
        float font_height;\r
        float aspect_correction;\r
+       bool freetype_inited;\r
 \r
 \r
 };\r
index 08fedb9049bb633cf7ea97aef0b32e4a780e85ae..0a93201484878e9f72034dedb78269563eb74577 100644 (file)
@@ -199,10 +199,13 @@ int RemoteLinux::shutdown()
 void RemoteLinux::deinitCec()
 {
        if (cec_adap) {
+               Log::getInstance()->log("Remote", Log::NOTICE, "Shutdown libcec begin");
                cec_adap->SetInactiveView();
                cec_adap->Close();
+               vc_cec_register_callback(NULL, NULL);//deactivate callback!
                UnloadLibCec(cec_adap);
                cec_adap = NULL;
+               Log::getInstance()->log("Remote", Log::NOTICE, "Shutdown libcec end");
        }
 
 }
index b2c9c37b3634d4c3f68173b8fb2bc6e75b25c787..07f983db16afe54ede60b12d1ee3fee17b595ba1 100644 (file)
@@ -61,6 +61,7 @@ VideoOMX::VideoOMX() {
        deinterlace=2; //advanced
 
        signalon=false;
+       outputinterlaced=0;
 
 }
 
@@ -368,8 +369,8 @@ void VideoOMX::selectVideoMode(int interlaced)
        if (all_my_modes<=0 || connection==COMPOSITERGB ) {
                /* analog tv case */
                Log::getInstance()->log("Video", Log::NOTICE, "No CEA and DMT modes found analog tv case?");
-               vc_tv_power_off();
                Remote::getInstance()->shutdown();
+               vc_tv_power_off();
                SDTV_MODE_T setmode=SDTV_MODE_PAL;
                SDTV_OPTIONS_T options;
 
@@ -431,8 +432,8 @@ void VideoOMX::selectVideoMode(int interlaced)
 
                        }
                }
-               vc_tv_power_off();
                Remote::getInstance()->shutdown();
+               vc_tv_power_off();
                if (mymode) {
                        Log::getInstance()->log("Video", Log::NOTICE, "Switch to optimum mode");
                        vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,group,mymode->code);
@@ -445,6 +446,7 @@ void VideoOMX::selectVideoMode(int interlaced)
                                        (EDID_MODE_MATCH_FLAG_T)(HDMI_MODE_MATCH_FRAMERATE|HDMI_MODE_MATCH_RESOLUTION|HDMI_MODE_MATCH_SCANMODE));
                }
                hdmi=true;
+               outputinterlaced=interlaced;
        }
 
        Remote::getInstance()->init("");
@@ -629,6 +631,25 @@ int VideoOMX::sync()
   return 1;
 }
 
+void VideoOMX::interlaceSwitch4Demux() {
+       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());
+                       Osd::getInstance()->shutdown();
+                       selectVideoMode(demux->getInterlaced());
+                       Osd::getInstance()->restore();
+                       Osd::getInstance()->init((void*)"");
+                       BoxStack::getInstance()->redrawAllBoxes();
+                       initted=1;
+
+               }
+
+       }
+}
+
 
 int VideoOMX::play() {
        if (!initted)
@@ -636,6 +657,8 @@ int VideoOMX::play() {
        iframemode = false;
        Log::getInstance()->log("Video", Log::DEBUG, "enter play");
 
+       interlaceSwitch4Demux();
+
        if (AllocateCodecsOMX()) {
                return 1;
                // Otherwise fall back to libav
index dd0ee0e864789c2acf75504ed73f340f0f9052e7..3371aad07e808a499a0862873998a9d0f4d9affe 100644 (file)
@@ -216,6 +216,8 @@ class VideoOMX : public Video
        void clockPause();\r
        void clockUnpause();\r
 \r
+       void interlaceSwitch4Demux();\r
+\r
        Mutex clock_mutex; //clock mutex is now responsible for all omx stuff\r
        long long cur_clock_time;\r
 \r
@@ -275,6 +277,7 @@ class VideoOMX : public Video
           bool signalon;\r
           bool pendingmodechange;\r
           bool hdmi;\r
+          int outputinterlaced;\r
 \r
 \r
 \r