[vdr-plugin-femon] 02/07: New upstream version 2.3.0~git20170108

Tobias Grimm tiber-guest at moszumanska.debian.org
Wed Dec 27 17:38:06 UTC 2017


This is an automated email from the git hooks/post-receive script.

tiber-guest pushed a commit to branch master
in repository vdr-plugin-femon.

commit 6374add0d8247513249ee135764887cef95c6059
Author: Tobias Grimm <etobi at debian.org>
Date:   Sun Jan 8 10:59:48 2017 +0100

    New upstream version 2.3.0~git20170108
---
 .gitignore       |   6 ++
 HISTORY          |  10 ++++
 Makefile         |   2 +-
 femon.c          |   9 +--
 h265.c           | 118 +++++++++++++++++++++++++++++++++++++++
 h265.h           |  44 +++++++++++++++
 osd.c            | 166 +++++++++++++++++++++++++++----------------------------
 osd.h            |   1 +
 po/de_DE.po      |   2 +-
 po/es_ES.po      |   2 +-
 po/et_EE.po      |   2 +-
 po/fi_FI.po      |   2 +-
 po/fr_FR.po      |   2 +-
 po/hu_HU.po      |   2 +-
 po/it_IT.po      |   2 +-
 po/lt_LT.po      |   2 +-
 po/ru_RU.po      |   2 +-
 po/sk_SK.po      |   2 +-
 po/uk_UA.po      |   2 +-
 po/zh_CN.po      |   2 +-
 po/zh_TW.po      |   2 +-
 receiver.c       |  11 +++-
 receiver.h       |   4 +-
 symbol.c         |   5 +-
 symbol.h         |   1 +
 symbols/h265.xpm |  23 ++++++++
 tools.c          |   3 +-
 video.h          |   3 +-
 28 files changed, 322 insertions(+), 110 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..13412ee
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.dependencies
+*.o
+*.so
+*~
+po/*.pot
+po/*.mo
diff --git a/HISTORY b/HISTORY
index 8ad877e..f703599 100644
--- a/HISTORY
+++ b/HISTORY
@@ -525,3 +525,13 @@ VDR Plugin 'femon' Revision History
 - Got rid of FEMON_DEBUG.
 - Added support for tracing modes.
 - Removed the 'femonclient' plugin.
+
+
+===================================
+VDR Plugin 'femon' Revision History
+===================================
+
+2015-XX-XX: Version 2.3.0
+
+- Updated for vdr-2.3.1.
+- Fixed frontend handling during a device switch.
diff --git a/Makefile b/Makefile
index 70e6837..988c1cf 100644
--- a/Makefile
+++ b/Makefile
@@ -61,7 +61,7 @@ all-redirect: all
 
 ### The object files (add further files here):
 
-OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o
+OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o h265.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o
 
 ### The main target:
 
diff --git a/femon.c b/femon.c
index 91b4846..fb000df 100644
--- a/femon.c
+++ b/femon.c
@@ -17,15 +17,15 @@
 #include "tools.h"
 #include "setup.h"
 
-#if defined(APIVERSNUM) && APIVERSNUM < 20200
-#error "VDR-2.2.0 API version or greater is required!"
+#if defined(APIVERSNUM) && APIVERSNUM < 20302
+#error "VDR-2.3.2 API version or greater is required!"
 #endif
 
 #ifndef GITVERSION
 #define GITVERSION ""
 #endif
 
-static const char VERSION[]       = "2.2.1" GITVERSION;
+static const char VERSION[]       = "2.3.0" GITVERSION;
 static const char DESCRIPTION[]   = trNOOP("DVB Signal Information Monitor (OSD)");
 static const char MAINMENUENTRY[] = trNOOP("Signal Information");
 
@@ -120,7 +120,8 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
 {
   // Perform the action when selected from the main VDR menu.
   debug1("%s", __PRETTY_FUNCTION__);
-  if (cControl::Control() || (Channels.Count() <= 0))
+  LOCK_CHANNELS_READ;
+  if (cControl::Control() || (Channels->Count() <= 0))
      Skins.Message(mtInfo, tr("Femon not available"));
   else
      return cFemonOsd::Instance(true);
diff --git a/h265.c b/h265.c
new file mode 100644
index 0000000..31a02e3
--- /dev/null
+++ b/h265.c
@@ -0,0 +1,118 @@
+/*
+ * h265.c: Frontend Status Monitor plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+
+#include "log.h"
+#include "tools.h"
+#include "h265.h"
+
+cFemonH265::cFemonH265(cFemonVideoIf *videoHandlerP)
+: videoHandlerM(videoHandlerP),
+  widthM(0),
+  heightM(0),
+  aspectRatioM(VIDEO_ASPECT_RATIO_INVALID),
+  formatM(VIDEO_FORMAT_INVALID),
+  frameRateM(0),
+  bitRateM(0),
+  scanM(VIDEO_SCAN_INVALID)
+{
+  reset();
+}
+
+cFemonH265::~cFemonH265()
+{
+}
+
+bool cFemonH265::processVideo(const uint8_t *bufP, int lenP)
+{
+  bool aud_found = false;
+  const uint8_t *buf = bufP;
+  const uint8_t *start = buf;
+  const uint8_t *end = start + lenP;
+
+  if (!videoHandlerM)
+     return false;
+
+  // skip PES header
+  if (!PesLongEnough(lenP))
+      return false;
+  buf += PesPayloadOffset(buf);
+  start = buf;
+
+  reset();
+
+  for (;;) {
+      int consumed = 0;
+
+      buf = nextStartCode(buf, end);
+      if (buf >= end)
+         break;
+
+      switch ((buf[3] >> 1) & 0x3F) {
+        case NAL_AUD:
+             if (!aud_found) {
+                aud_found = true;
+                debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
+                }
+             break;
+
+        default:
+             break;
+        }
+
+      if (aud_found)
+         break;
+
+      buf += consumed + 4;
+      }
+
+  if (aud_found) {
+     videoHandlerM->SetVideoCodec(VIDEO_CODEC_H265);
+     //videoHandlerM->SetVideoFormat(formatM);
+     //videoHandlerM->SetVideoSize(widthM, heightM);
+     //videoHandlerM->SetVideoAspectRatio(aspectRatioM);
+     //videoHandlerM->SetVideoBitrate(bitRateM);
+     //videoHandlerM->SetVideoScan(scanM);
+     //videoHandlerM->SetVideoFramerate((scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM);
+     }
+
+  return aud_found;
+}
+
+void cFemonH265::reset()
+{
+}
+
+const uint8_t *cFemonH265::nextStartCode(const uint8_t *startP, const uint8_t *endP)
+{
+  for (endP -= 3; startP < endP; ++startP) {
+      if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01))
+         return startP;
+      }
+  return (endP + 3);
+}
+
+int cFemonH265::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
+{
+  int s = 0, d = 0;
+
+  while (s < lenP) {
+    if (!srcP[s] && !srcP[s + 1]) {
+       // hit 00 00 xx
+       dstP[d] = dstP[d + 1] = 0;
+       s += 2;
+       d += 2;
+       if (srcP[s] == 3) {
+          s++; // 00 00 03 xx --> 00 00 xx
+          if (s >= lenP)
+             return d;
+          }
+       }
+    dstP[d++] = srcP[s++];
+    }
+
+  return d;
+}
diff --git a/h265.h b/h265.h
new file mode 100644
index 0000000..30d8dbf
--- /dev/null
+++ b/h265.h
@@ -0,0 +1,44 @@
+/*
+ * h265.h: Frontend Status Monitor plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+
+#ifndef __FEMON_H265_H
+#define __FEMON_H265_H
+
+#include "video.h"
+
+class cFemonH265 {
+private:
+  enum {
+    NAL_VPS = 32, // Video Parameter Set
+    NAL_SPS = 33, // Sequence Parameter Set
+    NAL_PPS = 34, // Picture Parameter Set
+    NAL_AUD = 35, // Access Unit Delimiter
+    NAL_EOS = 36, // End of Sequence
+    NAL_EOB = 37, // End of Bitstream
+  };
+
+  cFemonVideoIf    *videoHandlerM;
+  uint32_t          widthM;
+  uint32_t          heightM;
+  eVideoAspectRatio aspectRatioM;
+  eVideoFormat      formatM;
+  double            frameRateM;
+  double            bitRateM;
+  eVideoScan        scanM;
+
+  void           reset();
+  const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
+  int            nalUnescape(uint8_t *dst, const uint8_t *src, int len);
+
+public:
+  cFemonH265(cFemonVideoIf *videoHandlerP);
+  virtual ~cFemonH265();
+
+  bool processVideo(const uint8_t *bufP, int lenP);
+  };
+
+#endif //__FEMON_H265_H
diff --git a/osd.c b/osd.c
index 7158642..dab3fab 100644
--- a/osd.c
+++ b/osd.c
@@ -144,6 +144,7 @@
 
 class cFemonDummyFont : public cFont {
 public:
+  virtual int Width(void) const { return 10; }
   virtual int Width(uint cP) const { return 10; }
   virtual int Width(const char *sP) const { return 50; }
   virtual int Height(void) const { return 20; }
@@ -250,7 +251,8 @@ cFemonOsd::~cFemonOsd(void)
 void cFemonOsd::DrawStatusWindow(void)
 {
   cMutexLock lock(&mutexM);
-  cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
 
   if (osdM && channel) {
      cBitmap *bm = NULL;
@@ -339,6 +341,7 @@ void cFemonOsd::DrawStatusWindow(void)
         switch (receiverM->VideoCodec()) {
            case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break;
            case VIDEO_CODEC_H264:  bm = &OSDSYMBOL(SYMBOL_H264);  break;
+           case VIDEO_CODEC_H265:  bm = &OSDSYMBOL(SYMBOL_H265);  break;
            default:                bm = NULL;                     break;
            }
         OSDDRAWSTATUSBM(OSDSPACING);
@@ -394,7 +397,8 @@ void cFemonOsd::DrawStatusWindow(void)
 void cFemonOsd::DrawInfoWindow(void)
 {
   cMutexLock lock(&mutexM);
-  cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
 
   if (osdM && channel) {
      int offset = 0;
@@ -716,7 +720,48 @@ void cFemonOsd::Show(void)
 {
   debug1("%s", __PRETTY_FUNCTION__);
   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
-  const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
+
+  AttachFrontend();
+
+  osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM);
+  if (osdM) {
+     tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
+     if (Setup.AntiAlias && osdM->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
+        osdM->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea));
+        }
+     else {
+        tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0),          OSDWIDTH - 1, OSDSTATUSWIN_Y(0) + OSDSTATUSHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].bpp },
+                           { 0, OSDINFOWIN_Y(0),            OSDWIDTH - 1, OSDINFOWIN_Y(0)   + OSDROWHEIGHT    - 1, FemonTheme[FemonConfig.GetTheme()].bpp },
+                           { 0, OSDINFOWIN_Y(OSDROWHEIGHT), OSDWIDTH - 1, OSDINFOWIN_Y(0)   + OSDINFOHEIGHT   - 1, 2                                 } };
+        osdM->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea));
+        }
+     OSDCLEARSTATUS();
+     OSDCLEARINFO();
+     osdM->Flush();
+     if (receiverM) {
+        receiverM->Deactivate();
+        DELETENULL(receiverM);
+        }
+     if (FemonConfig.GetAnalyzeStream() && channel) {
+        receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
+        cDevice::ActualDevice()->AttachReceiver(receiverM);
+        }
+     Start();
+     }
+}
+
+bool cFemonOsd::AttachFrontend(void)
+{
+  debug1("%s", __PRETTY_FUNCTION__);
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
+
+  if (frontendM >= 0) {
+     close(frontendM);
+     frontendM = -1;
+     }
 
   deviceSourceM = DEVICESOURCE_DVBAPI;
   if (channel) {
@@ -737,54 +782,31 @@ void cFemonOsd::Show(void)
               close(frontendM);
               frontendM = -1;
               memset(&frontendInfoM, 0, sizeof(frontendInfoM));
-              return;
+              return false;
               }
            }
         else if (FemonConfig.GetUseSvdrp()) {
            if (!SvdrpConnect() || !SvdrpTune())
-              return;
+              return false;
            }
         else {
            error("%s Cannot open frontend device", __PRETTY_FUNCTION__);
-           return;
+           return false;
            }
         }
      }
   else
      frontendM = -1;
 
-  osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM);
-  if (osdM) {
-     tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
-     if (Setup.AntiAlias && osdM->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
-        osdM->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea));
-        }
-     else {
-        tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0),          OSDWIDTH - 1, OSDSTATUSWIN_Y(0) + OSDSTATUSHEIGHT - 1, FemonTheme[FemonConfig.GetTheme()].bpp },
-                           { 0, OSDINFOWIN_Y(0),            OSDWIDTH - 1, OSDINFOWIN_Y(0)   + OSDROWHEIGHT    - 1, FemonTheme[FemonConfig.GetTheme()].bpp },
-                           { 0, OSDINFOWIN_Y(OSDROWHEIGHT), OSDWIDTH - 1, OSDINFOWIN_Y(0)   + OSDINFOHEIGHT   - 1, 2                                 } };
-        osdM->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea));
-        }
-     OSDCLEARSTATUS();
-     OSDCLEARINFO();
-     osdM->Flush();
-     if (receiverM) {
-        receiverM->Deactivate();
-        DELETENULL(receiverM);
-        }
-     if (FemonConfig.GetAnalyzeStream() && channel) {
-        receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
-        cDevice::ActualDevice()->AttachReceiver(receiverM);
-        }
-     Start();
-     }
+  return true;
 }
 
 void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP)
 {
   debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP);
   eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
-  const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
 
   if (!deviceP || !liveViewP)
      return;
@@ -797,49 +819,13 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool
      return;
      }
 
-  if (channel && FemonConfig.GetAnalyzeStream()) {
-     deviceSourceM = DEVICESOURCE_DVBAPI;
-     if (channel->IsSourceType('I'))
-        deviceSourceM = DEVICESOURCE_IPTV;
-     else if (channel->IsSourceType('V'))
-        deviceSourceM = DEVICESOURCE_PVRINPUT;
-
-     if (frontendM >= 0) {
-        close(frontendM);
-        frontendM = -1;
-        }
-
-     if (deviceSourceM == DEVICESOURCE_DVBAPI) {
-        if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
-           cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
-           frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
-           if (frontendM >= 0) {
-              if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) {
-                 if (!FemonConfig.GetUseSvdrp())
-                    error("%s Cannot read frontend info", __PRETTY_FUNCTION__);
-                 close(frontendM);
-                 frontendM = -1;
-                 memset(&frontendInfoM, 0, sizeof(frontendInfoM));
-                 return;
-                 }
-              }
-           else if (FemonConfig.GetUseSvdrp()) {
-              if (!SvdrpConnect() || !SvdrpTune())
-                 return;
-              }
-           else {
-              error("%s Cannot open frontend device", __PRETTY_FUNCTION__);
-              return;
-              }
-           }
-
-        if (receiverM) {
-           receiverM->Deactivate();
-           DELETENULL(receiverM);
-           }
-        receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
-        cDevice::ActualDevice()->AttachReceiver(receiverM);
+  if (channel && FemonConfig.GetAnalyzeStream() && AttachFrontend()) {
+     if (receiverM) {
+        receiverM->Deactivate();
+        DELETENULL(receiverM);
         }
+     receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
+     cDevice::ActualDevice()->AttachReceiver(receiverM);
      }
 }
 
@@ -852,7 +838,8 @@ void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP)
      DELETENULL(receiverM);
      }
   if (FemonConfig.GetAnalyzeStream()) {
-     const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+     LOCK_CHANNELS_READ;
+     const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
      if (channel) {
         receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
         cDevice::ActualDevice()->AttachReceiver(receiverM);
@@ -866,7 +853,8 @@ bool cFemonOsd::DeviceSwitch(int directionP)
   int device = cDevice::ActualDevice()->DeviceNumber();
   int direction = sgn(directionP);
   if (device >= 0) {
-     cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+     LOCK_CHANNELS_READ;
+     const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
      if (channel) {
         for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
             if (direction >= 0) {
@@ -939,12 +927,13 @@ bool cFemonOsd::DeviceSwitch(int directionP)
                   d->CamSlot()->Assign(NULL);
                d->SwitchChannel(channel, false);
                cControl::Launch(new cTransferControl(d, channel));
-               return (true);
+               AttachFrontend();
+               return true;
                }
             }
         }
      }
-   return (false);
+   return false;
 }
 
 bool cFemonOsd::SvdrpConnect(void)
@@ -978,7 +967,8 @@ bool cFemonOsd::SvdrpConnect(void)
 bool cFemonOsd::SvdrpTune(void)
 {
    if (svdrpPluginM && svdrpConnectionM.handle >= 0) {
-      cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+      LOCK_CHANNELS_READ;
+      const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
       if (channel) {
          SvdrpCommand_v1_0 cmd;
          cmd.handle = svdrpConnectionM.handle;
@@ -1038,7 +1028,8 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
             if ((numberM == 0) && (oldNumberM != 0)) {
                numberM = oldNumberM;
                oldNumberM = cDevice::CurrentChannel();
-               Channels.SwitchTo(numberM);
+               LOCK_CHANNELS_READ;
+               Channels->SwitchTo(numberM);
                numberM = 0;
                return osContinue;
                }
@@ -1047,11 +1038,12 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
                numberM = numberM * 10 + keyP - k0;
                if (numberM > 0) {
                   DrawStatusWindow();
-                  cChannel *ch = Channels.GetByNumber(numberM);
+                  LOCK_CHANNELS_READ;
+                  const cChannel *ch = Channels->GetByNumber(numberM);
                   inputTimeM.Set(0);
                   // Lets see if there can be any useful further input:
                   int n = ch ? numberM * 10 : 0;
-                  while (ch && (ch = Channels.Next(ch)) != NULL) {
+                  while (ch && (ch = Channels->Next(ch)) != NULL) {
                         if (!ch->GroupSep()) {
                            if (n <= ch->Number() && ch->Number() <= n + 9) {
                               n = 0;
@@ -1064,7 +1056,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
                   if (n > 0) {
                      // This channel is the only one that fits the input, so let's take it right away:
                      oldNumberM = cDevice::CurrentChannel();
-                     Channels.SwitchTo(numberM);
+                     Channels->SwitchTo(numberM);
                      numberM = 0;
                      }
                   }
@@ -1124,9 +1116,10 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
             break;
        case kNone:
             if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) {
-               if (Channels.GetByNumber(numberM)) {
+               LOCK_CHANNELS_READ;
+               if (Channels->GetByNumber(numberM)) {
                   oldNumberM = cDevice::CurrentChannel();
-                  Channels.SwitchTo(numberM);
+                  Channels->SwitchTo(numberM);
                   numberM = 0;
                   }
                else {
@@ -1138,7 +1131,8 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
        case kOk:
             {
             // toggle between display modes
-            cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+            LOCK_CHANNELS_READ;
+            const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
             if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++;
             if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0;
             DrawInfoWindow();
diff --git a/osd.h b/osd.h
index 4428763..88de8b0 100644
--- a/osd.h
+++ b/osd.h
@@ -72,6 +72,7 @@ private:
   cCondWait         sleepM;
   cMutex            mutexM;
 
+  bool AttachFrontend(void);
   void DrawStatusWindow(void);
   void DrawInfoWindow(void);
   bool SvdrpConnect(void);
diff --git a/po/de_DE.po b/po/de_DE.po
index 5dd2004..92f9e2d 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -7,7 +7,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/es_ES.po b/po/es_ES.po
index b93f35f..ce68781 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/et_EE.po b/po/et_EE.po
index d114787..fde546c 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index 9c936b4..0ac7ed1 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 531fb23..b49a723 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -7,7 +7,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 88a29ca..f913b41 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/it_IT.po b/po/it_IT.po
index 8818e2f..af8c8bb 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -6,7 +6,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/lt_LT.po b/po/lt_LT.po
index ee2b3fc..9266f18 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/ru_RU.po b/po/ru_RU.po
index ac65c8b..4540479 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/sk_SK.po b/po/sk_SK.po
index 5f40aa9..0f6474a 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/uk_UA.po b/po/uk_UA.po
index 56efac1..d32ea1e 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
@@ -4,7 +4,7 @@
 # Yarema aka Knedlyk <yupadmin at gmail.com>, 2010.
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index b4b3865..ef80319 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index e7d246d..67f94c6 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -5,7 +5,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: vdr-femon 2.2.1\n"
+"Project-Id-Version: vdr-femon 2.3.0\n"
 "Report-Msgid-Bugs-To: <see README>\n"
 "POT-Creation-Date: 2015-04-04 04:04+0300\n"
 "PO-Revision-Date: 2015-04-04 04:04+0300\n"
diff --git a/receiver.c b/receiver.c
index 4401dab..240f1a1 100644
--- a/receiver.c
+++ b/receiver.c
@@ -19,6 +19,7 @@ cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrack
   sleepM(),
   activeM(false),
   detectH264M(this),
+  detectH265M(this),
   detectMpegM(this, this),
   detectAacM(this),
   detectLatmM(this),
@@ -101,7 +102,7 @@ void cFemonReceiver::Activate(bool onP)
      Deactivate();
 }
 
-void cFemonReceiver::Receive(uchar *dataP, int lengthP)
+void cFemonReceiver::Receive(const uchar *dataP, int lengthP)
 {
   // TS packet length: TS_SIZE
   if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) {
@@ -163,12 +164,18 @@ void cFemonReceiver::Action(void)
       processed = true;
       if (TsPayloadStart(Data)) {
          while (const uint8_t *p = videoAssemblerM.GetPes(len)) {
-           if (videoTypeM == 0x1B) { // MPEG4
+           if (videoTypeM == 0x1B) {
               if (detectH264M.processVideo(p, len)) {
                  videoValidM = true;
                  break;
                  }
               }
+           else if (videoTypeM == 0x24) {
+              if (detectH265M.processVideo(p, len)) {
+                 videoValidM = true;
+                 break;
+                 }
+              }
            else {
               if (detectMpegM.processVideo(p, len)) {
                  videoValidM = true;
diff --git a/receiver.h b/receiver.h
index c4b5ecf..b2e6891 100644
--- a/receiver.h
+++ b/receiver.h
@@ -15,6 +15,7 @@
 #include "ac3.h"
 #include "audio.h"
 #include "h264.h"
+#include "h265.h"
 #include "latm.h"
 #include "mpeg.h"
 #include "tools.h"
@@ -27,6 +28,7 @@ private:
   bool              activeM;
 
   cFemonH264        detectH264M;
+  cFemonH265        detectH265M;
   cFemonMPEG        detectMpegM;
   cFemonAAC         detectAacM;
   cFemonLATM        detectLatmM;
@@ -59,7 +61,7 @@ private:
 
 protected:
   virtual void Activate(bool onP);
-  virtual void Receive(uchar *dataP, int lengthP);
+  virtual void Receive(const uchar *dataP, int lengthP);
   virtual void Action(void);
 
 public:
diff --git a/symbol.c b/symbol.c
index 618db31..6dc6084 100644
--- a/symbol.c
+++ b/symbol.c
@@ -19,6 +19,7 @@
 #include "symbols/dolbydigital51.xpm"
 #include "symbols/mpeg2.xpm"
 #include "symbols/h264.xpm"
+#include "symbols/h265.xpm"
 #include "symbols/ntsc.xpm"
 #include "symbols/pal.xpm"
 #include "symbols/encrypted.xpm"
@@ -64,6 +65,7 @@ static cBitmap bmDolbyDigital20(dolbydigital20_xpm);
 static cBitmap bmDolbyDigital51(dolbydigital51_xpm);
 static cBitmap bmMpeg2(mpeg2_xpm);
 static cBitmap bmH264(h264_xpm);
+static cBitmap bmH265(h265_xpm);
 static cBitmap bmPal(pal_xpm);
 static cBitmap bmNtsc(ntsc_xpm);
 static cBitmap bmEncrypted(encrypted_xpm);
@@ -146,6 +148,7 @@ bool cFemonSymbolCache::Populate(void)
      cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM));  // SYMBOL_DD51
      cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM));           // SYMBOL_MPEG2
      cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_H264
+     cacheM.Append(bmH265.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_H265
      cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM));             // SYMBOL_PAL
      cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM));            // SYMBOL_NTSC
      cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM));       // SYMBOL_ENCRYPTED
@@ -201,7 +204,7 @@ bool cFemonSymbolCache::Flush(void)
 
 cBitmap& cFemonSymbolCache::Get(eSymbols symbolP)
 {
-  cBitmap *bitmapM = cacheM[SYMBOL_ONEPIXEL];
+  cBitmap *bitmapM = &bmOnePixel;
 
   if (symbolP < cacheM.Size())
      bitmapM = cacheM[symbolP];
diff --git a/symbol.h b/symbol.h
index de8a462..fbfed60 100644
--- a/symbol.h
+++ b/symbol.h
@@ -21,6 +21,7 @@ enum eSymbols {
   SYMBOL_DD51,
   SYMBOL_MPEG2,
   SYMBOL_H264,
+  SYMBOL_H265,
   SYMBOL_PAL,
   SYMBOL_NTSC,
   SYMBOL_ENCRYPTED,
diff --git a/symbols/h265.xpm b/symbols/h265.xpm
new file mode 100644
index 0000000..7be7c20
--- /dev/null
+++ b/symbols/h265.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *const h265_xpm[] = {
+"40 18 2 1",
+".	c #FFFFFF",
+"+	c #000000",
+"++++++++++++++++++++++++++++++++++++++++",
+"+......................................+",
+"+..++...++.....+++++...+++++..+++++++..+",
+"+..++...++....+++++++.+++++++.+++++++..+",
+"+..++...++....++...++.++...++.++.......+",
+"+..++...++.........++.++......++.......+",
+"+..++...++.........++.++......++.......+",
+"+..++...++........+++.++......++.......+",
+"+..+++++++.......+++..++++++..++++++...+",
+"+..+++++++......+++...+++++++.+++++++..+",
+"+..++...++.....+++....++...++.....+++..+",
+"+..++...++....+++.....++...++......++..+",
+"+..++...++....++......++...++......++..+",
+"+..++...++....++...++.++...++.++...++..+",
+"+..++...++.++.+++++++.+++++++.++...++..+",
+"+..++...++.++.+++++++..+++++...+++++...+",
+"+......................................+",
+"++++++++++++++++++++++++++++++++++++++++"};
diff --git a/tools.c b/tools.c
index 3dafc52..9d012cd 100644
--- a/tools.c
+++ b/tools.c
@@ -110,7 +110,8 @@ cString getFrontendInfo(cDvbDevice *deviceP)
   uint16_t snr = 0;
   uint32_t ber = 0;
   uint32_t unc = 0;
-  cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  LOCK_CHANNELS_READ;
+  const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
 
   if (!deviceP)
      return info;
diff --git a/video.h b/video.h
index 01ff131..e75e7e7 100644
--- a/video.h
+++ b/video.h
@@ -12,7 +12,8 @@ enum eVideoCodec {
   VIDEO_CODEC_INVALID = -1,
   VIDEO_CODEC_UNKNOWN,
   VIDEO_CODEC_MPEG2,
-  VIDEO_CODEC_H264
+  VIDEO_CODEC_H264,
+  VIDEO_CODEC_H265
   };
 
 enum eVideoFormat {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-vdr-dvb/vdr-plugin-femon.git



More information about the pkg-vdr-dvb-changes mailing list