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()
{
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);
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)
{
}
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);
}
//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 );
}
{
//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};
{
//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;
}
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*)"");
}
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();