git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cache movie filelengths in .meta file, by luke_s
[enigma2.git]
/
lib
/
service
/
servicedvb.cpp
diff --git
a/lib/service/servicedvb.cpp
b/lib/service/servicedvb.cpp
index 790ca2f7bd736a92a2c175ab63aba7b7eb9a4f3a..dcd7017c97ab427b3257557d0b4a02690d57caab 100644
(file)
--- a/
lib/service/servicedvb.cpp
+++ b/
lib/service/servicedvb.cpp
@@
-6,7
+6,6
@@
#include <lib/base/estring.h>
#include <lib/base/init_num.h>
#include <lib/base/init.h>
#include <lib/base/estring.h>
#include <lib/base/init_num.h>
#include <lib/base/init.h>
-#include <lib/base/nconfig.h> // access to python config
#include <lib/dvb/dvb.h>
#include <lib/dvb/db.h>
#include <lib/dvb/decoder.h>
#include <lib/dvb/dvb.h>
#include <lib/dvb/db.h>
#include <lib/dvb/decoder.h>
@@
-17,6
+16,7
@@
#include <lib/dvb/metaparser.h>
#include <lib/dvb/tstools.h>
#include <lib/python/python.h>
#include <lib/dvb/metaparser.h>
#include <lib/dvb/tstools.h>
#include <lib/python/python.h>
+#include <lib/base/nconfig.h> // access to python config
/* for subtitles */
#include <lib/gui/esubtitle.h>
/* for subtitles */
#include <lib/gui/esubtitle.h>
@@
-31,8
+31,6
@@
#error no byte order defined!
#endif
#error no byte order defined!
#endif
-#define TSPATH "/media/hdd"
-
class eStaticServiceDVBInformation: public iStaticServiceInformation
{
DECLARE_REF(eStaticServiceDVBInformation);
class eStaticServiceDVBInformation: public iStaticServiceInformation
{
DECLARE_REF(eStaticServiceDVBInformation);
@@
-98,7
+96,7
@@
int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const
return false;
}
return false;
}
-static void PutToDict(ePyObject &dict, const char*key, long value)
+static void PutToDict
AsStr
(ePyObject &dict, const char*key, long value)
{
ePyObject item = PyString_FromFormat("%d", value);
if (item)
{
ePyObject item = PyString_FromFormat("%d", value);
if (item)
@@
-111,15
+109,17
@@
static void PutToDict(ePyObject &dict, const char*key, long value)
eDebug("could not create PyObject for %s", key);
}
eDebug("could not create PyObject for %s", key);
}
-extern void PutToDict(ePyObject &dict, const char*key, const char *value);
+extern void PutToDict(ePyObject &dict, const char*key, long value); // defined in dvb/frontend.cpp
+extern void PutToDict(ePyObject &dict, const char*key, ePyObject item); // defined in dvb/frontend.cpp
+extern void PutToDict(ePyObject &dict, const char*key, const char *value); // defined in dvb/frontend.cpp
void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &feparm)
{
const char *tmp=0;
PutToDict(dict, "type", "Satellite");
void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &feparm)
{
const char *tmp=0;
PutToDict(dict, "type", "Satellite");
- PutToDict(dict, "frequency", feparm.frequency);
- PutToDict(dict, "symbolrate", feparm.symbol_rate);
- PutToDict(dict, "orbital position", feparm.orbital_position);
+ PutToDict
AsStr
(dict, "frequency", feparm.frequency);
+ PutToDict
AsStr
(dict, "symbolrate", feparm.symbol_rate);
+ PutToDict
AsStr
(dict, "orbital position", feparm.orbital_position);
switch (feparm.inversion)
{
case eDVBFrontendParametersSatellite::Inversion::On: tmp="ON"; break;
switch (feparm.inversion)
{
case eDVBFrontendParametersSatellite::Inversion::On: tmp="ON"; break;
@@
-166,15
+166,22
@@
void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe
default:
case eDVBFrontendParametersSatellite::System::DVB_S: tmp="DVB-S"; break;
case eDVBFrontendParametersSatellite::System::DVB_S2:
default:
case eDVBFrontendParametersSatellite::System::DVB_S: tmp="DVB-S"; break;
case eDVBFrontendParametersSatellite::System::DVB_S2:
- switch(feparm.roll
_
off)
+ switch(feparm.rolloff)
{
{
+ default:
case eDVBFrontendParametersSatellite::RollOff::alpha_0_35: tmp="0.35"; break;
case eDVBFrontendParametersSatellite::RollOff::alpha_0_25: tmp="0.25"; break;
case eDVBFrontendParametersSatellite::RollOff::alpha_0_20: tmp="0.20"; break;
case eDVBFrontendParametersSatellite::RollOff::alpha_0_35: tmp="0.35"; break;
case eDVBFrontendParametersSatellite::RollOff::alpha_0_25: tmp="0.25"; break;
case eDVBFrontendParametersSatellite::RollOff::alpha_0_20: tmp="0.20"; break;
- default:
- case eDVBFrontendParametersSatellite::RollOff::alpha_auto: tmp="AUTO"; break;
}
PutToDict(dict, "roll off", tmp);
}
PutToDict(dict, "roll off", tmp);
+ switch(feparm.pilot)
+ {
+ case eDVBFrontendParametersSatellite::Pilot::On: tmp="ON"; break;
+ case eDVBFrontendParametersSatellite::Pilot::Off: tmp="OFF"; break;
+ default:
+ case eDVBFrontendParametersSatellite::Pilot::Unknown: tmp="AUTO"; break;
+ }
+ PutToDict(dict, "pilot", tmp);
tmp="DVB-S2";
break;
}
tmp="DVB-S2";
break;
}
@@
-184,7
+191,7
@@
void PutSatelliteDataToDict(ePyObject &dict, eDVBFrontendParametersSatellite &fe
void PutTerrestrialDataToDict(ePyObject &dict, eDVBFrontendParametersTerrestrial &feparm)
{
PutToDict(dict, "type", "Terrestrial");
void PutTerrestrialDataToDict(ePyObject &dict, eDVBFrontendParametersTerrestrial &feparm)
{
PutToDict(dict, "type", "Terrestrial");
- PutToDict(dict, "frequency", feparm.frequency);
+ PutToDict
AsStr
(dict, "frequency", feparm.frequency);
const char *tmp=0;
switch (feparm.bandwidth)
{
const char *tmp=0;
switch (feparm.bandwidth)
{
@@
-268,8
+275,8
@@
void PutCableDataToDict(ePyObject &dict, eDVBFrontendParametersCable &feparm)
{
const char *tmp=0;
PutToDict(dict, "type", "Cable");
{
const char *tmp=0;
PutToDict(dict, "type", "Cable");
- PutToDict(dict, "frequency", feparm.frequency);
- PutToDict(dict, "symbolrate", feparm.symbol_rate);
+ PutToDict
AsStr
(dict, "frequency", feparm.frequency);
+ PutToDict
AsStr
(dict, "symbolrate", feparm.symbol_rate);
switch (feparm.modulation)
{
case eDVBFrontendParametersCable::Modulation::QAM16: tmp="QAM16"; break;
switch (feparm.modulation)
{
case eDVBFrontendParametersCable::Modulation::QAM16: tmp="QAM16"; break;
@@
-402,7
+409,7
@@
RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref
return -1;
}
return -1;
}
-int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore
, bool simulate
)
{
if (ref.flags & eServiceReference::isGroup)
{
{
if (ref.flags & eServiceReference::isGroup)
{
@@
-428,13
+435,38
@@
int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref
return 0;
}
return 0;
}
+ int prio_order = eDVBFrontend::getTypePriorityOrder();
int cur=0;
eDVBChannelID chid, chid_ignore;
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
for (std::list<eServiceReference>::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it)
{
int cur=0;
eDVBChannelID chid, chid_ignore;
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
for (std::list<eServiceReference>::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it)
{
+ static unsigned char prio_map[6][3] = {
+ { 3, 2, 1 }, // -S -C -T
+ { 3, 1, 2 }, // -S -T -C
+ { 2, 3, 1 }, // -C -S -T
+ { 1, 3, 2 }, // -C -T -S
+ { 1, 2, 3 }, // -T -C -S
+ { 2, 1, 3 } // -T -S -C
+ };
((const eServiceReferenceDVB&)*it).getChannelID(chid);
((const eServiceReferenceDVB&)*it).getChannelID(chid);
- int tmp=res->canAllocateChannel(chid, chid_ignore);
+ int tmp=res->canAllocateChannel(chid, chid_ignore, simulate);
+ switch(tmp)
+ {
+ 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;
+ }
if (tmp > cur)
{
m_playable_service = *it;
if (tmp > cur)
{
m_playable_service = *it;
@@
-504,14
+536,25
@@
int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
eDVBTSTools tstools;
eDVBTSTools tstools;
+ struct stat s;
+ stat(ref.path.c_str(), &s);
+
if (tstools.openFile(ref.path.c_str()))
return 0;
if (tstools.openFile(ref.path.c_str()))
return 0;
+ /* check if cached data is still valid */
+ if (m_parser.m_data_ok && (s.st_size == m_parser.m_filesize) && (m_parser.m_length))
+ return m_parser.m_length / 90000;
+
+ /* otherwise, re-calc length and update meta file */
pts_t len;
if (tstools.calcLen(len))
return 0;
pts_t len;
if (tstools.calcLen(len))
return 0;
- return len / 90000;
+ m_parser.m_length = len;
+ m_parser.m_filesize = s.st_size;
+ m_parser.updateMeta(ref.path);
+ return m_parser.m_length / 90000;
}
int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w)
}
int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w)
@@
-643,7
+686,11
@@
eServiceFactoryDVB::eServiceFactoryDVB()
eServiceCenter::getPrivInstance(sc);
if (sc)
eServiceCenter::getPrivInstance(sc);
if (sc)
- sc->addServiceFactory(eServiceFactoryDVB::id, this);
+ {
+ std::list<std::string> extensions;
+ extensions.push_back("ts");
+ sc->addServiceFactory(eServiceFactoryDVB::id, this, extensions);
+ }
m_StaticServiceDVBInfo = new eStaticServiceDVBInformation;
m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation;
m_StaticServiceDVBInfo = new eStaticServiceDVBInformation;
m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation;
@@
-784,7
+831,7
@@
PyObject *eDVBServiceList::getContent(const char* format, bool sorted)
sptr->getName(ref, name);
// filter short name brakets
sptr->getName(ref, name);
// filter short name brakets
-
unsigned in
t pos;
+
size_
t pos;
while((pos = name.find("\xc2\x86")) != std::string::npos)
name.erase(pos,2);
while((pos = name.find("\xc2\x87")) != std::string::npos)
while((pos = name.find("\xc2\x86")) != std::string::npos)
name.erase(pos,2);
while((pos = name.find("\xc2\x87")) != std::string::npos)
@@
-1008,7
+1055,6
@@
RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServ
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service):
m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0)
{
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service):
m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0)
{
- memset(&m_videoEventData, 0, sizeof(struct iTSMPEGDecoder::videoEvent));
m_is_primary = 1;
m_is_pvr = !m_reference.path.empty();
m_is_primary = 1;
m_is_pvr = !m_reference.path.empty();
@@
-1025,8
+1071,10
@@
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
m_subtitle_widget = 0;
m_tune_state = -1;
m_subtitle_widget = 0;
m_tune_state = -1;
-
- CONNECT(m_subtitle_sync_timer.timeout, eDVBServicePlay::checkSubtitleTiming);
+
+ m_subtitle_sync_timer = eTimer::create(eApp);
+
+ CONNECT(m_subtitle_sync_timer->timeout, eDVBServicePlay::checkSubtitleTiming);
}
eDVBServicePlay::~eDVBServicePlay()
}
eDVBServicePlay::~eDVBServicePlay()
@@
-1071,6
+1119,7
@@
void eDVBServicePlay::serviceEvent(int event)
else
m_event_handler.start(m_demux, sid);
}
else
m_event_handler.start(m_demux, sid);
}
+ m_event((iPlayableService*)this, evTunedIn);
break;
}
case eDVBServicePMTHandler::eventNoResources:
break;
}
case eDVBServicePMTHandler::eventNoResources:
@@
-1078,6
+1127,7
@@
void eDVBServicePlay::serviceEvent(int event)
case eDVBServicePMTHandler::eventNoPATEntry:
case eDVBServicePMTHandler::eventNoPMT:
case eDVBServicePMTHandler::eventTuneFailed:
case eDVBServicePMTHandler::eventNoPATEntry:
case eDVBServicePMTHandler::eventNoPMT:
case eDVBServicePMTHandler::eventTuneFailed:
+ case eDVBServicePMTHandler::eventMisconfiguration:
{
eDebug("DVB service failed to tune - error %d", event);
m_event((iPlayableService*)this, evTuneFailed);
{
eDebug("DVB service failed to tune - error %d", event);
m_event((iPlayableService*)this, evTuneFailed);
@@
-1190,8
+1240,8
@@
RESULT eDVBServicePlay::stop()
{
int perc = play_position * 100LL / length;
{
int perc = play_position * 100LL / length;
- /* only store last play position when between
5% and 95
% */
- if ((
5 < perc) && (perc < 95
))
+ /* only store last play position when between
1% and 99
% */
+ if ((
1 < perc) && (perc < 99
))
m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
}
m_cuesheet_changed = 1;
m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
}
m_cuesheet_changed = 1;
@@
-1345,6
+1395,9
@@
RESULT eDVBServicePlay::seekTo(pts_t to)
return -1;
m_cue->seekTo(0, to);
return -1;
m_cue->seekTo(0, to);
+ m_dvb_subtitle_pages.clear();
+ m_subtitle_pages.clear();
+
return 0;
}
return 0;
}
@@
-1372,6
+1425,8
@@
RESULT eDVBServicePlay::seekRelative(int direction, pts_t to)
return 0;
m_cue->seekTo(mode, to);
return 0;
m_cue->seekTo(mode, to);
+ m_dvb_subtitle_pages.clear();
+ m_subtitle_pages.clear();
return 0;
}
return 0;
}
@@
-1449,9
+1504,16
@@
RESULT eDVBServicePlay::timeshift(ePtr<iTimeshiftService> &ptr)
{
if (!m_timeshift_enabled)
{
{
if (!m_timeshift_enabled)
{
- /* we need enough diskspace */
+ /* query config path */
+ std::string tspath;
+ if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){
+ eDebug("could not query ts path from config");
+ return -4;
+ }
+ tspath.append("/");
+ /* we need enough diskspace */
struct statfs fs;
struct statfs fs;
- if (statfs(
TSPATH "/."
, &fs) < 0)
+ if (statfs(
tspath.c_str()
, &fs) < 0)
{
eDebug("statfs failed!");
return -2;
{
eDebug("statfs failed!");
return -2;
@@
-1526,42
+1588,43
@@
RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
int eDVBServicePlay::getInfo(int w)
{
eDVBServicePMTHandler::program program;
int eDVBServicePlay::getInfo(int w)
{
eDVBServicePMTHandler::program program;
-
+
if (w == sCAIDs)
return resIsPyObject;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
if (w == sCAIDs)
return resIsPyObject;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
-
+
int no_program_info = 0;
int no_program_info = 0;
-
+
if (h.getProgramInfo(program))
no_program_info = 1;
if (h.getProgramInfo(program))
no_program_info = 1;
-
+
switch (w)
{
switch (w)
{
-#if HAVE_DVB_API_VERSION >= 3
case sVideoHeight:
case sVideoHeight:
- if (m_
videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown
)
- return m_
videoEventData.height
;
-
return -1
;
+ if (m_
decoder
)
+ return m_
decoder->getVideoHeight()
;
+
break
;
case sVideoWidth:
case sVideoWidth:
- if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
- return m_videoEventData.width;
- return -1;
-#else
-#warning "FIXMEE implement sVideoHeight, sVideoWidth for old DVB API"
-#endif
+ if (m_decoder)
+ return m_decoder->getVideoWidth();
+ break;
+ case sFrameRate:
+ if (m_decoder)
+ return m_decoder->getVideoFrameRate();
+ break;
+ case sProgressive:
+ if (m_decoder)
+ return m_decoder->getVideoProgressive();
+ break;
case sAspect:
case sAspect:
-#if HAVE_DVB_API_VERSION >= 3
- if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
- return m_videoEventData.aspect == VIDEO_FORMAT_4_3 ? 1 : 3;
- else
-#else
-#warning "FIXMEE implement sAspect for old DVB API"
-#endif
+ {
+ int aspect = -1;
+ if (m_decoder)
+ aspect = m_decoder->getVideoAspect();
if (no_program_info)
if (no_program_info)
- return -1;
- else if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
+ break;
+ else if (
aspect == -1 &&
!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
{
ePtr<eServiceEvent> evt;
if (!m_event_handler.getEvent(evt, 0))
{
ePtr<eServiceEvent> evt;
if (!m_event_handler.getEvent(evt, 0))
@@
-1598,7
+1661,10
@@
int eDVBServicePlay::getInfo(int w)
}
}
}
}
}
}
- return -1;
+ else
+ return aspect;
+ break;
+ }
case sIsCrypted: if (no_program_info) return -1; return program.isCrypted();
case sVideoPID: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
case sVideoType: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type;
case sIsCrypted: if (no_program_info) return -1; return program.isCrypted();
case sVideoPID: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
case sVideoType: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type;
@@
-1614,8
+1680,9
@@
int eDVBServicePlay::getInfo(int w)
case sServiceref: return resIsString;
case sDVBState: return m_tune_state;
default:
case sServiceref: return resIsString;
case sDVBState: return m_tune_state;
default:
-
return -1
;
+
break
;
}
}
+ return -1;
}
std::string eDVBServicePlay::getInfoString(int w)
}
std::string eDVBServicePlay::getInfoString(int w)
@@
-1694,6
+1761,8
@@
RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int
if (i >= program.audioStreams.size())
return -2;
if (i >= program.audioStreams.size())
return -2;
+ info.m_pid = program.audioStreams[i].pid;
+
if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG)
info.m_description = "MPEG";
else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3)
if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG)
info.m_description = "MPEG";
else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3)
@@
-1730,7
+1799,7
@@
int eDVBServicePlay::selectAudioStream(int i)
if (h.getProgramInfo(program))
return -1;
if (h.getProgramInfo(program))
return -1;
- if ((
unsigned int)i >= program.audioStreams.size(
))
+ if ((
i != -1) && ((unsigned int)i >= program.audioStreams.size()
))
return -2;
if (!m_decoder)
return -2;
if (!m_decoder)
@@
-1740,16
+1809,37
@@
int eDVBServicePlay::selectAudioStream(int i)
if (stream == -1)
stream = program.defaultAudioStream;
if (stream == -1)
stream = program.defaultAudioStream;
-
m_current_audio_pid = program.audioStreams[stream].pid
;
+
int apid = -1, apidtype = -1
;
- if (m_decoder->setAudioPID(program.audioStreams[stream].pid, program.audioStreams[stream].type))
+ if (((unsigned int)stream) < program.audioStreams.size())
+ {
+ apid = program.audioStreams[stream].pid;
+ apidtype = program.audioStreams[stream].type;
+ }
+
+ m_current_audio_pid = apid;
+
+ if (m_decoder->setAudioPID(apid, apidtype))
{
eDebug("set audio pid failed");
return -4;
}
{
eDebug("set audio pid failed");
return -4;
}
+ /* if we are not in PVR mode, timeshift is not active and we are not in pip mode, check if we need to enable the rds reader */
+ if (!(m_is_pvr || m_timeshift_active || !m_is_primary))
+ if (!m_rds_decoder)
+ {
+ ePtr<iDVBDemux> data_demux;
+ if (!h.getDataDemux(data_demux))
+ {
+ m_rds_decoder = new eDVBRdsDecoder(data_demux);
+ m_rds_decoder->connectEvent(slot(*this, &eDVBServicePlay::rdsDecoderEvent), m_rds_decoder_event_connection);
+ }
+ }
+
+ /* if we decided that we need one, update the pid */
if (m_rds_decoder)
if (m_rds_decoder)
- m_rds_decoder->start(
program.audioStreams[stream].
pid);
+ m_rds_decoder->start(
a
pid);
/* store new pid as default only when:
a.) we have an entry in the service db for the current service,
/* store new pid as default only when:
a.) we have an entry in the service db for the current service,
@@
-1758,17
+1848,18
@@
int eDVBServicePlay::selectAudioStream(int i)
anything in the best case, or destroy the default setting in
case the real default is not yet available.)
*/
anything in the best case, or destroy the default setting in
case the real default is not yet available.)
*/
- if (m_dvb_service && !m_is_pvr && (i != -1))
+ if (m_dvb_service && !m_is_pvr && ((i != -1)
+ || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1))))
{
{
- if (
program.audioStreams[stream].
type == eDVBAudio::aMPEG)
+ if (
apid
type == eDVBAudio::aMPEG)
{
{
- m_dvb_service->setCacheEntry(eDVBService::cAPID,
program.audioStreams[stream].
pid);
+ m_dvb_service->setCacheEntry(eDVBService::cAPID,
a
pid);
m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
}
else
{
m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
}
else
{
m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
- m_dvb_service->setCacheEntry(eDVBService::cAC3PID,
program.audioStreams[stream].
pid);
+ m_dvb_service->setCacheEntry(eDVBService::cAC3PID,
a
pid);
}
}
}
}
@@
-1936,8
+2027,6
@@
PyObject *eDVBServiceBase::getTransponderData(bool original)
eDVBFrontendParametersSatellite osat;
if (!feparm->getDVBS(osat))
{
eDVBFrontendParametersSatellite osat;
if (!feparm->getDVBS(osat))
{
- void PutToDict(ePyObject &, const char*, long);
- void PutToDict(ePyObject &, const char*, const char*);
PutToDict(ret, "orbital_position", osat.orbital_position);
const char *tmp = "UNKNOWN";
switch(osat.polarisation)
PutToDict(ret, "orbital_position", osat.orbital_position);
const char *tmp = "UNKNOWN";
switch(osat.polarisation)
@@
-2015,12
+2104,23
@@
RESULT eDVBServicePlay::startTimeshift()
if (!m_record)
return -3;
if (!m_record)
return -3;
- char templ[]=TSPATH "/timeshift.XXXXXX";
+ std::string tspath;
+ if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){
+ eDebug("could not query ts path");
+ return -5;
+ }
+ tspath.append("/timeshift.XXXXXX");
+ char* templ;
+ templ = new char[tspath.length() + 1];
+ strcpy(templ, tspath.c_str());
+
m_timeshift_fd = mkstemp(templ);
m_timeshift_fd = mkstemp(templ);
- m_timeshift_file =
templ
;
-
+ m_timeshift_file =
std::string(templ)
;
+
eDebug("recording to %s", templ);
eDebug("recording to %s", templ);
-
+
+ delete [] templ;
+
if (m_timeshift_fd < 0)
{
m_record = 0;
if (m_timeshift_fd < 0)
{
m_record = 0;
@@
-2082,8
+2182,8
@@
PyObject *eDVBServicePlay::getCutList()
for (std::multiset<struct cueEntry>::iterator i(m_cue_entries.begin()); i != m_cue_entries.end(); ++i)
{
ePyObject tuple = PyTuple_New(2);
for (std::multiset<struct cueEntry>::iterator i(m_cue_entries.begin()); i != m_cue_entries.end(); ++i)
{
ePyObject tuple = PyTuple_New(2);
- PyTuple_S
etItem
(tuple, 0, PyLong_FromLongLong(i->where));
- PyTuple_S
etItem
(tuple, 1, PyInt_FromLong(i->what));
+ PyTuple_S
ET_ITEM
(tuple, 0, PyLong_FromLongLong(i->where));
+ PyTuple_S
ET_ITEM
(tuple, 1, PyInt_FromLong(i->what));
PyList_Append(list, tuple);
Py_DECREF(tuple);
}
PyList_Append(list, tuple);
Py_DECREF(tuple);
}
@@
-2248,16
+2348,10
@@
void eDVBServicePlay::switchToTimeshift()
void eDVBServicePlay::updateDecoder()
{
void eDVBServicePlay::updateDecoder()
{
- int vpid = -1, vpidtype = -1,
apid = -1, apidtype = -1,
pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1;
+ int vpid = -1, vpidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
- bool defaultac3=false;
- std::string default_ac3;
-
- if (!ePythonConfigQuery::getConfigValue("config.av.defaultac3", default_ac3))
- defaultac3 = default_ac3 == "True";
-
eDVBServicePMTHandler::program program;
if (h.getProgramInfo(program))
eDebug("getting program info failed.");
eDVBServicePMTHandler::program program;
if (h.getProgramInfo(program))
eDebug("getting program info failed.");
@@
-2290,14
+2384,6
@@
void eDVBServicePlay::updateDecoder()
i(program.audioStreams.begin());
i != program.audioStreams.end(); ++i)
{
i(program.audioStreams.begin());
i != program.audioStreams.end(); ++i)
{
- if (apid == -1 || (apidtype == eDVBAudio::aMPEG && defaultac3))
- {
- if ( apid == -1 || (i->type != eDVBAudio::aMPEG) )
- {
- apid = i->pid;
- apidtype = i->type;
- }
- }
if (i != program.audioStreams.begin())
eDebugNoNewLine(", ");
eDebugNoNewLine("%04x", i->pid);
if (i != program.audioStreams.begin())
eDebugNoNewLine(", ");
eDebugNoNewLine("%04x", i->pid);
@@
-2372,19
+2458,7
@@
void eDVBServicePlay::updateDecoder()
selectAudioStream();
if (!(m_is_pvr || m_timeshift_active || !m_is_primary))
selectAudioStream();
if (!(m_is_pvr || m_timeshift_active || !m_is_primary))
- {
m_decoder->setSyncPCR(pcrpid);
m_decoder->setSyncPCR(pcrpid);
- if (apid != -1)
- {
- ePtr<iDVBDemux> data_demux;
- if (!h.getDataDemux(data_demux))
- {
- m_rds_decoder = new eDVBRdsDecoder(data_demux);
- m_rds_decoder->connectEvent(slot(*this, &eDVBServicePlay::rdsDecoderEvent), m_rds_decoder_event_connection);
- m_rds_decoder->start(apid);
- }
- }
- }
else
m_decoder->setSyncPCR(-1);
else
m_decoder->setSyncPCR(-1);
@@
-2411,23
+2485,10
@@
void eDVBServicePlay::updateDecoder()
m_decoder->setAudioChannel(achannel);
m_decoder->setAudioChannel(achannel);
-// how we can do this better?
-// update cache pid when the user changed the audio track or video track
-// TODO handling of difference audio types.. default audio types..
-
/* don't worry about non-existing services, nor pvr services */
if (m_dvb_service && !m_is_pvr)
{
/* don't worry about non-existing services, nor pvr services */
if (m_dvb_service && !m_is_pvr)
{
- if (apidtype == eDVBAudio::aMPEG)
- {
- m_dvb_service->setCacheEntry(eDVBService::cAPID, apid);
- m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
- }
- else
- {
- m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
- m_dvb_service->setCacheEntry(eDVBService::cAC3PID, apid);
- }
+ /* (audio pid will be set in selectAudioTrack */
m_dvb_service->setCacheEntry(eDVBService::cVPID, vpid);
m_dvb_service->setCacheEntry(eDVBService::cVTYPE, vpidtype == eDVBVideo::MPEG2 ? -1 : vpidtype);
m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid);
m_dvb_service->setCacheEntry(eDVBService::cVPID, vpid);
m_dvb_service->setCacheEntry(eDVBService::cVTYPE, vpidtype == eDVBVideo::MPEG2 ? -1 : vpidtype);
m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid);
@@
-2547,7
+2608,16
@@
void eDVBServicePlay::cutlistToCuesheet()
}
}
}
}
- if (in != out)
+ if (in < 0)
+ in = 0;
+ if (out < 0)
+ out = 0;
+ if (in > length)
+ in = length;
+ if (out > length)
+ out = length;
+
+ if (in < out)
m_cue->addSourceSpan(in, out);
in = length;
m_cue->addSourceSpan(in, out);
in = length;
@@
-2786,6
+2856,10
@@
void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page)
{
if (m_subtitle_widget)
{
{
if (m_subtitle_widget)
{
+ pts_t pos = 0;
+ if (m_decoder)
+ m_decoder->getPTS(0, pos);
+ eDebug("got new subtitle page %lld %lld %d", pos, page.m_pts, page.m_have_pts);
m_subtitle_pages.push_back(page);
checkSubtitleTiming();
}
m_subtitle_pages.push_back(page);
checkSubtitleTiming();
}
@@
-2793,7
+2867,7
@@
void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page)
void eDVBServicePlay::checkSubtitleTiming()
{
void eDVBServicePlay::checkSubtitleTiming()
{
-
//
eDebug("checkSubtitleTiming");
+
eDebug("checkSubtitleTiming");
if (!m_subtitle_widget)
return;
while (1)
if (!m_subtitle_widget)
return;
while (1)
@@
-2822,37
+2896,37
@@
void eDVBServicePlay::checkSubtitleTiming()
if (m_decoder)
m_decoder->getPTS(0, pos);
if (m_decoder)
m_decoder->getPTS(0, pos);
-
//
eDebug("%lld %lld", pos, show_time);
+
eDebug("%lld %lld", pos, show_time);
int diff = show_time - pos;
if (diff < 0)
{
eDebug("[late (%d ms)]", -diff / 90);
diff = 0;
}
int diff = show_time - pos;
if (diff < 0)
{
eDebug("[late (%d ms)]", -diff / 90);
diff = 0;
}
-
if (diff > 900000)
-
{
-
eDebug("[invalid]");
-
diff = 0;
-
}
+
//
if (diff > 900000)
+
//
{
+
//
eDebug("[invalid]");
+
//
diff = 0;
+
//
}
- if (
!diff
)
+ if (
(diff/90)<20
)
{
if (type == TELETEXT)
{
{
if (type == TELETEXT)
{
- eDebug("display teletext subtitle page
"
);
+ eDebug("display teletext subtitle page
%lld", show_time
);
m_subtitle_widget->setPage(page);
m_subtitle_pages.pop_front();
}
else
{
m_subtitle_widget->setPage(page);
m_subtitle_pages.pop_front();
}
else
{
- eDebug("display dvb subtitle Page
"
);
+ eDebug("display dvb subtitle Page
%lld", show_time
);
m_subtitle_widget->setPage(dvb_page);
m_dvb_subtitle_pages.pop_front();
}
} else
{
m_subtitle_widget->setPage(dvb_page);
m_dvb_subtitle_pages.pop_front();
}
} else
{
-
//
eDebug("start subtitle delay %d", diff / 90);
- m_subtitle_sync_timer
.
start(diff / 90, 1);
+
eDebug("start subtitle delay %d", diff / 90);
+ m_subtitle_sync_timer
->
start(diff / 90, 1);
break;
}
}
break;
}
}
@@
-2862,6
+2936,10
@@
void eDVBServicePlay::newDVBSubtitlePage(const eDVBSubtitlePage &p)
{
if (m_subtitle_widget)
{
{
if (m_subtitle_widget)
{
+ pts_t pos = 0;
+ if (m_decoder)
+ m_decoder->getPTS(0, pos);
+ eDebug("got new subtitle page %lld %lld", pos, p.m_show_time);
m_dvb_subtitle_pages.push_back(p);
checkSubtitleTiming();
}
m_dvb_subtitle_pages.push_back(p);
checkSubtitleTiming();
}
@@
-2905,8
+2983,19
@@
void eDVBServicePlay::setPCMDelay(int delay)
void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
{
void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
{
- memcpy(&m_videoEventData, &event, sizeof(iTSMPEGDecoder::videoEvent));
- m_event((iPlayableService*)this, evVideoSizeChanged);
+ switch(event.type) {
+ case iTSMPEGDecoder::videoEvent::eventSizeChanged:
+ m_event((iPlayableService*)this, evVideoSizeChanged);
+ break;
+ case iTSMPEGDecoder::videoEvent::eventFrameRateChanged:
+ m_event((iPlayableService*)this, evVideoFramerateChanged);
+ break;
+ case iTSMPEGDecoder::videoEvent::eventProgressiveChanged:
+ m_event((iPlayableService*)this, evVideoProgressiveChanged);
+ break;
+ default:
+ break;
+ }
}
RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)
}
RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)
@@
-2920,18
+3009,16
@@
PyObject *eDVBServicePlay::getStreamingData()
eDVBServicePMTHandler::program program;
if (m_service_handler.getProgramInfo(program))
{
eDVBServicePMTHandler::program program;
if (m_service_handler.getProgramInfo(program))
{
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
}
-
PyObject *
r = program.createPythonObject();
+
ePyObject
r = program.createPythonObject();
ePtr<iDVBDemux> demux;
if (!m_service_handler.getDataDemux(demux))
{
uint8_t demux_id;
ePtr<iDVBDemux> demux;
if (!m_service_handler.getDataDemux(demux))
{
uint8_t demux_id;
- demux->getCADemuxID(demux_id);
-
- PyDict_SetItemString(r, "demux", PyInt_FromLong(demux_id));
+ if (!demux->getCADemuxID(demux_id))
+ PutToDict(r, "demux", demux_id);
}
return r;
}
return r;