git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
better solution to add possibility to delete eSocketNotifiers,
[enigma2.git]
/
lib
/
service
/
servicedvb.cpp
diff --git
a/lib/service/servicedvb.cpp
b/lib/service/servicedvb.cpp
index a3450b89f07a2fe806e51e64f7070945167c92f7..e0e6dbca67edf3037b00ca1f19da84fdf89a9cf2 100644
(file)
--- a/
lib/service/servicedvb.cpp
+++ b/
lib/service/servicedvb.cpp
@@
-166,15
+166,25
@@
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);
+ if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation::M8PSK)
+ {
+ 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;
}
@@
-428,13
+438,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);
int tmp=res->canAllocateChannel(chid, chid_ignore);
((const eServiceReferenceDVB&)*it).getChannelID(chid);
int tmp=res->canAllocateChannel(chid, chid_ignore);
+ 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;
@@
-643,7
+678,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
+823,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)
@@
-1071,6
+1110,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
+1118,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
+1231,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;
@@
-1528,38
+1569,67
@@
RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
return m_event_handler.getEvent(evt, nownext);
}
return m_event_handler.getEvent(evt, nownext);
}
+static int readMpegProc(char *str, int decoder)
+{
+ int val = -1;
+ char tmp[64];
+ sprintf(tmp, "/proc/stb/vmpeg/%d/%s", decoder, str);
+ FILE *f = fopen(tmp, "r");
+ if (f)
+ {
+ fscanf(f, "%x", &val);
+ fclose(f);
+ }
+ return val;
+}
+
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)
{
#if HAVE_DVB_API_VERSION >= 3
case sVideoHeight:
switch (w)
{
#if HAVE_DVB_API_VERSION >= 3
case sVideoHeight:
- if (m_videoEventData.type
!= iTSMPEGDecoder::videoEvent::eventUnknown
)
+ if (m_videoEventData.type
== iTSMPEGDecoder::videoEvent::eventSizeChanged
)
return m_videoEventData.height;
return m_videoEventData.height;
- return -1;
+ else
+ return readMpegProc("yres", !m_is_primary);
case sVideoWidth:
case sVideoWidth:
- if (m_videoEventData.type
!= iTSMPEGDecoder::videoEvent::eventUnknown
)
+ if (m_videoEventData.type
== iTSMPEGDecoder::videoEvent::eventSizeChanged
)
return m_videoEventData.width;
return m_videoEventData.width;
- return -1;
+ else
+ return readMpegProc("xres", !m_is_primary);
+ case sFrameRate:
+ if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventFrameRateChanged)
+ return m_videoEventData.framerate;
+ else
+ return readMpegProc("framerate", !m_is_primary);
+ case sProgressive:
+ if (m_videoEventData.type == iTSMPEGDecoder::videoEvent::eventProgressiveChanged)
+ return m_videoEventData.progressive;
+ return readMpegProc("progressive", !m_is_primary);
#else
#else
-#warning "FIXMEE implement sVideoHeight, sVideoWidth for old DVB API"
+#warning "FIXMEE implement s
FrameRate, sProgressive, s
VideoHeight, sVideoWidth for old DVB API"
#endif
case sAspect:
#endif
case sAspect:
+ {
+ int val;
#if HAVE_DVB_API_VERSION >= 3
#if HAVE_DVB_API_VERSION >= 3
- if (m_videoEventData.type
!= iTSMPEGDecoder::videoEvent::eventUnknown
)
+ if (m_videoEventData.type
== iTSMPEGDecoder::videoEvent::eventSizeChanged
)
return m_videoEventData.aspect == VIDEO_FORMAT_4_3 ? 1 : 3;
return m_videoEventData.aspect == VIDEO_FORMAT_4_3 ? 1 : 3;
+ else if ((val=readMpegProc("aspect", !m_is_primary)) != -1)
+ return val;
else
#else
#warning "FIXMEE implement sAspect for old DVB API"
else
#else
#warning "FIXMEE implement sAspect for old DVB API"
@@
-1604,6
+1674,7
@@
int eDVBServicePlay::getInfo(int w)
}
}
return -1;
}
}
return -1;
+ }
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;
@@
-1786,7
+1857,8
@@
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 (apidtype == eDVBAudio::aMPEG)
{
{
if (apidtype == eDVBAudio::aMPEG)
{
@@
-2536,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;
@@
-2828,11
+2909,11
@@
void eDVBServicePlay::checkSubtitleTiming()
// diff = 0;
// }
// 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();
}
m_subtitle_widget->setPage(page);
m_subtitle_pages.pop_front();
}
@@
-2902,8
+2983,20
@@
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);
+ memcpy(&m_videoEventData, &event, sizeof(event));
+ 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)