]> git.vomp.tv Git - vompclient.git/commitdiff
Some MVP compile fixes and some RBP clear deinitialisation code
authorMarten Richter <marten.richter@freenet.de>
Sun, 16 Sep 2012 21:01:42 +0000 (23:01 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sun, 16 Sep 2012 21:02:19 +0000 (23:02 +0200)
14 files changed:
audioomx.cc
boxstack.cc
defines.h
glshader.cc [changed mode: 0755->0644]
main.cc
osdmvp.cc
osdopengl.cc
osdopengl.h
remotelinux.cc
remotelinux.h
surfacemvp.cc
videoomx.cc
videoomx.h
vopts.cc

index f4a8aec734f1539b783ce1b9070cf76d84378da4..031adb0543cc2382c9d9870c8f4b8761a32f980b 100644 (file)
@@ -542,7 +542,7 @@ int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to
                DeAllocateCodecsOMX();
                return 0;
        }*/
-       VideoOMX *video=(VideoOMX*)Video::getInstance();
+
 
 
        if (!omx_running) {
index 188a5ed246e35295b32e93940e4ef1473e4df053..bee0c813ca64c9db46e36d8aaa23068f43b6bedf 100644 (file)
@@ -225,7 +225,7 @@ void BoxStack::deleteBox(int z)
 void BoxStack::update(Boxx* toUpdate, Region* regionToUpdate)\r
 {\r
   Log::getInstance()->log("BoxStack", Log::DEBUG, "Update called");\r
-\r
+  if (!initted) return; // it is allowed to call this before init\r
 #ifndef WIN32\r
   pthread_mutex_lock(&boxLock);\r
 #else\r
index 7a801fde3e3c3853d824baea3c4192114b92f263..fc4f354e97fac78a3507b3f9dcb423d17cf5a272 100644 (file)
--- a/defines.h
+++ b/defines.h
@@ -111,6 +111,9 @@ long long getTimeMS();
   // #define  VPE_LIBAV_MPEG2_TRANSCODING\r
 \r
   #define DEFAULT_TCP_WINDOWSIZENR 6  /*=2048*/\r
+  #define TV_NORM_SWITCHABLE\r
+\r
+  #define VOMP_LINUX_CLOCK  CLOCK_MONOTONIC\r
 \r
 #endif\r
 #ifdef VOMP_PLATTFORM_MVP\r
@@ -124,6 +127,9 @@ long long getTimeMS();
   #define Video_TYPE VideoMVP\r
   #define DEFAULT_TCP_WINDOWSIZENR 1  /*=2048*/\r
   #define PAL_WSS\r
+  #define MVP_REMOTE_TYPES\r
+\r
+  #define VOMP_LINUX_CLOCK  CLOCK_REALTIME\r
 #endif\r
 \r
 #ifdef VOMP_PLATTFORM_NMT // This was the attempt to port vomp to nmt, it failed but maybe the code is useful at some time\r
@@ -137,6 +143,8 @@ long long getTimeMS();
   #define Video_TYPE VideoNMT\r
   #define DEFAULT_TCP_WINDOWSIZENR 1  /*=2048*/\r
 \r
+  #define VOMP_LINUX_CLOCK  CLOCK_REALTIME\r
+\r
 #endif\r
 \r
 #endif\r
old mode 100755 (executable)
new mode 100644 (file)
index e84caa4..fce9c7b
@@ -101,5 +101,7 @@ int GLShader::deinitShaders()
         vertex_shader=0;\r
         if (shad_program!=0) glDeleteProgram(shad_program);\r
         shad_program=0;\r
+        initted=0;\r
+        return 0;\r
 }\r
 \r
diff --git a/main.cc b/main.cc
index b60fe027b0172a56e69e42b1e356aa4ac4396b16..d8377545e03dbb901db0c0719fbc453fc33751af 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -567,7 +567,7 @@ void MILLISLEEP(ULONG a)
 \r
 long long getTimeMS() {\r
        struct timespec ts;\r
-       clock_gettime(CLOCK_MONOTONIC, &ts);\r
+       clock_gettime(VOMP_LINUX_CLOCK, &ts);\r
        return ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
 }\r
 \r
index 1f4b22ca3b60ead41c8cc768738f81c3833d3db0..0317ea2d1d036421b6c4cb8953a248c9a68e0230 100644 (file)
--- a/osdmvp.cc
+++ b/osdmvp.cc
@@ -19,6 +19,7 @@
 */
 
 #include "osdmvp.h"
+#include "surfacemvp.h"
 
 OsdMVP::OsdMVP()
 {
@@ -37,7 +38,7 @@ int OsdMVP::getFD()
 }
 
 Surface * OsdMvp::createNewSurface();{
-       return (Surface*)new SurfaceMvp();
+       return (Surface*)new SurfaceMVP();
 }
 
 
index cb2e2c0ed4ba553a910b5367a515fde53908ab82..3abbaf7fe2732d7dd00c32e70cfbadea60f6365d 100644 (file)
@@ -47,6 +47,7 @@ OsdOpenGL::OsdOpenGL()
   lastrendertime=getTimeMS();\r
   display_height=0;\r
   display_width=0;\r
+  mode=0;\r
 \r
 #ifdef BENCHMARK_FPS\r
        last_benchmark_time=getTimeMS();\r
@@ -152,10 +153,8 @@ int OsdOpenGL::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
-   DISPMANX_DISPLAY_HANDLE_T bcm_display;\r
-   DISPMANX_ELEMENT_HANDLE_T bcm_element;\r
-   DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
 \r
+  DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
 \r
    bcm_display=vc_dispmanx_display_open(0);\r
    bcm_update=vc_dispmanx_update_start(0);\r
@@ -238,10 +237,6 @@ int OsdOpenGL::init(void* device)
 \r
   return 1;\r
 }\r
