X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e8f443313e47e0653d61d23c90352572194e5608..a2ef0a242972e70e4229441ea94f7712fcf66aff:/lib/dvb/decoder.cpp diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index eb5258d3..88cd3ee1 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -12,8 +12,12 @@ #define dmxPesFilterParams dmx_pes_filter_params #define DMX_PES_VIDEO0 DMX_PES_VIDEO #define DMX_PES_AUDIO0 DMX_PES_AUDIO +#define DMX_PES_PCR0 DMX_PES_PCR +#define DMX_PES_TELETEXT0 DMX_PES_TELETEXT #define DMX_PES_VIDEO1 DMX_PES_VIDEO #define DMX_PES_AUDIO1 DMX_PES_AUDIO +#define DMX_PES_PCR1 DMX_PES_PCR +#define DMX_PES_TELETEXT1 DMX_PES_TELETEXT #include #include #include @@ -196,6 +200,9 @@ int eDVBAudio::startPid(int pid, int type) case aAACHE: bypass = 9; break; + case aLPCM: + bypass = 6; + break; } eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass); @@ -203,8 +210,7 @@ int eDVBAudio::startPid(int pid, int type) eDebug("failed (%m)"); else eDebug("ok"); - freeze(); - + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState eDebugNoNewLine("AUDIO_PLAY - "); if (::ioctl(m_fd, AUDIO_PLAY) < 0) eDebug("failed (%m)"); @@ -216,9 +222,6 @@ int eDVBAudio::startPid(int pid, int type) void eDVBAudio::stop() { -#if HAVE_DVB_API_VERSION > 2 - flush(); -#endif eDebugNoNewLine("AUDIO_STOP - "); if (::ioctl(m_fd, AUDIO_STOP) < 0) eDebug("failed (%m)"); @@ -285,7 +288,7 @@ int eDVBAudio::getPTS(pts_t &now) eDVBAudio::~eDVBAudio() { - unfreeze(); + unfreeze(); // why unfreeze here... but not unfreeze video in ~eDVBVideo ?!? if (m_fd >= 0) ::close(m_fd); if (m_fd_demux >= 0) @@ -448,7 +451,7 @@ int eDVBVideo::startPid(int pid, int type) return -errno; } eDebug("ok"); - freeze(); + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState eDebugNoNewLine("VIDEO_PLAY - "); if (::ioctl(m_fd, VIDEO_PLAY) < 0) eDebug("failed (%m)"); @@ -598,7 +601,7 @@ RESULT eDVBVideo::connectEvent(const Slot1setPid(m_pcrpid)) res = -1; } @@ -961,7 +965,7 @@ int eTSMPEGDecoder::setState() { if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF)) { - m_pcr = new eDVBPCR(m_demux); + m_pcr = new eDVBPCR(m_demux, m_decoder); if (m_pcr->startPid(m_pcrpid)) res = -1; } @@ -992,7 +996,7 @@ int eTSMPEGDecoder::setState() { if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott) { - m_text = new eDVBTText(m_demux); + m_text = new eDVBTText(m_demux, m_decoder); if (m_text->startPid(m_textpid)) res = -1; } @@ -1000,7 +1004,7 @@ int eTSMPEGDecoder::setState() } #endif - if (m_changed & changeState) + if (changed & (changeState|changeVideo|changeAudio)) { /* play, slowmotion, fast-forward */ int state_table[6][4] = @@ -1013,7 +1017,7 @@ int eTSMPEGDecoder::setState() /* [stateSlowMotion] = */ {1, m_ff_sm_ratio, 0} }; int *s = state_table[m_state]; - if (m_video) + if (changed & (changeState|changeVideo) && m_video) { m_video->setSlowMotion(s[1]); m_video->setFastForward(s[2]); @@ -1022,7 +1026,7 @@ int eTSMPEGDecoder::setState() else m_video->freeze(); } - if (m_audio) + if (changed & (changeState|changeAudio) && m_audio) { if (s[0]) m_audio->unfreeze(); @@ -1041,9 +1045,9 @@ int eTSMPEGDecoder::setState() int eTSMPEGDecoder::m_pcm_delay=-1, eTSMPEGDecoder::m_ac3_delay=-1; -RESULT eTSMPEGDecoder::setPCMDelay(int delay) +RESULT eTSMPEGDecoder::setHwPCMDelay(int delay) { - if (m_decoder == 0 && delay != m_pcm_delay ) + if (delay != m_pcm_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w"); if (fp) @@ -1057,9 +1061,9 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay) return -1; } -RESULT eTSMPEGDecoder::setAC3Delay(int delay) +RESULT eTSMPEGDecoder::setHwAC3Delay(int delay) { - if ( m_decoder == 0 && delay != m_ac3_delay ) + if ( delay != m_ac3_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w"); if (fp) @@ -1073,6 +1077,17 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay) return -1; } + +RESULT eTSMPEGDecoder::setPCMDelay(int delay) +{ + return m_decoder == 0 ? setHwPCMDelay(delay) : -1; +} + +RESULT eTSMPEGDecoder::setAC3Delay(int delay) +{ + return m_decoder == 0 ? setHwAC3Delay(delay) : -1; +} + eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder) : m_demux(demux), m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1), @@ -1093,7 +1108,7 @@ eTSMPEGDecoder::~eTSMPEGDecoder() RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type) { - if (m_vpid != vpid) + if ((m_vpid != vpid) || (m_vtype != type)) { m_changed |= changeVideo; m_vpid = vpid; @@ -1173,8 +1188,7 @@ RESULT eTSMPEGDecoder::play() { if (!m_changed) return 0; - } - else + } else { m_state = statePlay; m_changed |= changeState;