diff --git a/lib/libdvbsub/dvbsub.cpp b/lib/libdvbsub/dvbsub.cpp index 585fb3d66..a70ebc73e 100644 --- a/lib/libdvbsub/dvbsub.cpp +++ b/lib/libdvbsub/dvbsub.cpp @@ -41,8 +41,8 @@ static int dvbsub_pid; static int dvbsub_stopped; cDvbSubtitleConverter *dvbSubtitleConverter; -void* reader_thread(void *arg); -void* dvbsub_thread(void* arg); +static void* reader_thread(void *arg); +static void* dvbsub_thread(void* arg); int dvbsub_init() { int trc; @@ -184,7 +184,7 @@ static int64_t get_pts_stc_delta(int64_t pts) return delta; } -void* reader_thread(void * /*arg*/) +static void* reader_thread(void * /*arg*/) { uint8_t tmp[16]; /* actually 6 should be enough */ int count; @@ -277,7 +277,7 @@ void* reader_thread(void * /*arg*/) pthread_exit(NULL); } -void* dvbsub_thread(void* /*arg*/) +static void* dvbsub_thread(void* /*arg*/) { struct timespec restartWait; struct timeval now; diff --git a/lib/libdvbsub/dvbsub.h b/lib/libdvbsub/dvbsub.h new file mode 100644 index 000000000..62ac8f970 --- /dev/null +++ b/lib/libdvbsub/dvbsub.h @@ -0,0 +1,9 @@ +#ifndef _DVB_SUB_H +#define _DVB_SUB_H +int dvbsub_init(); +int dvbsub_stop(); +int dvbsub_close(); +int dvbsub_start(int pid); +int dvbsub_pause(); +int dvbsub_getpid(); +#endif diff --git a/lib/libtuxtxt/teletext.h b/lib/libtuxtxt/teletext.h new file mode 100644 index 000000000..15e37d510 --- /dev/null +++ b/lib/libtuxtxt/teletext.h @@ -0,0 +1,12 @@ +#ifndef __teletext_h__ +#define __teletext_h__ + +extern int tuxtxt_init(); +extern void tuxtxt_close(); +extern void tuxtxt_start(int tpid); // Start caching +extern int tuxtxt_stop(); // Stop caching +extern int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int page = 0); +void tuxtx_stop_subtitle(); +int tuxtx_subtitle_running(int pid, int page); + +#endif diff --git a/lib/libtuxtxt/tuxtxt.cpp b/lib/libtuxtxt/tuxtxt.cpp index cd9cdd373..bca296420 100644 --- a/lib/libtuxtxt/tuxtxt.cpp +++ b/lib/libtuxtxt/tuxtxt.cpp @@ -1477,15 +1477,54 @@ void eval_l25() * main loop * ******************************************************************************/ -int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h) +static int subtitle_mode; +static pthread_t ttx_sub_thread; +static int reader_running; + +static void* reader_thread(void * /*arg*/) +{ + printf("TuxTxt subtitle thread started\n"); + reader_running = 1; + while(reader_running) { + RenderPage(); + } + CleanUp(); + tuxtxt_close(); + printf("TuxTxt subtitle thread stopped\n"); +} + +void tuxtx_stop_subtitle() +{ + printf("TuxTxt stopping subtitle thread ...\n"); + reader_running = 0; + if(ttx_sub_thread) + pthread_join(ttx_sub_thread, NULL); + ttx_sub_thread = NULL; +} + +int tuxtx_subtitle_running(int pid, int page) +{ + if(reader_running && (tuxtxt_cache.vtxtpid == pid) && (tuxtxt_cache.page == page)) + { + return 1; + } + return 0; +} + +int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h, int page) { char cvs_revision[] = "$Revision: 1.95 $"; + subtitle_mode = 0; //printf("to init tuxtxt\n");fflush(stdout); #if !TUXTXT_CFG_STANDALONE int initialized = tuxtxt_init(); - if ( initialized ) + if (initialized) tuxtxt_cache.page = 0x100; + if(page) { + tuxtxt_cache.page = page; + subtitle_mode = 1; + } #endif /* show versioninfo */ @@ -1507,7 +1546,7 @@ int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h) if(tuxtxt_cache.vtxtpid == 0) printf("[tuxtxt] No PID given, so scanning for PIDs ...\n\n"); else - printf("[tuxtxt] using PID %x\n", tuxtxt_cache.vtxtpid); + printf("[tuxtxt] using PID %x page %d\n", tuxtxt_cache.vtxtpid, tuxtxt_cache.page); fcntl(rc, F_SETFL, fcntl(rc, F_GETFL) | O_EXCL | O_NONBLOCK); @@ -1543,6 +1582,10 @@ int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h) if (Init() == 0) return 0; + if(subtitle_mode) { + pthread_create(&ttx_sub_thread, 0, reader_thread, (void *) NULL); + return 1; + } //transpmode = 1; /* main loop */ do { @@ -3326,7 +3369,7 @@ void PageInput(int Number) { tuxtxt_cache.subpage = subp; tuxtxt_cache.pageupdate = 1; -#if TUXTXT_DEBUG +#if 1 //TUXTXT_DEBUG printf("TuxTxt \n", tuxtxt_cache.page, tuxtxt_cache.subpage); #endif } diff --git a/src/daemonc/remotecontrol.cpp b/src/daemonc/remotecontrol.cpp index 7ab245b90..10bd14829 100644 --- a/src/daemonc/remotecontrol.cpp +++ b/src/daemonc/remotecontrol.cpp @@ -41,14 +41,9 @@ #include #include +#include "libdvbsub/dvbsub.h" +#include "libtuxtxt/teletext.h" -#ifndef TUXTXT_CFG_STANDALONE -extern int tuxtxt_init(); -extern void tuxtxt_start(int tpid); -extern int tuxtxt_stop(); -extern void tuxtxt_close(); -extern void dvbsub_pause(bool pause); -#endif //FIXME: auto-timeshift extern bool autoshift; extern uint32_t shift_timer; diff --git a/src/driver/framebuffer.cpp b/src/driver/framebuffer.cpp index 375abb325..737c50103 100644 --- a/src/driver/framebuffer.cpp +++ b/src/driver/framebuffer.cpp @@ -1423,3 +1423,16 @@ void CFrameBuffer::showFrame(const std::string & filename) else videoDecoder->ShowPicture((iconBasePath + filename).c_str()); } + +bool CFrameBuffer::Lock() +{ + if(locked) + return false; + locked = true; + return true; +} + +void CFrameBuffer::Unlock() +{ + locked = false; +} diff --git a/src/driver/framebuffer.h b/src/driver/framebuffer.h index b04a0e214..2de94c3ad 100644 --- a/src/driver/framebuffer.h +++ b/src/driver/framebuffer.h @@ -102,6 +102,7 @@ class CFrameBuffer unsigned int smem_start; /* as aquired from the fbdev, the framebuffers physical start address */ volatile uint8_t *gxa_base; /* base address for the GXA's register access */ #endif /* USE_NEVIS_GXA */ + bool locked; public: #ifndef FB_USE_PALETTE fb_pixel_t realcolor[256]; @@ -199,6 +200,9 @@ class CFrameBuffer void ClearFrameBuffer(); void showFrame(const std::string & filename); bool loadBackgroundPic(const std::string & filename, bool show = true); + bool Lock(void); + void Unlock(void); + bool Locked(void) { return locked; }; }; diff --git a/src/gui/audio_select.cpp b/src/gui/audio_select.cpp index 6dde054fa..b9c8f321a 100644 --- a/src/gui/audio_select.cpp +++ b/src/gui/audio_select.cpp @@ -42,9 +42,10 @@ extern CRemoteControl * g_RemoteControl; /* neutrino.cpp */ extern CAPIDChangeExec * APIDChanger; extern CAudioSetupNotifier * audioSetupNotifier; -int dvbsub_getpid(); #include +#include "libdvbsub/dvbsub.h" +#include "libtuxtxt/teletext.h" // // -- AUDIO Selector Menue Handler Class @@ -93,9 +94,9 @@ int CAudioSelectMenuHandler::doMenu () AudioSelector.addItem(GenericMenuSeparatorLine); CMenuOptionChooser* oj = new CMenuOptionChooser(LOCALE_AUDIOMENU_ANALOGOUT, - &g_settings.audio_AnalogMode, - AUDIOMENU_ANALOGOUT_OPTIONS, AUDIOMENU_ANALOGOUT_OPTION_COUNT, - true, audioSetupNotifier, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED); + &g_settings.audio_AnalogMode, + AUDIOMENU_ANALOGOUT_OPTIONS, AUDIOMENU_ANALOGOUT_OPTION_COUNT, + true, audioSetupNotifier, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED); AudioSelector.addItem( oj ); @@ -107,18 +108,34 @@ int CAudioSelectMenuHandler::doMenu () if(cc) { for (int i = 0 ; i < (int)cc->getSubtitleCount() ; ++i) { CZapitAbsSub* s = cc->getChannelSub(i); - CZapitDVBSub* sd = reinterpret_cast(s); -// CZapitTTXSub* st = reinterpret_cast(s); - printf("[neutrino] adding subtitle %s pid %x\n", sd->ISO639_language_code.c_str(), sd->pId); if (s->thisSubType == CZapitAbsSub::DVB) { + CZapitDVBSub* sd = reinterpret_cast(s); + printf("[neutrino] adding DVB subtitle %s pid %x\n", sd->ISO639_language_code.c_str(), sd->pId); if(!sep_added) { sep_added = true; AudioSelector.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_SUBTITLES_HEAD)); } - char spid[5]; - sprintf(spid, "%d", sd->pId); - AudioSelector.addItem(new CMenuForwarderNonLocalized(sd->ISO639_language_code.c_str(), - sd->pId != dvbsub_getpid(), NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count))); + char spid[10]; + sprintf(spid, "DVB:%d", sd->pId); + char item[64]; + sprintf(item, "DVB: %s (pid %x)", sd->ISO639_language_code.c_str(), sd->pId); + AudioSelector.addItem(new CMenuForwarderNonLocalized(item /*sd->ISO639_language_code.c_str()*/, + sd->pId != dvbsub_getpid(), NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count))); + } + if (s->thisSubType == CZapitAbsSub::TTX) { + CZapitTTXSub* sd = reinterpret_cast(s); + printf("[neutrino] adding TTX subtitle %s pid %x mag %X page %x\n", sd->ISO639_language_code.c_str(), sd->pId, sd->teletext_magazine_number, sd->teletext_page_number); + if(!sep_added) { + sep_added = true; + AudioSelector.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_SUBTITLES_HEAD)); + } + char spid[10]; + int page = ((sd->teletext_magazine_number & 0xFF) << 8) | sd->teletext_page_number; + sprintf(spid, "TTX:%d:%03X", sd->pId, page); + char item[64]; + sprintf(item, "TTX: %s (pid %x page %03X)", sd->ISO639_language_code.c_str(), sd->pId, page); + AudioSelector.addItem(new CMenuForwarderNonLocalized(item /*sd->ISO639_language_code.c_str()*/, + !tuxtx_subtitle_running(sd->pId, page), NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count))); } } if(sep_added) { diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index ca11743e8..dd20d9611 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -882,9 +882,6 @@ void CInfoViewer::showIcon_16_9 () } } -extern "C" void tuxtxt_start(int tpid); -extern "C" int tuxtxt_stop(); - void CInfoViewer::showIcon_VTXT () const { frameBuffer->paintIcon((g_RemoteControl->current_PIDs.PIDs.vtxtpid != 0) ? "vtxt.raw" : "vtxt_gray.raw", diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index a1c64a2a3..2e1707fdb 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -154,10 +154,11 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) int pos = 0; exit_pressed = false; + frameBuffer->Lock(); + if (parent) parent->hide(); - bool fadeIn = g_settings.widget_fade; bool fadeOut = false; int fadeValue; @@ -417,6 +418,8 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) CMenuItem* item = items[count]; item->init(-1, 0, 0, 0); } + + frameBuffer->Unlock(); return retval; } diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 0c331a69a..ce915176d 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -136,6 +136,9 @@ #include #include +#include "libdvbsub/dvbsub.h" +#include "libtuxtxt/teletext.h" + int old_b_id = -1; CHintBox * reloadhintBox = 0; uint32_t sec_timer; @@ -157,17 +160,6 @@ uint32_t scrambled_timer; char recDir[255]; char timeshiftDir[255]; -extern int tuxtxt_init(); -extern void tuxtxt_start(int tpid); -extern int tuxtxt_stop(); -extern void tuxtxt_close(); - -int dvbsub_init(); -int dvbsub_stop(); -int dvbsub_close(); -int dvbsub_start(int pid); -int dvbsub_pause(); - //char current_volume; extern int list_changed; @@ -2574,8 +2566,6 @@ int CNeutrinoApp::run(int argc, char **argv) return 0; } -int tuxtx_main(int _rc, void * _fb, int pid, int x, int y, int w, int h); - void CNeutrinoApp::quickZap(int msg) { if((bouquetList != NULL) && !(bouquetList->Bouquets.empty())) diff --git a/src/sectionsd/Makefile.am b/src/sectionsd/Makefile.am index 797a72c00..778506c2d 100644 --- a/src/sectionsd/Makefile.am +++ b/src/sectionsd/Makefile.am @@ -9,8 +9,6 @@ INCLUDES = \ AM_CPPFLAGS = -D DO_NOT_INCLUDE_STUFF_NOT_NEEDED_FOR_SECTIONSD -AM_CXXFLAGS = -fno-exceptions - noinst_LIBRARIES = libsectionsd.a libsectionsd_a_SOURCES = sectionsd.cpp dmxapi.cpp debug.cpp dmx.cpp SIsections.cpp SIevents.cpp SIutils.cpp SIlanguage.cpp edvbstring.cpp diff --git a/src/system/setting_helpers.cpp b/src/system/setting_helpers.cpp index 8ba9830ec..4ac2cf48f 100644 --- a/src/system/setting_helpers.cpp +++ b/src/system/setting_helpers.cpp @@ -61,6 +61,8 @@ #include #include #include +#include "libdvbsub/dvbsub.h" +#include "libtuxtxt/teletext.h" extern CPlugins * g_PluginList; /* neutrino.cpp */ extern CRemoteControl * g_RemoteControl; /* neutrino.cpp */ @@ -586,19 +588,30 @@ int CAPIDChangeExec::exec(CMenuTarget* /*parent*/, const std::string & actionKey return menu_return::RETURN_EXIT; } -int dvbsub_start(int pid); -int dvbsub_pause(); -int dvbsub_stop(); - int CSubtitleChangeExec::exec(CMenuTarget* /*parent*/, const std::string & actionKey) { printf("CSubtitleChangeExec::exec: action %s\n", actionKey.c_str()); if(actionKey == "off") { + tuxtx_stop_subtitle(); dvbsub_stop(); - } else { - int pid = atoi(actionKey.c_str()); + return menu_return::RETURN_EXIT; + } + if(!strncmp(actionKey.c_str(), "DVB", 3)) { + char * pidptr = strchr(actionKey.c_str(), ':'); + int pid = atoi(pidptr+1); dvbsub_pause(); dvbsub_start(pid); + } else { + char * ptr = strchr(actionKey.c_str(), ':'); + ptr++; + int pid = atoi(ptr); + ptr = strchr(ptr, ':'); + ptr++; + int page = strtol(ptr, NULL, 16); +printf("CSubtitleChangeExec::exec: TTX, pid %x page %x\n", pid, page); + tuxtx_stop_subtitle(); + tuxtx_main(g_RCInput->getFileHandle(), CFrameBuffer::getInstance()->getFrameBufferPointer(), pid, + CFrameBuffer::getInstance()->getScreenX(), CFrameBuffer::getInstance()->getScreenY(), CFrameBuffer::getInstance()->getScreenWidth(), CFrameBuffer::getInstance()->getScreenHeight(), page); } return menu_return::RETURN_EXIT; } diff --git a/src/zapit/src/channel.cpp b/src/zapit/src/channel.cpp index 3fbd6f574..5d0c77882 100644 --- a/src/zapit/src/channel.cpp +++ b/src/zapit/src/channel.cpp @@ -206,7 +206,7 @@ printf("[subtitles] DVBSub: PID=0x%04x, lang=%3.3s, cpageid=%04x, apageid=%04x\n if ((*subI)->thisSubType==CZapitAbsSub::DVB){ tmpSub=reinterpret_cast(*subI); if (tmpSub->ISO639_language_code==langCode) { - oldSub = tmpSub; + //oldSub = tmpSub; if (tmpSub->pId==pid && tmpSub->subtitling_type==subtitling_type && tmpSub->composition_page_id==composition_page_id && diff --git a/src/zapit/src/zapit.cpp b/src/zapit/src/zapit.cpp index cec40d1c0..721cddc28 100644 --- a/src/zapit/src/zapit.cpp +++ b/src/zapit/src/zapit.cpp @@ -63,6 +63,9 @@ #include #include +#include "libdvbsub/dvbsub.h" +#include "libtuxtxt/teletext.h" + /* globals */ int zapit_ready; int abort_zapit; @@ -335,10 +338,6 @@ CZapitClient::responseGetLastChannel load_settings(void) */ static int pmt_update_fd = -1; static bool update_pmt = true; -extern int dvbsub_pause(); -extern int dvbsub_stop(); -extern int dvbsub_getpid(); -extern int dvbsub_start(int pid); int zapit(const t_channel_id channel_id, bool in_nvod, bool forupdate = 0, bool /*nowait*/ = 0) { @@ -1857,6 +1856,7 @@ in record mode we stop onle cam1, while cam continue to decrypt recording channe playing = false; + tuxtx_stop_subtitle(); if(standby) dvbsub_pause(); else