[TSPlayback] Fix UHD TS playback on fastForward and rewind.
authorhschang <chang@dev3>
Wed, 25 Nov 2015 01:41:19 +0000 (10:41 +0900)
committerhschang <chang@dev3>
Wed, 2 Dec 2015 01:32:54 +0000 (10:32 +0900)
lib/dvb/pvrparse.cpp
lib/service/servicedvb.cpp
lib/service/servicedvb.h

index 9fab10c..c5a5c9c 100755 (executable)
@@ -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)
                                                {
index 07e5a73..7005c84 100755 (executable)
@@ -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))
index 6ced102..6971545 100644 (file)
@@ -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);