-\r
-\r
-\r
-\r
        \r
 void OsdOpenGL::InitVertexBuffer(float  scalex,float scaley)\r
 {\r
@@ -288,8 +283,11 @@ void OsdOpenGL::InitVertexBuffer(float  scalex,float scaley)
 int OsdOpenGL::shutdown()\r
 {\r
   if (!initted) return 0;\r
+  glmutex.Lock();\r
   initted = 0;\r
   threadStop();\r
+  delete screen;\r
+  screen=NULL;\r
 \r
   (((VideoOMX*)Video::getInstance())->shutdownUsingOSDObjects());\r
 \r
@@ -303,12 +301,22 @@ int OsdOpenGL::shutdown()
   eglDestroyContext(egl_display,egl_context);\r
   eglTerminate(egl_display );\r
 \r
+  DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
+  bcm_update=vc_dispmanx_update_start(0);\r
+\r
+  vc_dispmanx_element_remove(bcm_update,bcm_element);\r
+  vc_dispmanx_update_submit_sync(bcm_update);\r
+  vc_dispmanx_display_close(bcm_display);\r
+\r
+\r
   return 1;\r
 }\r
 \r
 void OsdOpenGL::screenShot(const char* fileName)\r
 {\r
+  BeginPainting();\r
   screen->screenShot(fileName);\r
+  EndPainting();\r
 }\r
 \r
 void OsdOpenGL::threadMethod()\r
index 7802d5740cbdff658dde73485b5aa4fd6b4a7b2a..d3825c4ff46c7c9eefed36c9c005d9d3b3365a79 100644 (file)
@@ -99,6 +99,7 @@ class OsdOpenGL : public Osd, public Thread_TYPE
 \r
 \r
 \r
+\r
 private:\r
 \r
        //Maybe move the following stuff to a generic opengl object also for boosting DCT etc.\r
@@ -126,6 +127,11 @@ private:
 \r
     uint32_t display_height;\r
        uint32_t display_width;\r
+       DISPMANX_DISPLAY_HANDLE_T bcm_display;\r
+       DISPMANX_ELEMENT_HANDLE_T bcm_element;\r
+\r
+       uint32_t mode;\r
+\r
 \r
        EGLDisplay egl_display;\r
        EGLSurface egl_surface;\r
index 8b643ea84c93dedbda225425cc278d244d250a02..01490261b300b17340b6dc21944ed6267b4bcf45 100644 (file)
@@ -115,6 +115,10 @@ int RemoteLinux::init(char* devName)
 
 
   }
