]> git.vomp.tv Git - vompclient.git/commitdiff
Add automatic video mode change at startup, remove background layer, restore console...
authorMarten Richter <marten.richter@freenet.de>
Sat, 13 Oct 2012 09:57:14 +0000 (11:57 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 13 Oct 2012 09:57:14 +0000 (11:57 +0200)
osdopenvg.cc
osdopenvg.h
videoomx.cc
videoomx.h

index 4d8c419484d0c73d02b8fa477b61d2c929c2f985..0f892fa129d6fcd0de6d1f8b34b1551c467751d9 100644 (file)
@@ -153,13 +153,13 @@ int OsdOpenVG::init(void* device)
    Log::getInstance()->log("OSD", Log::NOTICE, "Displaysize is %d x %d ",display_width, display_height);\r
    VC_RECT_T dst_rect ={0,0,display_width,display_height};\r
    VC_RECT_T src_rect={0,0,BACKBUFFER_WIDTH <<16,BACKBUFFER_HEIGHT<<16};\r
-   VC_RECT_T src_rect_bg={0,0,1<<16,1<<16};\r
-   VC_RECT_T src_rect_im={0,0,1,1};\r
+  // VC_RECT_T src_rect_bg={0,0,1<<16,1<<16};\r
//  VC_RECT_T src_rect_im={0,0,1,1};\r
 \r
-   uint32_t back_image_ptr;\r
+  /* uint32_t back_image_ptr;\r
    bcm_backres=vc_dispmanx_resource_create(VC_IMAGE_RGB888,1,1,&back_image_ptr);\r
    unsigned int color=0x00FF0000;\r
-   vc_dispmanx_resource_write_data(bcm_backres,VC_IMAGE_RGB888,4,&color,&src_rect_im);\r
+   vc_dispmanx_resource_write_data(bcm_backres,VC_IMAGE_RGB888,4,&color,&src_rect_im);*/\r
 \r
    DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
    bcm_display=vc_dispmanx_display_open(0);\r
@@ -169,9 +169,9 @@ int OsdOpenVG::init(void* device)
          &src_rect,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);\r
 \r
 \r
-   bcm_background=vc_dispmanx_element_add(bcm_update,bcm_display,\r
/*  bcm_background=vc_dispmanx_element_add(bcm_update,bcm_display,\r
             0,&dst_rect,bcm_backres ,\r
-            &src_rect_bg,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);\r
+            &src_rect_bg,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);*/\r
 \r
    vc_dispmanx_update_submit_sync(bcm_update);\r
 \r
@@ -326,9 +326,9 @@ int OsdOpenVG::shutdown()
   bcm_update=vc_dispmanx_update_start(0);\r
 \r
   vc_dispmanx_element_remove(bcm_update,bcm_element);\r
-  vc_dispmanx_element_remove(bcm_update,bcm_background);\r
+//  vc_dispmanx_element_remove(bcm_update,bcm_background);\r
   vc_dispmanx_update_submit_sync(bcm_update);\r
-  vc_dispmanx_resource_delete(bcm_backres);\r
+//  vc_dispmanx_resource_delete(bcm_backres);\r
   vc_dispmanx_display_close(bcm_display);\r
 \r
 \r
index 29bcfe534f77eb97dcae9457626e993e3ef1ee01..57d7f082fbaa8ff731ee834220470dfd1b73c1c8 100644 (file)
@@ -139,8 +139,8 @@ protected:
        uint32_t display_width;\r
        DISPMANX_DISPLAY_HANDLE_T bcm_display;\r
        DISPMANX_ELEMENT_HANDLE_T bcm_element;\r
-       DISPMANX_ELEMENT_HANDLE_T bcm_background;\r
-       DISPMANX_RESOURCE_HANDLE_T bcm_backres;\r
+//     DISPMANX_ELEMENT_HANDLE_T bcm_background;\r
+//     DISPMANX_RESOURCE_HANDLE_T bcm_backres;\r
 \r
        uint32_t mode;\r
 \r
index 39527ac3c7b69e8c98a76b18c987a5c8abbe501e..b737bf3f9a5db6b93c35444168a5bc5e18f91120 100644 (file)
@@ -26,6 +26,7 @@
 #include "woptionpane.h"
 #include "osdopenvg.h"
 
+#include <linux/fb.h>
 
 // temp
 #include "log.h"
@@ -75,6 +76,7 @@ int VideoOMX::init(UCHAR tformat)
   if (!attachFrameBuffer())          { shutdown(); return 0; }
 
   setTVsize(ASPECT4X3);
+  selectVideoMode(0);
 
 
 
@@ -165,10 +167,33 @@ int VideoOMX::shutdown()
 {
   if (!initted) return 0;
   initted = 0;
+  Log::getInstance()->log("Video", Log::NOTICE, "Shutdown video module");
 
   DeAllocateCodecsOMX();
   OMX_Deinit();
-  vc_tv_show_info(0); // back to console
+  //vc_tv_show_info(0); // back to console
+  // Restore console
+  int fd_fbset=0;
+  struct fb_var_screeninfo screeninfo;
+  fd_fbset=open("/dev/fb0",O_RDONLY);
+  if (fd_fbset<0) {
+         Log::getInstance()->log("Video", Log::CRIT, "Could not open frame buffer device %d", fd_fbset);
+         return 0;
+  }
+  if (ioctl(fd_fbset, FBIOGET_VSCREENINFO, &screeninfo)){
+         close(fd_fbset);
+         Log::getInstance()->log("Video", Log::CRIT, "Could not FBIOGET_VSCREENINFO frame buffer device");
+         return 0;
+  }
+  screeninfo.bits_per_pixel=8;
+  if (ioctl(fd_fbset, FBIOPUT_VSCREENINFO, &screeninfo)){
+         Log::getInstance()->log("Video", Log::CRIT, "Could not FBIOPUT_VSCREENINFO frame buffer device");
+  }
+  screeninfo.bits_per_pixel=16;
+  if (ioctl(fd_fbset, FBIOPUT_VSCREENINFO, &screeninfo)){
+         Log::getInstance()->log("Video", Log::CRIT, "Could not FBIOPUT_VSCREENINFO frame buffer device");
+  }
+  close(fd_fbset);
   return 1;
 }
 
@@ -313,74 +338,75 @@ int VideoOMX::setFormat(UCHAR tformat)
   return 1;
 }
 
