1
0
mirror of https://github.com/rofafor/vdr-plugin-femon.git synced 2023-10-10 11:36:53 +00:00

Compare commits

..

18 Commits

Author SHA1 Message Date
Rolf Ahrenberg
a2a2a27ef3 Prepared for a release. 2015-04-04 14:09:25 +03:00
Rolf Ahrenberg
1d136bd109 Removed femonclient. 2015-03-07 23:07:11 +02:00
Rolf Ahrenberg
6735c6807c Got rid of FEMON_DEBUG. 2015-03-07 23:03:41 +02:00
Rolf Ahrenberg
2bcf1bbadc Renamed source files. 2015-03-07 23:01:03 +02:00
Rolf Ahrenberg
9d9a8f5a49 Added support for tracing modes. 2015-03-07 22:18:38 +02:00
Rolf Ahrenberg
6875f81c60 Refactored configuration handling. 2015-03-07 21:37:46 +02:00
Rolf Ahrenberg
43a071c7fd Moved setup menu into a separate file. 2015-03-07 20:37:07 +02:00
Rolf Ahrenberg
bdb9595cbe Refactored class members. 2015-03-07 20:25:36 +02:00
Rolf Ahrenberg
9420ab95e3 Updated the APIVERSNUM requirement. 2015-02-20 20:39:32 +02:00
Rolf Ahrenberg
89b7befce4 Updated the copyright year. 2015-02-15 19:11:30 +02:00
Rolf Ahrenberg
5b0f1e2572 Merge pull request #1 from varaslt/master
Added missing lithuanian translations
2015-02-12 23:49:06 +02:00
Valdemaras Pipiras
e38047eab0 Added missing lithuanian translations 2015-02-12 23:48:51 +02:00
Rolf Ahrenberg
377e73dfe1 Simplified ChannelSwitch(). 2015-02-08 23:27:16 +02:00
Rolf Ahrenberg
749e3e3238 Fixed the detaching of receiver during a channel switch. 2015-02-08 20:07:11 +02:00
Rolf Ahrenberg
7f1e5130a6 Updated for vdr-2.1.8. 2015-02-08 15:34:01 +02:00
Rolf Ahrenberg
667da1f5fe Check for SAT>IP devices first. 2015-02-07 18:51:35 +02:00
Rolf Ahrenberg
e043190855 Updated CA definitions. 2015-01-10 14:42:21 +02:00
Rolf Ahrenberg
3a2af94f74 Fixed the SVDRP service IP menu item (Thanks to Toerless Eckert). 2015-01-05 22:16:12 +02:00
53 changed files with 3489 additions and 3248 deletions

20
HISTORY
View File

@@ -505,3 +505,23 @@ VDR Plugin 'femon' Revision History
2014-05-10: Version 2.1.1
- Fixed the channel frequency value.
2015-01-10: Version 2.1.2
===================================
VDR Plugin 'femon' Revision History
===================================
2015-02-19: Version 2.2.0
- Updated for vdr-2.2.0.
- Updated CA definitions.
- Fixed the SVDRP service IP menu item (Thanks to Toerless Eckert).
- Fixed the detaching of receiver during a channel switch.
2015-04-04: Version 2.2.1
- Got rid of FEMON_DEBUG.
- Added support for tracing modes.
- Removed the 'femonclient' plugin.

View File

@@ -2,14 +2,6 @@
# Makefile for Frontend Status Monitor plugin
#
# Debugging on/off
#FEMON_DEBUG = 1
# Strip debug symbols? Set eg. to /bin/true if not
STRIP = strip
# The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name.
@@ -35,6 +27,7 @@ TMPDIR ?= /tmp
export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags)
STRIP ?= /bin/true
### The version number of VDR's plugin API:
@@ -59,10 +52,6 @@ INCLUDES +=
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef FEMON_DEBUG
DEFINES += -DDEBUG
endif
ifneq ($(strip $(GITTAG)),)
DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"'
endif
@@ -72,7 +61,7 @@ all-redirect: all
### The object files (add further files here):
OBJS = $(PLUGIN).o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonlatm.o femonh264.o femonsymbol.o
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
### The main target:
@@ -122,9 +111,7 @@ install-i18n: $(I18Nmsgs)
$(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
ifndef FEMON_DEBUG
@$(STRIP) $@
endif
install-lib: $(SOFILE)
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)

View File

@@ -1,22 +1,22 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* aac.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonaac.h"
#include "tools.h"
#include "aac.h"
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0))
int cFemonAAC::s_Samplerates[16] =
int cFemonAAC::sampleRateS[16] =
{
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1
};
cFemonAAC::cFemonAAC(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
cFemonAAC::cFemonAAC(cFemonAudioIf *audioHandlerP)
: audioHandlerM(audioHandlerP)
{
}
@@ -24,11 +24,11 @@ cFemonAAC::~cFemonAAC()
{
}
bool cFemonAAC::processAudio(const uint8_t *buf, int len)
bool cFemonAAC::processAudio(const uint8_t *bufP, int lenP)
{
cFemonBitStream bs(buf, len * 8);
cFemonBitStream bs(bufP, lenP * 8);
if (!m_AudioHandler)
if (!audioHandlerM)
return false;
/* ADTS Fixed Header:
@@ -46,9 +46,9 @@ bool cFemonAAC::processAudio(const uint8_t *buf, int len)
*/
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(bufP));
// HE-AAC audio detection
if (bs.GetBits(12) != 0xFFF) // syncword
@@ -66,38 +66,38 @@ bool cFemonAAC::processAudio(const uint8_t *buf, int len)
bs.SkipBit(); // private pid
int channel_configuration = bs.GetBits(3); // channel_configuration
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC);
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
audioHandlerM->SetAudioCodec(AUDIO_CODEC_HEAAC);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
switch (channel_configuration) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (sampling_frequency_index) {
case 0xC ... 0xF:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency_index]);
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency_index]);
break;
}

26
aac.h Normal file
View File

@@ -0,0 +1,26 @@
/*
* aac.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_AAC_H
#define __FEMON_AAC_H
#include "audio.h"
class cFemonAAC {
private:
cFemonAudioIf *audioHandlerM;
static int sampleRateS[16];
public:
cFemonAAC(cFemonAudioIf *audioHandlerP);
virtual ~cFemonAAC();
bool processAudio(const uint8_t *bufP, int lenP);
};
#endif //__FEMON_AAC_H

View File

@@ -1,33 +1,33 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* ac3.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
*/
#include "femontools.h"
#include "femonac3.h"
#include "tools.h"
#include "ac3.h"
int cFemonAC3::s_Bitrates[32] =
int cFemonAC3::bitrateS[32] =
{
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int cFemonAC3::s_Frequencies[4] =
int cFemonAC3::frequencieS[4] =
{
480, 441, 320, 0
};
int cFemonAC3::s_Frames[3][32] =
int cFemonAC3::frameS[3][32] =
{
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
cFemonAC3::cFemonAC3(cFemonAC3If *audiohandler)
: m_AudioHandler(audiohandler)
cFemonAC3::cFemonAC3(cFemonAC3If *audioHandlerP)
: audioHandlerM(audioHandlerP)
{
}
@@ -35,21 +35,21 @@ cFemonAC3::~cFemonAC3()
{
}
bool cFemonAC3::processAudio(const uint8_t *buf, int len)
bool cFemonAC3::processAudio(const uint8_t *bufP, int lenP)
{
int fscod, frmsizcod, bsmod, acmod;
int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
cFemonBitStream bs(buf, len * 8);
cFemonBitStream bs(bufP, lenP * 8);
if (!m_AudioHandler)
if (!audioHandlerM)
return false;
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(bufP));
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
@@ -78,16 +78,16 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
if (acmod == 0x02)
dolbysurroundmode = bs.GetBits(2);
m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]);
m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]);
m_AudioHandler->SetAC3Bitstream(bsmod);
m_AudioHandler->SetAC3AudioCoding(acmod);
m_AudioHandler->SetAC3CenterMix(centermixlevel);
m_AudioHandler->SetAC3SurroundMix(surroundmixlevel);
m_AudioHandler->SetAC3DolbySurround(dolbysurroundmode);
audioHandlerM->SetAC3Bitrate(1000 * bitrateS[frmsizcod >> 1]);
audioHandlerM->SetAC3SamplingFrequency(100 * frequencieS[fscod]);
audioHandlerM->SetAC3Bitstream(bsmod);
audioHandlerM->SetAC3AudioCoding(acmod);
audioHandlerM->SetAC3CenterMix(centermixlevel);
audioHandlerM->SetAC3SurroundMix(surroundmixlevel);
audioHandlerM->SetAC3DolbySurround(dolbysurroundmode);
m_AudioHandler->SetAC3LFE(bs.GetBit()); // low frequency effects on
m_AudioHandler->SetAC3Dialog(bs.GetBits(5)); // dialog normalization
audioHandlerM->SetAC3LFE(bs.GetBit()); // low frequency effects on
audioHandlerM->SetAC3Dialog(bs.GetBits(5)); // dialog normalization
return true;
}

28
ac3.h Normal file
View File

