[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