]> git.vomp.tv Git - vompclient.git/commitdiff
Apply JTE subtitles patch for not destroying OSD
authorMarten Richter <marten.richter@freenet.de>
Sat, 24 Nov 2012 08:19:07 +0000 (09:19 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sat, 24 Nov 2012 08:19:07 +0000 (09:19 +0100)
dvbsubtitles.cc
dvbsubtitles.h
player.cc
player.h
playerlivetv.cc
playerlivetv.h
vteletextview.cc
vteletextview.h
vvideolivetv.cc
vvideorec.cc

index 1a6f22cc2813f80c28f6e59072f4bdfb25f31eb1..e581a1885b4aa68672e6956709673924b6a8dd76 100644 (file)
@@ -777,7 +777,7 @@ bool DVBSubtitles::decodePacket(const PESPacket& packet)
 
 void DVBSubtitles::finishPage(const DVBSubtitlePage& page)
 {
-  if (page.dirty)
+  if (page.dirty && !osdMenuShowing) 
   {
     osd->clearOSD();
   }
@@ -795,7 +795,7 @@ void DVBSubtitles::finishPage(const DVBSubtitlePage& page)
       region_iter = page.regions.find(i->first);
       if (region_iter == page.regions.end()) continue;
       Log::getInstance()->log("SUBTITLES", Log::DEBUG, "Clear region %d", i->first);
-      osd->clearOSDArea(i->second.x, i->second.y,
+      if (!osdMenuShowing) osd->clearOSDArea(i->second.x, i->second.y,
            region_iter->second.getWidth(), region_iter->second.getHeight(),dds);
     }
   }
@@ -806,7 +806,8 @@ void DVBSubtitles::finishPage(const DVBSubtitlePage& page)
     region_iter = page.regions.find(i->first);
     if (region_iter == page.regions.end()) continue;
     Log::getInstance()->log("SUBTITLES", Log::DEBUG, "Display region %d", i->first);
-    osd->drawOSDBitmap(i->second.x, i->second.y, region_iter->second,dds);
+    if (!osdMenuShowing) osd->drawOSDBitmap(i->second.x, i->second.y,
+         region_iter->second,dds);
   }
 // after displaying regions set the page timeout timer
   SubtitleTimeout.Set(page.timeout * 1000);
@@ -876,7 +877,7 @@ void DVBSubtitles::stop()
       DVBSubtitlePage::RegionMap::const_iterator region_iter;
       region_iter = page.regions.find(i->first);
       if (region_iter == page.regions.end()) continue;
-      osd->clearOSDArea(i->second.x, i->second.y,
+      if (!osdMenuShowing) osd->clearOSDArea(i->second.x, i->second.y,
            region_iter->second.getWidth(), region_iter->second.getHeight(),dds);
     }
   }
@@ -907,7 +908,7 @@ void DVBSubtitles::hide()
       DVBSubtitlePage::RegionMap::const_iterator region_iter;
       region_iter = page.regions.find(i->first);
       if (region_iter == page.regions.end()) continue;
-      osd->clearOSDArea(i->second.x, i->second.y,
+      if (!osdMenuShowing) osd->clearOSDArea(i->second.x, i->second.y,
            region_iter->second.getWidth(), region_iter->second.getHeight(),dds);
     }
   }
@@ -945,7 +946,7 @@ void DVBSubtitles::threadMethod()
     if (SubtitleTimeout.TimedOut())  // do we have a subtitle timeout
     {
       lockOutput();
-      if(showing)
+      if (showing && !osdMenuShowing)  
        osd->clearOSD();      // if we have the timeout, lets clear the OSD
       unlockOutput();
     }
@@ -1059,3 +1060,11 @@ void DVBSubtitles::threadMethod()
     }
   }
 }
+
+void DVBSubtitles::setOSDMenuVisibility(bool visible)
+{
+  lockOutput();
+  osdMenuShowing = visible;
+  unlockOutput();
+}
+
index 1fb44527978690e5401e67f7f7700b829950c10d..d08f3c36b1e7b1a5e069ae19d9b48de82ffae03e 100644 (file)
@@ -126,6 +126,7 @@ class DVBSubtitles : public Thread_TYPE
     void stop();
     void show();
     void hide();
+    void setOSDMenuVisibility(bool visible);
 
   private:
     OSDReceiver* osd;
@@ -137,6 +138,7 @@ class DVBSubtitles : public Thread_TYPE
     void finishPage(const DVBSubtitlePage&);
     DVBSubtitleDisplayDefinition dds;
 
+    bool osdMenuShowing;
     bool running;
     bool showing;
     bool threadNudged;
