Cache ddp/aac/he-aac pid in lamedb
[vuplus_dvbapp] / lib / service / servicedvb.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 93b0cc6..07827ec
@@ -90,9 +90,10 @@ int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const
        else
        {
                eDVBChannelID chid, chid_ignore;
+               int system;
                ((const eServiceReferenceDVB&)ref).getChannelID(chid);
                ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
-               return res_mgr->canAllocateChannel(chid, chid_ignore);
+               return res_mgr->canAllocateChannel(chid, chid_ignore, system);
        }
        return false;
 }
@@ -240,23 +241,24 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref
                                { 1, 2, 3 }, // -T -C -S
                                { 2, 1, 3 }  // -T -S -C
                        };
+                       int system;
                        ((const eServiceReferenceDVB&)*it).getChannelID(chid);
-                       int tmp=res->canAllocateChannel(chid, chid_ignore, simulate);
-                       switch(tmp)
+                       int tmp = res->canAllocateChannel(chid, chid_ignore, system, simulate);
+                       if (tmp > 0)
                        {
-                               case 0:
-                                       break;
-                               case 30000: // cached DVB-T channel
-                               case 1: // DVB-T frontend
-                                       tmp = prio_map[prio_order][2];
-                                       break;
-                               case 40000: // cached DVB-C channel
-                               case 2:
-                                       tmp = prio_map[prio_order][1];
-                                       break;
-                               default: // DVB-S
-                                       tmp = prio_map[prio_order][0];
-                                       break;
+                               switch (system)
+                               {
+                                       case iDVBFrontend::feTerrestrial:
+                                               tmp = prio_map[prio_order][2];
+                                               break;
+                                       case iDVBFrontend::feCable:
+                                               tmp = prio_map[prio_order][1];
+                                               break;
+                                       default:
+                                       case iDVBFrontend::feSatellite:
+                                               tmp = prio_map[prio_order][0];
+                                               break;
+                               }
                        }
                        if (tmp > cur)
                        {
@@ -954,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);
 }
 
@@ -1061,6 +1065,9 @@ void eDVBServicePlay::serviceEvent(int event)
        case eDVBServicePMTHandler::eventSOF:
                m_event((iPlayableService*)this, evSOF);
                break;
+       case eDVBServicePMTHandler::eventHBBTVInfo:
+               m_event((iPlayableService*)this, evHBBTVInfo);
+               break;
        }
 }
 
@@ -1319,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_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;
@@ -1521,7 +1539,7 @@ RESULT eDVBServicePlay::timeshift(ePtr<iTimeshiftService> &ptr)
 {
        ptr = 0;
        if (m_have_video_pid &&  // HACK !!! FIXMEE !! temporary no timeshift on radio services !!
-               (m_timeshift_enabled || !m_is_pvr))
+               (m_timeshift_enabled || (!m_is_pvr&&!m_is_stream)))
        {
                if (!m_timeshift_enabled)
                {
@@ -1711,12 +1729,21 @@ int eDVBServicePlay::getInfo(int w)
        case sAudioPID:
                if (m_dvb_service)
                {
-                       int apid = m_dvb_service->getCacheEntry(eDVBService::cAPID);
+                       int apid = m_dvb_service->getCacheEntry(eDVBService::cMPEGAPID);
                        if (apid != -1)
                                return apid;
                        apid = m_dvb_service->getCacheEntry(eDVBService::cAC3PID);
                        if (apid != -1)
                                return apid;
+                       apid = m_dvb_service->getCacheEntry(eDVBService::cDDPPID);
+                       if (apid != -1)
+                               return apid;
+                       apid = m_dvb_service->getCacheEntry(eDVBService::cAACHEAPID);
+                       if (apid != -1)
+                               return apid;
+                       apid = m_dvb_service->getCacheEntry(eDVBService::cAACAPID);
+                       if (apid != -1)
+                               return apid;
                }
                if (no_program_info) return -1; if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid;
        case sPCRPID:
@@ -1751,6 +1778,23 @@ std::string eDVBServicePlay::getInfoString(int w)
                return m_dvb_service->m_provider_name;
        case sServiceref:
                return m_reference.toString();
+       case sHBBTVUrl:
+       {
+               std::string url;
+               eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+               h.getHBBTVUrl(url);
+               return url;
+       }
+       case sLiveStreamDemuxId:
+       {
+               int id;
+               eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+               h.getDemuxID(id);
+
+               std::string demux;
+               demux += id + '0';
+               return demux;
+       }
        default:
                break;
        }
@@ -1767,6 +1811,11 @@ PyObject *eDVBServicePlay::getInfoObject(int w)
                return m_service_handler.getCaIds(true);
        case sTransponderData:
                return eStaticServiceDVBInformation().getInfoObject(m_reference, w);
+       case sHBBTVUrl:
+       {
+               eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+               return h.getHbbTVApplications();
+       }
        default:
                break;
        }
