From 93e22163e9364f0e685fae382cd220c5bb243eee Mon Sep 17 00:00:00 2001 From: svenhoefer Date: Thu, 16 Mar 2017 20:20:47 +0100 Subject: [PATCH 1/2] - acinclude.m4: remove unused --enable-tmsdk switch; ... There's so much more unused and outdated stuff :/ --- acinclude.m4 | 5 ----- src/Makefile.am | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 5a98110b7..67b67f0bf 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -21,11 +21,6 @@ if test "$DEBUG" = "yes"; then AC_DEFINE(DEBUG,1,[Enable debug messages]) fi -AC_ARG_ENABLE(tmsdk, - AS_HELP_STRING(--enable-tmsdk, compile inside sdk), - ,[enable_tmsdk=no]) -AM_CONDITIONAL(ENABLE_TMSDK,test "$enable_tmsdk" = "yes") - AC_MSG_CHECKING(target) if test "$TARGET" = "native"; then diff --git a/src/Makefile.am b/src/Makefile.am index 73843b7d0..126f279a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -145,14 +145,12 @@ if BOXTYPE_COOL neutrino_LDADD += \ $(top_builddir)/lib/hardware/coolstream/libhwcaps.a neutrino_LDADD += -lcoolstream-mt -lca-sc -if ENABLE_TMSDK -else + if BOXMODEL_CS_HD2 neutrino_LDADD += -lca-ci -llnxtmvssUsr -llnxUKAL -llnxplatUsr -llnxtmasUsr -llnxdvbciUsr -llnxpvrUsr -llnxcssUsr -llnxnotifyqUsr -ltmpvrDataManager-cst -ltmpvrIndexStorage -llnxscsUsr else neutrino_LDADD += -lnxp endif -endif if BOXMODEL_CS_HD2 neutrino_LDADD += -liconv @@ -166,5 +164,4 @@ bin_PROGRAMS += rcsim rcsim_SOURCES = rcsim.c rcsim.h bin_PROGRAMS += mdev_helper mdev_helper_SOURCES = mdev_helper.cpp - endif From ad47a5d5e9d4a5280c1243f38a6b1334bb13281e Mon Sep 17 00:00:00 2001 From: "M. Liebmann" Date: Fri, 17 Mar 2017 07:56:47 +0100 Subject: [PATCH 2/2] CScreenShot: Remove OpenThreads and use pthread functions --- src/driver/screenshot.cpp | 95 ++++++++++++++++++++++++++++----------- src/driver/screenshot.h | 14 ++++-- 2 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/driver/screenshot.cpp b/src/driver/screenshot.cpp index db6bf89d7..7818795e3 100644 --- a/src/driver/screenshot.cpp +++ b/src/driver/screenshot.cpp @@ -2,6 +2,7 @@ Neutrino-GUI - DBoxII-Project Copyright (C) 2011 CoolStream International Ltd + Copyright (C) 2017 M. Liebmann (micha-bbg) parts based on AiO Screengrabber (C) Seddi seddi@ihad.tv @@ -61,6 +62,9 @@ CScreenShot::CScreenShot(const std::string fname, screenshot_format_t fmt) fd = NULL; xres = 0; yres = 0; + scs_thread = 0; + pthread_mutex_init(&thread_mutex, NULL); + pthread_mutex_init(&getData_mutex, NULL); get_video = g_settings.screenshot_video; get_osd = g_settings.screenshot_mode; scale_to_video = g_settings.screenshot_scale; @@ -68,20 +72,23 @@ CScreenShot::CScreenShot(const std::string fname, screenshot_format_t fmt) CScreenShot::~CScreenShot() { + pthread_mutex_destroy(&thread_mutex); + pthread_mutex_destroy(&getData_mutex); +// printf("[CScreenShot::%s:%d] thread: %p\n", __func__, __LINE__, this); } /* try to get video frame data in ARGB format, restore GXA state */ bool CScreenShot::GetData() { - static OpenThreads::Mutex mutex; bool res = false; + pthread_mutex_lock(&getData_mutex); - mutex.lock(); #ifdef BOXMODEL_CS_HD1 CFrameBuffer::getInstance()->setActive(false); #endif if (videoDecoder->getBlank()) get_video = false; + #if 1 // to enable after libcs/drivers update res = videoDecoder->GetScreenImage(pixel_data, xres, yres, get_video, get_osd, scale_to_video); #endif @@ -93,48 +100,84 @@ bool CScreenShot::GetData() CFrameBuffer::getInstance()->add_gxa_sync_marker(); CFrameBuffer::getInstance()->setActive(true); #endif - mutex.unlock(); + pthread_mutex_unlock(&getData_mutex); if (!res) { - printf("CScreenShot::Start: GetScreenImage failed\n"); + printf("[CScreenShot::%s:%d] GetScreenImage failed\n", __func__, __LINE__); return false; } - printf("CScreenShot::GetData: data: %p %d x %d\n", pixel_data, xres, yres); + printf("[CScreenShot::%s:%d] data: %p %d x %d\n", __func__, __LINE__, pixel_data, xres, yres); return true; } +bool CScreenShot::startThread() +{ + if (!scs_thread) { + void *ptr = static_cast(this); + int res = pthread_create(&scs_thread, NULL, initThread, ptr); + if (res != 0) { + printf("[CScreenShot::%s:%d] ERROR! pthread_create\n", __func__, __LINE__); + return false; + } + pthread_detach(scs_thread); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0); + } + return true; +} + +void* CScreenShot::initThread(void *arg) +{ + CScreenShot *scs = static_cast(arg); + pthread_cleanup_push(cleanupThread, scs); +// printf("[CScreenShot::%s:%d] thread: %p\n", __func__, __LINE__, scs); + + scs->runThread(); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0); + pthread_exit(0); + + pthread_cleanup_pop(0); + return 0; +} + +/* thread function to save data asynchroniosly. delete itself after saving */ +void CScreenShot::runThread() +{ + pthread_mutex_lock(&thread_mutex); + printf("[CScreenShot::%s:%d] save to %s format %d\n", __func__, __LINE__, filename.c_str(), format); + + bool ret = SaveFile(); + + printf("[CScreenShot::%s:%d] %s finished: %d\n", __func__, __LINE__, filename.c_str(), ret); + pthread_mutex_unlock(&thread_mutex); +} + +void CScreenShot::cleanupThread(void *arg) +{ + CScreenShot *scs = static_cast(arg); +// printf("[CScreenShot::%s:%d] thread: %p\n", __func__, __LINE__, scs); + delete scs; +} + /* start ::run in new thread to save file in selected format */ bool CScreenShot::Start() { bool ret = false; - if(GetData()) - ret = (start() == 0); + if (GetData()) + ret = startThread(); else delete this; return ret; } -/* thread function to save data asynchroniosly. delete itself after saving */ -void CScreenShot::run() -{ - printf("CScreenShot::run save to %s format %d\n", filename.c_str(), format); - detach(); - setCancelModeDisable(); - setSchedulePriority(THREAD_PRIORITY_MIN); - bool ret = SaveFile(); - printf("CScreenShot::run: %s finished: %d\n", filename.c_str(), ret); - delete this; -} - /* save file in sync mode, return true if save ok, or false */ bool CScreenShot::StartSync() { bool ret = false; - printf("CScreenShot::StartSync save to %s format %d\n", filename.c_str(), format); - if(GetData()) + printf("[CScreenShot::%s:%d] save to %s format %d\n", __func__, __LINE__, filename.c_str(), format); + if (GetData()) ret = SaveFile(); - - printf("CScreenShot::StartSync: %s finished: %d\n", filename.c_str(), ret); + printf("[CScreenShot::%s:%d] %s finished: %d\n", __func__, __LINE__, filename.c_str(), ret); return ret; } @@ -228,7 +271,7 @@ bool CScreenShot::SavePng() free(row_pointers); fclose(fd); - TIMER_STOP(filename.c_str()); + TIMER_STOP(("[CScreenShot::SavePng] " + filename).c_str()); return true; } @@ -309,7 +352,7 @@ bool CScreenShot::SaveJpg() jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); fclose(fd); - TIMER_STOP(filename.c_str()); + TIMER_STOP(("[CScreenShot::SaveJpg] " + filename).c_str()); return true; } @@ -342,7 +385,7 @@ bool CScreenShot::SaveBmp() fwrite(pixel_data+(y*xres*4),xres*4,1,fd); } fclose(fd); - TIMER_STOP(filename.c_str()); + TIMER_STOP(("[CScreenShot::SaveBmp] " + filename).c_str()); return true; } diff --git a/src/driver/screenshot.h b/src/driver/screenshot.h index a4f348a8b..fefaf7c78 100644 --- a/src/driver/screenshot.h +++ b/src/driver/screenshot.h @@ -2,6 +2,7 @@ Neutrino-GUI - DBoxII-Project Copyright (C) 2011 CoolStream International Ltd + Copyright (C) 2017 M. Liebmann (micha-bbg) License: GPLv2 @@ -22,9 +23,9 @@ #ifndef __screenshot_h_ #define __screenshot_h_ -#include +#include -class CScreenShot : public OpenThreads::Thread +class CScreenShot { public: typedef enum { @@ -43,6 +44,9 @@ class CScreenShot : public OpenThreads::Thread bool get_video; bool scale_to_video; FILE *fd; + pthread_t scs_thread; + pthread_mutex_t thread_mutex; + pthread_mutex_t getData_mutex; bool GetData(); bool OpenFile(); @@ -51,7 +55,11 @@ class CScreenShot : public OpenThreads::Thread bool SavePng(); bool SaveJpg(); bool SaveBmp(); - void run(); + + bool startThread(); + static void* initThread(void *arg); + void runThread(); + static void cleanupThread(void *arg); public: CScreenShot(const std::string fname = "", screenshot_format_t fmt = CScreenShot::FORMAT_JPG);