index 091fb0a57d959de68c04833979b2b362f5642c87..790ed9acc365e35daef13305b87ebe903f7c5316 100644 (file)
--- a/player.cc
+++ b/player.cc
@@ -265,6 +265,10 @@ void  Player::turnSubtitlesOn(bool ison) {
 
 }
 
+void Player::tellSubtitlesOSDVisible(bool visible){
+subtitles->setOSDMenuVisibility(visible);
+}
+
 Channel * Player::getDemuxerChannel() {
     if (!is_pesrecording) {
         return ((DemuxerTS*) demuxer)->getChannelInfo();
index 12de87a8001d25ef2c7a22dee58c821950d0dee7..a798750ad9b07c935268621ffc00a102abc44291 100644 (file)
--- a/player.h
+++ b/player.h
@@ -64,6 +64,7 @@ class Player : public Thread_TYPE, public Callback
     bool toggleSubtitles();
     void turnSubtitlesOn(bool ison); 
     bool isSubtitlesOn() { return subtitlesShowing; }
+    void tellSubtitlesOSDVisible(bool visible);
 
     void play();
     void stop();
index 20f25c4a19fcebf86faf57de061c4d5c962cc41b..16eff3c4de5922f88c8ce89c5858dc936efb1a00 100644 (file)
@@ -183,6 +183,12 @@ void  PlayerLiveTV::turnSubtitlesOn(bool ison) {
   }
 
 }
+
+void PlayerLiveTV::tellSubtitlesOSDVisible(bool visible)
+{
+subtitles->setOSDMenuVisibility(visible);
+}
+
 // ----------------------------------- Externally called events
 
 void PlayerLiveTV::go(ULONG index)
index 4fba1c8984c0c1e430b4f25045d55a1d4bb79486..49bc9fe5e3cc3ef76f3663df7b9cdd31b48f0ff7 100644 (file)
@@ -72,6 +72,7 @@ class PlayerLiveTV : public PlayerLive, public Thread_TYPE, public Callback, pub
     virtual bool toggleSubtitles();
     virtual void turnSubtitlesOn(bool ison); 
     virtual bool isSubtitlesOn() {return subtitlesShowing;};
+    virtual void tellSubtitlesOSDVisible(bool visible);
 
     virtual bool* getDemuxerMpegAudioChannels();
     virtual bool* getDemuxerAc3AudioChannels();
index de95dc1fc66a91d6ab32845f6edc44d705a529e7..975a58afdd0a5681dad2b227bcc6ac224e830170 100644 (file)
 #include "timers.h"
 #include "boxstack.h"
 #include "remote.h"
+#include "playerlivetv.h"
 
 
-VTeletextView::VTeletextView(TeletextDecoderVBIEBU* TTdecoder,Boxx* playerview)
+VTeletextView::VTeletextView(TeletextDecoderVBIEBU* TTdecoder,Boxx* playerview, PlayerLiveTV* playerObj)
 {   
     ttdecoder=TTdecoder;
     pv=playerview;
+    player=playerObj;
     subtitlemode=false;
     
     
@@ -108,8 +110,9 @@ int VTeletextView::handleCommand(int command) {
     case Remote::OK:
         return 2;
     case Remote::BACK:
+        if(player) player->tellSubtitlesOSDVisible(false); // Only on liveTV
         return 4;
-     case Remote::ZERO:
+    case Remote::ZERO:
     case Remote::ONE:
     case Remote::TWO:
     case Remote::THREE:
index 01bf5e08fe895c32c1708040907129d72f69553a..d3d1f35aee9cebd89ee1d2e03421a397765747a7 100644 (file)
 #include "timerreceiver.h"
 #include "teletextdecodervbiebu.h"
 
+class PlayerLiveTV;
+
 class VTeletextView : public Boxx, public TimerReceiver
 {
   public:
-    VTeletextView (TeletextDecoderVBIEBU* TTdecoder, Boxx* playerview);
+    VTeletextView (TeletextDecoderVBIEBU* TTdecoder, Boxx* playerview,
+       PlayerLiveTV* palyerObj);
     ~VTeletextView ();
     void draw(bool completedraw, bool onlyfirstline);
     void draw() {draw(true,false);};
@@ -56,7 +59,8 @@ class VTeletextView : public Boxx, public TimerReceiver
       int keyindigit;
       int page;
       bool subtitlemode;
-     Boxx* pv;
+      Boxx* pv;
+      PlayerLiveTV* player;
     
 
 };
index 4c2f1bee1b3c7edfbb2e9bce082ba72bbeb7b8f3..e75adef2fc632d328bc83f6473df2e802797913a 100644 (file)
@@ -409,7 +409,10 @@ int VVideoLiveTV::handleCommand(int command)
     }
     case Remote::YELLOW:
     {
-      if (streamType ==VDR::VIDEO) doTeletext(); //TODO: Add a selector for subtitles or teletext
+      if (streamType ==VDR::VIDEO) 
+      {
+        doTeletext(); //TODO: Add a selector for subtitles or teletext
+      }
       return 2;
     }
     case Remote::GUIDE:
@@ -590,6 +593,7 @@ void VVideoLiveTV::doKey(int command)
 void VVideoLiveTV::doTeletext(bool subtitlemode)
 {
   if (streamType !=VDR::VIDEO) return;
+  (static_cast<PlayerLiveTV*>(player))->tellSubtitlesOSDVisible(true);
   bool exists=true;
 
   // Cancel keying
@@ -602,11 +606,12 @@ void VVideoLiveTV::doTeletext(bool subtitlemode)
     osdChanNum.setText(formatChanNum);
     osdChanName.setText((*chanList)[osdChannelIndex]->name);
   }
+  (static_cast<PlayerLiveTV*>(player))->tellSubtitlesOSDVisible(true);
   if (osd.getVisible()) clearScreen();
   // Draw the teletxt
   VTeletextView *vtxv=((PlayerLiveTV*)player)->getTeletextDecoder()->getTeletxtView();
   if (vtxv==NULL) {
-       vtxv= new VTeletextView(((PlayerLiveTV*)player)->getTeletextDecoder(),this);
+       vtxv= new VTeletextView(((PlayerLiveTV*)player)->getTeletextDecoder(),this, (PlayerLiveTV*)player);
       ((PlayerLiveTV*)player)->getTeletextDecoder()->registerTeletextView(vtxv);
       exists=false;
   }
@@ -750,6 +755,7 @@ void VVideoLiveTV::setSummaryData()
 
 void VVideoLiveTV::displayOSD(bool newNowNextData)
 {
+  (static_cast<PlayerLiveTV*>(player))->tellSubtitlesOSDVisible(true);
   osd.setVisible(true);
   if (newNowNextData)
   {
@@ -789,6 +795,8 @@ void VVideoLiveTV::clearScreen()
 
   draw();
   boxstack->update(this);
+
+  (static_cast<PlayerLiveTV*>(player))->tellSubtitlesOSDVisible(false);
 }
 
 void VVideoLiveTV::showUnavailable()
@@ -856,6 +864,7 @@ void VVideoLiveTV::timercall(int ref)
       boxstack->update(this, osd.getRegion());
 
       Log::getInstance()->log("VVideoLiveTV", Log::DEBUG, "Timer Call 1 notkey 3."); 
+      (static_cast<PlayerLiveTV*>(player))->tellSubtitlesOSDVisible(false);
       Log::getInstance()->log("VVideoLiveTV", Log::DEBUG, "Timer Call 1 notkey end."); 
     }
   }
index 654bc7785ac8254749dc5c8627c48f6164f52a46..d5d2e08a2068e4fe06d035704302f0a108130622 100644 (file)
@@ -427,7 +427,7 @@ void VVideoRec::doTeletext()
   // Draw the teletxt
   VTeletextView *vtxv=player->getTeletextDecoder()->getTeletxtView();
   if (vtxv==NULL) {
-       vtxv= new VTeletextView((player)->getTeletextDecoder(),this);
+       vtxv= new VTeletextView((player)->getTeletextDecoder(),this,NULL);
       (player)->getTeletextDecoder()->registerTeletextView(vtxv);
       exists=false;
   }
@@ -787,6 +787,8 @@ void VVideoRec::doAudioSelector()
 
 void VVideoRec::doBar(int action)
 {
+  clearOSD(); // remove dvbsubtitles
+  player->tellSubtitlesOSDVisible(true);
   barShowing = true;
 
   rectangle(barRegion, barBlue);
@@ -1039,10 +1041,13 @@ void VVideoRec::removeBar()
   barVasHold = false;
   rectangle(barRegion, transparent);
   boxstack->update(this, &barRegion);
+  player->tellSubtitlesOSDVisible(false);
 }
 
 void VVideoRec::doSummary()
 {
+  clearOSD(); // remove dvbsubtitles
+  player->tellSubtitlesOSDVisible(true);
   vsummary = new VInfo();
   vsummary->setTitleText(myRec->getProgName());
   vsummary->setBorderOn(1);
@@ -1073,6 +1078,7 @@ void VVideoRec::removeSummary()
     vsummary = NULL;
     draw();
     BoxStack::getInstance()->update(this);
+    player->tellSubtitlesOSDVisible(false);
   }
 }