support much more audio/video codecs encapsulated in TS files (not all stb hardware...
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 20 Jan 2009 22:39:33 +0000 (23:39 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 20 Jan 2009 22:39:33 +0000 (23:39 +0100)
lib/dvb/decoder.cpp
lib/dvb/decoder.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/service/servicedvb.cpp

index 8bc07e600b7c2919c895c9f77e7cf43fee8bc608..065a49c290ba7ceeb79d5368e1f882a0ee9f50f2 100644 (file)
@@ -187,11 +187,15 @@ int eDVBAudio::startPid(int pid, int type)
        case aAC3:
                bypass = 0;
                break;
        case aAC3:
                bypass = 0;
                break;
-               /*
        case aDTS:
                bypass = 2;
                break;
        case aDTS:
                bypass = 2;
                break;
-               */
+       case aAAC:
+               bypass = 8;
+               break;
+       case aAACHE:
+               bypass = 9;
+               break;
        }
 
        eDebugNoNewLine("AUDIO_SET_BYPASS - ");
        }
 
        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
 // 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)
 
 #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)
 {
 #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;
 
        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");
                eDebug("failed (%m)");
        else
                eDebug("ok");
index 5b9d352ac157f4787ad65b37b12b668792fca90b..f2e10bb9eafd10e0d7e95e3e26bb832171616362 100644 (file)
@@ -13,7 +13,7 @@ private:
        ePtr<eDVBDemux> m_demux;
        int m_fd, m_fd_demux, m_dev, m_is_freezed;
 public:
        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);
        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:
        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
        eDVBVideo(eDVBDemux *demux, int dev);
        void stop();
 #if HAVE_DVB_API_VERSION < 3
index 0c21272a95d9fca61955f4c1b6bb00e3ddfc32a1..279ec74f723eb5e1092f32b79ea833d6cebb669d 100644 (file)
@@ -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::atMPEG;
+                                                       audio.type = audioStream::atAAC;
                                                }
                                                //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::atAACHE; // 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;
                                                                }
index ff0ef046090e115ebec629af3bfbc97d50dff7b8..3e22174b9d777e7ecfa4ed569f06d626ea8a04f7 100644 (file)
@@ -135,14 +135,14 @@ public:
        {
                int pid;
                int component_tag;
        {
                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;
                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;
                int type; // mpeg2, ac3, dts, ...
                
                int component_tag;
index 59831680d8f160ef022bd825d5c9934571a4b873..d4a3a562ab649aa7391be26a31580362ec33f40a 100644 (file)
@@ -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";
                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
        else  if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
                info.m_description = "DTS";
        else