From 4328b788ac0ad723f1b13e144ae4ec4d3c9c4dc5 Mon Sep 17 00:00:00 2001 From: hschang Date: Wed, 25 Nov 2015 10:41:19 +0900 Subject: [PATCH] [TSPlayback] Fix UHD TS playback on fastForward and rewind. --- lib/dvb/pvrparse.cpp | 4 ++-- lib/service/servicedvb.cpp | 16 +++++++++++++++- lib/service/servicedvb.h | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp index 9fab10c..c5a5c9c 100755 --- a/lib/dvb/pvrparse.cpp +++ b/lib/dvb/pvrparse.cpp @@ -687,10 +687,10 @@ int eMPEGStreamParserTS::processPacket(const unsigned char *pkt, off_t offset) int nal_unit_type = (sc >> 1); if (nal_unit_type == 35) /* H265 NAL unit access delimiter */ { - unsigned long long data = sc | (pkt[4] << 8); + unsigned long long data = sc | (pkt[5] << 8); m_streaminfo.writeStructureEntry(offset + pkt_offset, data); - if ((pkt[4] >> 5) == 0) /* check pic_type for I-frame */ + if ((pkt[5] >> 5) == 0) /* check pic_type for I-frame */ { if (ptsvalid) { diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 07e5a73..7005c84 100755 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -956,6 +956,8 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_subtitle_sync_timer = eTimer::create(eApp); + m_current_video_pid_type = 0; + CONNECT(m_subtitle_sync_timer->timeout, eDVBServicePlay::checkSubtitleTiming); } @@ -1324,7 +1326,18 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio, bool final_seek) { eDebug("setting cue skipmode to %d", skipmode); if (m_cue) - m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */ + { + long long _skipmode = skipmode; + if (!m_timeshift_active && (m_current_video_pid_type == eDVBServicePMTHandler::videoStream::vtH265_HEVC)) + { + if (ratio < 0) + _skipmode = skipmode * 3; + else + _skipmode = skipmode * 4; + } + + m_cue->setSkipmode(_skipmode * 90000); /* convert to 90000 per second */ + } } m_skipmode = skipmode; @@ -2591,6 +2604,7 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); + m_current_video_pid_type = vpidtype; selectAudioStream(); //if (!(m_is_pvr || m_is_stream || m_timeshift_active || !m_is_primary)) diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 6ced102..6971545 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -200,6 +200,7 @@ protected: eDVBServicePMTHandler m_service_handler_timeshift; eDVBServiceEITHandler m_event_handler; int m_current_audio_pid; + int m_current_video_pid_type; eDVBServicePlay(const eServiceReference &ref, eDVBService *service); -- 2.7.4