add new skin stuff
[enigma2.git] / lib / dvb / decoder.cpp
index a6537e81d60d4a5bd05c122e8007f7e8044f98fd..362289f3196dc20cd2c29a73a78a37c2847e3501 100644 (file)
@@ -137,6 +137,19 @@ void eDVBAudio::unfreeze()
                eDebug("video: AUDIO_CONTINUE: %m");
 }
 
+void eDVBAudio::setChannel(int channel)
+{
+       int val = AUDIO_STEREO;
+       switch (channel)
+       {
+       case aMonoLeft: val = AUDIO_MONO_LEFT; break;
+       case aMonoRight: val = AUDIO_MONO_RIGHT; break;
+       default: break;
+       }
+       if (::ioctl(m_fd, AUDIO_CHANNEL_SELECT, val) < 0)
+               eDebug("video: AUDIO_CHANNEL_SELECT: %m");
+}
+
 int eDVBAudio::getPTS(pts_t &now)
 {
        return ::ioctl(m_fd, AUDIO_GET_PTS, &now);
@@ -175,13 +188,21 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux), m_dev(dev)
                eWarning("%s: %m", filename);
        eDebug("demux device: %s", filename);
 }
-       
-int eDVBVideo::startPid(int pid)
+
+// not finally values i think.. !!
+#define VIDEO_STREAMTYPE_MPEG2 0
+#define VIDEO_STREAMTYPE_MPEG4_H264 1
+
+int eDVBVideo::startPid(int pid, int type)
 {      
        if ((m_fd < 0) || (m_fd_demux < 0))
                return -1;
        dmx_pes_filter_params pes;
 
+       if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE,
+               type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2) < 0)
+               eWarning("video: VIDEO_SET_STREAMTYPE: %m");
+
        pes.pid      = pid;
        pes.input    = DMX_IN_FRONTEND;
        pes.output   = DMX_OUT_DECODER;
@@ -465,7 +486,7 @@ int eTSMPEGDecoder::setState()
                {
                        eDebug("new video");
                        m_video = new eDVBVideo(m_demux, m_decoder);
-                       if (m_video->startPid(m_vpid))
+                       if (m_video->startPid(m_vpid, m_vtype))
                        {
                                eWarning("video: startpid failed!");
                                res = -1;
@@ -522,12 +543,13 @@ eTSMPEGDecoder::~eTSMPEGDecoder()
        setState();
 }
 
-RESULT eTSMPEGDecoder::setVideoPID(int vpid)
+RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type)
 {
        if (m_vpid != vpid)
        {
                m_changed |= changeVideo;
                m_vpid = vpid;
+               m_vtype = type;
        }
        return 0;
 }
@@ -543,6 +565,15 @@ RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
        return 0;
 }
 
+RESULT eTSMPEGDecoder::setAudioChannel(int channel)
+{
+       if (m_audio)
+               m_audio->setChannel(channel);
+       else
+               eDebug("eTSMPEGDecoder::setAudioChannel but no audio decoder exist");
+       return 0;
+}
+
 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
 {
        if (m_pcrpid != pcrpid)