DeAllocateCodecsOMX();
return 0;
}*/
- VideoOMX *video=(VideoOMX*)Video::getInstance();
+
if (!omx_running) {
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
// #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
#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
#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
vertex_shader=0;\r
if (shad_program!=0) glDeleteProgram(shad_program);\r
shad_program=0;\r
+ initted=0;\r
+ return 0;\r
}\r
\r
\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
*/
#include "osdmvp.h"
+#include "surfacemvp.h"
OsdMVP::OsdMVP()
{
}
Surface * OsdMvp::createNewSurface();{
- return (Surface*)new SurfaceMvp();
+ return (Surface*)new SurfaceMVP();
}
lastrendertime=getTimeMS();\r
display_height=0;\r
display_width=0;\r
+ mode=0;\r
\r
#ifdef BENCHMARK_FPS\r
last_benchmark_time=getTimeMS();\r
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
\r
return 1;\r
}\r
-\r
-\r
-\r
-\r
\r
void OsdOpenGL::InitVertexBuffer(float scalex,float scaley)\r
{\r
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
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
\r
\r
\r
+\r
private:\r
\r
//Maybe move the following stuff to a generic opengl object also for boosting DCT etc.\r
\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
}
+ return initCec();
+}
+
+int RemoteLinux::initCec() {
// bcm_host_init(); //may be move to custom hardware init?
// now init cec
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
const char*HardcodedTranslateStr(UCHAR command);
char* HCWDesc(ULLONG hcw);
+ int initCec();
+ void deinitCec();
+
private:
return ioctl(fd, GFX_FB_OSD_BITBLT, &fblt);
}
-void SurfaceMVP::screenShot(char* fileName)
+void SurfaceMVP::screenShot(const char* fileName)
{
Log* logger = Log::getInstance();
DeAllocateCodecsOMX();
OMX_Deinit();
+ vc_tv_show_info(0); // back to console
return 1;
}
{
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;
//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);
}
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
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
{\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
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