From 1155846a3c9ba7facbd39f34012c40e4b4245e06 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Wed, 27 Feb 2013 11:01:40 +0400 Subject: [PATCH] zapit/src/zapit.cpp: add Start/Stop PiP Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a50ffa81e07e38835f3618c742b95fec9545623d Author: [CST] Focus Date: 2013-02-27 (Wed, 27 Feb 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/zapit/include/zapit/zapit.h | 5 ++ src/zapit/src/zapit.cpp | 98 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/src/zapit/include/zapit/zapit.h b/src/zapit/include/zapit/zapit.h index 7325d8c53..f054614f7 100644 --- a/src/zapit/include/zapit/zapit.h +++ b/src/zapit/include/zapit/zapit.h @@ -132,11 +132,13 @@ class CZapit : public OpenThreads::Thread CZapitChannel * current_channel; t_channel_id live_channel_id; + t_channel_id pip_channel_id; /* scan params */ TP_params TP; fast_scan_type_t scant; CFrontend * live_fe; + CFrontend * pip_fe; audio_map_t audio_map; volume_map_t vol_map; @@ -240,6 +242,7 @@ class CZapit : public OpenThreads::Thread CZapitChannel * GetCurrentChannel() { return current_channel; }; t_channel_id GetCurrentChannelID() { return live_channel_id; }; + t_channel_id GetPipChannelID() { return pip_channel_id; }; t_channel_id GetLastTVChannel() { return lastChannelTV; } t_channel_id GetLastRADIOChannel() { return lastChannelRadio; } void SetCurrentChannelID(const t_channel_id channel_id) { live_channel_id = channel_id; }; @@ -251,5 +254,7 @@ class CZapit : public OpenThreads::Thread void SetVolume(int vol); int GetVolume() { return current_volume; }; int SetVolumePercent(int percent); + bool StartPip(const t_channel_id channel_id); + bool StopPip(); }; #endif /* __zapit_h__ */ diff --git a/src/zapit/src/zapit.cpp b/src/zapit/src/zapit.cpp index 071c40b0b..91453d672 100644 --- a/src/zapit/src/zapit.cpp +++ b/src/zapit/src/zapit.cpp @@ -86,6 +86,11 @@ extern cAudio *audioDecoder; extern cDemux *audioDemux; extern cDemux *videoDemux; +#ifdef BOXMODEL_APOLLO +cVideo *pipDecoder; +cDemux *pipDemux; +#endif + cDemux *pcrDemux = NULL; /* the map which stores the wanted cable/satellites */ @@ -123,6 +128,8 @@ CZapit::CZapit() currentMode = 0; current_volume = 100; volume_percent = 0; + pip_channel_id = 0; + pip_fe = NULL; } CZapit::~CZapit() @@ -508,6 +515,11 @@ bool CZapit::ZapIt(const t_channel_id channel_id, bool forupdate, bool startplay } SendEvent(CZapitClient::EVT_TUNE_COMPLETE, &live_channel_id, sizeof(t_channel_id)); +#ifdef BOXMODEL_APOLLO + if (transponder_change && (live_fe == pip_fe)) + StopPip(); +#endif + if (current_channel->getServiceType() == ST_NVOD_REFERENCE_SERVICE) { current_is_nvod = true; return true; @@ -548,6 +560,75 @@ bool CZapit::ZapIt(const t_channel_id channel_id, bool forupdate, bool startplay return true; } +#ifdef BOXMODEL_APOLLO +bool CZapit::StopPip() +{ + if (pip_channel_id) { + INFO("[pip] stop %llx", pip_channel_id); + CCamManager::getInstance()->Stop(pip_channel_id, CCamManager::RECORD); + pipDemux->Stop(); + pipDecoder->Stop(); + pip_fe = NULL; + pip_channel_id = 0; + return true; + } + return false; +} + +bool CZapit::StartPip(const t_channel_id channel_id) +{ + CZapitChannel* newchannel; + bool transponder_change; + + StopPip(); + + if((newchannel = CServiceManager::getInstance()->FindChannel(channel_id)) == NULL) { + printf("zapit_to_record: channel_id " PRINTF_CHANNEL_ID_TYPE " not found", channel_id); + return false; + } + INFO("[pip] zap to %s (%llx tp %llx)", newchannel->getName().c_str(), newchannel->getChannelID(), newchannel->getTransponderId()); + + CFEManager::getInstance()->lockFrontend(live_fe); + CFrontend * frontend = CFEManager::getInstance()->allocateFE(newchannel); + CFEManager::getInstance()->unlockFrontend(live_fe); + if(frontend == NULL) { + ERROR("Cannot get frontend\n"); + return false; + } + if(!TuneChannel(frontend, newchannel, transponder_change)) + return false; + + if(!ParsePatPmt(newchannel)) + return false; + + pip_fe = frontend; + + INFO("[pip] vpid %X apid %X pcr %X", newchannel->getVideoPid(), newchannel->getAudioPid(), newchannel->getPcrPid()); + if (pipDemux && (pipDemux->getUnit() != newchannel->getRecordDemux())) { + pipDecoder->SetDemux(NULL); + delete pipDemux; + pipDemux = new cDemux(newchannel->getRecordDemux()); + pipDemux->Open(DMX_PIP_CHANNEL); + pipDecoder->SetDemux(pipDemux); + } +#if 0 + pipDecoder->SetSyncMode(AVSYNC_DISABLED); + pipDemux->SetSyncMode(AVSYNC_DISABLED); +#endif + + pipDecoder->SetStreamType((VIDEO_FORMAT)newchannel->type); + pipDemux->pesFilter(newchannel->getVideoPid()); + pipDecoder->Start(0, newchannel->getPcrPid(), newchannel->getVideoPid()); + pipDemux->Start(); + pip_channel_id = channel_id; + + //pipDecoder->setBlank(false); + + CCamManager::getInstance()->Start(newchannel->getChannelID(), CCamManager::RECORD); + return true; +} +#endif + bool CZapit::ZapForRecord(const t_channel_id channel_id) { CZapitChannel* newchannel; @@ -567,6 +648,10 @@ bool CZapit::ZapForRecord(const t_channel_id channel_id) if(!TuneChannel(frontend, newchannel, transponder_change)) return false; +#ifdef BOXMODEL_APOLLO + if (transponder_change && (frontend == pip_fe)) + StopPip(); +#endif if(!ParsePatPmt(newchannel)) return false; @@ -1936,6 +2021,9 @@ void CZapit::enterStandby(void) SaveAudioMap(); SaveVolumeMap(); StopPlayBack(true); +#ifdef BOXMODEL_APOLLO + StopPip(); +#endif if(!(currentMode & RECORD_MODE)) { pmt_stop_update_filter(&pmt_update_fd); @@ -2051,6 +2139,11 @@ bool CZapit::Start(Z_start_arg *ZapStart_arg) audioDecoder->SetDemux(audioDemux); audioDecoder->SetVideo(videoDecoder); + + pipDemux = new cDemux(); + pipDemux->Open(DMX_PIP_CHANNEL); + pipDecoder = cVideo::GetDecoder(1); + pipDecoder->SetDemux(pipDemux); #else videoDecoder = new cVideo(video_mode, videoDemux->getChannel(), videoDemux->getBuffer()); videoDecoder->Standby(false); @@ -2235,6 +2328,11 @@ void CZapit::run() delete pmtDemux; delete audioDecoder; delete audioDemux; +#ifdef BOXMODEL_APOLLO + StopPip(); + delete pipDecoder; + delete pipDemux; +#endif INFO("demuxes/decoders deleted");