@@ -0,0 +1,28 @@
/*
* ac3.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_AC3_H
#define __FEMON_AC3_H
#include "audio.h"
class cFemonAC3 {
private:
cFemonAC3If *audioHandlerM;
static int bitrateS[32];
static int frequencieS[4];
static int frameS[3][32];
public:
cFemonAC3(cFemonAC3If *audioHandlerP);
virtual ~cFemonAC3();
bool processAudio(const uint8_t *bufP, int lenP);
};
#endif //__FEMON_AC3_H

View File

@@ -1,12 +1,12 @@
/*
* Frontend Status Monitor plugin for the AUDIO Disk Recorder
* audio.h: Frontend Status Monitor plugin for the AUDIO Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONAUDIO_H
#define __FEMONAUDIO_H
#ifndef __FEMON_AUDIO_H
#define __FEMON_AUDIO_H
enum eAudioCodec {
AUDIO_CODEC_INVALID = -1,
@@ -113,13 +113,13 @@ public:
virtual ~cFemonAudioIf() {}
// enum
virtual void SetAudioCodec(eAudioCodec codec) = 0;
virtual void SetAudioCodec(eAudioCodec codecP) = 0;
// kbit/s or eAudioBitrate
virtual void SetAudioBitrate(double bitrate) = 0;
virtual void SetAudioBitrate(double bitRateP) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAudioSamplingFrequency(int sampling) = 0;
virtual void SetAudioSamplingFrequency(int samplingP) = 0;
// eAudioChannelMode
virtual void SetAudioChannel(eAudioChannelMode mode) = 0;
virtual void SetAudioChannel(eAudioChannelMode modeP) = 0;
};
class cFemonAC3If {
@@ -128,23 +128,23 @@ public:
virtual ~cFemonAC3If() {}
// bit/s or eAudioBitrate
virtual void SetAC3Bitrate(int bitrate) = 0;
virtual void SetAC3Bitrate(int bitRateP) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAC3SamplingFrequency(int sampling) = 0;
virtual void SetAC3SamplingFrequency(int samplingP) = 0;
// 0..7 or eAudioBitstreamMode
virtual void SetAC3Bitstream(int mode) = 0;
virtual void SetAC3Bitstream(int modeP) = 0;
// 0..7 or eAudioCodingMode
virtual void SetAC3AudioCoding(int mode) = 0;
virtual void SetAC3AudioCoding(int modeP) = 0;
// eAudioDolbySurroundMode
virtual void SetAC3DolbySurround(int mode) = 0;
virtual void SetAC3DolbySurround(int modeP) = 0;
// eAudioCenterMixLevel
virtual void SetAC3CenterMix(int level) = 0;
virtual void SetAC3CenterMix(int levelP) = 0;
// eAudioSurroundMixLevel
virtual void SetAC3SurroundMix(int level) = 0;
virtual void SetAC3SurroundMix(int levelP) = 0;
// -dB
virtual void SetAC3Dialog(int level) = 0;
virtual void SetAC3Dialog(int levelP) = 0;
// boolean
virtual void SetAC3LFE(bool onoff) = 0;
virtual void SetAC3LFE(bool onoffP) = 0;
};
#endif //__FEMONAUDIO_H
#endif //__FEMON_AUDIO_H

View File

@@ -1,34 +1,42 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* config.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <string.h>
#include "femoncfg.h"
cFemonConfig femonConfig;
#include "tools.h"
#include "config.h"
cFemonConfig::cFemonConfig(void)
cFemonConfig FemonConfig;
cFemonConfig::cFemonConfig()
: traceModeM(eTraceModeNormal),
hideMenuM(0),
displayModeM(0),
skinM(0),
themeM(0),
positionM(1),
downscaleM(0),
redLimitM(33),
greenLimitM(66),
updateIntervalM(5),
analyzeStreamM(1),
calcIntervalM(20),
useSvdrpM(0),
svdrpPortM(6419)
{
hidemenu = 0;
displaymode = 0;
skin = 0;
theme = 0;
position = 1;
downscale = 0;
redlimit = 33;
greenlimit = 66;
updateinterval = 5;
analyzestream = 1;
calcinterval = 20;
usesvdrp = 0;
svdrpport = 6419;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
SetSvdrpIp("0.0.0.0");
}
const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
void cFemonConfig::SetSvdrpIp(const char *strP)
{
strn0cpy(svdrpIpM, strP, sizeof(svdrpIpM));
}
const cFemonTheme FemonTheme[eFemonThemeMaxNumber] =
{
{
// eFemonThemeClassic

136
config.h Normal file
View File

@@ -0,0 +1,136 @@
/*
* config.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_CONFIG_H
#define __FEMON_CONFIG_H
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
enum eFemonModes
{
eFemonModeBasic,
eFemonModeTransponder,
eFemonModeStream,
eFemonModeAC3,
eFemonModeMaxNumber
};
class cFemonConfig
{
private:
unsigned int traceModeM;
int hideMenuM;
int displayModeM;
int skinM;
int themeM;
int positionM;
int downscaleM;
int redLimitM;
int greenLimitM;
int updateIntervalM;
int analyzeStreamM;
int calcIntervalM;
int useSvdrpM;
int svdrpPortM;
char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null
public:
enum eTraceMode {
eTraceModeNormal = 0x0000,
eTraceModeDebug1 = 0x0001,
eTraceModeDebug2 = 0x0002,
eTraceModeDebug3 = 0x0004,
eTraceModeDebug4 = 0x0008,
eTraceModeDebug5 = 0x0010,
eTraceModeDebug6 = 0x0020,
eTraceModeDebug7 = 0x0040,
eTraceModeDebug8 = 0x0080,
eTraceModeDebug9 = 0x0100,
eTraceModeDebug10 = 0x0200,
eTraceModeDebug11 = 0x0400,
eTraceModeDebug12 = 0x0800,
eTraceModeDebug13 = 0x1000,
eTraceModeDebug14 = 0x2000,
eTraceModeDebug15 = 0x4000,
eTraceModeDebug16 = 0x8000,
eTraceModeMask = 0xFFFF
};
cFemonConfig();
unsigned int GetTraceMode(void) const { return traceModeM; }
bool IsTraceMode(eTraceMode modeP) const { return (traceModeM & modeP); }
int GetHideMenu(void) const { return hideMenuM; }
int GetDisplayMode(void) const { return displayModeM; }
int GetSkin(void) const { return skinM; }
int GetTheme(void) const { return themeM; }
int GetPosition(void) const { return positionM; }
int GetDownscale(void) const { return downscaleM; }
int GetRedLimit(void) const { return redLimitM; }
int GetGreenLimit(void) const { return greenLimitM; }
int GetUpdateInterval(void) const { return updateIntervalM; }
int GetAnalyzeStream(void) const { return analyzeStreamM; }
int GetCalcInterval(void) const { return calcIntervalM; }
int GetUseSvdrp(void) const { return useSvdrpM; }
int GetSvdrpPort(void) const { return svdrpPortM; }
const char *GetSvdrpIp(void) const { return svdrpIpM; }
void SetTraceMode(unsigned int modeP) { traceModeM = (modeP & eTraceModeMask); }
void SetHideMenu(int hideMenuP) { hideMenuM = hideMenuP; }
void SetDisplayMode(int displayModeP) { if (displayModeM < 0 || displayModeM >= eFemonModeMaxNumber) displayModeM = 0; else displayModeM = displayModeP; }
void SetSkin(int skinP) { skinM = skinP; }
void SetTheme(int themeP) { themeM = themeP; }
void SetPosition(int positionP) { positionM = positionP; }
void SetDownscale(int downscaleP) { downscaleM = downscaleP; }
void SetRedLimit(int redLimitP) { redLimitM = redLimitP; }
void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; }
void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; }
void SetAnalyzeStream(int analyzeStreamP) { analyzeStreamM = analyzeStreamP; }
void SetCalcInterval(int calcIntervalP) { calcIntervalM = calcIntervalP; }
void SetUseSvdrp(int useSvdrpP) { useSvdrpM = useSvdrpP; }
void SetSvdrpPort(int svdrpPortP) { svdrpPortM = svdrpPortP; }
void SetSvdrpIp(const char *strP);
};
extern cFemonConfig FemonConfig;
enum eFemonSkins
{
eFemonSkinClassic,
eFemonSkinElchi,
eFemonSkinMaxNumber
};
enum eFemonThemes
{
eFemonThemeClassic,
eFemonThemeElchi,
eFemonThemeSTTNG,
eFemonThemeDeepBlue,
eFemonThemeMoronimo,
eFemonThemeEnigma,
eFemonThemeEgalsTry,
eFemonThemeDuotone,
eFemonThemeSilverGreen,
eFemonThemePearlHD,
eFemonThemeMaxNumber
};
struct cFemonTheme
{
int bpp;
unsigned int clrBackground;
unsigned int clrTitleBackground;
unsigned int clrTitleText;
unsigned int clrActiveText;
unsigned int clrInactiveText;
unsigned int clrRed;
unsigned int clrYellow;
unsigned int clrGreen;
};
extern const cFemonTheme FemonTheme[eFemonThemeMaxNumber];
#endif // __FEMON_CONFIG_H

300
femon.c
View File

@@ -1,28 +1,31 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* femon.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <getopt.h>
#include <vdr/menu.h>
#include <vdr/remote.h>
#include <vdr/player.h>
#include "femoncfg.h"
#include "femonreceiver.h"
#include "femonosd.h"
#include "femonservice.h"
#include "femontools.h"
#if defined(APIVERSNUM) && APIVERSNUM < 20106
#error "VDR-2.1.6 API version or greater is required!"
#include "config.h"
#include "femonservice.h"
#include "log.h"
#include "osd.h"
#include "tools.h"
#include "setup.h"
#if defined(APIVERSNUM) && APIVERSNUM < 20200
#error "VDR-2.2.0 API version or greater is required!"
#endif
#ifndef GITVERSION
#define GITVERSION ""
#endif
static const char VERSION[] = "2.1.1" GITVERSION;
static const char VERSION[] = "2.2.1" GITVERSION;
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
@@ -40,13 +43,13 @@ public:
virtual void Housekeeping(void);
virtual void MainThreadHook(void) {}
virtual cString Active(void) { return NULL; }
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
virtual const char *MainMenuEntry(void) { return (FemonConfig.GetHideMenu() ? NULL : tr(MAINMENUENTRY)); }
virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value);
virtual bool Service(const char *Id, void *Data);
virtual bool SetupParse(const char *nameP, const char *valueP);
virtual bool Service(const char *idP, void *dataP);
virtual const char **SVDRPHelpPages(void);
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
virtual cString SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP);
};
cPluginFemon::cPluginFemon()
@@ -54,24 +57,40 @@ cPluginFemon::cPluginFemon()
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
debug("%s()\n", __PRETTY_FUNCTION__);
debug1("%s", __PRETTY_FUNCTION__);
}
cPluginFemon::~cPluginFemon()
{
// Clean up after yourself!
debug("%s()\n", __PRETTY_FUNCTION__);
debug1("%s", __PRETTY_FUNCTION__);
}
const char *cPluginFemon::CommandLineHelp(void)
{
// Return a string that describes all known command line options.
return NULL;
return " -t <mode>, --trace=<mode> set the tracing mode\n";
}
bool cPluginFemon::ProcessArgs(int argc, char *argv[])
{
// Implement command line argument processing here if applicable.
static const struct option long_options[] = {
{ "trace", required_argument, NULL, 't' },
{ NULL, no_argument, NULL, 0 }
};
cString server;
int c;
while ((c = getopt_long(argc, argv, "t:", long_options, NULL)) != -1) {
switch (c) {
case 't':
FemonConfig.SetTraceMode(strtol(optarg, NULL, 0));
break;
default:
return false;
}
}
return true;
}
@@ -100,7 +119,7 @@ void cPluginFemon::Housekeeping(void)
cOsdObject *cPluginFemon::MainMenuAction(void)
{
// Perform the action when selected from the main VDR menu.
debug("%s()\n", __PRETTY_FUNCTION__);
debug1("%s", __PRETTY_FUNCTION__);
if (cControl::Control() || (Channels.Count() <= 0))
Skins.Message(mtInfo, tr("Femon not available"));
else
@@ -108,35 +127,54 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
return NULL;
}
bool cPluginFemon::SetupParse(const char *Name, const char *Value)
cMenuSetupPage *cPluginFemon::SetupMenu(void)
{
// Return a setup menu in case the plugin supports one.
return new cMenuFemonSetup;
}
bool cPluginFemon::SetupParse(const char *nameP, const char *valueP)
{
// Parse your own setup parameters and store their values.
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value);
else if (!strcasecmp(Name, "Downscale")) femonConfig.downscale = atoi(Value);
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value);
else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value);
else if (!strcasecmp(Name, "UseSvdrp")) femonConfig.usesvdrp = atoi(Value);
else if (!strcasecmp(Name, "ServerPort")) femonConfig.svdrpport = atoi(Value);
else if (!strcasecmp(Name, "ServerIp")) strn0cpy(femonConfig.svdrpip, Value, sizeof(femonConfig.svdrpip));
if (!strcasecmp(nameP, "HideMenu"))
FemonConfig.SetHideMenu(atoi(valueP));
else if (!strcasecmp(nameP, "DisplayMode"))
FemonConfig.SetDisplayMode(atoi(valueP));
else if (!strcasecmp(nameP, "Position"))
FemonConfig.SetPosition(atoi(valueP));
else if (!strcasecmp(nameP, "Skin"))
FemonConfig.SetSkin(atoi(valueP));
else if (!strcasecmp(nameP, "Theme"))
FemonConfig.SetTheme(atoi(valueP));
else if (!strcasecmp(nameP, "Downscale"))
FemonConfig.SetDownscale(atoi(valueP));
else if (!strcasecmp(nameP, "RedLimit"))
FemonConfig.SetRedLimit(atoi(valueP));
else if (!strcasecmp(nameP, "GreenLimit"))
FemonConfig.SetGreenLimit(atoi(valueP));
else if (!strcasecmp(nameP, "UpdateInterval"))
FemonConfig.SetUpdateInterval(atoi(valueP));
else if (!strcasecmp(nameP, "AnalStream"))
FemonConfig.SetAnalyzeStream(atoi(valueP));
else if (!strcasecmp(nameP, "CalcInterval"))
FemonConfig.SetCalcInterval(atoi(valueP));
else if (!strcasecmp(nameP, "UseSvdrp"))
FemonConfig.SetUseSvdrp(atoi(valueP));
else if (!strcasecmp(nameP, "ServerPort"))
FemonConfig.SetSvdrpPort(atoi(valueP));
else if (!strcasecmp(nameP, "ServerIp"))
FemonConfig.SetSvdrpIp(valueP);
else
return false;
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0;
return true;
}
bool cPluginFemon::Service(const char *Id, void *Data)
bool cPluginFemon::Service(const char *idP, void *dataP)
{
if (strcmp(Id,"FemonService-v1.0") == 0) {
if (Data) {
FemonService_v1_0 *data = reinterpret_cast<FemonService_v1_0*>(Data);
if (strcmp(idP, "FemonService-v1.0") == 0) {
if (dataP) {
FemonService_v1_0 *data = reinterpret_cast<FemonService_v1_0*>(dataP);
if (!cDevice::ActualDevice())
return false;
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
@@ -191,87 +229,94 @@ const char **cPluginFemon::SVDRPHelpPages(void)
" Print the current audio bitrate [kbit/s].",
"DDBR\n"
" Print the current dolby bitrate [kbit/s].",
"TRAC [ <mode> ]\n"
" Gets and/or sets used tracing mode.\n",
NULL
};
return HelpPages;
}
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP)
{
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
if (*Option && isnumber(Option)) {
cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(Option, NULL, 10))));
if (strcasecmp(commandP, "TRAC") == 0) {
if (optionP && *optionP)
FemonConfig.SetTraceMode(strtol(optionP, NULL, 0));
return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode());
}
if (*optionP && isnumber(optionP)) {
cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(optionP, NULL, 10))));
if (dev2)
dev = dev2;
}
if (cReplayControl::NowReplaying() || !dev) {
ReplyCode = 550; // Requested action not taken
replyCodeP = 550; // Requested action not taken
return cString("Cannot open femon plugin while replaying");
}
if (strcasecmp(Command, "OPEN") == 0) {
if (strcasecmp(commandP, "OPEN") == 0) {
if (!cFemonOsd::Instance())
cRemote::CallPlugin(Name());
return cString("Opening femon plugin");
}
else if (strcasecmp(Command, "QUIT") == 0) {
else if (strcasecmp(commandP, "QUIT") == 0) {
if (cFemonOsd::Instance())
cRemote::Put(kBack);
return cString("Closing femon plugin");
}
else if (strcasecmp(Command, "NEXT") == 0) {
else if (strcasecmp(commandP, "NEXT") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed");
else
return cString("Cannot switch device");
}
else if (strcasecmp(Command, "PREV") == 0) {
else if (strcasecmp(commandP, "PREV") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed");
else
return cString("Cannot switch device");
}
else if (strcasecmp(Command, "INFO") == 0) {
else if (strcasecmp(commandP, "INFO") == 0) {
return getFrontendInfo(dev);
}
else if (strcasecmp(Command, "NAME") == 0) {
else if (strcasecmp(commandP, "NAME") == 0) {
return getFrontendName(dev);
}
else if (strcasecmp(Command, "STAT") == 0) {
else if (strcasecmp(commandP, "STAT") == 0) {
return getFrontendStatus(dev);
}
else if (strcasecmp(Command, "STRG") == 0) {
else if (strcasecmp(commandP, "STRG") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex());
}
else if (strcasecmp(Command, "QUAL") == 0) {
else if (strcasecmp(commandP, "QUAL") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
}
else if (strcasecmp(Command, "SGNL") == 0) {
else if (strcasecmp(commandP, "SGNL") == 0) {
int value = getSignal(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
}
else if (strcasecmp(Command, "SNRA") == 0) {
else if (strcasecmp(commandP, "SNRA") == 0) {
int value = getSNR(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
}
else if (strcasecmp(Command, "BERA") == 0) {
else if (strcasecmp(commandP, "BERA") == 0) {
return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex());
}
else if (strcasecmp(Command, "UNCB") == 0) {
else if (strcasecmp(commandP, "UNCB") == 0) {
return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex());
}
else if (strcasecmp(Command, "VIBR") == 0) {
else if (strcasecmp(commandP, "VIBR") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "AUBR") == 0) {
else if (strcasecmp(commandP, "AUBR") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetAudioBitrate()), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "DDBR") == 0) {
else if (strcasecmp(commandP, "DDBR") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex());
else
@@ -280,145 +325,4 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
return NULL;
}
class cMenuFemonSetup : public cMenuSetupPage {
private:
const char *dispmodes[eFemonModeMaxNumber];
const char *skins[eFemonSkinMaxNumber];
const char *themes[eFemonThemeMaxNumber];
cFemonConfig data;
cVector<const char*> help;
void Setup(void);
protected:
virtual eOSState ProcessKey(eKeys Key);
virtual void Store(void);
public:
cMenuFemonSetup(void);
};
cMenuFemonSetup::cMenuFemonSetup(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
dispmodes[eFemonModeBasic] = tr("basic");
dispmodes[eFemonModeTransponder] = tr("transponder");
dispmodes[eFemonModeStream] = tr("stream");
dispmodes[eFemonModeAC3] = tr("AC-3");
skins[eFemonSkinClassic] = tr("Classic");
skins[eFemonSkinElchi] = tr("Elchi");
themes[eFemonThemeClassic] = tr("Classic");
themes[eFemonThemeElchi] = tr("Elchi");
themes[eFemonThemeSTTNG] = tr("ST:TNG");
themes[eFemonThemeDeepBlue] = tr("DeepBlue");
themes[eFemonThemeMoronimo] = tr("Moronimo");
themes[eFemonThemeEnigma] = tr("Enigma");
themes[eFemonThemeEgalsTry] = tr("EgalsTry");
themes[eFemonThemeDuotone] = tr("Duotone");
themes[eFemonThemeSilverGreen] = tr("SilverGreen");
themes[eFemonThemePearlHD] = tr("PearlHD");
data = femonConfig;
SetMenuCategory(mcSetupPlugins);
Setup();
}
void cMenuFemonSetup::Setup(void)
{
int current = Current();
Clear();
help.Clear();
Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &data.hidemenu));
help.Append(tr("Define whether the main menu entry is hidden."));
Add(new cMenuEditStraItem(tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
help.Append(tr("Define the default display mode at startup."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Skin"), &data.skin, eFemonSkinMaxNumber, skins));
help.Append(tr("Define the used OSD skin."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Theme"), &data.theme, eFemonThemeMaxNumber,themes));
help.Append(tr("Define the used OSD theme."));
Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top")));
help.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &data.downscale, 0, 20));
help.Append(tr("Define the downscale ratio for OSD size."));
Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50));
help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
Add(new cMenuEditIntItem(tr("Green limit [%]"), &data.greenlimit, 51, 100));
help.Append(tr("Define a limit for green bar, which is used to indicate a good signal."));
Add(new cMenuEditIntItem(tr("OSD update interval [0.1s]"), &data.updateinterval, 1, 100));
help.Append(tr("Define an interval for OSD updates. The smaller interval generates higher CPU load."));
Add(new cMenuEditBoolItem(tr("Analyze stream"), &data.analyzestream));
help.Append(tr("Define whether the DVB stream is analyzed and bitrates calculated."));
if (femonConfig.analyzestream) {
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100));
help.Append(tr("Define an interval for calculation. The bigger interval generates more stable values."));
}
Add(new cMenuEditBoolItem(tr("Use SVDRP service"), &data.usesvdrp));
help.Append(tr("Define whether the SVDRP service is used in client/server setups."));
if (data.usesvdrp) {
Add(new cMenuEditIntItem(tr("SVDRP service port"), &data.svdrpport, 1, 65535));
help.Append(tr("Define the port number of SVDRP service."));
Add(new cMenuEditStrItem(tr("SVDRP service IP"), data.svdrpip, MaxSvdrpIp, ".1234567890"));
help.Append(tr("Define the IP address of SVDRP service."));
}
SetCurrent(Get(current));
Display();
}
void cMenuFemonSetup::Store(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
femonConfig = data;
SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("DisplayMode", femonConfig.displaymode);
SetupStore("Skin", femonConfig.skin);
SetupStore("Theme", femonConfig.theme);
SetupStore("Position", femonConfig.position);
SetupStore("Downscale", femonConfig.downscale);
SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval);
SetupStore("AnalStream", femonConfig.analyzestream);
SetupStore("CalcInterval", femonConfig.calcinterval);
SetupStore("UseSvdrp", femonConfig.usesvdrp);
SetupStore("ServerPort", femonConfig.svdrpport);
SetupStore("ServerIp", femonConfig.svdrpip);
}
eOSState cMenuFemonSetup::ProcessKey(eKeys Key)
{
int oldUsesvdrp = data.usesvdrp;
int oldAnalyzestream = data.analyzestream;
eOSState state = cMenuSetupPage::ProcessKey(Key);
if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp))
Setup();
if ((Key == kInfo) && (state == osUnknown) && (Current() < help.Size()))
return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), help[Current()]));
return state;
}
cMenuSetupPage *cPluginFemon::SetupMenu(void)
{
// Return a setup menu in case the plugin supports one.
return new cMenuFemonSetup;
}
VDRPLUGINCREATOR(cPluginFemon); // Don't touch this!

View File

@@ -1,26 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONAAC_H
#define __FEMONAAC_H
#include "femonaudio.h"
class cFemonAAC {
private:
cFemonAudioIf *m_AudioHandler;
static int s_Samplerates[16];
public:
cFemonAAC(cFemonAudioIf *audiohandler);
virtual ~cFemonAAC();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONAAC_H

View File

@@ -1,28 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONAC3_H
#define __FEMONAC3_H
#include "femonaudio.h"
class cFemonAC3 {
private:
cFemonAC3If *m_AudioHandler;
static int s_Bitrates[32];
static int s_Frequencies[4];
static int s_Frames[3][32];
public:
cFemonAC3(cFemonAC3If *audiohandler);
virtual ~cFemonAC3();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONAC3_H

View File

@@ -1,81 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONCFG_H
#define __FEMONCFG_H
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
enum eFemonModes
{
eFemonModeBasic,
eFemonModeTransponder,
eFemonModeStream,
eFemonModeAC3,
eFemonModeMaxNumber
};
struct cFemonConfig
{
public:
cFemonConfig(void);
int hidemenu;
int displaymode;
int skin;
int theme;
int position;
int downscale;
int redlimit;
int greenlimit;
int updateinterval;
int analyzestream;
int calcinterval;
int usesvdrp;
int svdrpport;
char svdrpip[MaxSvdrpIp + 1]; // must end with additional null
};
extern cFemonConfig femonConfig;
enum eFemonSkins
{
eFemonSkinClassic,
eFemonSkinElchi,
eFemonSkinMaxNumber
};
enum eFemonThemes
{
eFemonThemeClassic,
eFemonThemeElchi,
eFemonThemeSTTNG,
eFemonThemeDeepBlue,
eFemonThemeMoronimo,
eFemonThemeEnigma,
eFemonThemeEgalsTry,
eFemonThemeDuotone,
eFemonThemeSilverGreen,
eFemonThemePearlHD,
eFemonThemeMaxNumber
};
struct cFemonTheme
{
int bpp;
unsigned int clrBackground;
unsigned int clrTitleBackground;
unsigned int clrTitleText;
unsigned int clrActiveText;
unsigned int clrInactiveText;
unsigned int clrRed;
unsigned int clrYellow;
unsigned int clrGreen;
};
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];
#endif // __FEMONCFG_H

View File

@@ -1,64 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONH264_H
#define __FEMONH264_H
#include "femonvideo.h"
class cFemonH264 {
private:
enum {
NAL_SEI = 0x06, // Supplemental Enhancement Information
NAL_SPS = 0x07, // Sequence Parameter Set
NAL_AUD = 0x09, // Access Unit Delimiter
NAL_END_SEQ = 0x0A // End of Sequence
};
typedef struct DAR {
eVideoAspectRatio dar;
int ratio;
} t_DAR;
typedef struct SAR {
int w;
int h;
} t_SAR;
cFemonVideoIf *m_VideoHandler;
uint32_t m_Width;
uint32_t m_Height;
eVideoAspectRatio m_AspectRatio;
eVideoFormat m_Format;
double m_FrameRate;
double m_BitRate;
eVideoScan m_Scan;
bool m_CpbDpbDelaysPresentFlag;
bool m_PicStructPresentFlag;
bool m_FrameMbsOnlyFlag;
bool m_MbAdaptiveFrameFieldFlag;
uint32_t m_TimeOffsetLength;
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);
int parseSPS(const uint8_t *buf, int len);
int parseSEI(const uint8_t *buf, int len);
static const t_SAR s_SAR[];
static const t_DAR s_DAR[];
static const eVideoFormat s_VideoFormats[];
static const uint8_t s_SeiNumClockTsTable[9];
public:
cFemonH264(cFemonVideoIf *videohandler);
virtual ~cFemonH264();
bool processVideo(const uint8_t *buf, int len);
};
#endif //__FEMONH264_H

View File

@@ -1,27 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONLATM_H
#define __FEMONLATM_H
#include "femonaudio.h"
class cFemonLATM {
private:
cFemonAudioIf *m_AudioHandler;
static int s_Bitrates[3][16];
static int s_Samplerates[4];
public:
cFemonLATM(cFemonAudioIf *audiohandler);
virtual ~cFemonLATM();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONLATM_H

View File

@@ -1,31 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONMPEG_H
#define __FEMONMPEG_H
#include "femonvideo.h"
#include "femonaudio.h"
class cFemonMPEG {
private:
cFemonVideoIf *m_VideoHandler;
cFemonAudioIf *m_AudioHandler;
static int s_Bitrates[2][3][16];
static int s_Samplerates[2][4];
static eAudioCodec s_Formats[2][4];
public:
cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler);
virtual ~cFemonMPEG();
bool processVideo(const uint8_t *buf, int len);
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONMPEG_H

View File

@@ -1,100 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONOSD_H
#define __FEMONOSD_H
#include <linux/dvb/frontend.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <vdr/osd.h>
#include <vdr/thread.h>
#include <vdr/status.h>
#include <vdr/plugin.h>
#include <vdr/channels.h>
#include <vdr/transfer.h>
#include <vdr/tools.h>
#include "svdrpservice.h"
#define MAX_BM_NUMBER 8
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private:
enum eDeviceSourceType {
DEVICESOURCE_DVBAPI = 0,
DEVICESOURCE_IPTV,
DEVICESOURCE_PVRINPUT,
DEVICESOURCE_COUNT
};
static cFemonOsd *pInstance;
cOsd *m_Osd;
cFemonReceiver *m_Receiver;
int m_Frontend;
int m_SvdrpFrontend;
double m_SvdrpVideoBitrate;
double m_SvdrpAudioBitrate;
SvdrpConnection_v1_0 m_SvdrpConnection;
cPlugin *m_SvdrpPlugin;
int m_Number;
int m_OldNumber;
int m_Quality;
bool m_QualityValid;
int m_Strength;
bool m_StrengthValid;
uint16_t m_SNR;
bool m_SNRValid;
uint16_t m_Signal;
bool m_SignalValid;
uint32_t m_BER;
bool m_BERValid;
uint32_t m_UNC;
bool m_UNCValid;
cString m_FrontendName;
fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo;
eDeviceSourceType m_DeviceSource;
int m_DisplayMode;
int m_OsdWidth;
int m_OsdHeight;
int m_OsdLeft;
int m_OsdTop;
cFont *m_Font;
cTimeMs m_InputTime;
cCondWait m_Sleep;
cMutex m_Mutex;
void DrawStatusWindow(void);
void DrawInfoWindow(void);
bool SvdrpConnect(void);
bool SvdrpTune(void);
protected:
cFemonOsd();
cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void);
virtual void ChannelSwitch(const cDevice *device, int channelNumber, bool liveView);
virtual void SetAudioTrack(int Index, const char * const *Tracks);
public:
static cFemonOsd *Instance(bool create = false);
~cFemonOsd();
virtual void Show(void);
virtual eOSState ProcessKey(eKeys Key);
bool DeviceSwitch(int direction);
double GetVideoBitrate(void);
double GetAudioBitrate(void);
double GetDolbyBitrate(void);
};
#endif //__FEMONOSD_H

View File

@@ -1,250 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <unistd.h>
#include "femontools.h"
#include "femoncfg.h"
#include "femonreceiver.h"
cFemonReceiver::cFemonReceiver(const cChannel *Channel, int ATrack, int DTrack)
: cReceiver(Channel),
cThread("femon receiver"),
m_Mutex(),
m_Sleep(),
m_Active(false),
m_DetectH264(this),
m_DetectMPEG(this, this),
m_DetectAAC(this),
m_DetectLATM(this),
m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Channel ? Channel->Vtype(): 0),
m_VideoPid(Channel ? Channel->Vpid() : 0),
m_VideoPacketCount(0),
m_VideoBitrate(0.0),
m_VideoValid(false),
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Channel ? Channel->Apid(ATrack) : 0),
m_AudioPacketCount(0),
m_AudioBitrate(0.0),
m_AudioValid(false),
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Channel ? Channel->Dpid(DTrack) : 0),
m_AC3PacketCount(0),
m_AC3Bitrate(0),
m_AC3Valid(false)
{
debug("%s()\n", __PRETTY_FUNCTION__);
SetPids(NULL);
AddPid(m_VideoPid);
AddPid(m_AudioPid);
AddPid(m_AC3Pid);
m_VideoBuffer.SetTimeouts(0, 100);
m_AudioBuffer.SetTimeouts(0, 100);
m_AC3Buffer.SetTimeouts(0, 100);
m_VideoInfo.codec = VIDEO_CODEC_INVALID;
m_VideoInfo.format = VIDEO_FORMAT_INVALID;
m_VideoInfo.scan = VIDEO_SCAN_INVALID;
m_VideoInfo.aspectRatio = VIDEO_ASPECT_RATIO_INVALID;
m_VideoInfo.width = 0;
m_VideoInfo.height = 0;
m_VideoInfo.frameRate = 0;
m_VideoInfo.bitrate = AUDIO_BITRATE_INVALID;
m_AudioInfo.codec = AUDIO_CODEC_UNKNOWN;
m_AudioInfo.bitrate = AUDIO_BITRATE_INVALID;
m_AudioInfo.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AudioInfo.channelMode = AUDIO_CHANNEL_MODE_INVALID;
m_AC3Info.bitrate = AUDIO_BITRATE_INVALID;
m_AC3Info.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AC3Info.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID;
m_AC3Info.audioCodingMode = AUDIO_CODING_MODE_INVALID;
m_AC3Info.dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
m_AC3Info.centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
m_AC3Info.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
m_AC3Info.dialogLevel = 0;
m_AC3Info.lfe = false;
}
cFemonReceiver::~cFemonReceiver(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
Deactivate();
}
void cFemonReceiver::Deactivate(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
Detach();
if (m_Active) {
m_Active = false;
m_Sleep.Signal();
if (Running())
Cancel(3);
}
}
void cFemonReceiver::Activate(bool On)
{
debug("%s(%d)\n", __PRETTY_FUNCTION__, On);
if (On)
Start();
else
Deactivate();
}
void cFemonReceiver::Receive(uchar *Data, int Length)
{
// TS packet length: TS_SIZE
if (Running() && (*Data == TS_SYNC_BYTE) && (Length == TS_SIZE)) {
int len, pid = TsPid(Data);
if (pid == m_VideoPid) {
++m_VideoPacketCount;
len = m_VideoBuffer.Put(Data, Length);
if (len != Length) {
m_VideoBuffer.ReportOverflow(Length - len);
m_VideoBuffer.Clear();
}
}
else if (pid == m_AudioPid) {
++m_AudioPacketCount;
len = m_AudioBuffer.Put(Data, Length);
if (len != Length) {
m_AudioBuffer.ReportOverflow(Length - len);
m_AudioBuffer.Clear();
}
}
else if (pid == m_AC3Pid) {
++m_AC3PacketCount;
len = m_AC3Buffer.Put(Data, Length);
if (len != Length) {
m_AC3Buffer.ReportOverflow(Length - len);
m_AC3Buffer.Clear();
}
}
}
}
void cFemonReceiver::Action(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
cTimeMs calcPeriod(0);
m_Active = true;
while (Running() && m_Active) {
uint8_t *Data;
double timeout;
int len, Length;
bool processed = false;
// process available video data
while ((Data = m_VideoBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_VideoBuffer.Del(Length);
continue;
}
processed = true;
if (TsPayloadStart(Data)) {
while (const uint8_t *p = m_VideoAssembler.GetPes(len)) {
if (m_VideoType == 0x1B) { // MPEG4
if (m_DetectH264.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
else {
if (m_DetectMPEG.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
}
m_VideoAssembler.Reset();
}
m_VideoAssembler.PutTs(Data, Length);
m_VideoBuffer.Del(Length);
}
// process available audio data
while ((Data = m_AudioBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AudioBuffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectLATM.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true;
m_AudioAssembler.Reset();
}
m_AudioAssembler.PutTs(Data, Length);
m_AudioBuffer.Del(Length);
}
// process available dolby data
while ((Data = m_AC3Buffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AC3Buffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AC3Assembler.GetPes(len)) {
if (m_DetectAC3.processAudio(p, len))
m_AC3Valid = true;
m_AC3Assembler.Reset();
}
m_AC3Assembler.PutTs(Data, Length);
m_AC3Buffer.Del(Length);
}
// calculate bitrates
timeout = double(calcPeriod.Elapsed());
if (m_Active && (timeout >= (100.0 * femonConfig.calcinterval))) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
// PES headers should be compensated!
m_VideoBitrate = (1000.0 * 8.0 * 184.0 * m_VideoPacketCount) / timeout;
m_VideoPacketCount = 0;
m_AudioBitrate = (1000.0 * 8.0 * 184.0 * m_AudioPacketCount) / timeout;
m_AudioPacketCount = 0;
m_AC3Bitrate = (1000.0 * 8.0 * 184.0 * m_AC3PacketCount) / timeout;
m_AC3PacketCount = 0;
calcPeriod.Set(0);
}
if (!processed)
m_Sleep.Wait(10); // to avoid busy loop and reduce cpu load
}
}

View File

@@ -1,178 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONRECEIVER_H
#define __FEMONRECEIVER_H
#include <vdr/thread.h>
#include <vdr/receiver.h>
#include "femonh264.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonlatm.h"
#include "femonac3.h"
#include "femonaudio.h"
#include "femonvideo.h"
#include "femontools.h"
class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If {
private:
cMutex m_Mutex;
cCondWait m_Sleep;
bool m_Active;
cFemonH264 m_DetectH264;
cFemonMPEG m_DetectMPEG;
cFemonAAC m_DetectAAC;
cFemonLATM m_DetectLATM;
cFemonAC3 m_DetectAC3;
cRingBufferLinear m_VideoBuffer;
cTsToPes m_VideoAssembler;
int m_VideoType;
int m_VideoPid;
int m_VideoPacketCount;
double m_VideoBitrate;
bool m_VideoValid;
video_info_t m_VideoInfo;
cRingBufferLinear m_AudioBuffer;
cTsToPes m_AudioAssembler;
int m_AudioPid;
int m_AudioPacketCount;
double m_AudioBitrate;
bool m_AudioValid;
audio_info_t m_AudioInfo;
cRingBufferLinear m_AC3Buffer;
cTsToPes m_AC3Assembler;
int m_AC3Pid;
int m_AC3PacketCount;
double m_AC3Bitrate;
bool m_AC3Valid;
ac3_info_t m_AC3Info;
protected:
virtual void Activate(bool On);
virtual void Receive(uchar *Data, int Length);
virtual void Action(void);
public:
virtual void SetVideoCodec(eVideoCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.codec = codec; }
virtual void SetVideoFormat(eVideoFormat format) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.format = format; }
virtual void SetVideoScan(eVideoScan scan) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.scan = scan; }
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.aspectRatio = aspectratio; }
virtual void SetVideoSize(int width, int height) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.width = width;
m_VideoInfo.height = height; }
virtual void SetVideoFramerate(double framerate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.frameRate = framerate; }
virtual void SetVideoBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.bitrate = bitrate; }
virtual void SetAudioCodec(eAudioCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.codec = codec; }
virtual void SetAudioBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.bitrate = bitrate; }
virtual void SetAudioSamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.samplingFrequency = sampling; }
virtual void SetAudioChannel(eAudioChannelMode mode) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.channelMode = mode; }
virtual void SetAC3Bitrate(int bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitrate = bitrate; }
virtual void SetAC3SamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.samplingFrequency = sampling; }
virtual void SetAC3Bitstream(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitstreamMode = mode; }
virtual void SetAC3AudioCoding(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.audioCodingMode = mode; }
virtual void SetAC3DolbySurround(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dolbySurroundMode = mode; }
virtual void SetAC3CenterMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.centerMixLevel = level; }
virtual void SetAC3SurroundMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.surroundMixLevel = level; }
virtual void SetAC3Dialog(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dialogLevel = level; }
virtual void SetAC3LFE(bool onoff) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.lfe = onoff; }
public:
cFemonReceiver(const cChannel* Channel, int ATrack, int DTrack);
virtual ~cFemonReceiver();
void Deactivate(void);
bool VideoValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoValid; }; // boolean
double VideoBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoBitrate; }; // bit/s
int VideoCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.codec; }; // eVideoCodec
int VideoFormat(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.format; }; // eVideoFormat
int VideoScan(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.scan; }; // eVideoScan
int VideoAspectRatio(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.aspectRatio; }; // eVideoAspectRatio
int VideoHorizontalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.width; }; // pixels
int VideoVerticalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.height; }; // pixels
double VideoFrameRate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.frameRate; }; // Hz
double VideoStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.bitrate; }; // bit/s
bool AudioValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioValid; }; // boolean
double AudioBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioBitrate; }; // bit/s
int AudioCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.codec; }; // eAudioCodec
int AudioChannelMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.channelMode; }; // eAudioChannelMode
double AudioStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.bitrate; }; // bit/s or eAudioBitrate
int AudioSamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.samplingFrequency; }; // Hz or eAudioSamplingFrequency
bool AC3Valid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Valid; }; // boolean
double AC3Bitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Bitrate; }; // bit/s
double AC3StreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitrate; }; // bit/s or eAudioBitrate
int AC3SamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.samplingFrequency; }; // Hz or eAudioSamplingFrequency
int AC3BitStreamMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
int AC3AudioCodingMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.audioCodingMode; }; // 0..7 or eAudioCodingMode
bool AC3_2_0(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean
bool AC3_5_1(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean
int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dolbySurroundMode; }; // eAudioDolbySurroundMode
int AC3CenterMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.centerMixLevel; }; // eAudioCenterMixLevel
int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.surroundMixLevel; }; // eAudioSurroundMixLevel
int AC3DialogLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dialogLevel; }; // -dB
bool AC3Lfe(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.lfe; }; // boolean
};
#endif //__FEMONRECEIVER_H

View File

@@ -1,91 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONTOOLS_H
#define __FEMONTOOLS_H
#include <stdint.h>
#include <vdr/channels.h>
#include <vdr/dvbdevice.h>
#include <vdr/remux.h>
#include <vdr/tools.h>
#ifdef DEBUG
#define debug(x...) dsyslog("FEMON: " x);
#define error(x...) esyslog("ERROR: " x);
#else
#define debug(x...) ;
#define error(x...) esyslog("ERROR: " x);
#endif
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#define SATIP_DEVICE "SAT>IP"
cDvbDevice *getDvbDevice(cDevice* device);
cString getFrontendInfo(cDvbDevice *device);
cString getFrontendName(cDvbDevice *device);
cString getFrontendStatus(cDvbDevice *device);
uint16_t getSNR(cDvbDevice *device);
uint16_t getSignal(cDvbDevice *device);
uint32_t getBER(cDvbDevice *device);
uint32_t getUNC(cDvbDevice *device);
cString getApids(const cChannel *channel);
cString getDpids(const cChannel *channel);
cString getSpids(const cChannel *channel);
cString getCAids(const cChannel *channel);
cString getVideoStream(int value);
cString getVideoCodec(int value);
cString getAudioStream(int value, const cChannel *channel);
cString getAudioCodec(int value);
cString getAudioChannelMode(int value);
cString getCoderate(int value);
cString getTransmission(int value);
cString getBandwidth(int value);
cString getInversion(int value);
cString getHierarchy(int value);
cString getGuard(int value);
cString getModulation(int value);
cString getTerrestrialSystem(int value);
cString getSatelliteSystem(int value);
cString getRollOff(int value);
cString getPilot(int value);
cString getResolution(int width, int height, int scan);
cString getAspectRatio(int value);
cString getVideoFormat(int value);
cString getFrameRate(double value);
cString getAC3Stream(int value, const cChannel *channel);
cString getAC3BitStreamMode(int value, int coding);
cString getAC3AudioCodingMode(int value, int stream);
cString getAC3CenterMixLevel(int value);
cString getAC3SurroundMixLevel(int value);
cString getAC3DolbySurroundMode(int value);
cString getAC3DialogLevel(int value);
cString getFrequencyMHz(int value);
cString getAudioSamplingFreq(int value);
cString getAudioBitrate(double value, double stream);
cString getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value);
cString getBitrateKbits(double value);
class cFemonBitStream : public cBitStream {
public:
cFemonBitStream(const uint8_t *Data, const int Length) : cBitStream(Data, Length) {}
uint32_t GetUeGolomb();
int32_t GetSeGolomb();
void SkipGolomb();
void SkipUeGolomb() { SkipGolomb(); }
void SkipSeGolomb() { SkipGolomb(); }
};
#endif // __FEMONTOOLS_H

View File

@@ -1,14 +1,15 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* h264.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonh264.h"
#include "log.h"
#include "tools.h"
#include "h264.h"
const cFemonH264::t_DAR cFemonH264::s_DAR[] =
const cFemonH264::t_DAR cFemonH264::darS[] =
{
{ VIDEO_ASPECT_RATIO_1_1, 100 },
{ VIDEO_ASPECT_RATIO_4_3, 133 },
@@ -30,7 +31,7 @@ const cFemonH264::t_DAR cFemonH264::s_DAR[] =
{ VIDEO_ASPECT_RATIO_2_1, 200 }
};
const cFemonH264::t_SAR cFemonH264::s_SAR[] =
const cFemonH264::t_SAR cFemonH264::sarS[] =
{
{ 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID
{ 1, 1 }, // VIDEO_ASPECT_RATIO_1_1
@@ -51,7 +52,7 @@ const cFemonH264::t_SAR cFemonH264::s_SAR[] =
{ 2, 1 } // VIDEO_ASPECT_RATIO_2_1
};
const eVideoFormat cFemonH264::s_VideoFormats[] =
const eVideoFormat cFemonH264::videoFormatS[] =
{
VIDEO_FORMAT_COMPONENT,
VIDEO_FORMAT_PAL,
@@ -62,25 +63,25 @@ const eVideoFormat cFemonH264::s_VideoFormats[] =
VIDEO_FORMAT_RESERVED
};
const uint8_t cFemonH264::s_SeiNumClockTsTable[9] =
const uint8_t cFemonH264::seiNumClockTsTableS[9] =
{
1, 1, 1, 2, 2, 3, 3, 2, 3
};
cFemonH264::cFemonH264(cFemonVideoIf *videohandler)
: m_VideoHandler(videohandler),
m_Width(0),
m_Height(0),
m_AspectRatio(VIDEO_ASPECT_RATIO_INVALID),
m_Format(VIDEO_FORMAT_INVALID),
m_FrameRate(0),
m_BitRate(0),
m_Scan(VIDEO_SCAN_INVALID),
m_CpbDpbDelaysPresentFlag(false),
m_PicStructPresentFlag(false),
m_FrameMbsOnlyFlag(false),
m_MbAdaptiveFrameFieldFlag(false),
m_TimeOffsetLength(0)
cFemonH264::cFemonH264(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),
cpbDpbDelaysPresentFlagM(false),
picStructPresentFlagM(false),
frameMbsOnlyFlagM(false),
mbAdaptiveFrameFieldFlagM(false),
timeOffsetLengthM(0)
{
reset();
}
@@ -89,18 +90,19 @@ cFemonH264::~cFemonH264()
{
}
bool cFemonH264::processVideo(const uint8_t *buf, int len)
bool cFemonH264::processVideo(const uint8_t *bufP, int lenP)
{
uint8_t nal_data[len];
uint8_t nal_data[lenP];
bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled!
const uint8_t *buf = bufP;
const uint8_t *start = buf;
const uint8_t *end = start + len;
const uint8_t *end = start + lenP;
if (!m_VideoHandler)
if (!videoHandlerM)
return false;
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
buf += PesPayloadOffset(buf);
start = buf;
@@ -119,7 +121,7 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
if (!aud_found) {
switch (buf[4] >> 5) {
case 0: case 3: case 5: // I_FRAME
//debug("H.264: Found NAL AUD at offset %d/%d\n", int(buf - start), len);
debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
aud_found = true;
break;
case 1: case 4: case 6: // P_FRAME;
@@ -132,7 +134,7 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
case NAL_SPS:
if (!sps_found) {
//debug("H.264: Found NAL SPS at offset %d/%d\n", int(buf - start), len);
debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4));
consumed = parseSPS(nal_data, nal_len);
if (consumed > 0)
@@ -142,7 +144,7 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
case NAL_SEI:
if (!sei_found) {
//debug("H.264: Found NAL SEI at offset %d/%d\n", int(buf - start), len);
debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4));
consumed = parseSEI(nal_data, nal_len);
if (consumed > 0)
@@ -161,18 +163,18 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
}
if (aud_found) {
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_H264);
videoHandlerM->SetVideoCodec(VIDEO_CODEC_H264);
if (sps_found) {
//debug("H.264: size %dx%d, aspect %d format %d bitrate %.0f\n", m_Width, m_Height, m_AspectRatio, m_Format, m_BitRate);
m_VideoHandler->SetVideoFormat(m_Format);
m_VideoHandler->SetVideoSize(m_Width, m_Height);
m_VideoHandler->SetVideoAspectRatio(m_AspectRatio);
m_VideoHandler->SetVideoBitrate(m_BitRate);
debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM);
videoHandlerM->SetVideoFormat(formatM);
videoHandlerM->SetVideoSize(widthM, heightM);
videoHandlerM->SetVideoAspectRatio(aspectRatioM);
videoHandlerM->SetVideoBitrate(bitRateM);
}
if (sps_found || sei_found) {
//debug("H.264: scan %d framerate %.2f\n", m_Scan, (m_Scan == VIDEO_SCAN_PROGRESSIVE) ? (m_FrameRate / 2) : m_FrameRate);
m_VideoHandler->SetVideoScan(m_Scan);
m_VideoHandler->SetVideoFramerate((m_Scan == VIDEO_SCAN_PROGRESSIVE) ? (m_FrameRate / 2) : m_FrameRate);
debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, (scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM);
videoHandlerM->SetVideoScan(scanM);
videoHandlerM->SetVideoFramerate((scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM);
}
}
@@ -181,60 +183,60 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
void cFemonH264::reset()
{
m_CpbDpbDelaysPresentFlag = false;
m_PicStructPresentFlag = false;
m_FrameMbsOnlyFlag = false;
m_MbAdaptiveFrameFieldFlag = false;
m_TimeOffsetLength = 0;
cpbDpbDelaysPresentFlagM = false;
picStructPresentFlagM = false;
frameMbsOnlyFlagM = false;
mbAdaptiveFrameFieldFlagM = false;
timeOffsetLengthM = 0;
}
const uint8_t *cFemonH264::nextStartCode(const uint8_t *start, const uint8_t *end)
const uint8_t *cFemonH264::nextStartCode(const uint8_t *startP, const uint8_t *endP)
{
for (end -= 3; start < end; ++start) {
if ((start[0] == 0x00) && (start[1] == 0x00) && (start[2] == 0x01))
return start;
for (endP -= 3; startP < endP; ++startP) {
if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01))
return startP;
}
return (end + 3);
return (endP + 3);
}
int cFemonH264::nalUnescape(uint8_t *dst, const uint8_t *src, int len)
int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
{
int s = 0, d = 0;
while (s < len) {
if (!src[s] && !src[s + 1]) {
while (s < lenP) {
if (!srcP[s] && !srcP[s + 1]) {
// hit 00 00 xx
dst[d] = dst[d + 1] = 0;
dstP[d] = dstP[d + 1] = 0;
s += 2;
d += 2;
if (src[s] == 3) {
if (srcP[s] == 3) {
s++; // 00 00 03 xx --> 00 00 xx
if (s >= len)
if (s >= lenP)
return d;
}
}
dst[d++] = src[s++];
dstP[d++] = srcP[s++];
}
return d;
}
int cFemonH264::parseSPS(const uint8_t *buf, int len)
int cFemonH264::parseSPS(const uint8_t *bufP, int lenP)
{
int profile_idc, level_idc, constraint_set3_flag, pic_order_cnt_type, i, j;
cFemonBitStream bs(buf, len);
cFemonBitStream bs(bufP, lenP);
uint32_t width = m_Width;
uint32_t height = m_Height;
eVideoAspectRatio aspect_ratio = m_AspectRatio;
eVideoFormat format = m_Format;
double frame_rate = m_FrameRate;
double bit_rate = m_BitRate;
bool cpb_dpb_delays_present_flag = m_CpbDpbDelaysPresentFlag;
bool pic_struct_present_flag = m_PicStructPresentFlag;
bool frame_mbs_only_flag = m_FrameMbsOnlyFlag;
bool mb_adaptive_frame_field_flag = m_MbAdaptiveFrameFieldFlag;
uint32_t time_offset_length = m_TimeOffsetLength;
uint32_t width = widthM;
uint32_t height = heightM;
eVideoAspectRatio aspect_ratio = aspectRatioM;
eVideoFormat format = formatM;
double frame_rate = frameRateM;
double bit_rate = bitRateM;
bool cpb_dpb_delays_present_flag = cpbDpbDelaysPresentFlagM;
bool pic_struct_present_flag = picStructPresentFlagM;
bool frame_mbs_only_flag = frameMbsOnlyFlagM;
bool mb_adaptive_frame_field_flag = mbAdaptiveFrameFieldFlagM;
uint32_t time_offset_length = timeOffsetLengthM;
profile_idc = bs.GetBits(8); // profile_idc
bs.SkipBit(); // constraint_set0_flag
@@ -244,7 +246,7 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
bs.SkipBits(4); // reserved_zero_4bits
level_idc = bs.GetBits(8); // level_idc
bs.SkipUeGolomb(); // seq_parameter_set_id
//debug("H.264 SPS: profile_idc %d level_idc %d\n", profile_idc, level_idc);
debug2("%s profile_idc=%d level_idc=%d", __PRETTY_FUNCTION__, profile_idc, level_idc);
switch (profile_idc) {
case 66: // baseline profile
case 77: // main profile
@@ -492,9 +494,9 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
width = bs.GetUeGolomb() + 1; // pic_width_in_mbs_minus1
height = bs.GetUeGolomb() + 1; // pic_height_in_mbs_minus1
frame_mbs_only_flag = bs.GetBit(); // frame_mbs_only_flag
//debug("H.264 SPS: pic_width: %u mbs\n", width);
//debug("H.264 SPS: pic_height: %u mbs\n", height);
//debug("H.264 SPS: frame only flag: %d\n", frame_mbs_only_flag);
debug2("%s pic_width=%u", __PRETTY_FUNCTION__, width);
debug2("%s pic_height=%u", __PRETTY_FUNCTION__, height);
debug2("%s frame_mbs_only_flag=%d", __PRETTY_FUNCTION__, frame_mbs_only_flag);
width *= 16;
height *= 16 * (frame_mbs_only_flag ? 1 : 2);
if (!frame_mbs_only_flag)
@@ -506,7 +508,7 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
crop_right = bs.GetUeGolomb(); // frame_crop_rigth_offset
crop_top = bs.GetUeGolomb(); // frame_crop_top_offset
crop_bottom = bs.GetUeGolomb(); // frame_crop_bottom_offset
//debug("H.264 SPS: cropping %d %d %d %d\n", crop_left, crop_top, crop_right, crop_bottom);
debug2("%s crop_left=%d crop_top=%d crop_right=%d crop_bottom=%d", __PRETTY_FUNCTION__, crop_left, crop_top, crop_right, crop_bottom);
width -= 2 * (crop_left + crop_right);
if (frame_mbs_only_flag)
height -= 2 * (crop_top + crop_bottom);
@@ -518,19 +520,19 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
if (bs.GetBit()) { // aspect_ratio_info_present
uint32_t aspect_ratio_idc, sar_width = 0, sar_height = 0;
aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc
//debug("H.264 SPS: aspect_ratio_idc %d\n", aspect_ratio_idc);
debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc);
if (aspect_ratio_idc == 255) { // extended sar
sar_width = bs.GetBits(16); // sar_width
sar_height = bs.GetBits(16); // sar_height
}
else if (aspect_ratio_idc < ELEMENTS(s_SAR)) {
sar_width = s_SAR[aspect_ratio_idc].w;
sar_height = s_SAR[aspect_ratio_idc].h;
else if (aspect_ratio_idc < ELEMENTS(sarS)) {
sar_width = sarS[aspect_ratio_idc].w;
sar_height = sarS[aspect_ratio_idc].h;
}
if (sar_width && sar_height) {
int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height);
for (unsigned int i = 0; i < ELEMENTS(s_DAR); ++i) {
if (s_DAR[i].ratio == ratio) {
for (unsigned int i = 0; i < ELEMENTS(darS); ++i) {
if (darS[i].ratio == ratio) {
index = i;
break;
}
@@ -542,8 +544,8 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
aspect_ratio = VIDEO_ASPECT_RATIO_INVALID;
}
else
aspect_ratio = s_DAR[index].dar;
//debug("H.264 SPS: DAR %dx%d (%d)\n", sar_width, sar_height, aspect_ratio);
aspect_ratio = darS[index].dar;
debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio);
}
}
if (bs.GetBit()) // overscan_info_present_flag
@@ -551,9 +553,9 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
if (bs.GetBit()) { // video_signal_type_present_flag
uint32_t video_format;
video_format = bs.GetBits(3); // video_format
if (video_format < sizeof(s_VideoFormats) / sizeof(s_VideoFormats[0])) {
format = s_VideoFormats[video_format];
//debug("H.264 SPS: video format %d\n", format);
if (video_format < sizeof(videoFormatS) / sizeof(videoFormatS[0])) {
format = videoFormatS[video_format];
debug2("%s video_format=%d", __PRETTY_FUNCTION__, format);
}
bs.SkipBit(); // video_full_range_flag
if (bs.GetBit()) { // colour_description_present_flag
@@ -621,30 +623,30 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
}
}
m_Width = width;
m_Height = height;
m_AspectRatio = aspect_ratio;
m_Format = format;
m_Scan = frame_mbs_only_flag ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED;
m_FrameRate = frame_rate;
m_BitRate = bit_rate;
m_CpbDpbDelaysPresentFlag = cpb_dpb_delays_present_flag;
m_PicStructPresentFlag = pic_struct_present_flag;
m_FrameMbsOnlyFlag = frame_mbs_only_flag;
m_MbAdaptiveFrameFieldFlag = mb_adaptive_frame_field_flag;
m_TimeOffsetLength = time_offset_length;
widthM = width;
heightM = height;
aspectRatioM = aspect_ratio;
formatM = format;
scanM = frame_mbs_only_flag ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED;
frameRateM = frame_rate;
bitRateM = bit_rate;
cpbDpbDelaysPresentFlagM = cpb_dpb_delays_present_flag;
picStructPresentFlagM = pic_struct_present_flag;
frameMbsOnlyFlagM = frame_mbs_only_flag;
mbAdaptiveFrameFieldFlagM = mb_adaptive_frame_field_flag;
timeOffsetLengthM = time_offset_length;
return (bs.Index() / 8);
}
int cFemonH264::parseSEI(const uint8_t *buf, int len)
int cFemonH264::parseSEI(const uint8_t *bufP, int lenP)
{
int num_referenced_subseqs, i;
cFemonBitStream bs(buf, len);
cFemonBitStream bs(bufP, lenP);
eVideoScan scan = m_Scan;
eVideoScan scan = scanM;
while ((bs.Index() * 8 + 16) < len) { // sei_message
while ((bs.Index() * 8 + 16) < lenP) { // sei_message
int lastByte, payloadSize = 0, payloadType = 0;
do {
@@ -659,16 +661,16 @@ int cFemonH264::parseSEI(const uint8_t *buf, int len)
switch (payloadType) { // sei_payload
case 1: // pic_timing
if (m_CpbDpbDelaysPresentFlag) { // cpb_dpb_delays_present_flag
if (cpbDpbDelaysPresentFlagM) { // cpb_dpb_delays_present_flag
bs.SkipUeGolomb(); // cpb_removal_delay
bs.SkipUeGolomb(); // dpb_output_delay
}
if (m_PicStructPresentFlag) { // pic_struct_present_flag
if (picStructPresentFlagM) { // pic_struct_present_flag
uint32_t pic_struct, ct_type = 0, i = 0;
pic_struct = bs.GetBits(4); // pic_struct
if (pic_struct >= (sizeof(s_SeiNumClockTsTable)) / sizeof(s_SeiNumClockTsTable[0]))
if (pic_struct >= (sizeof(seiNumClockTsTableS)) / sizeof(seiNumClockTsTableS[0]))
return 0;
if (m_FrameMbsOnlyFlag && !m_MbAdaptiveFrameFieldFlag)
if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM)
scan = VIDEO_SCAN_PROGRESSIVE;
else {
switch (pic_struct) {
@@ -690,12 +692,12 @@ int cFemonH264::parseSEI(const uint8_t *buf, int len)
break;
}
}
//debug("H.264 SEI: pic struct %d scan type %d\n", pic_struct, scan);
for (i = 0; i < s_SeiNumClockTsTable[pic_struct]; ++i) {
debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan);
for (i = 0; i < seiNumClockTsTableS[pic_struct]; ++i) {
if (bs.GetBit()) { // clock_timestamp_flag[i]
int full_timestamp_flag;
ct_type |= (1 << bs.GetBits(2)); // ct_type
//debug("H.264 SEI: ct type %04X\n", ct_type);
debug2("%s ct_type=%04X", __PRETTY_FUNCTION__, ct_type);
bs.SkipBit(); // nuit_field_based_flag
bs.SkipBits(5); // counting_type
full_timestamp_flag = bs.GetBit(); // full_timestamp_flag
@@ -717,8 +719,8 @@ int cFemonH264::parseSEI(const uint8_t *buf, int len)
}
}
}
if (m_TimeOffsetLength > 0)
bs.SkipBits(m_TimeOffsetLength); // time_offset
if (timeOffsetLengthM > 0)
bs.SkipBits(timeOffsetLengthM); // time_offset
}
}
if (i > 0)
@@ -753,7 +755,7 @@ int cFemonH264::parseSEI(const uint8_t *buf, int len)
bs.ByteAlign();
}
m_Scan = scan;
scanM = scan;
return (bs.Index() / 8);
}

64
h264.h Normal file
View File

@@ -0,0 +1,64 @@
/*
* h264.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_H264_H
#define __FEMON_H264_H
#include "video.h"
class cFemonH264 {
private:
enum {
NAL_SEI = 0x06, // Supplemental Enhancement Information
NAL_SPS = 0x07, // Sequence Parameter Set
NAL_AUD = 0x09, // Access Unit Delimiter
NAL_END_SEQ = 0x0A // End of Sequence
};
typedef struct DAR {
eVideoAspectRatio dar;
int ratio;
} t_DAR;
typedef struct SAR {
int w;
int h;
} t_SAR;
cFemonVideoIf *videoHandlerM;
uint32_t widthM;
uint32_t heightM;
eVideoAspectRatio aspectRatioM;
eVideoFormat formatM;
double frameRateM;
double bitRateM;
eVideoScan scanM;
bool cpbDpbDelaysPresentFlagM;
bool picStructPresentFlagM;
bool frameMbsOnlyFlagM;
bool mbAdaptiveFrameFieldFlagM;
uint32_t timeOffsetLengthM;
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);
int parseSPS(const uint8_t *buf, int len);
int parseSEI(const uint8_t *buf, int len);
static const t_SAR sarS[];
static const t_DAR darS[];
static const eVideoFormat videoFormatS[];
static const uint8_t seiNumClockTsTableS[9];
public:
cFemonH264(cFemonVideoIf *videoHandlerP);
virtual ~cFemonH264();
bool processVideo(const uint8_t *bufP, int lenP);
};
#endif //__FEMON_H264_H

View File

@@ -1,27 +1,27 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* latm.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonlatm.h"
#include "tools.h"
#include "latm.h"
int cFemonLATM::s_Bitrates[3][16] =
int cFemonLATM::bitrateS[3][16] =
{
{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III
};
int cFemonLATM::s_Samplerates[4] =
int cFemonLATM::sampleRateS[4] =
{
22050, 24000, 16000, -1
};
cFemonLATM::cFemonLATM(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
cFemonLATM::cFemonLATM(cFemonAudioIf *audioHandlerP)
: audioHandlerM(audioHandlerP)
{
}
@@ -29,23 +29,23 @@ cFemonLATM::~cFemonLATM()
{
}
bool cFemonLATM::processAudio(const uint8_t *buf, int len)
bool cFemonLATM::processAudio(const uint8_t *bufP, int lenP)
{
cFemonBitStream bs(buf, len * 8);
cFemonBitStream bs(bufP, lenP * 8);
if (!m_AudioHandler)
if (!audioHandlerM)
return false;
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(bufP));
// MPEG audio detection
if (bs.GetBits(12) != 0x56E) // syncword
return false;
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_LATM);
audioHandlerM->SetAudioCodec(AUDIO_CODEC_LATM);
if (bs.GetBit() == 0) // id: MPEG-1=1, extension to lower sampling frequencies=0
return true; // @todo: lower sampling frequencies support
@@ -59,52 +59,52 @@ bool cFemonLATM::processAudio(const uint8_t *buf, int len)
switch (mode) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
if (layer == 3) {
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
}
else {
switch (bit_rate_index) {
case 0:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[layer][bit_rate_index]);
audioHandlerM->SetAudioBitrate(1000 * bitrateS[layer][bit_rate_index]);
break;
}
}
switch (sampling_frequency) {
case 3:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency]);
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency]);
break;
}

27
latm.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* latm.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_LATM_H
#define __FEMON_LATM_H
#include "audio.h"
class cFemonLATM {
private:
cFemonAudioIf *audioHandlerM;
static int bitrateS[3][16];
static int sampleRateS[4];
public:
cFemonLATM(cFemonAudioIf *audioHandlerP);
virtual ~cFemonLATM();
bool processAudio(const uint8_t *bufP, int lenP);
};
#endif //__FEMON_LATM_H

48
log.h Normal file
View File

@@ -0,0 +1,48 @@
/*
* log.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_LOG_H
#define __FEMON_LOG_H
#include "config.h"
#define error(x...) esyslog("FEMON-ERROR: " x)
#define info(x...) isyslog("FEMON: " x)
// 0x0001: Generic call stack
#define debug1(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug1) ? dsyslog("FEMON1: " x) : void() )
// 0x0002: H.264
#define debug2(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug2) ? dsyslog("FEMON2: " x) : void() )
// 0x0004: TBD
#define debug3(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug3) ? dsyslog("FEMON3: " x) : void() )
// 0x0008: TBD
#define debug4(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug4) ? dsyslog("FEMON4: " x) : void() )
// 0x0010: TBD
#define debug5(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug5) ? dsyslog("FEMON5: " x) : void() )
// 0x0020: TBD
#define debug6(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug6) ? dsyslog("FEMON6: " x) : void() )
// 0x0040: TBD
#define debug7(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug7) ? dsyslog("FEMON7: " x) : void() )
// 0x0080: TBD
#define debug8(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug8) ? dsyslog("FEMON8: " x) : void() )
// 0x0100: TBD
#define debug9(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug9) ? dsyslog("FEMON9: " x) : void() )
// 0x0200: TBD
#define debug10(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug10) ? dsyslog("FEMON10: " x) : void() )
// 0x0400: TBD
#define debug11(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug11) ? dsyslog("FEMON11: " x) : void() )
// 0x0800: TBD
#define debug12(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug12) ? dsyslog("FEMON12: " x) : void() )
// 0x1000: TBD
#define debug13(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug13) ? dsyslog("FEMON13: " x) : void() )
// 0x2000: TBD
#define debug14(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug14) ? dsyslog("FEMON14: " x) : void() )
// 0x4000: TBD
#define debug15(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug15) ? dsyslog("FEMON15: " x) : void() )
// 0x8000; Extra call stack
#define debug16(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug16) ? dsyslog("FEMON16: " x) : void() )
#endif // __FEMON_LOG_H

View File

@@ -1,16 +1,16 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* mpeg.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonmpeg.h"
#include "tools.h"
#include "mpeg.h"
#define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5))
int cFemonMPEG::s_Bitrates[2][3][16] =
int cFemonMPEG::bitrateS[2][3][16] =
{
{
{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I
@@ -24,21 +24,21 @@ int cFemonMPEG::s_Bitrates[2][3][16] =
}
};
int cFemonMPEG::s_Samplerates[2][4] =
int cFemonMPEG::sampleRateS[2][4] =
{
{22050, 24000, 16000, -1}, // MPEG-2
{44100, 48000, 32000, -1} // MPEG-1
};
eAudioCodec cFemonMPEG::s_Formats[2][4] =
eAudioCodec cFemonMPEG::formatS[2][4] =
{
{AUDIO_CODEC_MPEG2_I, AUDIO_CODEC_MPEG2_II, AUDIO_CODEC_MPEG2_III, AUDIO_CODEC_UNKNOWN}, // MPEG-2
{AUDIO_CODEC_MPEG1_I, AUDIO_CODEC_MPEG1_II, AUDIO_CODEC_MPEG1_III, AUDIO_CODEC_UNKNOWN} // MPEG-1
};
cFemonMPEG::cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler)
: m_VideoHandler(videohandler),
m_AudioHandler(audiohandler)
cFemonMPEG::cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP)
: videoHandlerM(videoHandlerP),
audioHandlerM(audioHandlerP)
{
}
@@ -46,17 +46,17 @@ cFemonMPEG::~cFemonMPEG()
{
}
bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
bool cFemonMPEG::processAudio(const uint8_t *bufP, int lenP)
{
cFemonBitStream bs(buf, len * 8);
cFemonBitStream bs(bufP, lenP * 8);
if (!m_AudioHandler)
if (!audioHandlerM)
return false;
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(bufP));
// MPEG audio detection
if (bs.GetBits(12) != 0xFFF) // syncword
@@ -71,68 +71,68 @@ bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
bs.SkipBit(); // private pid
int mode = bs.GetBits(2); // mode
m_AudioHandler->SetAudioCodec(s_Formats[id][layer]);
audioHandlerM->SetAudioCodec(formatS[id][layer]);
switch (mode) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (bit_rate_index) {
case 0:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[id][layer][bit_rate_index]);
audioHandlerM->SetAudioBitrate(1000 * bitrateS[id][layer][bit_rate_index]);
break;
}
switch (sampling_frequency) {
case 3:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[id][sampling_frequency]);
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[id][sampling_frequency]);
break;
}
return true;
}
bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
bool cFemonMPEG::processVideo(const uint8_t *bufP, int lenP)
{
cFemonBitStream bs(buf, len * 8);
cFemonBitStream bs(bufP, lenP * 8);
if (!m_VideoHandler)
if (!videoHandlerM)
return false;
// skip PES header
if (!PesLongEnough(len))
if (!PesLongEnough(lenP))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(bufP));
// MPEG-2 video detection, search for start code
if (bs.GetBits(32) != 0x000001B3) // sequence header
@@ -274,13 +274,13 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
}
}
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_MPEG2);
m_VideoHandler->SetVideoSize(horizontal_size, vertical_size);
m_VideoHandler->SetVideoBitrate(400.0 * (double)(bit_rate));
m_VideoHandler->SetVideoFramerate(frame_rate);
m_VideoHandler->SetVideoScan(eVideoScan(scan));
m_VideoHandler->SetVideoAspectRatio(eVideoAspectRatio(aspect));
m_VideoHandler->SetVideoFormat(eVideoFormat(format));
videoHandlerM->SetVideoCodec(VIDEO_CODEC_MPEG2);
videoHandlerM->SetVideoSize(horizontal_size, vertical_size);
videoHandlerM->SetVideoBitrate(400.0 * (double)(bit_rate));
videoHandlerM->SetVideoFramerate(frame_rate);
videoHandlerM->SetVideoScan(eVideoScan(scan));
videoHandlerM->SetVideoAspectRatio(eVideoAspectRatio(aspect));
videoHandlerM->SetVideoFormat(eVideoFormat(format));
return true;
}

31
mpeg.h Normal file
View File

@@ -0,0 +1,31 @@
/*
* mpeg.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_MPEG_H
#define __FEMON_MPEG_H
#include "video.h"
#include "audio.h"
class cFemonMPEG {
private:
cFemonVideoIf *videoHandlerM;
cFemonAudioIf *audioHandlerM;
static int bitrateS[2][3][16];
static int sampleRateS[2][4];
static eAudioCodec formatS[2][4];
public:
cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP);
virtual ~cFemonMPEG();
bool processVideo(const uint8_t *bufP, int lenP);
bool processAudio(const uint8_t *bufP, int lenP);
};
#endif //__FEMON_MPEG_H

File diff suppressed because it is too large Load Diff

102
osd.h Normal file
View File

@@ -0,0 +1,102 @@
/*
* osd.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_OSD_H
#define __FEMON_OSD_H
#include <linux/dvb/frontend.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <vdr/osd.h>
#include <vdr/thread.h>
#include <vdr/status.h>
#include <vdr/plugin.h>
#include <vdr/channels.h>
#include <vdr/transfer.h>
#include <vdr/tools.h>
#include "receiver.h"
#include "svdrpservice.h"
#define MAX_BM_NUMBER 8
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private:
enum eDeviceSourceType {
DEVICESOURCE_DVBAPI = 0,
DEVICESOURCE_IPTV,
DEVICESOURCE_PVRINPUT,
DEVICESOURCE_COUNT
};
static cFemonOsd *pInstanceS;
cOsd *osdM;
cFemonReceiver *receiverM;
int frontendM;
int svdrpFrontendM;
double svdrpVideoBitRateM;
double svdrpAudioBitRateM;
SvdrpConnection_v1_0 svdrpConnectionM;
cPlugin *svdrpPluginM;
int numberM;
int oldNumberM;
int qualityM;
bool qualityValidM;
int strengthM;
bool strengthValidM;
uint16_t snrM;
bool snrValidM;
uint16_t signalM;
bool signalValidM;
uint32_t berM;
bool berValidM;
uint32_t uncM;
bool uncValidM;
cString frontendNameM;
fe_status_t frontendStatusM;
bool frontendStatusValidM;
dvb_frontend_info frontendInfoM;
eDeviceSourceType deviceSourceM;
int displayModeM;
int osdWidthM;
int osdHeightM;
int osdLeftM;
int osdTopM;
cFont *fontM;
cTimeMs inputTimeM;
cCondWait sleepM;
cMutex mutexM;
void DrawStatusWindow(void);
void DrawInfoWindow(void);
bool SvdrpConnect(void);
bool SvdrpTune(void);
protected:
cFemonOsd();
cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void);
virtual void ChannelSwitch(const cDevice *deviceP, int channelNumberP, bool liveViewP);
virtual void SetAudioTrack(int indexP, const char * const *tracksP);
public:
static cFemonOsd *Instance(bool createP = false);
~cFemonOsd();
virtual void Show(void);
virtual eOSState ProcessKey(eKeys keyP);
bool DeviceSwitch(int directionP);
double GetVideoBitrate(void);
double GetAudioBitrate(void);
double GetDolbyBitrate(void);
};
#endif //__FEMON_OSD_H

View File

@@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Peter Marquardt
# Andreas Brachold
@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Christian Wieninger\n"
"Language-Team: German <vdr@linuxtv.org>\n"
"Language: de\n"
@@ -27,6 +27,99 @@ msgstr "Signalinformationen"
msgid "Femon not available"
msgstr "Femon nicht verf<72>gbar"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponderinformation"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Streaminformation"
msgid "Video Stream"
msgstr "Video Stream"
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr "Seitenverh<72>ltnis"
msgid "Frame Rate"
msgstr "Bildrate"
msgid "Video Format"
msgstr "Bildformat"
msgid "Resolution"
msgstr "Aufl<66>sung"
msgid "Audio Stream"
msgstr "Audio Stream"
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr "Abtastrate"
msgid "AC-3 Stream"
msgstr "AC-3 Stream"
msgid "Bit Stream Mode"
msgstr "Bitstream Modus"
msgid "Audio Coding Mode"
msgstr "Audiokodierung"
msgid "Center Mix Level"
msgstr "Center Mix Pegel"
msgid "Surround Mix Level"
msgstr "Surround Mix Pegel"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround Modus"
msgid "Low Frequency Effects"
msgstr "Tieft<66>ner Effekte"
msgid "Dialogue Normalization"
msgstr "Dialog Normalisierung"
msgid "basic"
msgstr "Standard"
@@ -36,9 +129,6 @@ msgstr "Transponder"
msgid "stream"
msgstr "Stream"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klassischer"
@@ -150,96 +240,6 @@ msgstr ""
msgid "Help"
msgstr "Hilfe"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponderinformation"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Streaminformation"
msgid "Video Stream"
msgstr "Video Stream"
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr "Seitenverh<72>ltnis"
msgid "Frame Rate"
msgstr "Bildrate"
msgid "Video Format"
msgstr "Bildformat"
msgid "Resolution"
msgstr "Aufl<66>sung"
msgid "Audio Stream"
msgstr "Audio Stream"
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr "Abtastrate"
msgid "AC-3 Stream"
msgstr "AC-3 Stream"
msgid "Bit Stream Mode"
msgstr "Bitstream Modus"
msgid "Audio Coding Mode"
msgstr "Audiokodierung"
msgid "Center Mix Level"
msgstr "Center Mix Pegel"
msgid "Surround Mix Level"
msgstr "Surround Mix Pegel"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround Modus"
msgid "Low Frequency Effects"
msgstr "Tieft<66>ner Effekte"
msgid "Dialogue Normalization"
msgstr "Dialog Normalisierung"
msgid "Fixed"
msgstr "Fest"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Luis Palacios
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Luis Palacios\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n"
"Language: es\n"
@@ -25,6 +25,99 @@ msgstr "Monitorizaci
msgid "Femon not available"
msgstr ""
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Informaci<63>n del transpondedor"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Stream Information"
msgstr "Informaci<63>n del flujo"
msgid "Video Stream"
msgstr "Flujo de video"
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr "Proporciones de la imagen"
msgid "Frame Rate"
msgstr "Tasa de frames"
msgid "Video Format"
msgstr "Formato de video"
msgid "Resolution"
msgstr "Resoluci<63>n"
msgid "Audio Stream"
msgstr "Flujo de audio"
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr "Frecuencia de muestreo"
msgid "AC-3 Stream"
msgstr "Flujo AC-3"
msgid "Bit Stream Mode"
msgstr "Modo bitstream"
msgid "Audio Coding Mode"
msgstr "Modo de codificaci<63>n de audio"
msgid "Center Mix Level"
msgstr "Nivel sonoro central"
msgid "Surround Mix Level"
msgstr "Nivel sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Nivel sonoro Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Efectos de baja frecuencia"
msgid "Dialogue Normalization"
msgstr "Normalizaci<63>n del di<64>logo"
msgid "basic"
msgstr "B<>sico"
@@ -34,9 +127,6 @@ msgstr "Transpondedor"
msgid "stream"
msgstr "Flujo"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Cl<43>sico"
@@ -148,96 +238,6 @@ msgstr ""
msgid "Help"
msgstr "Ayuda"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Informaci<63>n del transpondedor"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Stream Information"
msgstr "Informaci<63>n del flujo"
msgid "Video Stream"
msgstr "Flujo de video"
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr "Proporciones de la imagen"
msgid "Frame Rate"
msgstr "Tasa de frames"
msgid "Video Format"
msgstr "Formato de video"
msgid "Resolution"
msgstr "Resoluci<63>n"
msgid "Audio Stream"
msgstr "Flujo de audio"
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr "Frecuencia de muestreo"
msgid "AC-3 Stream"
msgstr "Flujo AC-3"
msgid "Bit Stream Mode"
msgstr "Modo bitstream"
msgid "Audio Coding Mode"
msgstr "Modo de codificaci<63>n de audio"
msgid "Center Mix Level"
msgstr "Nivel sonoro central"
msgid "Surround Mix Level"
msgstr "Nivel sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Nivel sonoro Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Efectos de baja frecuencia"
msgid "Dialogue Normalization"
msgstr "Normalizaci<63>n del di<64>logo"
msgid "Fixed"
msgstr "Fijo"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Arthur Konovalov
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Arthur Konovalov\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
@@ -25,6 +25,99 @@ msgstr "Signaaliinfo"
msgid "Femon not available"
msgstr "Femon ei ole k<>ttesaadav"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponderi info"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Stream Information"
msgstr "Vooinfo"
msgid "Video Stream"
msgstr "Videovoog"
msgid "Codec"
msgstr "Koodek"
msgid "Aspect Ratio"
msgstr "K<>lgsuhe"
msgid "Frame Rate"
msgstr "Kaadrisagedus"
msgid "Video Format"
msgstr "Videoformaat"
msgid "Resolution"
msgstr "Resolutsioon"
msgid "Audio Stream"
msgstr "Audiovoog"
msgid "Channel Mode"
msgstr "Kanalimoodus"
msgid "Sampling Frequency"
msgstr "S<>mplimissagedus"
msgid "AC-3 Stream"
msgstr "AC-3 voog"
msgid "Bit Stream Mode"
msgstr "Bitivoo t<><74>p"
msgid "Audio Coding Mode"
msgstr "Audiokodeering"
msgid "Center Mix Level"
msgstr "Keskmise kanali tase"
msgid "Surround Mix Level"
msgstr "Surround kanali tase"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround'i t<><74>p"
msgid "Low Frequency Effects"
msgstr "LFE kanal"
msgid "Dialogue Normalization"
msgstr "Dialoogi normalisatsioon"
msgid "basic"
msgstr "standard"
@@ -34,9 +127,6 @@ msgstr "transponder"
msgid "stream"
msgstr "voog"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Classic"
@@ -148,96 +238,6 @@ msgstr "SVDRP teenuse IP aadressi m
msgid "Help"
msgstr "Abi"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponderi info"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Stream Information"
msgstr "Vooinfo"
msgid "Video Stream"
msgstr "Videovoog"
msgid "Codec"
msgstr "Koodek"
msgid "Aspect Ratio"
msgstr "K<>lgsuhe"
msgid "Frame Rate"
msgstr "Kaadrisagedus"
msgid "Video Format"
msgstr "Videoformaat"
msgid "Resolution"
msgstr "Resolutsioon"
msgid "Audio Stream"
msgstr "Audiovoog"
msgid "Channel Mode"
msgstr "Kanalimoodus"
msgid "Sampling Frequency"
msgstr "S<>mplimissagedus"
msgid "AC-3 Stream"
msgstr "AC-3 voog"
msgid "Bit Stream Mode"
msgstr "Bitivoo t<><74>p"
msgid "Audio Coding Mode"
msgstr "Audiokodeering"
msgid "Center Mix Level"
msgstr "Keskmise kanali tase"
msgid "Surround Mix Level"
msgstr "Surround kanali tase"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround'i t<><74>p"
msgid "Low Frequency Effects"
msgstr "LFE kanal"
msgid "Dialogue Normalization"
msgstr "Dialoogi normalisatsioon"
msgid "Fixed"
msgstr "Fikseeritud"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Rolf Ahrenberg
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
"Language: fi\n"
@@ -25,6 +25,99 @@ msgstr "Signaalimittari"
msgid "Femon not available"
msgstr "Signaalimittari ei ole käytettävissä"
msgid "Video"
msgstr "Kuva"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Ääni"
msgid "Transponder Information"
msgstr "Transponderin tiedot"
msgid "Apid"
msgstr "Ääni-PID"
msgid "Dpid"
msgstr "Dolby-PID"
msgid "Spid"
msgstr "Tekstitys-PID"
msgid "Nid"
msgstr "Verkko-ID"
msgid "Tid"
msgstr "TS-ID"
msgid "Rid"
msgstr "Radio-ID"
msgid "Coderate"
msgstr "Suojaustaso"
msgid "Protocol"
msgstr "Protokolla"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Stream Information"
msgstr "Lähetteen tiedot"
msgid "Video Stream"
msgstr "Kuvaraita"
msgid "Codec"
msgstr "Koodekki"
msgid "Aspect Ratio"
msgstr "Kuvasuhde"
msgid "Frame Rate"
msgstr "Ruudunpäivitystaajuus"
msgid "Video Format"
msgstr "Kuvaformaatti"
msgid "Resolution"
msgstr "Resoluutio"
msgid "Audio Stream"
msgstr "Ääniraita"
msgid "Channel Mode"
msgstr "Kanavatila"
msgid "Sampling Frequency"
msgstr "Näytteenottotaajuus"
msgid "AC-3 Stream"
msgstr "AC-3-ääniraita"
msgid "Bit Stream Mode"
msgstr "Lähetteen tyyppi"
msgid "Audio Coding Mode"
msgstr "Äänikoodaus"
msgid "Center Mix Level"
msgstr "Keskikanavan taso"
msgid "Surround Mix Level"
msgstr "Tehostekanavien taso"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround -tehoste"
msgid "Low Frequency Effects"
msgstr "LFE-kanava"
msgid "Dialogue Normalization"
msgstr "Dialogin normalisointi"
msgid "basic"
msgstr "perus"
@@ -34,9 +127,6 @@ msgstr "transponderi"
msgid "stream"
msgstr "lähete"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klassinen"
@@ -148,96 +238,6 @@ msgstr "Määrittele SVDRP-palvelun käyttämä IP-osoite."
msgid "Help"
msgstr "Opaste"
msgid "Video"
msgstr "Kuva"
msgid "Audio"
msgstr "Ääni"
msgid "Transponder Information"
msgstr "Transponderin tiedot"
msgid "Apid"
msgstr "Ääni-PID"
msgid "Dpid"
msgstr "Dolby-PID"
msgid "Spid"
msgstr "Tekstitys-PID"
msgid "Nid"
msgstr "Verkko-ID"
msgid "Tid"
msgstr "TS-ID"
msgid "Rid"
msgstr "Radio-ID"
msgid "Coderate"
msgstr "Suojaustaso"
msgid "Protocol"
msgstr "Protokolla"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Stream Information"
msgstr "Lähetteen tiedot"
msgid "Video Stream"
msgstr "Kuvaraita"
msgid "Codec"
msgstr "Koodekki"
msgid "Aspect Ratio"
msgstr "Kuvasuhde"
msgid "Frame Rate"
msgstr "Ruudunpäivitystaajuus"
msgid "Video Format"
msgstr "Kuvaformaatti"
msgid "Resolution"
msgstr "Resoluutio"
msgid "Audio Stream"
msgstr "Ääniraita"
msgid "Channel Mode"
msgstr "Kanavatila"
msgid "Sampling Frequency"
msgstr "Näytteenottotaajuus"
msgid "AC-3 Stream"
msgstr "AC-3-ääniraita"
msgid "Bit Stream Mode"
msgstr "Lähetteen tyyppi"
msgid "Audio Coding Mode"
msgstr "Äänikoodaus"
msgid "Center Mix Level"
msgstr "Keskikanavan taso"
msgid "Surround Mix Level"
msgstr "Tehostekanavien taso"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround -tehoste"
msgid "Low Frequency Effects"
msgstr "LFE-kanava"
msgid "Dialogue Normalization"
msgstr "Dialogin normalisointi"
msgid "Fixed"
msgstr "kiinteä"

View File

@@ -1,5 +1,5 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nicolas Huillard
# Michaël Nival <mnival@club-internet.fr>, 2010
@@ -7,10 +7,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
"Language: fr\n"
@@ -27,6 +27,99 @@ msgstr "Infos sur le signal DVB"
msgid "Femon not available"
msgstr "Femon n'est pas disponible"
msgid "Video"
msgstr "Vidéo"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Information du transpondeur"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr "Protocole"
msgid "Bitrate"
msgstr "Taux d'échantillonnage fixe"
msgid "Stream Information"
msgstr "Information sur le flux"
msgid "Video Stream"
msgstr "Flux vidéo"
msgid "Codec"
msgstr "Codec"
msgid "Aspect Ratio"
msgstr "Format de l'image"
msgid "Frame Rate"
msgstr "Rafraîchissement"
msgid "Video Format"
msgstr "Standard vidéo"
msgid "Resolution"
msgstr "Résolution"
msgid "Audio Stream"
msgstr "Flux audio"
msgid "Channel Mode"
msgstr "Mode chaîne"
msgid "Sampling Frequency"
msgstr "Fréquence d'échantillonage"
msgid "AC-3 Stream"
msgstr "Flux AC-3"
msgid "Bit Stream Mode"
msgstr "Mode bitstream"
msgid "Audio Coding Mode"
msgstr "Mode de codage audio"
msgid "Center Mix Level"
msgstr "Niveau sonore milieu"
msgid "Surround Mix Level"
msgstr "Niveau sonore surround"
msgid "Dolby Surround Mode"
msgstr "Mode Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effets de basses"
msgid "Dialogue Normalization"
msgstr "Normalisation des dialogues"
msgid "basic"
msgstr "basique"
@@ -36,9 +129,6 @@ msgstr "transpondeur"
msgid "stream"
msgstr "flux"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Classique"
@@ -150,96 +240,6 @@ msgstr "Définit l'adresse IP du service SVDRP."
msgid "Help"
msgstr "Aide"
msgid "Video"
msgstr "Vidéo"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Information du transpondeur"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr "Protocole"
msgid "Bitrate"
msgstr "Taux d'échantillonnage fixe"
msgid "Stream Information"
msgstr "Information sur le flux"
msgid "Video Stream"
msgstr "Flux vidéo"
msgid "Codec"
msgstr "Codec"
msgid "Aspect Ratio"
msgstr "Format de l'image"
msgid "Frame Rate"
msgstr "Rafraîchissement"
msgid "Video Format"
msgstr "Standard vidéo"
msgid "Resolution"
msgstr "Résolution"
msgid "Audio Stream"
msgstr "Flux audio"
msgid "Channel Mode"
msgstr "Mode chaîne"
msgid "Sampling Frequency"
msgstr "Fréquence d'échantillonage"
msgid "AC-3 Stream"
msgstr "Flux AC-3"
msgid "Bit Stream Mode"
msgstr "Mode bitstream"
msgid "Audio Coding Mode"
msgstr "Mode de codage audio"
msgid "Center Mix Level"
msgstr "Niveau sonore milieu"
msgid "Surround Mix Level"
msgstr "Niveau sonore surround"
msgid "Dolby Surround Mode"
msgstr "Mode Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effets de basses"
msgid "Dialogue Normalization"
msgstr "Normalisation des dialogues"
msgid "Fixed"
msgstr "Fixe"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# F<>ley Istv<74>n <ifuley at tigercomp dot ro>, 2011
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: F<>ley Istv<74>n <ifuley at tigercomp dot ro>\n"
"Language-Team: Hungarian <ifuley at tigercomp dot ro>\n"
"Language: hu\n"
@@ -28,6 +28,99 @@ msgstr "Jel inform
msgid "Femon not available"
msgstr "Femon nem el<65>rhet<65>"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponder inf<6E>"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitr<74>ta"
msgid "Stream Information"
msgstr "Adatfolyam inf<6E>"
msgid "Video Stream"
msgstr "Vide<64> adatfolyam"
msgid "Codec"
msgstr "Kodek"
msgid "Aspect Ratio"
msgstr "M<>retar<61>ny"
msgid "Frame Rate"
msgstr "K<>pfriss<73>t<EFBFBD>s"
msgid "Video Format"
msgstr "Vide<64> form<72>tum"
msgid "Resolution"
msgstr "Felbont<6E>s"
msgid "Audio Stream"
msgstr "Hang adatfolyam"
msgid "Channel Mode"
msgstr "Hangs<67>v m<>d"
msgid "Sampling Frequency"
msgstr "Mintav<61>telez<65>si frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 adatfolyam"
msgid "Bit Stream Mode"
msgstr "Bit Stream m<>d"
msgid "Audio Coding Mode"
msgstr "Hang k<>dol<6F>si m<>d"
msgid "Center Mix Level"
msgstr "K<>z<EFBFBD>pcsatorna kever<65>si jelszintje"
msgid "Surround Mix Level"
msgstr "T<>rhat<61>s csatorna kever<65>si szintje"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround m<>d"
msgid "Low Frequency Effects"
msgstr "LFE - alacsony frekvenci<63>s effektek"
msgid "Dialogue Normalization"
msgstr "P<>rbesz<73>d jelszint normaliz<69>l<EFBFBD>sa"
msgid "basic"
msgstr "alap"
@@ -37,9 +130,6 @@ msgstr "transponder"
msgid "stream"
msgstr "adatfolyam (stream)"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasszikus"
@@ -151,96 +241,6 @@ msgstr "Meghat
msgid "Help"
msgstr "Seg<65>ts<74>g"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponder inf<6E>"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitr<74>ta"
msgid "Stream Information"
msgstr "Adatfolyam inf<6E>"
msgid "Video Stream"
msgstr "Vide<64> adatfolyam"
msgid "Codec"
msgstr "Kodek"
msgid "Aspect Ratio"
msgstr "M<>retar<61>ny"
msgid "Frame Rate"
msgstr "K<>pfriss<73>t<EFBFBD>s"
msgid "Video Format"
msgstr "Vide<64> form<72>tum"
msgid "Resolution"
msgstr "Felbont<6E>s"
msgid "Audio Stream"
msgstr "Hang adatfolyam"
msgid "Channel Mode"
msgstr "Hangs<67>v m<>d"
msgid "Sampling Frequency"
msgstr "Mintav<61>telez<65>si frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 adatfolyam"
msgid "Bit Stream Mode"
msgstr "Bit Stream m<>d"
msgid "Audio Coding Mode"
msgstr "Hang k<>dol<6F>si m<>d"
msgid "Center Mix Level"
msgstr "K<>z<EFBFBD>pcsatorna kever<65>si jelszintje"
msgid "Surround Mix Level"
msgstr "T<>rhat<61>s csatorna kever<65>si szintje"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround m<>d"
msgid "Low Frequency Effects"
msgstr "LFE - alacsony frekvenci<63>s effektek"
msgid "Dialogue Normalization"
msgstr "P<>rbesz<73>d jelszint normaliz<69>l<EFBFBD>sa"
msgid "Fixed"
msgstr "<22>lland<6E>"

View File

@@ -1,15 +1,15 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Sean Carlos
# Diego Pierotto <vdr-italian@tiscali.it>
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
"Language: it\n"
@@ -29,6 +29,99 @@ msgstr "Info segnale"
msgid "Femon not available"
msgstr "Femon non disponibile"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Informazioni transponder"
msgid "Apid"
msgstr "PID Audio"
msgid "Dpid"
msgstr "PID AC3"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Informazioni flusso"
msgid "Video Stream"
msgstr "Flusso video"
msgid "Codec"
msgstr "Codifica"
msgid "Aspect Ratio"
msgstr "Formato immagine"
msgid "Frame Rate"
msgstr "Frame rate"
msgid "Video Format"
msgstr "Formato video"
msgid "Resolution"
msgstr "Risoluzione"
msgid "Audio Stream"
msgstr "Flusso audio"
msgid "Channel Mode"
msgstr "Modalità canale"
msgid "Sampling Frequency"
msgstr "Frequenza campionamento"
msgid "AC-3 Stream"
msgstr "Flusso AC-3"
msgid "Bit Stream Mode"
msgstr "Modalità bitstream"
msgid "Audio Coding Mode"
msgstr "Modalità codifica audio"
msgid "Center Mix Level"
msgstr "Livello sonoro centrale"
msgid "Surround Mix Level"
msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Modalità Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza"
msgid "Dialogue Normalization"
msgstr "Normalizzazione dialoghi"
msgid "basic"
msgstr "base"
@@ -38,9 +131,6 @@ msgstr "transponder"
msgid "stream"
msgstr "flusso"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Classico"
@@ -152,96 +242,6 @@ msgstr "Definisci l'indirizzo IP del servizio SVDRP."
msgid "Help"
msgstr "Aiuto"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Informazioni transponder"
msgid "Apid"
msgstr "PID Audio"
msgid "Dpid"
msgstr "PID AC3"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Informazioni flusso"
msgid "Video Stream"
msgstr "Flusso video"
msgid "Codec"
msgstr "Codifica"
msgid "Aspect Ratio"
msgstr "Formato immagine"
msgid "Frame Rate"
msgstr "Frame rate"
msgid "Video Format"
msgstr "Formato video"
msgid "Resolution"
msgstr "Risoluzione"
msgid "Audio Stream"
msgstr "Flusso audio"
msgid "Channel Mode"
msgstr "Modalità canale"
msgid "Sampling Frequency"
msgstr "Frequenza campionamento"
msgid "AC-3 Stream"
msgstr "Flusso AC-3"
msgid "Bit Stream Mode"
msgstr "Modalità bitstream"
msgid "Audio Coding Mode"
msgstr "Modalità codifica audio"
msgid "Center Mix Level"
msgstr "Livello sonoro centrale"
msgid "Surround Mix Level"
msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Modalità Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza"
msgid "Dialogue Normalization"
msgstr "Normalizzazione dialoghi"
msgid "Fixed"
msgstr "Fisso"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Valdemaras Pipiras
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
"Language: lt\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "DVB signalo informacijos stebėjimas (OSD)"
msgstr "DVB signalo stebėjimas (OSD)"
msgid "Signal Information"
msgstr "Signalo informacija"
@@ -25,6 +25,99 @@ msgstr "Signalo informacija"
msgid "Femon not available"
msgstr "Femon įskiepas nepasiekiamas"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Siųstuvo informacija"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Kodavimo dažnis"
msgid "Protocol"
msgstr "Protokolas"
msgid "Bitrate"
msgstr "Kokybė"
msgid "Stream Information"
msgstr "Srauto informacija"
msgid "Video Stream"
msgstr "Video srautas"
msgid "Codec"
msgstr "Kodekas"
msgid "Aspect Ratio"
msgstr "Proporcijos"
msgid "Frame Rate"
msgstr "Kadrų dažnis"
msgid "Video Format"
msgstr "Video formatas"
msgid "Resolution"
msgstr "Rezoliucija"
msgid "Audio Stream"
msgstr "Audio srautas"
msgid "Channel Mode"
msgstr "Kanalo būsena"
msgid "Sampling Frequency"
msgstr "Parodomasis dažnis"
msgid "AC-3 Stream"
msgstr "AC-3 srautas"
msgid "Bit Stream Mode"
msgstr "Srauto būsena"
msgid "Audio Coding Mode"
msgstr "Audio kodavimas"
msgid "Center Mix Level"
msgstr "Centrinis mikserio lygis"
msgid "Surround Mix Level"
msgstr "Surround Mix lygis"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround būklė"
msgid "Low Frequency Effects"
msgstr "Žemo dažnio efektai"
msgid "Dialogue Normalization"
msgstr "Dialogo normalizacija"
msgid "basic"
msgstr "Standartinis"
@@ -34,9 +127,6 @@ msgstr "Siųstuvas"
msgid "stream"
msgstr "Srautas"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasikinis"
@@ -47,7 +137,7 @@ msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgstr "Tamsiai mėlyna"
msgid "Moronimo"
msgstr "Moronimo"
@@ -62,7 +152,7 @@ msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgstr "Sidabro žalia"
msgid "PearlHD"
msgstr "PearlHD"
@@ -92,10 +182,10 @@ msgid "Define the position of OSD."
msgstr "Nustatyti ekrano užsklandos poziciją."
msgid "Downscale OSD size [%]"
msgstr ""
msgstr "Sumažinti ekrano užsklandos (OSD) dydį [%]"
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį."
msgid "Red limit [%]"
msgstr "Raudonoji ribą [%]"
@@ -148,101 +238,11 @@ msgstr "Nustatyti SVDRP įrenginio IP adresą."
msgid "Help"
msgstr "Pagalba"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Siųstuvo informacija"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Kodavimo dažnis"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Kokybė"
msgid "Stream Information"
msgstr "Srauto informacija"
msgid "Video Stream"
msgstr "Video srautas"
msgid "Codec"
msgstr "Kodekas"
msgid "Aspect Ratio"
msgstr "Proporcijos"
msgid "Frame Rate"
msgstr "Kadrų dažnis"
msgid "Video Format"
msgstr "Video formatas"
msgid "Resolution"
msgstr "Rezoliucija"
msgid "Audio Stream"
msgstr "Audio srautas"
msgid "Channel Mode"
msgstr "kanalo būsena"
msgid "Sampling Frequency"
msgstr "Parodomasis dažnis"
msgid "AC-3 Stream"
msgstr "AC-3 srautas"
msgid "Bit Stream Mode"
msgstr "Bitstream būsena"
msgid "Audio Coding Mode"
msgstr "Audio kodavimas"
msgid "Center Mix Level"
msgstr "Centerinis Mix lygis"
msgid "Surround Mix Level"
msgstr "Surround Mix lygis"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround būklė"
msgid "Low Frequency Effects"
msgstr "Žemo dažnio efektai"
msgid "Dialogue Normalization"
msgstr "Dialogo normalizacija"
msgid "Fixed"
msgstr "Fest"
msgstr "Sutvarkyta"
msgid "Analog"
msgstr "Analog"
msgstr "Analoginis"
msgid "MPEG-2"
msgstr "MPEG-2"
@@ -293,7 +293,7 @@ msgid "progressive"
msgstr "progresyvinis"
msgid "reserved"
msgstr "belegt"
msgstr "rezervuota"
msgid "extended"
msgstr "išplėstas"
@@ -326,22 +326,22 @@ msgid "Music and Effects (ME)"
msgstr "Muzika ir efektai (ME)"
msgid "Visually Impaired (VI)"
msgstr " (VI)"
msgstr "Skirta silpnaregiams (VI)"
msgid "Hearing Impaired (HI)"
msgstr " (HI)"
msgstr "Skirta žmoniems su klausos negalia (HI)"
msgid "Dialogue (D)"
msgstr "Dialogas (D)"
msgid "Commentary (C)"
msgstr "Komentavimas (C)"
msgstr "Komentarai (C)"
msgid "Emergency (E)"
msgstr "Avarinis (E)"
msgid "Voice Over (VO)"
msgstr "Voice over (VO)"
msgstr "Įgarsinta (VO)"
msgid "Karaoke"
msgstr "Karaoke"
@@ -356,10 +356,10 @@ msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgstr "K"
msgid "R"
msgstr "R"
msgstr "D"
msgid "S"
msgstr "S"
@@ -380,7 +380,7 @@ msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "frei"
msgstr "nekoduota"
msgid "Mbit/s"
msgstr "Mbit/s"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Vyacheslav Dikonov
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
"Language: ru\n"
@@ -25,6 +25,99 @@ msgstr "
msgid "Femon not available"
msgstr ""
msgid "Video"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "Transponder Information"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Stream Information"
msgstr ""
msgid "Video Stream"
msgstr ""
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr ""
msgid "Frame Rate"
msgstr ""
msgid "Video Format"
msgstr ""
msgid "Resolution"
msgstr ""
msgid "Audio Stream"
msgstr ""
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr ""
msgid "AC-3 Stream"
msgstr ""
msgid "Bit Stream Mode"
msgstr ""
msgid "Audio Coding Mode"
msgstr ""
msgid "Center Mix Level"
msgstr ""
msgid "Surround Mix Level"
msgstr ""
msgid "Dolby Surround Mode"
msgstr ""
msgid "Low Frequency Effects"
msgstr ""
msgid "Dialogue Normalization"
msgstr ""
msgid "basic"
msgstr ""
@@ -34,9 +127,6 @@ msgstr ""
msgid "stream"
msgstr ""
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr ""
@@ -148,96 +238,6 @@ msgstr ""
msgid "Help"
msgstr ""
msgid "Video"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "Audio"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "Transponder Information"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Stream Information"
msgstr ""
msgid "Video Stream"
msgstr ""
msgid "Codec"
msgstr ""
msgid "Aspect Ratio"
msgstr ""
msgid "Frame Rate"
msgstr ""
msgid "Video Format"
msgstr ""
msgid "Resolution"
msgstr ""
msgid "Audio Stream"
msgstr ""
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr ""
msgid "AC-3 Stream"
msgstr ""
msgid "Bit Stream Mode"
msgstr ""
msgid "Audio Coding Mode"
msgstr ""
msgid "Center Mix Level"
msgstr ""
msgid "Surround Mix Level"
msgstr ""
msgid "Dolby Surround Mode"
msgstr ""
msgid "Low Frequency Effects"
msgstr ""
msgid "Dialogue Normalization"
msgstr ""
msgid "Fixed"
msgstr ""

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Milan Hrala
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
"Language: sk\n"
@@ -25,6 +25,99 @@ msgstr "Inform
msgid "Femon not available"
msgstr "Femon nie je k dispoz<6F>cii"
msgid "Video"
msgstr "Video"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Zvuk"
msgid "Transponder Information"
msgstr "Inform<72>cie transpond<6E>ra"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "r<>chlos<6F> k<>dovania"
msgid "Protocol"
msgstr "Protokol"
msgid "Bitrate"
msgstr "D<>tov<6F> tok"
msgid "Stream Information"
msgstr "Inform<72>cie o d<>tovom toku"
msgid "Video Stream"
msgstr "Video stopa"
msgid "Codec"
msgstr "kodek"
msgid "Aspect Ratio"
msgstr "Pomer str<74>n"
msgid "Frame Rate"
msgstr "Po<50>et sn<73>mkov"
msgid "Video Format"
msgstr "Video form<72>t"
msgid "Resolution"
msgstr "Rozl<7A><6C>enie"
msgid "Audio Stream"
msgstr "Zvukov<6F> stopa"
msgid "Channel Mode"
msgstr "re<72>im kan<61>la"
msgid "Sampling Frequency"
msgstr "Vzorkovacia frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 d<>tov<6F> tok"
msgid "Bit Stream Mode"
msgstr "re<72>im bitov<6F>ho toku"
msgid "Audio Coding Mode"
msgstr "Re<52><65>m k<>dovania zvuku"
msgid "Center Mix Level"
msgstr "<22>rove<76> Center mix"
msgid "Surround Mix Level"
msgstr "<22>rove<76> Surround mix"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround re<72><65>m"
msgid "Low Frequency Effects"
msgstr "Basov<6F> efekty"
msgid "Dialogue Normalization"
msgstr "<22>tandartn<74> dial<61>g"
msgid "basic"
msgstr "<22>tandardtn<74>"
@@ -34,9 +127,6 @@ msgstr "Transpond
msgid "stream"
msgstr "d<>tov<6F> tok"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasick<63>"
@@ -148,96 +238,6 @@ msgstr "zadajte IP adresu slu
msgid "Help"
msgstr "Pomoc"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Zvuk"
msgid "Transponder Information"
msgstr "Inform<72>cie transpond<6E>ra"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "r<>chlos<6F> k<>dovania"
msgid "Protocol"
msgstr "Protokol"
msgid "Bitrate"
msgstr "D<>tov<6F> tok"
msgid "Stream Information"
msgstr "Inform<72>cie o d<>tovom toku"
msgid "Video Stream"
msgstr "Video stopa"
msgid "Codec"
msgstr "kodek"
msgid "Aspect Ratio"
msgstr "Pomer str<74>n"
msgid "Frame Rate"
msgstr "Po<50>et sn<73>mkov"
msgid "Video Format"
msgstr "Video form<72>t"
msgid "Resolution"
msgstr "Rozl<7A><6C>enie"
msgid "Audio Stream"
msgstr "Zvukov<6F> stopa"
msgid "Channel Mode"
msgstr "re<72>im kan<61>la"
msgid "Sampling Frequency"
msgstr "Vzorkovacia frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 d<>tov<6F> tok"
msgid "Bit Stream Mode"
msgstr "re<72>im bitov<6F>ho toku"
msgid "Audio Coding Mode"
msgstr "Re<52><65>m k<>dovania zvuku"
msgid "Center Mix Level"
msgstr "<22>rove<76> Center mix"
msgid "Surround Mix Level"
msgstr "<22>rove<76> Surround mix"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround re<72><65>m"
msgid "Low Frequency Effects"
msgstr "Basov<6F> efekty"
msgid "Dialogue Normalization"
msgstr "<22>tandartn<74> dial<61>g"
msgid "Fixed"
msgstr "Pevn<76>"

View File

@@ -4,10 +4,10 @@
# Yarema aka Knedlyk <yupadmin@gmail.com>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"Language: uk\n"
@@ -25,6 +25,99 @@ msgstr "Інформація про сигнал"
msgid "Femon not available"
msgstr "Femon не доступний"
msgid "Video"
msgstr "Відео"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "Аудіо"
msgid "Transponder Information"
msgstr "Інформація про транспондер"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Шв. кодування"
msgid "Protocol"
msgstr "Протокол"
msgid "Bitrate"
msgstr "Бітрейт"
msgid "Stream Information"
msgstr "Інформація про потік"
msgid "Video Stream"
msgstr "Відео потік"
msgid "Codec"
msgstr "Кодек"
msgid "Aspect Ratio"
msgstr "Співвідношення сторін"
msgid "Frame Rate"
msgstr "Частота кадрів"
msgid "Video Format"
msgstr "Формат відео"
msgid "Resolution"
msgstr "Роздільна здатність"
msgid "Audio Stream"
msgstr "Аудіо потік"
msgid "Channel Mode"
msgstr "Режим каналу"
msgid "Sampling Frequency"
msgstr "Частота"
msgid "AC-3 Stream"
msgstr "AC-3 потік"
msgid "Bit Stream Mode"
msgstr "Режим бітового потоку:"
msgid "Audio Coding Mode"
msgstr "Режим кодування малюнка"
msgid "Center Mix Level"
msgstr "Рівень міксування в центрі"
msgid "Surround Mix Level"
msgstr "Рівень міксування заповнення"
msgid "Dolby Surround Mode"
msgstr "Режим Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Ефекти низької частоти"
msgid "Dialogue Normalization"
msgstr "Нормалізація гучності"
msgid "basic"
msgstr "основне"
@@ -34,9 +127,6 @@ msgstr "транспондер"
msgid "stream"
msgstr "потік"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Класичний"
@@ -148,96 +238,6 @@ msgstr "Визначення IP адреси сервісу SVDRP."
msgid "Help"
msgstr "Допомога"
msgid "Video"
msgstr "Відео"
msgid "Audio"
msgstr "Аудіо"
msgid "Transponder Information"
msgstr "Інформація про транспондер"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Шв. кодування"
msgid "Protocol"
msgstr "Протокол"
msgid "Bitrate"
msgstr "Бітрейт"
msgid "Stream Information"
msgstr "Інформація про потік"
msgid "Video Stream"
msgstr "Відео потік"
msgid "Codec"
msgstr "Кодек"
msgid "Aspect Ratio"
msgstr "Співвідношення сторін"
msgid "Frame Rate"
msgstr "Частота кадрів"
msgid "Video Format"
msgstr "Формат відео"
msgid "Resolution"
msgstr "Роздільна здатність"
msgid "Audio Stream"
msgstr "Аудіо потік"
msgid "Channel Mode"
msgstr "Режим каналу"
msgid "Sampling Frequency"
msgstr "Частота"
msgid "AC-3 Stream"
msgstr "AC-3 потік"
msgid "Bit Stream Mode"
msgstr "Режим бітового потоку:"
msgid "Audio Coding Mode"
msgstr "Режим кодування малюнка"
msgid "Center Mix Level"
msgstr "Рівень міксування в центрі"
msgid "Surround Mix Level"
msgstr "Рівень міксування заповнення"
msgid "Dolby Surround Mode"
msgstr "Режим Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Ефекти низької частоти"
msgid "Dialogue Normalization"
msgstr "Нормалізація гучності"
msgid "Fixed"
msgstr "Фіксовано"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
"Language: zh_CN\n"
@@ -25,6 +25,99 @@ msgstr "频道信息浏览"
msgid "Femon not available"
msgstr "Femon插件无法使用"
msgid "Video"
msgstr "视频"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "音频"
msgid "Transponder Information"
msgstr "转发器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "码速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "视频流"
msgid "Codec"
msgstr "解码模式"
msgid "Aspect Ratio"
msgstr "纵横比"
msgid "Frame Rate"
msgstr "帧速率"
msgid "Video Format"
msgstr "视频制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音频流"
msgid "Channel Mode"
msgstr "声道模式"
msgid "Sampling Frequency"
msgstr "采样频率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音频编码模式"
msgid "Center Mix Level"
msgstr "中心混合级别"
msgid "Surround Mix Level"
msgstr "环绕混合级别"
msgid "Dolby Surround Mode"
msgstr "杜比环绕声模式"
msgid "Low Frequency Effects"
msgstr "低频效果"
msgid "Dialogue Normalization"
msgstr "对话正常化"
msgid "basic"
msgstr "基本"
@@ -34,9 +127,6 @@ msgstr "转发器"
msgid "stream"
msgstr "数据流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "经典"
@@ -148,96 +238,6 @@ msgstr "定义SVDRP服务的IP地址."
msgid "Help"
msgstr "帮助"
msgid "Video"
msgstr "视频"
msgid "Audio"
msgstr "音频"
msgid "Transponder Information"
msgstr "转发器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "码速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "视频流"
msgid "Codec"
msgstr "解码模式"
msgid "Aspect Ratio"
msgstr "纵横比"
msgid "Frame Rate"
msgstr "帧速率"
msgid "Video Format"
msgstr "视频制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音频流"
msgid "Channel Mode"
msgstr "声道模式"
msgid "Sampling Frequency"
msgstr "采样频率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音频编码模式"
msgid "Center Mix Level"
msgstr "中心混合级别"
msgid "Surround Mix Level"
msgstr "环绕混合级别"
msgid "Dolby Surround Mode"
msgstr "杜比环绕声模式"
msgid "Low Frequency Effects"
msgstr "低频效果"
msgid "Dialogue Normalization"
msgstr "对话正常化"
msgid "Fixed"
msgstr "固定"

View File

@@ -1,14 +1,14 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# Copyright (C) 2007-2015 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.1.1\n"
"Project-Id-Version: vdr-femon 2.2.1\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-05-10 05:10+0200\n"
"PO-Revision-Date: 2014-05-10 05:10+0200\n"
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
"Language: zh_TW\n"
@@ -25,6 +25,99 @@ msgstr "頻道信息瀏覽"
msgid "Femon not available"
msgstr "Femon插件無法使用"
msgid "Video"
msgstr "視頻"
msgid "AC-3"
msgstr "AC-3"
msgid "Audio"
msgstr "音頻"
msgid "Transponder Information"
msgstr "轉發器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "碼速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "視頻流"
msgid "Codec"
msgstr "解碼模式"
msgid "Aspect Ratio"
msgstr "縱橫比"
msgid "Frame Rate"
msgstr "幀速率"
msgid "Video Format"
msgstr "視頻制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音頻流"
msgid "Channel Mode"
msgstr "聲道模式"
msgid "Sampling Frequency"
msgstr "採樣頻率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音頻編碼模式"
msgid "Center Mix Level"
msgstr "中心混合級別"
msgid "Surround Mix Level"
msgstr "環繞混合級別"
msgid "Dolby Surround Mode"
msgstr "杜比環繞聲模式"
msgid "Low Frequency Effects"
msgstr "低頻效果"
msgid "Dialogue Normalization"
msgstr "對話正常化"
msgid "basic"
msgstr "基本"
@@ -34,9 +127,6 @@ msgstr "轉發器"
msgid "stream"
msgstr "數據流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "經典"
@@ -148,96 +238,6 @@ msgstr "定義SVDRP服務的IP地址."
msgid "Help"
msgstr "幫助"
msgid "Video"
msgstr "視頻"
msgid "Audio"
msgstr "音頻"
msgid "Transponder Information"
msgstr "轉發器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "碼速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "視頻流"
msgid "Codec"
msgstr "解碼模式"
msgid "Aspect Ratio"
msgstr "縱橫比"
msgid "Frame Rate"
msgstr "幀速率"
msgid "Video Format"
msgstr "視頻制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音頻流"
msgid "Channel Mode"
msgstr "聲道模式"
msgid "Sampling Frequency"
msgstr "採樣頻率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音頻編碼模式"
msgid "Center Mix Level"
msgstr "中心混合級別"
msgid "Surround Mix Level"
msgstr "環繞混合級別"
msgid "Dolby Surround Mode"
msgstr "杜比環繞聲模式"
msgid "Low Frequency Effects"
msgstr "低頻效果"
msgid "Dialogue Normalization"
msgstr "對話正常化"
msgid "Fixed"
msgstr "固定"

252
receiver.c Normal file
View File

@@ -0,0 +1,252 @@
/*
* receiver.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <unistd.h>
#include "config.h"
#include "log.h"
#include "tools.h"
#include "receiver.h"
cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrackP)
: cReceiver(channelP),
cThread("femon receiver"),
mutexM(),
sleepM(),
activeM(false),
detectH264M(this),
detectMpegM(this, this),
detectAacM(this),
detectLatmM(this),
detectAc3M(this),
videoBufferM(KILOBYTE(512), TS_SIZE, false, "Femon video"),
videoTypeM(channelP ? channelP->Vtype(): 0),
videoPidM(channelP ? channelP->Vpid() : 0),
videoPacketCountM(0),
videoBitRateM(0.0),
videoValidM(false),
audioBufferM(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
audioPidM(channelP ? channelP->Apid(aTrackP) : 0),
audioPacketCountM(0),
audioBitRateM(0.0),
audioValidM(false),
ac3BufferM(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
ac3PidM(channelP ? channelP->Dpid(dTrackP) : 0),
ac3PacketCountM(0),
ac3BitRateM(0),
ac3ValidM(false)
{
debug1("%s (, %d, %d)", __PRETTY_FUNCTION__, aTrackP, dTrackP);
SetPids(NULL);
AddPid(videoPidM);
AddPid(audioPidM);
AddPid(ac3PidM);
videoBufferM.SetTimeouts(0, 100);
audioBufferM.SetTimeouts(0, 100);
ac3BufferM.SetTimeouts(0, 100);
videoInfoM.codec = VIDEO_CODEC_INVALID;
videoInfoM.format = VIDEO_FORMAT_INVALID;
videoInfoM.scan = VIDEO_SCAN_INVALID;
videoInfoM.aspectRatio = VIDEO_ASPECT_RATIO_INVALID;
videoInfoM.width = 0;
videoInfoM.height = 0;
videoInfoM.frameRate = 0;
videoInfoM.bitrate = AUDIO_BITRATE_INVALID;
audioInfoM.codec = AUDIO_CODEC_UNKNOWN;
audioInfoM.bitrate = AUDIO_BITRATE_INVALID;
audioInfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
audioInfoM.channelMode = AUDIO_CHANNEL_MODE_INVALID;
ac3InfoM.bitrate = AUDIO_BITRATE_INVALID;
ac3InfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
ac3InfoM.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID;
ac3InfoM.audioCodingMode = AUDIO_CODING_MODE_INVALID;
ac3InfoM.dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
ac3InfoM.centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
ac3InfoM.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
ac3InfoM.dialogLevel = 0;
ac3InfoM.lfe = false;
}
cFemonReceiver::~cFemonReceiver(void)
{
debug1("%s", __PRETTY_FUNCTION__);
Deactivate();
}
void cFemonReceiver::Deactivate(void)
{
debug1("%s", __PRETTY_FUNCTION__);
Detach();
if (activeM) {
activeM = false;
sleepM.Signal();
if (Running())
Cancel(3);
}
}
void cFemonReceiver::Activate(bool onP)
{
debug1("%s (%d)", __PRETTY_FUNCTION__, onP);
if (onP)
Start();
else
Deactivate();
}
void cFemonReceiver::Receive(uchar *dataP, int lengthP)
{
// TS packet length: TS_SIZE
if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) {
int len, pid = TsPid(dataP);
if (pid == videoPidM) {
++videoPacketCountM;
len = videoBufferM.Put(dataP, lengthP);
if (len != lengthP) {
videoBufferM.ReportOverflow(lengthP - len);
videoBufferM.Clear();
}
}
else if (pid == audioPidM) {
++audioPacketCountM;
len = audioBufferM.Put(dataP, lengthP);
if (len != lengthP) {
audioBufferM.ReportOverflow(lengthP - len);
audioBufferM.Clear();
}
}
else if (pid == ac3PidM) {
++ac3PacketCountM;
len = ac3BufferM.Put(dataP, lengthP);
if (len != lengthP) {
ac3BufferM.ReportOverflow(lengthP - len);
ac3BufferM.Clear();
}
}
}
}
void cFemonReceiver::Action(void)
{
debug1("%s", __PRETTY_FUNCTION__);
cTimeMs calcPeriod(0);
activeM = true;
while (Running() && activeM) {
uint8_t *Data;
double timeout;
int len, Length;
bool processed = false;
// process available video data
while ((Data = videoBufferM.Get(Length))) {
if (!activeM || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
videoBufferM.Del(Length);
continue;
}
processed = true;
if (TsPayloadStart(Data)) {
while (const uint8_t *p = videoAssemblerM.GetPes(len)) {
if (videoTypeM == 0x1B) { // MPEG4
if (detectH264M.processVideo(p, len)) {
videoValidM = true;
break;
}
}
else {
if (detectMpegM.processVideo(p, len)) {
videoValidM = true;
break;
}
}
}
videoAssemblerM.Reset();
}
videoAssemblerM.PutTs(Data, Length);
videoBufferM.Del(Length);
}
// process available audio data
while ((Data = audioBufferM.Get(Length))) {
if (!activeM || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
audioBufferM.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = audioAssemblerM.GetPes(len)) {
if (detectAacM.processAudio(p, len) || detectLatmM.processAudio(p, len) || detectMpegM.processAudio(p, len))
audioValidM = true;
audioAssemblerM.Reset();
}
audioAssemblerM.PutTs(Data, Length);
audioBufferM.Del(Length);
}
// process available dolby data
while ((Data = ac3BufferM.Get(Length))) {
if (!activeM || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
ac3BufferM.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = ac3AssemblerM.GetPes(len)) {
if (detectAc3M.processAudio(p, len))
ac3ValidM = true;
ac3AssemblerM.Reset();
}
ac3AssemblerM.PutTs(Data, Length);
ac3BufferM.Del(Length);
}
// calculate bitrates
timeout = double(calcPeriod.Elapsed());
if (activeM && (timeout >= (100.0 * FemonConfig.GetCalcInterval()))) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
// PES headers should be compensated!
videoBitRateM = (1000.0 * 8.0 * 184.0 * videoPacketCountM) / timeout;
videoPacketCountM = 0;
audioBitRateM = (1000.0 * 8.0 * 184.0 * audioPacketCountM) / timeout;
audioPacketCountM = 0;
ac3BitRateM = (1000.0 * 8.0 * 184.0 * ac3PacketCountM) / timeout;
ac3PacketCountM = 0;
calcPeriod.Set(0);
}
if (!processed)
sleepM.Wait(10); // to avoid busy loop and reduce cpu load
}
}

178
receiver.h Normal file
View File

@@ -0,0 +1,178 @@
/*
* receiver.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_RECEIVER_H
#define __FEMON_RECEIVER_H
#include <vdr/thread.h>
#include <vdr/receiver.h>
#include "aac.h"
#include "ac3.h"
#include "audio.h"
#include "h264.h"
#include "latm.h"
#include "mpeg.h"
#include "tools.h"
#include "video.h"
class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If {
private:
cMutex mutexM;
cCondWait sleepM;
bool activeM;
cFemonH264 detectH264M;
cFemonMPEG detectMpegM;
cFemonAAC detectAacM;
cFemonLATM detectLatmM;
cFemonAC3 detectAc3M;
cRingBufferLinear videoBufferM;
cTsToPes videoAssemblerM;
int videoTypeM;
int videoPidM;
int videoPacketCountM;
double videoBitRateM;
bool videoValidM;
video_info_t videoInfoM;
cRingBufferLinear audioBufferM;
cTsToPes audioAssemblerM;
int audioPidM;
int audioPacketCountM;
double audioBitRateM;
bool audioValidM;
audio_info_t audioInfoM;
cRingBufferLinear ac3BufferM;
cTsToPes ac3AssemblerM;
int ac3PidM;
int ac3PacketCountM;
double ac3BitRateM;
bool ac3ValidM;
ac3_info_t ac3InfoM;
protected:
virtual void Activate(bool onP);
virtual void Receive(uchar *dataP, int lengthP);
virtual void Action(void);
public:
virtual void SetVideoCodec(eVideoCodec codecP) { cMutexLock MutexLock(&mutexM);
videoInfoM.codec = codecP; }
virtual void SetVideoFormat(eVideoFormat formatP) { cMutexLock MutexLock(&mutexM);
videoInfoM.format = formatP; }
virtual void SetVideoScan(eVideoScan scanP) { cMutexLock MutexLock(&mutexM);
videoInfoM.scan = scanP; }
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) { cMutexLock MutexLock(&mutexM);
videoInfoM.aspectRatio = aspectRatioP; }
virtual void SetVideoSize(int widthP, int heightP) { cMutexLock MutexLock(&mutexM);
videoInfoM.width = widthP;
videoInfoM.height = heightP; }
virtual void SetVideoFramerate(double frameRateP) { cMutexLock MutexLock(&mutexM);
videoInfoM.frameRate = frameRateP; }
virtual void SetVideoBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM);
videoInfoM.bitrate = bitRateP; }
virtual void SetAudioCodec(eAudioCodec codecP) { cMutexLock MutexLock(&mutexM);
audioInfoM.codec = codecP; }
virtual void SetAudioBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM);
audioInfoM.bitrate = bitRateP; }
virtual void SetAudioSamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM);
audioInfoM.samplingFrequency = samplingP; }
virtual void SetAudioChannel(eAudioChannelMode modeP) { cMutexLock MutexLock(&mutexM);
audioInfoM.channelMode = modeP; }
virtual void SetAC3Bitrate(int bitRateP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.bitrate = bitRateP; }
virtual void SetAC3SamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.samplingFrequency = samplingP; }
virtual void SetAC3Bitstream(int modeP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.bitstreamMode = modeP; }
virtual void SetAC3AudioCoding(int modeP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.audioCodingMode = modeP; }
virtual void SetAC3DolbySurround(int modeP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.dolbySurroundMode = modeP; }
virtual void SetAC3CenterMix(int levelP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.centerMixLevel = levelP; }
virtual void SetAC3SurroundMix(int levelP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.surroundMixLevel = levelP; }
virtual void SetAC3Dialog(int levelP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.dialogLevel = levelP; }
virtual void SetAC3LFE(bool onoffP) { cMutexLock MutexLock(&mutexM);
ac3InfoM.lfe = onoffP; }
public:
cFemonReceiver(const cChannel* channelP, int aTrackp, int dTrackP);
virtual ~cFemonReceiver();
void Deactivate(void);
bool VideoValid(void) { cMutexLock MutexLock(&mutexM);
return videoValidM; }; // boolean
double VideoBitrate(void) { cMutexLock MutexLock(&mutexM);
return videoBitRateM; }; // bit/s
int VideoCodec(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.codec; }; // eVideoCodec
int VideoFormat(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.format; }; // eVideoFormat
int VideoScan(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.scan; }; // eVideoScan
int VideoAspectRatio(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.aspectRatio; }; // eVideoAspectRatio
int VideoHorizontalSize(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.width; }; // pixels
int VideoVerticalSize(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.height; }; // pixels
double VideoFrameRate(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.frameRate; }; // Hz
double VideoStreamBitrate(void) { cMutexLock MutexLock(&mutexM);
return videoInfoM.bitrate; }; // bit/s
bool AudioValid(void) { cMutexLock MutexLock(&mutexM);
return audioValidM; }; // boolean
double AudioBitrate(void) { cMutexLock MutexLock(&mutexM);
return audioBitRateM; }; // bit/s
int AudioCodec(void) { cMutexLock MutexLock(&mutexM);
return audioInfoM.codec; }; // eAudioCodec
int AudioChannelMode(void) { cMutexLock MutexLock(&mutexM);
return audioInfoM.channelMode; }; // eAudioChannelMode
double AudioStreamBitrate(void) { cMutexLock MutexLock(&mutexM);
return audioInfoM.bitrate; }; // bit/s or eAudioBitrate
int AudioSamplingFreq(void) { cMutexLock MutexLock(&mutexM);
return audioInfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency
bool AC3Valid(void) { cMutexLock MutexLock(&mutexM);
return ac3ValidM; }; // boolean
double AC3Bitrate(void) { cMutexLock MutexLock(&mutexM);
return ac3BitRateM; }; // bit/s
double AC3StreamBitrate(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.bitrate; }; // bit/s or eAudioBitrate
int AC3SamplingFreq(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency
int AC3BitStreamMode(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
int AC3AudioCodingMode(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.audioCodingMode; }; // 0..7 or eAudioCodingMode
bool AC3_2_0(void) { cMutexLock MutexLock(&mutexM);
return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean
bool AC3_5_1(void) { cMutexLock MutexLock(&mutexM);
return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean
int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.dolbySurroundMode; }; // eAudioDolbySurroundMode
int AC3CenterMixLevel(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.centerMixLevel; }; // eAudioCenterMixLevel
int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.surroundMixLevel; }; // eAudioSurroundMixLevel
int AC3DialogLevel(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.dialogLevel; }; // -dB
bool AC3Lfe(void) { cMutexLock MutexLock(&mutexM);
return ac3InfoM.lfe; }; // boolean
};
#endif //__FEMON_RECEIVER_H

162
setup.c Normal file
View File

@@ -0,0 +1,162 @@
/*
* setup.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <vdr/menu.h>
#include "config.h"
#include "log.h"
#include "tools.h"
#include "setup.h"
cMenuFemonSetup::cMenuFemonSetup()
: hideMenuM(FemonConfig.GetHideMenu()),
displayModeM(FemonConfig.GetDisplayMode()),
skinM(FemonConfig.GetSkin()),
themeM(FemonConfig.GetTheme()),
positionM(FemonConfig.GetPosition()),
downscaleM(FemonConfig.GetDownscale()),
redLimitM(FemonConfig.GetRedLimit()),
greenLimitM(FemonConfig.GetGreenLimit()),
updateIntervalM(FemonConfig.GetUpdateInterval()),
analyzeStreamM(FemonConfig.GetAnalyzeStream()),
calcIntervalM(FemonConfig.GetCalcInterval()),
useSvdrpM(FemonConfig.GetUseSvdrp()),
svdrpPortM(FemonConfig.GetSvdrpPort())
{
debug1("%s", __PRETTY_FUNCTION__);
strn0cpy(svdrpIpM, FemonConfig.GetSvdrpIp(), sizeof(svdrpIpM));
dispModesM[eFemonModeBasic] = tr("basic");
dispModesM[eFemonModeTransponder] = tr("transponder");
dispModesM[eFemonModeStream] = tr("stream");
dispModesM[eFemonModeAC3] = tr("AC-3");
skinsM[eFemonSkinClassic] = tr("Classic");
skinsM[eFemonSkinElchi] = tr("Elchi");
themesM[eFemonThemeClassic] = tr("Classic");
themesM[eFemonThemeElchi] = tr("Elchi");
themesM[eFemonThemeSTTNG] = tr("ST:TNG");
themesM[eFemonThemeDeepBlue] = tr("DeepBlue");
themesM[eFemonThemeMoronimo] = tr("Moronimo");
themesM[eFemonThemeEnigma] = tr("Enigma");
themesM[eFemonThemeEgalsTry] = tr("EgalsTry");
themesM[eFemonThemeDuotone] = tr("Duotone");
themesM[eFemonThemeSilverGreen] = tr("SilverGreen");
themesM[eFemonThemePearlHD] = tr("PearlHD");
SetMenuCategory(mcSetupPlugins);
Setup();
}
void cMenuFemonSetup::Setup(void)
{
int current = Current();
Clear();
helpM.Clear();
Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &hideMenuM));
helpM.Append(tr("Define whether the main menu entry is hidden."));
Add(new cMenuEditStraItem(tr("Default display mode"), &displayModeM, eFemonModeMaxNumber, dispModesM));
helpM.Append(tr("Define the default display mode at startup."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Skin"), &skinM, eFemonSkinMaxNumber, skinsM));
helpM.Append(tr("Define the used OSD skin."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Theme"), &themeM, eFemonThemeMaxNumber, themesM));
helpM.Append(tr("Define the used OSD theme."));
Add(new cMenuEditBoolItem(tr("Position"), &positionM, trVDR("bottom"), trVDR("top")));
helpM.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20));
helpM.Append(tr("Define the downscale ratio for OSD size."));
Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50));
helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
Add(new cMenuEditIntItem(tr("Green limit [%]"), &greenLimitM, 51, 100));
helpM.Append(tr("Define a limit for green bar, which is used to indicate a good signal."));
Add(new cMenuEditIntItem(tr("OSD update interval [0.1s]"), &updateIntervalM, 1, 100));
helpM.Append(tr("Define an interval for OSD updates. The smaller interval generates higher CPU load."));
Add(new cMenuEditBoolItem(tr("Analyze stream"), &analyzeStreamM));
helpM.Append(tr("Define whether the DVB stream is analyzed and bitrates calculated."));
if (analyzeStreamM) {
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &calcIntervalM, 1, 100));
helpM.Append(tr("Define an interval for calculation. The bigger interval generates more stable values."));
}
Add(new cMenuEditBoolItem(tr("Use SVDRP service"), &useSvdrpM));
helpM.Append(tr("Define whether the SVDRP service is used in client/server setups."));
if (useSvdrpM) {
Add(new cMenuEditIntItem(tr("SVDRP service port"), &svdrpPortM, 1, 65535));
helpM.Append(tr("Define the port number of SVDRP service."));
Add(new cMenuEditStrItem(tr("SVDRP service IP"), svdrpIpM, sizeof(svdrpIpM), ".1234567890"));
helpM.Append(tr("Define the IP address of SVDRP service."));
}
SetCurrent(Get(current));
Display();
}
void cMenuFemonSetup::Store(void)
{
debug1("%s", __PRETTY_FUNCTION__);
// Store values into setup.conf
SetupStore("HideMenu", hideMenuM);
SetupStore("DisplayMode", displayModeM);
SetupStore("Skin", skinM);
SetupStore("Theme", themeM);
SetupStore("Position", positionM);
SetupStore("Downscale", downscaleM);
SetupStore("RedLimit", redLimitM);
SetupStore("GreenLimit", greenLimitM);
SetupStore("UpdateInterval", updateIntervalM);
SetupStore("AnalStream", analyzeStreamM);
SetupStore("CalcInterval", calcIntervalM);
SetupStore("UseSvdrp", useSvdrpM);
SetupStore("ServerPort", svdrpPortM);
SetupStore("ServerIp", svdrpIpM);
// Update global config
FemonConfig.SetHideMenu(hideMenuM);
FemonConfig.SetDisplayMode(displayModeM);
FemonConfig.SetSkin(skinM);
FemonConfig.SetTheme(themeM);
FemonConfig.SetPosition(positionM);
FemonConfig.SetDownscale(downscaleM);
FemonConfig.SetRedLimit(redLimitM);
FemonConfig.SetGreenLimit(greenLimitM);
FemonConfig.SetUpdateInterval(updateIntervalM);
FemonConfig.SetAnalyzeStream(analyzeStreamM);
FemonConfig.SetCalcInterval(calcIntervalM);
FemonConfig.SetUseSvdrp(useSvdrpM);
FemonConfig.SetSvdrpPort(svdrpPortM);
FemonConfig.SetSvdrpIp(svdrpIpM);
}
eOSState cMenuFemonSetup::ProcessKey(eKeys keyP)
{
int oldUseSvdrp = useSvdrpM;
int oldAnalyzeStream = analyzeStreamM;
eOSState state = cMenuSetupPage::ProcessKey(keyP);
if (keyP != kNone && (analyzeStreamM != oldAnalyzeStream || useSvdrpM != oldUseSvdrp))
Setup();
if ((keyP == kInfo) && (state == osUnknown) && (Current() < helpM.Size()))
return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), helpM[Current()]));
return state;
}

41
setup.h Normal file
View File

@@ -0,0 +1,41 @@
/*
* setup.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_SETUP_H
#define __FEMON_SETUP_H
class cMenuFemonSetup : public cMenuSetupPage {
private:
const char *dispModesM[eFemonModeMaxNumber];
const char *skinsM[eFemonSkinMaxNumber];
const char *themesM[eFemonThemeMaxNumber];
cVector<const char*> helpM;
int hideMenuM;
int displayModeM;
int skinM;
int themeM;
int positionM;
int downscaleM;
int redLimitM;
int greenLimitM;
int updateIntervalM;
int analyzeStreamM;
int calcIntervalM;
int useSvdrpM;
int svdrpPortM;
char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null
void Setup(void);
protected:
virtual eOSState ProcessKey(eKeys Key);
virtual void Store(void);
public:
cMenuFemonSetup();
};
#endif // __FEMON_SETUP_H

View File

@@ -11,11 +11,11 @@
class cLine: public cListObject {
private:
char *Line;
char *lineM;
public:
const char *Text() { return Line; }
cLine(const char *s) { Line = s ? strdup(s) : NULL; };
virtual ~cLine() { if (Line) free(Line); };
const char *Text() { return lineM; }
cLine(const char *strP) { lineM = strP ? strdup(strP) : NULL; };
virtual ~cLine() { if (lineM) free(lineM); };
};
struct SvdrpConnection_v1_0 {

View File

@@ -1,13 +1,15 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* symbol.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include <vdr/device.h>
#include "femontools.h"
#include "femonsymbol.h"
#include "log.h"
#include "tools.h"
#include "symbol.h"
#include "symbols/stereo.xpm"
#include "symbols/monoleft.xpm"
@@ -118,7 +120,7 @@ void cFemonSymbolCache::Refresh()
int width, height;
double aspect, xfactor, yfactor;
cDevice::PrimaryDevice()->GetOsdSize(width, height, aspect);
debug("%s(): %dx%d\n", __PRETTY_FUNCTION__, width, height);
debug1("%s width=%d height=%d", __PRETTY_FUNCTION__, width, height);
xfactor = (double)width / DEFAULT_WIDTH;
yfactor = (double)height / DEFAULT_HEIGHT;
if (!DoubleEqual(xfactor, xFactorM) || !DoubleEqual(yfactor, yFactorM)) {
@@ -130,7 +132,7 @@ void cFemonSymbolCache::Refresh()
bool cFemonSymbolCache::Populate(void)
{
debug("%s(): %.02fx%.02f\n", __PRETTY_FUNCTION__, xFactorM, yFactorM);
debug1("%s xFactor=%.02f yFactor=%.02f", __PRETTY_FUNCTION__, xFactorM, yFactorM);
if (!DoubleEqual(0.0, xFactorM) || !DoubleEqual(0.0, yFactorM)) {
Flush();
@@ -188,7 +190,7 @@ bool cFemonSymbolCache::Populate(void)
bool cFemonSymbolCache::Flush(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
debug1("%s", __PRETTY_FUNCTION__);
for (int i = 0; i < cacheM.Size(); ++i) {
cBitmap *bmp = cacheM[i];
DELETENULL(bmp);
@@ -204,7 +206,7 @@ cBitmap& cFemonSymbolCache::Get(eSymbols symbolP)
if (symbolP < cacheM.Size())
bitmapM = cacheM[symbolP];
else
error("%s(): Invalid symbol %d\n", __PRETTY_FUNCTION__, symbolP);
error("%s (%d) Invalid symbol", __PRETTY_FUNCTION__, symbolP);
return *bitmapM;
}

View File

@@ -1,12 +1,12 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* symbol.h: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONSYMBOL_H
#define __FEMONSYMBOL_H
#ifndef __FEMON_SYMBOL_H
#define __FEMON_SYMBOL_H
#include <vdr/tools.h>
#include <vdr/osd.h>
@@ -84,4 +84,4 @@ public:
extern cFemonSymbolCache femonSymbols;
#endif // __FEMONSYMBOL_H
#endif // __FEMON_SYMBOL_H

View File

@@ -1,5 +1,5 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* tools.c: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
@@ -15,79 +15,93 @@
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/dvb/frontend.h>
#include "femonreceiver.h"
#include "femonosd.h"
#include "femontools.h"
static cString getCA(int value)
#include "osd.h"
#include "receiver.h"
#include "tools.h"
static cString getCA(int valueP)
{
// http://www.dvb.org/index.php?id=174
// http://en.wikipedia.org/wiki/Conditional_access_system
switch (value) {
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), value); // Reserved
switch (valueP) {
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), valueP); // Reserved
case 0x0001 ... 0x009F:
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), value); // Standardized systems
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), value); // Analog signals
case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", value); // Canal Plus
case 0x0464: return cString::sprintf("EuroDec (%X)", value); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", value); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", value); // Irdeto
case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", value); // News Datacom
case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", value); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", value); // Philips
case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", value); // Scientific Atlanta
case 0x1000: return cString::sprintf("RAS (%X)", value); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", value); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("BetaCrypt (%X)", value); // BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", value); // Kudelski SA
case 0x22F0: return cString::sprintf("Codicrypt (%X)", value); // Scopus Network Technologies
case 0x2600: return cString::sprintf("BISS (%X)", value); // European Broadcasting Union
case 0x4347: return cString::sprintf("CryptOn (%X)", value); // CryptOn
case 0x4800: return cString::sprintf("Accessgate (%X)", value); // Telemann
case 0x4900: return cString::sprintf("China Crypt (%X)", value); // CryptoWorks
case 0x4A10: return cString::sprintf("EasyCas (%X)", value); // EasyCas
case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", value); // AlphaCrypt
case 0x4A70: return cString::sprintf("DreamCrypt (%X)", value); // Dream Multimedia
case 0x4A60: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", value); // Neotion
case 0x4A62: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A63: return cString::sprintf("Neotion SHL (%X)", value); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", value); // TPS
case 0x4AA1: return cString::sprintf("KeyFly (%X)", value); // SIDSA
case 0x4ABF: return cString::sprintf("DG-Crypt (%X)", value); // Beijing Compunicate Technology Inc.
case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", value); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", value); // Widevine Technologies, Inc.
case 0x4AE0: return cString::sprintf("RossCrypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5500: return cString::sprintf("Z-Crypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("Griffin (%X)", value); // Griffin
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), valueP); // Standardized systems
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), valueP); // Analog signals
case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", valueP); // Canal Plus
case 0x0464: return cString::sprintf("EuroDec (%X)", valueP); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", valueP); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", valueP); // Irdeto
case 0x0700 ... 0x07FF: return cString::sprintf("DigiCipher 2 (%X)", valueP); // Jerrold/GI/Motorola 4DTV
case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", valueP); // NDS
case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", valueP); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", valueP); // Philips CryptoTec
case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", valueP); // Scientific Atlanta
case 0x1000: return cString::sprintf("RAS (%X)", valueP); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", valueP); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("VCAS (%X)", valueP); // Verimatrix Inc. former BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", valueP); // Kudelski SA
case 0x22F0: return cString::sprintf("Codicrypt (%X)", valueP); // Scopus Network Technologies
case 0x2600: return cString::sprintf("BISS (%X)", valueP); // European Broadcasting Union
case 0x2719: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd.
case 0x4347: return cString::sprintf("CryptOn (%X)", valueP); // CryptOn
case 0x4800: return cString::sprintf("Accessgate (%X)", valueP); // Telemann
case 0x4900: return cString::sprintf("China Crypt (%X)", valueP); // CryptoWorks
case 0x4A02: return cString::sprintf("Tongfang (%X)", valueP); // Tsinghua Tongfang Company
case 0x4A10: return cString::sprintf("EasyCas (%X)", valueP); // EasyCas
case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", valueP); // AlphaCrypt
case 0x4A60: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", valueP); // Neotion
case 0x4A62: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
case 0x4A63: return cString::sprintf("Neotion SHL (%X)", valueP); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
case 0x4A70: return cString::sprintf("DreamCrypt (%X)", valueP); // Dream Multimedia
case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", valueP); // Thales Broadcast & Multimedia
case 0x4AA1: return cString::sprintf("KeyFly (%X)", valueP); // SIDSA
case 0x4ABF: return cString::sprintf("CTI-CAS (%X)", valueP); // Beijing Compunicate Technology Inc.
case 0x4AC1: return cString::sprintf("Latens (%X)", valueP); // Latens Systems
case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", valueP); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", valueP); // Widevine Technologies, Inc.
case 0x4AE0 ... 0x4AE1: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd.
case 0x4AE4: return cString::sprintf("CoreCrypt (%X)", valueP); // CoreTrust
case 0x4AE5: return cString::sprintf("PRO-Crypt (%X)", valueP); // IK SATPROF
case 0x4AEA: return cString::sprintf("Cryptoguard (%X)", valueP); // Gryptoguard AB
case 0x4AEB: return cString::sprintf("Abel Quintic (%X)", valueP); // Abel DRM Systems
case 0x4AF0: return cString::sprintf("ABV (%X)", valueP); // Alliance Broadcast Vision
case 0x5500: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("Griffin (%X)", valueP); // Nucleus Systems Ltd.
case 0x5581: return cString::sprintf("Bulcrypt (%X)", valueP); // Bulcrypt
case 0x7BE1: return cString::sprintf("DRE-Crypt (%X)", valueP); // DRE-Crypt
case 0xA101: return cString::sprintf("RosCrypt-M (%X)", valueP); // NIIR
case 0xEAD0: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd.
default: break;
}
return cString::sprintf("%X", value);
return cString::sprintf("%X", valueP);
}
static const char *getUserString(int Value, const tDvbParameterMap *Map)
static const char *getUserString(int valueP, const tDvbParameterMap *mapP)
{
const tDvbParameterMap *map = Map;
const tDvbParameterMap *map = mapP;
while (map && map->userValue != -1) {
if (map->driverValue == Value)
if (map->driverValue == valueP)
return map->userString ? trVDR(map->userString) : "---";
map++;
}
return "---";
}
cDvbDevice *getDvbDevice(cDevice* device)
cDvbDevice *getDvbDevice(cDevice* deviceP)
{
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(device);
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(deviceP);
#ifdef __DYNAMIC_DEVICE_PROBE
if (!dev && device && device->HasSubDevice())
dev = dynamic_cast<cDvbDevice*>(device->SubDevice());
if (!dev && deviceP && deviceP->HasSubDevice())
dev = dynamic_cast<cDvbDevice*>(deviceP->SubDevice());
#endif
return dev;
}
cString getFrontendInfo(cDvbDevice *device)
cString getFrontendInfo(cDvbDevice *deviceP)
{
struct dvb_frontend_info value;
fe_status_t status;
@@ -98,17 +112,17 @@ cString getFrontendInfo(cDvbDevice *device)
uint32_t unc = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (!device)
if (!deviceP)
return info;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return info;
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", device->CardIndex(), device->SignalStrength(), device->SignalQuality());
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality());
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *device->DeviceName());
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *deviceP->DeviceName());
if (ioctl(fe, FE_READ_STATUS, &status) >= 0)
info = cString::sprintf("%s\nSTAT:%02X", *info, status);
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
@@ -130,39 +144,39 @@ cString getFrontendInfo(cDvbDevice *device)
return info;
}
cString getFrontendName(cDvbDevice *device)
cString getFrontendName(cDvbDevice *deviceP)
{
if (!device)
if (!deviceP)
return NULL;
return (cString::sprintf("%s on device #%d", *device->DeviceName(), device->CardIndex()));
return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex()));
}
cString getFrontendStatus(cDvbDevice *device)
cString getFrontendStatus(cDvbDevice *deviceP)
{
fe_status_t value;
if (!device)
if (!deviceP)
return NULL;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
memset(&value, 0, sizeof(value));
ioctl(fe, FE_READ_STATUS, &value);
close(fe);
return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", device->CardIndex()));
return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex()));
}
uint16_t getSignal(cDvbDevice *device)
uint16_t getSignal(cDvbDevice *deviceP)
{
uint16_t value = 0;
if (!device)
if (!deviceP)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
@@ -171,14 +185,14 @@ uint16_t getSignal(cDvbDevice *device)
return (value);
}
uint16_t getSNR(cDvbDevice *device)
uint16_t getSNR(cDvbDevice *deviceP)
{
uint16_t value = 0;
if (!device)
if (!deviceP)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SNR, &value);
@@ -187,14 +201,14 @@ uint16_t getSNR(cDvbDevice *device)
return (value);
}
uint32_t getBER(cDvbDevice *device)
uint32_t getBER(cDvbDevice *deviceP)
{
uint32_t value = 0;
if (!device)
if (!deviceP)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_BER, &value);
@@ -203,14 +217,14 @@ uint32_t getBER(cDvbDevice *device)
return (value);
}
uint32_t getUNC(cDvbDevice *device)
uint32_t getUNC(cDvbDevice *deviceP)
{
uint32_t value = 0;
if (!device)
if (!deviceP)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
@@ -219,39 +233,39 @@ uint32_t getUNC(cDvbDevice *device)
return (value);
}
cString getApids(const cChannel *channel)
cString getApids(const cChannel *channelP)
{
int value = 0;
cString apids = cString::sprintf("%d", channel->Apid(value));
while (channel->Apid(++value) && (value < MAXAPIDS))
apids = cString::sprintf("%s, %d", *apids, channel->Apid(value));
cString apids = cString::sprintf("%d", channelP->Apid(value));
while (channelP->Apid(++value) && (value < MAXAPIDS))
apids = cString::sprintf("%s, %d", *apids, channelP->Apid(value));
return apids;
}
cString getDpids(const cChannel *channel)
cString getDpids(const cChannel *channelP)
{
int value = 0;
cString dpids = cString::sprintf("%d", channel->Dpid(value));
while (channel->Dpid(++value) && (value < MAXDPIDS))
dpids = cString::sprintf("%s, %d", *dpids, channel->Dpid(value));
cString dpids = cString::sprintf("%d", channelP->Dpid(value));
while (channelP->Dpid(++value) && (value < MAXDPIDS))
dpids = cString::sprintf("%s, %d", *dpids, channelP->Dpid(value));
return dpids;
}
cString getSpids(const cChannel *channel)
cString getSpids(const cChannel *channelP)
{
int value = 0;
cString spids = cString::sprintf("%d", channel->Spid(value));
while (channel->Spid(++value) && (value < MAXSPIDS))
spids = cString::sprintf("%s, %d", *spids, channel->Spid(value));
cString spids = cString::sprintf("%d", channelP->Spid(value));
while (channelP->Spid(++value) && (value < MAXSPIDS))
spids = cString::sprintf("%s, %d", *spids, channelP->Spid(value));
return spids;
}
cString getCAids(const cChannel *channel)
cString getCAids(const cChannel *channelP)
{
int value = 0;
cString caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
while (channel->Ca(++value) && (value < MAXCAIDS))
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
cString caids = cString::sprintf("%s", *getCA(channelP->Ca(value)));
while (channelP->Ca(++value) && (value < MAXCAIDS))
caids = cString::sprintf("%s, %s", *caids, *getCA(channelP->Ca(value)));
return caids;
}
@@ -262,37 +276,37 @@ cString getVideoStream(int value)
return cString::sprintf("---");
}
cString getAudioStream(int value, const cChannel *channel)
cString getAudioStream(int valueP, const cChannel *channelP)
{
int pid = 0;
if (IS_AUDIO_TRACK(value))
pid = int(value - ttAudioFirst);
if (channel && channel->Apid(pid)) {
if (channel->Alang(pid))
return cString::sprintf("#%d (%s)", channel->Apid(pid), channel->Alang(pid));
if (IS_AUDIO_TRACK(valueP))
pid = int(valueP - ttAudioFirst);
if (channelP && channelP->Apid(pid)) {
if (channelP->Alang(pid))
return cString::sprintf("#%d (%s)", channelP->Apid(pid), channelP->Alang(pid));
else
return cString::sprintf("#%d", channel->Apid(pid));
return cString::sprintf("#%d", channelP->Apid(pid));
}
return cString::sprintf("---");
}
cString getAC3Stream(int value, const cChannel *channel)
cString getAC3Stream(int valueP, const cChannel *channelP)
{
int pid = 0;
if (IS_DOLBY_TRACK(value))
pid = int(value - ttDolbyFirst);
if (channel && channel->Dpid(pid)) {
if (channel->Dlang(pid))
return cString::sprintf("#%d (%s)", channel->Dpid(pid), channel->Dlang(pid));
if (IS_DOLBY_TRACK(valueP))
pid = int(valueP - ttDolbyFirst);
if (channelP && channelP->Dpid(pid)) {
if (channelP->Dlang(pid))
return cString::sprintf("#%d (%s)", channelP->Dpid(pid), channelP->Dlang(pid));
else
return cString::sprintf("#%d", channel->Dpid(pid));
return cString::sprintf("#%d", channelP->Dpid(pid));
}
return cString::sprintf("---");
}
cString getVideoCodec(int value)
cString getVideoCodec(int valueP)
{
switch (value) {
switch (valueP) {
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
default: break;
@@ -300,9 +314,9 @@ cString getVideoCodec(int value)
return cString::sprintf("---");
}
cString getAudioCodec(int value)
cString getAudioCodec(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_CODEC_MPEG1_I: return cString::sprintf("%s", tr("MPEG-1 Layer I"));
case AUDIO_CODEC_MPEG1_II: return cString::sprintf("%s", tr("MPEG-1 Layer II"));
case AUDIO_CODEC_MPEG1_III: return cString::sprintf("%s", tr("MPEG-1 Layer III"));
@@ -316,9 +330,9 @@ cString getAudioCodec(int value)
return cString::sprintf("---");
}
cString getAudioChannelMode(int value)
cString getAudioChannelMode(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_CHANNEL_MODE_STEREO: return cString::sprintf("%s", tr("stereo"));
case AUDIO_CHANNEL_MODE_JOINT_STEREO: return cString::sprintf("%s", tr("joint Stereo"));
case AUDIO_CHANNEL_MODE_DUAL: return cString::sprintf("%s", tr("dual"));
@@ -328,76 +342,76 @@ cString getAudioChannelMode(int value)
return cString::sprintf("---");
}
cString getCoderate(int value)
cString getCoderate(int valueP)
{
return cString::sprintf("%s", getUserString(value, CoderateValues));
return cString::sprintf("%s", getUserString(valueP, CoderateValues));
}
cString getTransmission(int value)
cString getTransmission(int valueP)
{
return cString::sprintf("%s", getUserString(value, TransmissionValues));
return cString::sprintf("%s", getUserString(valueP, TransmissionValues));
}
cString getBandwidth(int value)
cString getBandwidth(int valueP)
{
return cString::sprintf("%s", getUserString(value, BandwidthValues));
return cString::sprintf("%s", getUserString(valueP, BandwidthValues));
}
cString getInversion(int value)
cString getInversion(int valueP)
{
return cString::sprintf("%s", getUserString(value, InversionValues));
return cString::sprintf("%s", getUserString(valueP, InversionValues));
}
cString getHierarchy(int value)
cString getHierarchy(int valueP)
{
return cString::sprintf("%s", getUserString(value, HierarchyValues));
return cString::sprintf("%s", getUserString(valueP, HierarchyValues));
}
cString getGuard(int value)
cString getGuard(int valueP)
{
return cString::sprintf("%s", getUserString(value, GuardValues));
return cString::sprintf("%s", getUserString(valueP, GuardValues));
}
cString getModulation(int value)
cString getModulation(int valueP)
{
return cString::sprintf("%s", getUserString(value, ModulationValues));
return cString::sprintf("%s", getUserString(valueP, ModulationValues));
}
cString getTerrestrialSystem(int value)
cString getTerrestrialSystem(int valueP)
{
return cString::sprintf("%s", getUserString(value, SystemValuesTerr));
return cString::sprintf("%s", getUserString(valueP, SystemValuesTerr));
}
cString getSatelliteSystem(int value)
cString getSatelliteSystem(int valueP)
{
return cString::sprintf("%s", getUserString(value, SystemValuesSat));
return cString::sprintf("%s", getUserString(valueP, SystemValuesSat));
}
cString getRollOff(int value)
cString getRollOff(int valueP)
{
return cString::sprintf("%s", getUserString(value, RollOffValues));
return cString::sprintf("%s", getUserString(valueP, RollOffValues));
}
cString getPilot(int value)
cString getPilot(int valueP)
{
return cString::sprintf("%s", getUserString(value, PilotValues));
return cString::sprintf("%s", getUserString(valueP, PilotValues));
}
cString getResolution(int width, int height, int scan)
cString getResolution(int widthP, int heightP, int scanP)
{
if ((width > 0) && (height > 0)) {
switch (scan) {
case VIDEO_SCAN_INTERLACED: return cString::sprintf("%dx%d %s", width, height, tr("interlaced"));
case VIDEO_SCAN_PROGRESSIVE: return cString::sprintf("%dx%d %s", width, height, tr("progressive"));
default: return cString::sprintf("%dx%d", width, height);
if ((widthP > 0) && (heightP > 0)) {
switch (scanP) {
case VIDEO_SCAN_INTERLACED: return cString::sprintf("%dx%d %s", widthP, heightP, tr("interlaced"));
case VIDEO_SCAN_PROGRESSIVE: return cString::sprintf("%dx%d %s", widthP, heightP, tr("progressive"));
default: return cString::sprintf("%dx%d", widthP, heightP);
}
}
return cString::sprintf("---");
}
cString getAspectRatio(int value)
cString getAspectRatio(int valueP)
{
switch (value) {
switch (valueP) {
case VIDEO_ASPECT_RATIO_RESERVED: return cString::sprintf("%s", tr("reserved"));
case VIDEO_ASPECT_RATIO_EXTENDED: return cString::sprintf("%s", tr("extended"));
case VIDEO_ASPECT_RATIO_1_1: return cString::sprintf("1:1");
@@ -423,9 +437,9 @@ cString getAspectRatio(int value)
return cString::sprintf("---");
}
cString getVideoFormat(int value)
cString getVideoFormat(int valueP)
{
switch (value) {
switch (valueP) {
case VIDEO_FORMAT_UNKNOWN: return cString::sprintf("%s", tr("unknown"));
case VIDEO_FORMAT_RESERVED: return cString::sprintf("%s", tr("reserved"));
case VIDEO_FORMAT_COMPONENT: return cString::sprintf("%s", tr("component"));
@@ -438,16 +452,16 @@ cString getVideoFormat(int value)
return cString::sprintf("---");
}
cString getFrameRate(double value)
cString getFrameRate(double valueP)
{
if (value > 0)
return cString::sprintf("%.2f %s", value, tr("Hz"));
if (valueP > 0)
return cString::sprintf("%.2f %s", valueP, tr("Hz"));
return cString::sprintf("---");
}
cString getAC3BitStreamMode(int value, int coding)
cString getAC3BitStreamMode(int valueP, int codingP)
{
switch (value) {
switch (valueP) {
case AUDIO_BITSTREAM_MODE_CM: return cString::sprintf("%s", tr("Complete Main (CM)"));
case AUDIO_BITSTREAM_MODE_ME: return cString::sprintf("%s", tr("Music and Effects (ME)"));
case AUDIO_BITSTREAM_MODE_VI: return cString::sprintf("%s", tr("Visually Impaired (VI)"));
@@ -455,16 +469,16 @@ cString getAC3BitStreamMode(int value, int coding)
case AUDIO_BITSTREAM_MODE_D: return cString::sprintf("%s", tr("Dialogue (D)"));
case AUDIO_BITSTREAM_MODE_C: return cString::sprintf("%s", tr("Commentary (C)"));
case AUDIO_BITSTREAM_MODE_E: return cString::sprintf("%s", tr("Emergency (E)"));
case AUDIO_BITSTREAM_MODE_VO_KAR: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
case AUDIO_BITSTREAM_MODE_VO_KAR: return cString::sprintf("%s", (codingP == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
default: break;
}
return cString::sprintf("---");
}
cString getAC3AudioCodingMode(int value, int stream)
cString getAC3AudioCodingMode(int valueP, int streamP)
{
if (stream != 7) {
switch (value) {
if (streamP != 7) {
switch (valueP) {
case AUDIO_CODING_MODE_1_1: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2"));
case AUDIO_CODING_MODE_1_0: return cString::sprintf("1/0 - %s", tr("C"));
case AUDIO_CODING_MODE_2_0: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R"));
@@ -479,9 +493,9 @@ cString getAC3AudioCodingMode(int value, int stream)
return cString::sprintf("---");
}
cString getAC3CenterMixLevel(int value)
cString getAC3CenterMixLevel(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_CENTER_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB"));
case AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB"));
case AUDIO_CENTER_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB"));
@@ -491,9 +505,9 @@ cString getAC3CenterMixLevel(int value)
return cString::sprintf("---");
}
cString getAC3SurroundMixLevel(int value)
cString getAC3SurroundMixLevel(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB"));
case AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB"));
case AUDIO_SURROUND_MIX_LEVEL_0_dB: return cString::sprintf("0 %s", tr("dB"));
@@ -503,9 +517,9 @@ cString getAC3SurroundMixLevel(int value)
return cString::sprintf("---");
}
cString getAC3DolbySurroundMode(int value)
cString getAC3DolbySurroundMode(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated"));
case AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND: return cString::sprintf("%s", trVDR("no"));
case AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND: return cString::sprintf("%s", trVDR("yes"));
@@ -515,57 +529,57 @@ cString getAC3DolbySurroundMode(int value)
return cString::sprintf("---");
}
cString getAC3DialogLevel(int value)
cString getAC3DialogLevel(int valueP)
{
if (value > 0)
return cString::sprintf("-%d %s", value, tr("dB"));
if (valueP > 0)
return cString::sprintf("-%d %s", valueP, tr("dB"));
return cString::sprintf("---");
}
cString getFrequencyMHz(int value)
cString getFrequencyMHz(int valueP)
{
double freq = value;
double freq = valueP;
while (freq > 20000.0) freq /= 1000.0;
return cString::sprintf("%s %s", *dtoa(freq, "%lg"), tr("MHz"));
}
cString getAudioSamplingFreq(int value)
cString getAudioSamplingFreq(int valueP)
{
switch (value) {
switch (valueP) {
case AUDIO_SAMPLING_FREQUENCY_INVALID: return cString::sprintf("---");
case AUDIO_SAMPLING_FREQUENCY_RESERVED: return cString::sprintf("%s", tr("reserved"));
default: break;
}
return cString::sprintf("%d %s", value, tr("Hz"));
return cString::sprintf("%d %s", valueP, tr("Hz"));
}
cString getAudioBitrate(double value, double stream)
cString getAudioBitrate(double valueP, double streamP)
{
switch ((int)stream) {
switch ((int)streamP) {
case AUDIO_BITRATE_INVALID: return cString::sprintf("---");
case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value));
case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value));
case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(valueP));
case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(valueP));
default: break;
}
return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value));
return cString::sprintf("%s (%s)", *getBitrateKbits(streamP), *getBitrateKbits(valueP));
}
cString getVideoBitrate(double value, double stream)
cString getVideoBitrate(double valueP, double streamP)
{
return cString::sprintf("%s (%s)", *getBitrateMbits(stream), *getBitrateMbits(value));
return cString::sprintf("%s (%s)", *getBitrateMbits(streamP), *getBitrateMbits(valueP));
}
cString getBitrateMbits(double value)
cString getBitrateMbits(double valueP)
{
if (value > 0)
return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s"));
if (valueP > 0)
return cString::sprintf("%.2f %s", valueP / 1000000.0, tr("Mbit/s"));
return cString::sprintf("---");
}
cString getBitrateKbits(double value)
cString getBitrateKbits(double valueP)
{
if (value > 0)
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
if (valueP > 0)
return cString::sprintf("%.0f %s", valueP / 1000.0, tr("kbit/s"));
return cString::sprintf("---");
}

83
tools.h Normal file
View File

@@ -0,0 +1,83 @@
/*
* tools.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_COMMON_H
#define __FEMON_COMMON_H
#include <stdint.h>
#include <vdr/channels.h>
#include <vdr/dvbdevice.h>
#include <vdr/remux.h>
#include <vdr/tools.h>
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#define SATIP_DEVICE "SAT>IP"
cDvbDevice *getDvbDevice(cDevice* deviceP);
cString getFrontendInfo(cDvbDevice *deviceP);
cString getFrontendName(cDvbDevice *deviceP);
cString getFrontendStatus(cDvbDevice *deviceP);
uint16_t getSNR(cDvbDevice *deviceP);
uint16_t getSignal(cDvbDevice *deviceP);
uint32_t getBER(cDvbDevice *deviceP);
uint32_t getUNC(cDvbDevice *deviceP);
cString getApids(const cChannel *channelP);
cString getDpids(const cChannel *channelP);
cString getSpids(const cChannel *channelP);
cString getCAids(const cChannel *channelP);
cString getVideoStream(int valueP);
cString getVideoCodec(int valueP);
cString getAudioStream(int valueP, const cChannel *channelP);
cString getAudioCodec(int valueP);
cString getAudioChannelMode(int valueP);
cString getCoderate(int valueP);
cString getTransmission(int valueP);
cString getBandwidth(int valueP);
cString getInversion(int valueP);
cString getHierarchy(int valueP);
cString getGuard(int valueP);
cString getModulation(int valueP);
cString getTerrestrialSystem(int valueP);
cString getSatelliteSystem(int valueP);
cString getRollOff(int valueP);
cString getPilot(int valueP);
cString getResolution(int widthP, int heightP, int scanP);
cString getAspectRatio(int valueP);
cString getVideoFormat(int valueP);
cString getFrameRate(double valueP);
cString getAC3Stream(int valueP, const cChannel *channelP);
cString getAC3BitStreamMode(int valueP, int codingP);
cString getAC3AudioCodingMode(int valueP, int streamP);
cString getAC3CenterMixLevel(int valueP);
cString getAC3SurroundMixLevel(int valueP);
cString getAC3DolbySurroundMode(int valueP);
cString getAC3DialogLevel(int valueP);
cString getFrequencyMHz(int valueP);
cString getAudioSamplingFreq(int valueP);
cString getAudioBitrate(double valueP, double streamP);
cString getVideoBitrate(double valueP, double streamP);
cString getBitrateMbits(double valueP);
cString getBitrateKbits(double valueP);
class cFemonBitStream : public cBitStream {
public:
cFemonBitStream(const uint8_t *dataP, const int lengthP) : cBitStream(dataP, lengthP) {}
uint32_t GetUeGolomb();
int32_t GetSeGolomb();
void SkipGolomb();
void SkipUeGolomb() { SkipGolomb(); }
void SkipSeGolomb() { SkipGolomb(); }
};
#endif // __FEMON_COMMON_H

View File

@@ -1,12 +1,12 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
* video.h: Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONVIDEO_H
#define __FEMONVIDEO_H
#ifndef __FEMON_VIDEO_H
#define __FEMON_VIDEO_H
enum eVideoCodec {
VIDEO_CODEC_INVALID = -1,
@@ -75,19 +75,19 @@ public:
virtual ~cFemonVideoIf() {}
// eVideoCodec
virtual void SetVideoCodec(eVideoCodec codec) = 0;
virtual void SetVideoCodec(eVideoCodec codecP) = 0;
// eVideoFormat
virtual void SetVideoFormat(eVideoFormat format) = 0;
virtual void SetVideoFormat(eVideoFormat formatP) = 0;
// eVideoScan
virtual void SetVideoScan(eVideoScan scan) = 0;
virtual void SetVideoScan(eVideoScan scanP) = 0;
// eVideoAspectRatio
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) = 0;
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) = 0;
// pixels
virtual void SetVideoSize(int width, int height) = 0;
virtual void SetVideoSize(int widthP, int heightP) = 0;
// Hz
virtual void SetVideoFramerate(double framerate) = 0;
virtual void SetVideoFramerate(double frameRateP) = 0;
// Mbit/s
virtual void SetVideoBitrate(double bitrate) = 0;
virtual void SetVideoBitrate(double bitRateP) = 0;
};
#endif //__FEMONVIDEO_H
#endif //__FEMON_VIDEO_H