2004-02-26 03:20:00 +01:00
|
|
|
/*
|
2004-03-03 03:20:00 +01:00
|
|
|
* Frontend Status Monitor plugin for the Video Disk Recorder
|
2004-02-26 03:20:00 +01:00
|
|
|
*
|
|
|
|
* See the README file for copyright information and how to reach the author.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2004-03-03 03:20:00 +01:00
|
|
|
#include <unistd.h>
|
2005-08-28 03:20:00 +02:00
|
|
|
#include "femontools.h"
|
2004-03-03 03:20:00 +01:00
|
|
|
#include "femoncfg.h"
|
2004-02-26 03:20:00 +01:00
|
|
|
#include "femonreceiver.h"
|
|
|
|
|
2009-08-28 19:54:34 +02:00
|
|
|
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vtype, int Vpid, int Apid[], int Dpid[])
|
2008-11-09 12:43:27 +01:00
|
|
|
: cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL),
|
|
|
|
cThread("femon receiver"),
|
2009-09-01 14:30:48 +02:00
|
|
|
m_Mutex(),
|
2008-11-23 21:26:48 +01:00
|
|
|
m_Sleep(),
|
|
|
|
m_Active(false),
|
2009-08-25 19:22:06 +02:00
|
|
|
m_DetectH264(this),
|
|
|
|
m_DetectMPEG(this, this),
|
|
|
|
m_DetectAAC(this),
|
|
|
|
m_DetectAC3(this),
|
2009-08-28 19:54:34 +02:00
|
|
|
m_VideoType(Vtype),
|
2008-11-09 12:43:27 +01:00
|
|
|
m_VideoPid(Vpid),
|
|
|
|
m_VideoPacketCount(0),
|
|
|
|
m_VideoBitrate(0.0),
|
|
|
|
m_VideoValid(false),
|
|
|
|
m_AudioPid(Apid[0]),
|
|
|
|
m_AudioPacketCount(0),
|
|
|
|
m_AudioBitrate(0.0),
|
|
|
|
m_AudioValid(false),
|
|
|
|
m_AC3Pid(Dpid[0]),
|
2009-08-28 19:54:34 +02:00
|
|
|
m_AC3PacketCount(0),
|
2008-11-09 12:43:27 +01:00
|
|
|
m_AC3Bitrate(0),
|
2009-08-25 19:22:06 +02:00
|
|
|
m_AC3Valid(false)
|
2004-02-26 03:20:00 +01:00
|
|
|
{
|
2005-02-24 03:20:00 +01:00
|
|
|
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
2008-11-09 12:43:27 +01:00
|
|
|
|
|
|
|
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;
|
2004-02-26 03:20:00 +01:00
|
|
|
}
|
2008-11-09 12:43:27 +01:00
|
|
|
|
2004-02-26 03:20:00 +01:00
|
|
|
cFemonReceiver::~cFemonReceiver(void)
|
|
|
|
{
|
2005-02-24 03:20:00 +01:00
|
|
|
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
2008-11-23 21:26:48 +01:00
|
|
|
Deactivate();
|
|
|
|
}
|
|
|
|
|
|
|
|
void cFemonReceiver::Deactivate(void)
|
|
|
|
{
|
|
|
|
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
|
|
|
if (m_Active) {
|
|
|
|
m_Active = false;
|
|
|
|
m_Sleep.Signal();
|
|
|
|
if (Running())
|
|
|
|
Cancel(3);
|
|
|
|
Detach();
|
|
|
|
}
|
2004-02-26 03:20:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void cFemonReceiver::Activate(bool On)
|
|
|
|
{
|
2005-02-24 03:20:00 +01:00
|
|
|
Dprintf("%s(%d)\n", __PRETTY_FUNCTION__, On);
|
2005-08-15 03:20:00 +02:00
|
|
|
if (On)
|
|
|
|
Start();
|
|
|
|
else
|
2008-11-23 21:26:48 +01:00
|
|
|
Deactivate();
|
2004-02-26 03:20:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void cFemonReceiver::Receive(uchar *Data, int Length)
|
|
|
|
{
|
2004-05-30 03:20:00 +02:00
|
|
|
// TS packet length: TS_SIZE
|
|
|
|
if (Length == TS_SIZE) {
|
2009-08-25 19:22:06 +02:00
|
|
|
int len, pid = TsPid(Data);
|
2004-03-03 03:20:00 +01:00
|
|
|
if (pid == m_VideoPid) {
|
|
|
|
m_VideoPacketCount++;
|
2009-08-25 19:22:06 +02:00
|
|
|
if (TsPayloadStart(Data)) {
|
|
|
|
while (const uint8_t *p = m_VideoAssembler.GetPes(len)) {
|
2009-08-28 19:54:34 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2009-08-25 19:22:06 +02:00
|
|
|
}
|
|
|
|
m_VideoAssembler.Reset();
|
|
|
|
}
|
|
|
|
m_VideoAssembler.PutTs(Data, Length);
|
2004-02-27 03:20:00 +01:00
|
|
|
}
|
2004-03-03 03:20:00 +01:00
|
|
|
else if (pid == m_AudioPid) {
|
|
|
|
m_AudioPacketCount++;
|
2009-08-25 19:22:06 +02:00
|
|
|
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
|
|
|
|
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
|
|
|
|
m_AudioValid = true;
|
|
|
|
m_AudioAssembler.Reset();
|
|
|
|
}
|
|
|
|
m_AudioAssembler.PutTs(Data, Length);
|
2004-02-27 03:20:00 +01:00
|
|
|
}
|
2004-06-11 03:20:00 +02:00
|
|
|
else if (pid == m_AC3Pid) {
|
|
|
|
m_AC3PacketCount++;
|
2009-08-25 19:22:06 +02:00
|
|
|
if (const uint8_t *p = m_AC3Assembler.GetPes(len)) {
|
|
|
|
if (m_DetectAC3.processAudio(p, len))
|
|
|
|
m_AC3Valid = true;
|
|
|
|
m_AC3Assembler.Reset();
|
2004-05-30 03:20:00 +02:00
|
|
|
}
|
2009-08-25 19:22:06 +02:00
|
|
|
m_AC3Assembler.PutTs(Data, Length);
|
2004-05-30 03:20:00 +02:00
|
|
|
}
|
2004-02-26 03:20:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-03 03:20:00 +01:00
|
|
|
void cFemonReceiver::Action(void)
|
2004-02-26 03:20:00 +01:00
|
|
|
{
|
2005-02-24 03:20:00 +01:00
|
|
|
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
2005-01-15 03:20:00 +01:00
|
|
|
cTimeMs t;
|
2008-11-23 21:26:48 +01:00
|
|
|
m_Active = true;
|
|
|
|
while (Running() && m_Active) {
|
2005-01-15 03:20:00 +01:00
|
|
|
t.Set(0);
|
2004-03-16 03:20:00 +01:00
|
|
|
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
2006-09-17 03:20:00 +02:00
|
|
|
m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval;
|
2004-03-03 03:20:00 +01:00
|
|
|
m_VideoPacketCount = 0;
|
2006-09-17 03:20:00 +02:00
|
|
|
m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval;
|
2004-03-03 03:20:00 +01:00
|
|
|
m_AudioPacketCount = 0;
|
2006-09-17 03:20:00 +02:00
|
|
|
m_AC3Bitrate = (10.0 * 8.0 * 184.0 * m_AC3PacketCount) / femonConfig.calcinterval;
|
2004-06-11 03:20:00 +02:00
|
|
|
m_AC3PacketCount = 0;
|
2008-09-10 16:37:28 +02:00
|
|
|
m_Sleep.Wait(max((int)(100 * femonConfig.calcinterval - t.Elapsed()), 3));
|
2004-03-03 03:20:00 +01:00
|
|
|
}
|
2004-02-26 03:20:00 +01:00
|
|
|
}
|