Added preliminary support for LATM.

This commit is contained in:
Rolf Ahrenberg 2010-06-23 12:16:17 +03:00
parent 3235c67256
commit f37f428670
18 changed files with 213 additions and 39 deletions

View File

@ -396,8 +396,9 @@ VDR Plugin 'femon' Revision History
- Added a setup option to downscale the OSD size.
- Updated Estonian translation (Thanks to Arthur Konovalov).
2010-xx-xx: Version 1.7.8
2010-06-23: Version 1.7.8
- Fixed device switching.
- Added preliminary support for LATM.
- Updated Italian translation (Thanks to Diego Pierotto).
- Fixed a crash in femon service (Thanks to Wolfgang Astleitner).

View File

@ -63,7 +63,7 @@ all-redirect: all
### The object files (add further files here):
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonh264.o femonsymbol.o
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonlatm.o femonh264.o femonsymbol.o
### The main target:
@ -95,7 +95,7 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='Rolf Ahrenberg' -o $@ $^
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o $@ $^
%.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<

View File

@ -17,7 +17,8 @@ enum eAudioCodec {
AUDIO_CODEC_MPEG2_I,
AUDIO_CODEC_MPEG2_II,
AUDIO_CODEC_MPEG2_III,
AUDIO_CODEC_HEAAC
AUDIO_CODEC_HEAAC,
AUDIO_CODEC_LATM
};
enum eAudioChannelMode {

112
femonlatm.c Normal file
View File

@ -0,0 +1,112 @@
/*
* 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"
unsigned int cFemonLATM::s_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
};
unsigned int cFemonLATM::s_Samplerates[4] =
{
22050, 24000, 16000, -1
};
cFemonLATM::cFemonLATM(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
{
}
cFemonLATM::~cFemonLATM()
{
}
bool cFemonLATM::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection
if (bs.getBits(12) != 0x56E) // syncword
return false;
if (bs.getBit() == 1) // id: MPEG-1=1, extension to lower sampling frequences=0
return false;
int layer = 3 - bs.getBits(2); // layer: I=11, II=10, III=01
bs.skipBit(); // protection bit
int bit_rate_index = bs.getBits(4); // bitrate index
int sampling_frequency = bs.getBits(2); // sampling frequency
bs.skipBit(); // padding bit
bs.skipBit(); // private pid
int mode = bs.getBits(2); // mode
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_LATM);
switch (mode) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
if (layer == 3) {
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
}
else {
switch (bit_rate_index) {
case 0:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[layer][bit_rate_index]);
break;
}
}
switch (sampling_frequency) {
case 3:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency]);
break;
}
return true;
}

27
femonlatm.h Normal file
View File

@ -0,0 +1,27 @@
/*
* 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 unsigned int s_Bitrates[3][16];
static unsigned int s_Samplerates[4];
public:
cFemonLATM(cFemonAudioIf *audiohandler);
virtual ~cFemonLATM();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONLATM_H

View File

@ -18,6 +18,7 @@ cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
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(Vtype),
@ -144,7 +145,7 @@ void cFemonReceiver::Action(void)
while (Data = m_VideoBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
@ -181,7 +182,7 @@ void cFemonReceiver::Action(void)
while (Data = m_AudioBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
@ -194,7 +195,7 @@ void cFemonReceiver::Action(void)
}
processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
if (m_DetectAAC.processAudio(p, len) || m_DetectLATM.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true;
m_AudioAssembler.Reset();
}
@ -206,7 +207,7 @@ void cFemonReceiver::Action(void)
while (Data = m_AC3Buffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {

View File

@ -14,6 +14,7 @@
#include "femonh264.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonlatm.h"
#include "femonac3.h"
#include "femonaudio.h"
#include "femonvideo.h"
@ -28,6 +29,7 @@ private:
cFemonH264 m_DetectH264;
cFemonMPEG m_DetectMPEG;
cFemonAAC m_DetectAAC;
cFemonLATM m_DetectLATM;
cFemonAC3 m_DetectAC3;
cRingBufferLinear m_VideoBuffer;

View File

@ -294,6 +294,7 @@ cString getAudioCodec(int value)
case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II"));
case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III"));
case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC"));
case AUDIO_CODEC_LATM: return cString::sprintf("%s", tr("LATM"));
default: break;
}
return cString::sprintf("---");

View File

@ -7,9 +7,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Christian Wieninger\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -266,6 +266,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Luis Palacios\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Arthur Konovalov\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr "MPEG-2 kerros III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2008-01-26 09:59+0100\n"
"Last-Translator: NIVAL Michaël <mnival@club-internet.fr>\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@ -6,9 +6,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2010-03-29 00:24+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -268,6 +268,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"
@ -381,4 +384,3 @@ msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Valdemaras Pipiras\n"
"Language-Team: <varas@ambernet.lt>\n"
@ -264,6 +264,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "立体声"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.7\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n"
"Project-Id-Version: femon 1.7.8\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-06-23 12:14+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
@ -264,6 +264,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "立體聲"