+  return initCec();
+}
+
+int RemoteLinux::initCec() {
 
   // bcm_host_init(); //may be move to custom hardware init?
 // now init cec
@@ -176,16 +180,24 @@ int RemoteLinux::init(char* devName)
 int RemoteLinux::shutdown()
 {
   if (!initted) return 0;
-  if (cec_adap) {
-         cec_adap->SetInactiveView();
-         cec_adap->Close();
-         UnloadLibCec(cec_adap);
-  }
+  deinitCec();
+
 
   initted = 0;
   return 1;
 }
 
+void RemoteLinux::deinitCec()
+{
+       if (cec_adap) {
+               cec_adap->SetInactiveView();
+               cec_adap->Close();
+               UnloadLibCec(cec_adap);
+               cec_adap = NULL;
+       }
+
+}
+
 UCHAR RemoteLinux::getButtonPress(int waitType) {
        /* how = 0 - block
         how = 1 - start new wait
index e45cac41d20ffd67d2e2eb25adb87ec85f074e3e..949295169c6aa947d0a2457202a9184b205581c0 100644 (file)
@@ -52,6 +52,9 @@ class RemoteLinux : public Remote
     const char*HardcodedTranslateStr(UCHAR command);
     char* HCWDesc(ULLONG hcw);
     
+    int initCec();
+    void deinitCec();
+
 
 
   private: 
index 5fd5b59d3920fd05d9f98e8052af04de90217caf..c0fe85b6f16e46cca54d558e7797e91f844c675d 100644 (file)
@@ -361,7 +361,7 @@ int SurfaceMVP::blt(int fd, unsigned long shandle, int sx, int sy, int width, in
   return ioctl(fd, GFX_FB_OSD_BITBLT, &fblt);
 }
 
-void SurfaceMVP::screenShot(char* fileName)
+void SurfaceMVP::screenShot(const char* fileName)
 {
   Log* logger = Log::getInstance();
 
index 25444c1641c4fb33d3505d76ae850fb66e5e5b1f..18e43cb797793b5c46e164cb76aac2acc431e2c5 100644 (file)
@@ -167,6 +167,7 @@ int VideoOMX::shutdown()
 
   DeAllocateCodecsOMX();
   OMX_Deinit();
+  vc_tv_show_info(0); // back to console
   return 1;
 }
 
@@ -297,24 +298,90 @@ int VideoOMX::setFormat(UCHAR tformat)
 {
   if (!initted) return 0;
   if ((tformat != PAL) && (tformat != NTSC)) return 0;
-  format = tformat;
+  format = PAL;
+  tvsystem = tformat;
 
-//  if (ioctl(fdVideo, AV_SET_VID_DISP_FMT, format) != 0) return 0;
-
-  if (format == NTSC)
-  {
-    screenWidth = 720;
-    screenHeight = 480;
-  }
   if (format == PAL)
   {
     screenWidth = 720;
     screenHeight = 576;
   }
 
+//  selectVideoMode(0);
+
   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));
+//             }
+//
+//     }
+//
+//
+//
+//}
+
+
 int VideoOMX::setConnection(UCHAR tconnection)
 {
   if (!initted) return 0;
@@ -2192,15 +2259,15 @@ void VideoOMX::threadMethod()
                                //Log::getInstance()->log("Video", Log::DEBUG, "threadMethod Frameskip");
 
                        } else {
-                               Log::getInstance()->log("Video", Log::DEBUG,
-                                                                                                       "prot empty this buffer in");
+                       //      Log::getInstance()->log("Video", Log::DEBUG,
+                               //                                                                      "prot empty this buffer in");
                                OMX_ERRORTYPE error = ProtOMXEmptyThisBuffer(omx_vid_dec, pict);
                                if (error != OMX_ErrorNone) {
                                        Log::getInstance()->log("Video", Log::DEBUG,
                                                        "OMX_EmptyThisBuffer failed %x", error);
                                }
-                               Log::getInstance()->log("Video", Log::DEBUG,
-                                                                                                                                               "prot empty this buffer out");
+                               //Log::getInstance()->log("Video", Log::DEBUG,
+                                       //                                                                                                      "prot empty this buffer out");
                                if (deint_first_frame && dodeint) DeinterlaceFix();
                                if (islast) FrameWaitforDisplay(time);
                        }
index 59f0d9796f70cfd7d11f089f08725f2c01c10781..be11fdf90691385b94a1d4c2b9a32903e5e8f933 100644 (file)
@@ -255,6 +255,8 @@ 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
+          UCHAR tvsystem;\r
 \r
 \r
 \r
index 64d1bd2f1516223396709846d9c92be8763e3adc..57419ce30bda10f7442b9bc2f1667be6a0dd5f03 100644 (file)
--- a/vopts.cc
+++ b/vopts.cc
@@ -89,9 +89,11 @@ VOpts::VOpts()
   wop = new WOptionPane();\r
   tabbar.addTab(tr("General"), wop);\r
   panes[0] = wop;\r
+#ifdef MVP_REMOTE_TYPES\r
   option = new Option(1, "Remote control type",      "General", "Remote type",           Option::TYPE_TEXT, 2, 0, 0, options1);\r
   options.push_back(option);\r
   wop->addOptionLine(option);\r
+#endif\r
   option = new Option(2, "Language",                 "General", "LangCode",              Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);\r
   options.push_back(option);\r
   wop->addOptionLine(option);\r
@@ -264,6 +266,7 @@ void VOpts::doSave()
       {\r
         case 1:\r
         {\r
+#ifdef MVP_REMOTE_TYPES\r
           if (options[i]->userSetChoice == 1)\r
           {\r
             Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");\r
@@ -274,6 +277,7 @@ void VOpts::doSave()
             Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");\r
             Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);\r
           }\r
+#endif\r
           break;\r
         }\r
         case 2:\r