-//void VideoOMX::selectVideoMode(int interlaced)
-//{
-//     if (/*hdmi*/ true) {
-//             TV_SUPPORTED_MODE_T all_supp_modes[TV_MAX_SUPPORTED_MODES];
-//             HDMI_RES_GROUP_T pref_group;
-//             TV_SUPPORTED_MODE_T  *mymode=NULL;
-//             TV_SUPPORTED_MODE_T  *mymode_second_best=NULL;
-//             bool got_optimum=false;
-//             uint32_t pref_mode;
-//             int all_my_modes=vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_CEA,
-//                             all_supp_modes,TV_MAX_SUPPORTED_MODES,
-//                             &pref_group,&pref_mode);
-//             int target_fps=50;
-//             if (format==PAL)target_fps=50;
-//             else if (format==NTSC) target_fps=60;
-//             if (all_my_modes<=0) {
-//                      Log::getInstance()->log("Video", Log::NOTICE, "No CEA modes found abort");
-//                     return;
-//             }
-//
-//             //Now first determine native resolution
-//             int native_width=1920;
-//             int native_height=1080;
-//             for (int i=0;i<all_my_modes;i++) {
-//                     if (all_supp_modes[i].native) {
-//                             mymode=all_supp_modes+i;
-//                             Log::getInstance()->log("Video", Log::NOTICE, "Found native mode %dx%d %d Hz i: %d",
-//                                             mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
-//                     }
-//
-//             }
-//             //Now find the mode which matches best
-//             for (int i=0;i<all_my_modes;i++) {
-//                     TV_SUPPORTED_MODE_T  *curmode=all_supp_modes+i;
-//                     if (curmode->width==native_width &&
-//                             curmode->height==native_height &&
-//                              curmode->frame_rate==target_fps) {
-//                               if(curmode->scan_mode==interlaced) {
-//                                       got_optimum=true;
-//                                       mymode=curmode;
-//                                       Log::getInstance()->log("Video", Log::NOTICE, "Found optimum mode %dx%d %d Hz i: %d",
-//                                                                                     mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
-//                               } else {
-//                                       mymode_second_best=curmode;
-//                                       Log::getInstance()->log("Video", Log::NOTICE, "Found close to optimum mode %dx%d %d Hz i: %d",
-//                                                                                             mymode_second_best->width,mymode_second_best->height,
-//                                                                                             mymode_second_best->frame_rate,mymode_second_best->scan_mode);
-//                             }
-//
-//                     }
-//             }
-//             if (mymode) {
-//                     Log::getInstance()->log("Video", Log::NOTICE, "Switch to optimum mode");
-//                     vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,HDMI_RES_GROUP_CEA,mymode->code);
-//             } else if (mymode_second_best) {
-//                     Log::getInstance()->log("Video", Log::NOTICE, "Switch to close to optimum mode");
-//                     vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,HDMI_RES_GROUP_CEA,mymode_second_best->code);
-//             } else {
-//                     Log::getInstance()->log("Video", Log::NOTICE, "Switch to prefered mode");
-//                     vc_tv_hdmi_power_on_best(1920,1080,target_fps,interlaced?HDMI_INTERLACED:HDMI_NONINTERLACED,
-//                                     (EDID_MODE_MATCH_FLAG_T)(HDMI_MODE_MATCH_FRAMERATE|HDMI_MODE_MATCH_RESOLUTION|HDMI_MODE_MATCH_SCANMODE));
-//             }
-//
-//     }
-//
-//
-//
-//}
+void VideoOMX::selectVideoMode(int interlaced)
+{
+       if (/*hdmi*/ true) {
+               TV_SUPPORTED_MODE_T all_supp_modes[TV_MAX_SUPPORTED_MODES];
+               HDMI_RES_GROUP_T pref_group;
+               TV_SUPPORTED_MODE_T  *mymode=NULL;
+               TV_SUPPORTED_MODE_T  *mymode_second_best=NULL;
+               bool got_optimum=false;
+               uint32_t pref_mode;
+               int all_my_modes=vc_tv_hdmi_get_supported_modes(HDMI_RES_GROUP_CEA,
+                               all_supp_modes,TV_MAX_SUPPORTED_MODES,
+                               &pref_group,&pref_mode);
+               int target_fps=50;
+               if (format==PAL)target_fps=50;
+               else if (format==NTSC) target_fps=60;
+               if (all_my_modes<=0) {
+                        Log::getInstance()->log("Video", Log::NOTICE, "No CEA modes found abort");
+                       return;
+               }
+
+               //Now first determine native resolution
+               int native_width=1920;
+               int native_height=1080;
+               for (int i=0;i<all_my_modes;i++) {
+                       if (all_supp_modes[i].native) {
+                               mymode=all_supp_modes+i;
+                               Log::getInstance()->log("Video", Log::NOTICE, "Found native mode %dx%d %d Hz i: %d",
+                                               mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
+                       }
+
+               }
+               //Now find the mode which matches best
+               for (int i=0;i<all_my_modes;i++) {
+                       TV_SUPPORTED_MODE_T  *curmode=all_supp_modes+i;
+                       if (curmode->width==native_width &&
+                               curmode->height==native_height &&
+                                curmode->frame_rate==target_fps) {
+                                 if(curmode->scan_mode==interlaced) {
+                                         got_optimum=true;
+                                         mymode=curmode;
+                                         Log::getInstance()->log("Video", Log::NOTICE, "Found optimum mode %dx%d %d Hz i: %d",
+                                                                                       mymode->width,mymode->height,mymode->frame_rate,mymode->scan_mode);
+                                 } else {
+                                         mymode_second_best=curmode;
+                                         Log::getInstance()->log("Video", Log::NOTICE, "Found close to optimum mode %dx%d %d Hz i: %d",
+                                                                                               mymode_second_best->width,mymode_second_best->height,
+                                                                                               mymode_second_best->frame_rate,mymode_second_best->scan_mode);
+                               }
+
+                       }
+               }
+               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,HDMI_RES_GROUP_CEA,mymode->code);
+               } else if (mymode_second_best) {
+                       Log::getInstance()->log("Video", Log::NOTICE, "Switch to close to optimum mode");
+                       vc_tv_hdmi_power_on_explicit(HDMI_MODE_HDMI,HDMI_RES_GROUP_CEA,mymode_second_best->code);
+               } else {
+                       Log::getInstance()->log("Video", Log::NOTICE, "Switch to prefered mode");
+                       vc_tv_hdmi_power_on_best(1920,1080,target_fps,interlaced?HDMI_INTERLACED:HDMI_NONINTERLACED,
+                                       (EDID_MODE_MATCH_FLAG_T)(HDMI_MODE_MATCH_FRAMERATE|HDMI_MODE_MATCH_RESOLUTION|HDMI_MODE_MATCH_SCANMODE));
+               }
+
+       }
+
+
+
+}
 
 
 int VideoOMX::setConnection(UCHAR tconnection)
index 9fd9caf2194ce319c8aa14528a6ac85f174837ec..cdc0c13bdd0cbee343f7d7ab052b1992148e50c8 100644 (file)
@@ -257,7 +257,7 @@ class VideoOMX : public Video, public Thread_TYPE
           float xpos,ypos;\r
           int deinterlace;\r
           void updateMode();//called internally to adjust for different parameters\r
-         // void selectVideoMode(int interlaced);\r
+          void selectVideoMode(int interlaced);\r
           UCHAR tvsystem;\r
 \r
 \r