@@ -1926,23 +1975,17 @@ int eDVBServicePlay::selectAudioStream(int i)
                                    case the real default is not yet available.)
                        */
        if (m_dvb_service && ((i != -1)
-               || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1))))
+               || ((m_dvb_service->getCacheEntry(eDVBService::cMPEGAPID) == -1)
+               && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1)
+               && (m_dvb_service->getCacheEntry(eDVBService::cDDPPID)==-1)
+               && (m_dvb_service->getCacheEntry(eDVBService::cAACHEAPID)==-1)
+               && (m_dvb_service->getCacheEntry(eDVBService::cAACAPID)==-1))))
        {
-               if (apidtype == eDVBAudio::aMPEG)
-               {
-                       m_dvb_service->setCacheEntry(eDVBService::cAPID, apid);
-                       m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
-               }
-               else if (apidtype == eDVBAudio::aAC3)
-               {
-                       m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
-                       m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apid);
-               }
-               else
-               {
-                       m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
-                       m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
-               }
+               m_dvb_service->setCacheEntry(eDVBService::cMPEGAPID, apidtype == eDVBAudio::aMPEG ? apid : -1);
+               m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apidtype == eDVBAudio::aAC3 ? apid : -1);
+               m_dvb_service->setCacheEntry(eDVBService::cDDPPID, apidtype == eDVBAudio::aDDP ? apid : -1);
+               m_dvb_service->setCacheEntry(eDVBService::cAACHEAPID, apidtype == eDVBAudio::aAACHE ? apid : -1);
+               m_dvb_service->setCacheEntry(eDVBService::cAACAPID, apidtype == eDVBAudio::aAAC ? apid : -1);
        }
 
        h.resetCachedProgram();
@@ -2188,6 +2231,8 @@ RESULT eDVBServicePlay::startTimeshift()
        }
                
        m_record->setTargetFD(m_timeshift_fd);
+       m_record->setTargetFilename(m_timeshift_file.c_str());
+       m_record->enableAccessPoints(false);
 
        m_timeshift_enabled = 1;
        
@@ -2213,6 +2258,11 @@ RESULT eDVBServicePlay::stopTimeshift(bool swToLive)
        close(m_timeshift_fd);
        eDebug("remove timeshift file");
        eBackgroundFileEraser::getInstance()->erase(m_timeshift_file.c_str());
+
+       {
+               std::string timeshift_file_sc = m_timeshift_file + ".sc";
+               eBackgroundFileEraser::getInstance()->erase(timeshift_file_sc.c_str());
+       }
        
        return 0;
 }
@@ -2309,6 +2359,8 @@ void eDVBServicePlay::updateTimeshiftPids()
                return;
        else
        {
+               int timing_pid = -1;
+               int timing_pid_type = -1;
                std::set<int> pids_to_record;
                pids_to_record.insert(0); // PAT
                if (program.pmtPid != -1)
@@ -2320,12 +2372,28 @@ void eDVBServicePlay::updateTimeshiftPids()
                for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator
                        i(program.videoStreams.begin()); 
                        i != program.videoStreams.end(); ++i)
+               {
                        pids_to_record.insert(i->pid);
 
+                       if (timing_pid == -1)
+                       {
+                               timing_pid = i->pid;
+                               timing_pid_type = i->type;
+                       }
+               }
+
                for (std::vector<eDVBServicePMTHandler::audioStream>::const_iterator
                        i(program.audioStreams.begin()); 
                        i != program.audioStreams.end(); ++i)
-                               pids_to_record.insert(i->pid);
+               {
+                       pids_to_record.insert(i->pid);
+
+                       if (timing_pid == -1)
+                       {
+                               timing_pid = i->pid;
+                               timing_pid_type = -1;
+                       }
+               }
 
                for (std::vector<eDVBServicePMTHandler::subtitleStream>::const_iterator
                        i(program.subtitleStreams.begin());
@@ -2349,6 +2417,9 @@ void eDVBServicePlay::updateTimeshiftPids()
 
                for (std::set<int>::iterator i(obsolete_pids.begin()); i != obsolete_pids.end(); ++i)
                        m_record->removePID(*i);
+
+               if (timing_pid != -1)
+                       m_record->setTimingPID(timing_pid, timing_pid_type);
        }
 }
 
@@ -2564,9 +2635,11 @@ 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))
+               //if (!(m_is_pvr || m_is_stream || m_timeshift_active || !m_is_primary))
+               if (!(m_is_pvr || m_is_stream || m_timeshift_active))
                        m_decoder->setSyncPCR(pcrpid);
                else
                        m_decoder->setSyncPCR(-1);