summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2009-01-20 22:39:33 (GMT)
committerghost <andreas.monzner@multimedia-labs.de>2009-01-20 22:39:33 (GMT)
commita0f0f0b446b7b0fd941194299fa4840b609df1f0 (patch)
tree47ff50cfcb121a67b5892531283e03454d7b1d37 /lib
parent9daf5d650d06aa046399b68931084d4005aab74a (diff)
support much more audio/video codecs encapsulated in TS files (not all stb hardware can handle all codecs!!!)
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/decoder.cpp41
-rw-r--r--lib/dvb/decoder.h4
-rw-r--r--lib/dvb/pmt.cpp65
-rw-r--r--lib/dvb/pmt.h4
-rw-r--r--lib/service/servicedvb.cpp2
5 files changed, 104 insertions, 12 deletions
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 8bc07e6..065a49c 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -187,11 +187,15 @@ int eDVBAudio::startPid(int pid, int type)
case aAC3:
bypass = 0;
break;
- /*
case aDTS:
bypass = 2;
break;
- */
+ case aAAC:
+ bypass = 8;
+ break;
+ case aAACHE:
+ bypass = 9;
+ break;
}
eDebugNoNewLine("AUDIO_SET_BYPASS - ");
@@ -334,6 +338,10 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev)
// not finally values i think.. !!
#define VIDEO_STREAMTYPE_MPEG2 0
#define VIDEO_STREAMTYPE_MPEG4_H264 1
+#define VIDEO_STREAMTYPE_VC1 3
+#define VIDEO_STREAMTYPE_MPEG4_Part2 4
+#define VIDEO_STREAMTYPE_VC1_SM 5
+#define VIDEO_STREAMTYPE_MPEG1 6
#if HAVE_DVB_API_VERSION < 3
int eDVBVideo::setPid(int pid)
@@ -395,13 +403,36 @@ int eDVBVideo::stopPid()
#else
int eDVBVideo::startPid(int pid, int type)
{
+ int streamtype = VIDEO_STREAMTYPE_MPEG2;
+
if ((m_fd < 0) || (m_fd_demux < 0))
return -1;
dmx_pes_filter_params pes;
- eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ",type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2);
- if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE,
- type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2) < 0)
+ switch(type)
+ {
+ default:
+ case MPEG2:
+ break;
+ case MPEG4_H264:
+ streamtype = VIDEO_STREAMTYPE_MPEG4_H264;
+ break;
+ case MPEG1:
+ streamtype = VIDEO_STREAMTYPE_MPEG1;
+ break;
+ case MPEG4_Part2:
+ streamtype = VIDEO_STREAMTYPE_MPEG4_Part2;
+ break;
+ case VC1:
+ streamtype = VIDEO_STREAMTYPE_VC1;
+ break;
+ case VC1_SM:
+ streamtype = VIDEO_STREAMTYPE_VC1_SM;
+ break;
+ }
+
+ eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ", streamtype);
+ if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE, streamtype) < 0)
eDebug("failed (%m)");
else
eDebug("ok");
diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h
index 5b9d352..f2e10bb 100644
--- a/lib/dvb/decoder.h
+++ b/lib/dvb/decoder.h
@@ -13,7 +13,7 @@ private:
ePtr<eDVBDemux> m_demux;
int m_fd, m_fd_demux, m_dev, m_is_freezed;
public:
- enum { aMPEG, aAC3, aDTS, aAAC };
+ enum { aMPEG, aAC3, aDTS, aAAC, aAACHE };
eDVBAudio(eDVBDemux *demux, int dev);
enum { aMonoLeft, aStereo, aMonoRight };
void setChannel(int channel);
@@ -49,7 +49,7 @@ private:
Signal1<void, struct iTSMPEGDecoder::videoEvent> m_event;
int m_width, m_height, m_framerate, m_aspect, m_progressive;
public:
- enum { MPEG2, MPEG4_H264 };
+ enum { MPEG2, MPEG4_H264, MPEG1, MPEG4_Part2, VC1, VC1_SM };
eDVBVideo(eDVBDemux *demux, int dev);
void stop();
#if HAVE_DVB_API_VERSION < 3
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 0c21272..279ec74 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -16,6 +16,7 @@
#include <dvbsi++/stream_identifier_descriptor.h>
#include <dvbsi++/subtitling_descriptor.h>
#include <dvbsi++/teletext_descriptor.h>
+#include <dvbsi++/video_stream_descriptor.h>
eDVBServicePMTHandler::eDVBServicePMTHandler()
:m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF)
@@ -217,25 +218,49 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
audioStream audio;
audio.component_tag=video.component_tag=-1;
video.type = videoStream::vtMPEG2;
+ audio.type = audioStream::atMPEG;
switch ((*es)->getType())
{
case 0x1b: // AVC Video Stream (MPEG4 H264)
video.type = videoStream::vtMPEG4_H264;
+ isvideo = 1;
+ //break; fall through !!!
+ case 0x10: // MPEG 4 Part 2
+ if (!isvideo)
+ {
+ video.type = videoStream::vtMPEG4_Part2;
+ isvideo = 1;
+ }
+ //break; fall through !!!
case 0x01: // MPEG 1 video
+ if (!isvideo)
+ video.type = videoStream::vtMPEG1;
+ //break; fall through !!!
case 0x02: // MPEG 2 video
isvideo = 1;
//break; fall through !!!
case 0x03: // MPEG 1 audio
case 0x04: // MPEG 2 audio:
if (!isvideo)
+ isaudio = 1;
+ //break; fall through !!!
+ case 0x0f: // MPEG 2 AAC
+ if (!isvideo && !isaudio)
{
isaudio = 1;
- audio.type = audioStream::atMPEG;
+ audio.type = audioStream::atAAC;
}
//break; fall through !!!
+ case 0x11: // MPEG 4 AAC
+ if (!isvideo && !isaudio)
+ {
+ isaudio = 1;
+ audio.type = audioStream::atAACHE;
+ }
case 0x06: // PES Private
case 0x81: // user private
+ case 0xEA: // TS_PSI_ST_SMPTE_VC1
for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
desc != (*es)->getDescriptors()->end(); ++desc)
{
@@ -246,6 +271,17 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
check descriptors to get the exakt type. */
switch (tag)
{
+ case AUDIO_STREAM_DESCRIPTOR:
+ isaudio = 1;
+ break;
+ case VIDEO_STREAM_DESCRIPTOR:
+ {
+ isvideo = 1;
+ VideoStreamDescriptor *d = (VideoStreamDescriptor*)(*desc);
+ if (d->getMpeg1OnlyFlag())
+ video.type = videoStream::vtMPEG1;
+ break;
+ }
case SUBTITLING_DESCRIPTOR:
{
SubtitlingDescriptor *d = (SubtitlingDescriptor*)(*desc);
@@ -304,9 +340,14 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
isaudio = 1;
audio.type = audioStream::atDTS;
break;
+ case 0x2B: // TS_PSI_DT_MPEG2_AAC
+ isaudio = 1;
+ audio.type = audioStream::atAAC; // MPEG2-AAC
+ break;
+ case 0x1C: // TS_PSI_DT_MPEG4_Audio
case AAC_DESCRIPTOR:
isaudio = 1;
- audio.type = audioStream::atAAC;
+ audio.type = audioStream::atAACHE; // MPEG4-AAC
break;
case AC3_DESCRIPTOR:
isaudio = 1;
@@ -315,7 +356,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
case REGISTRATION_DESCRIPTOR: /* some services don't have a separate AC3 descriptor */
{
/* libdvbsi++ doesn't yet support this descriptor type, so work around. */
- if ((*desc)->getLength() != 4)
+ if ((*desc)->getLength() < 4)
break;
unsigned char descr[6];
(*desc)->writeToBuffer(descr);
@@ -326,11 +367,29 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
isaudio = 1;
audio.type = audioStream::atAC3;
break;
+ case 0x56432d31:
+ if (descr[6] == 0x01) // subdescriptor tag
+ {
+ if (descr[7] >= 0x90) // profile_level
+ video.type = videoStream::vtVC1; // advanced profile
+ else
+ video.type = videoStream::vtVC1_SM; // simple main
+ isvideo = 1;
+ }
+ break;
default:
break;
}
break;
}
+ case 0x28: // TS_PSI_DT_AVC
+ isvideo = 1;
+ video.type = videoStream::vtMPEG4_H264;
+ break;
+ case 0x1B: // TS_PSI_DT_MPEG4_Video
+ isvideo = 1;
+ video.type = videoStream::vtMPEG4_Part2;
+ break;
default:
break;
}
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index ff0ef04..3e22174 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -135,14 +135,14 @@ public:
{
int pid;
int component_tag;
- enum { vtMPEG2, vtMPEG4_H264 };
+ enum { vtMPEG2, vtMPEG4_H264, vtMPEG1, vtMPEG4_Part2, vtVC1, vtVC1_SM };
int type;
};
struct audioStream
{
int pid;
- enum { atMPEG, atAC3, atDTS, atAAC };
+ enum { atMPEG, atAC3, atDTS, atAAC, atAACHE };
int type; // mpeg2, ac3, dts, ...
int component_tag;
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 5983168..d4a3a56 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -1600,6 +1600,8 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int
info.m_description = "AC3";
else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAAC)
info.m_description = "AAC";
+ else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAACHE)
+ info.m_description = "AAC-HE";
else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
info.m_description = "DTS";
else