git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of git.opendreambox.org:/git/enigma2
[enigma2.git]
/
lib
/
dvb
/
pmt.cpp
diff --git
a/lib/dvb/pmt.cpp
b/lib/dvb/pmt.cpp
index 0c21272a95d9fca61955f4c1b6bb00e3ddfc32a1..da45c8eb4733f95e290d3876424f384172308b13 100644
(file)
--- 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++/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)
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;
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;
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
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)
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;
{
isaudio = 1;
- audio.type = audioStream::at
MPEG
;
+ audio.type = audioStream::at
AAC
;
}
//break; fall through !!!
}
//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 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)
{
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)
{
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);
case SUBTITLING_DESCRIPTOR:
{
SubtitlingDescriptor *d = (SubtitlingDescriptor*)(*desc);
@@
-304,9
+340,14
@@
int eDVBServicePMTHandler::getProgramInfo(struct program &program)
isaudio = 1;
audio.type = audioStream::atDTS;
break;
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;
case AAC_DESCRIPTOR:
isaudio = 1;
- audio.type = audioStream::atAAC
;
+ audio.type = audioStream::atAAC
HE; // MPEG4-AAC
break;
case AC3_DESCRIPTOR:
isaudio = 1;
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. */
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);
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;
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;
}
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;
}
default:
break;
}
@@
-340,10
+399,16
@@
int eDVBServicePMTHandler::getProgramInfo(struct program &program)
case ISO_639_LANGUAGE_DESCRIPTOR:
if (!isvideo)
{
case ISO_639_LANGUAGE_DESCRIPTOR:
if (!isvideo)
{
+ int cnt=0;
const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages();
/* use last language code */
const Iso639LanguageList *languages = ((Iso639LanguageDescriptor*)*desc)->getIso639Languages();
/* use last language code */
- for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i)
- audio.language_code = (*i)->getIso639LanguageCode();
+ for (Iso639LanguageConstIterator i(languages->begin()); i != languages->end(); ++i, ++cnt)
+ {
+ if (cnt == 0)
+ audio.language_code = (*i)->getIso639LanguageCode();
+ else
+ audio.language_code += "/" + (*i)->getIso639LanguageCode();
+ }
}
break;
case STREAM_IDENTIFIER_DESCRIPTOR:
}
break;
case STREAM_IDENTIFIER_DESCRIPTOR:
@@
-546,12
+611,15
@@
void eDVBServicePMTHandler::SDTScanEvent(int event)
}
}
}
}
-int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate)
+int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate
, eDVBService *service
)
{
RESULT res=0;
m_reference = ref;
m_use_decode_demux = use_decode_demux;
{
RESULT res=0;
m_reference = ref;
m_use_decode_demux = use_decode_demux;
+
+ /* use given service as backup. This is used for timeshift where we want to clone the live stream using the cache, but in fact have a PVR channel */
+ m_service = service;
/* is this a normal (non PVR) channel? */
if (ref.path.empty())
/* is this a normal (non PVR) channel? */
if (ref.path.empty())