((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
for (std::list<eServiceReference>::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it)
{
- int tmp=res->canAllocateChannel(chid, chid_ignore);
((const eServiceReferenceDVB&)*it).getChannelID(chid);
+ int tmp=res->canAllocateChannel(chid, chid_ignore);
if (tmp > cur)
{
m_playable_service = *it;
return -1;
}
+#include <lib/dvb/epgcache.h>
+
+RESULT eStaticServiceDVBBouquetInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time)
+{
+ return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
+}
+
class eStaticServiceDVBPVRInformation: public iStaticServiceInformation
{
DECLARE_REF(eStaticServiceDVBPVRInformation);
RESULT eDVBServiceList::startEdit(ePtr<iMutableServiceList> &res)
{
- if (m_parent.flags & eServiceReference::flagDirectory) // bouquet
+ if (m_parent.flags & eServiceReference::canDescent) // bouquet
{
ePtr<iDVBChannelList> db;
ePtr<eDVBResourceManager> resm;
RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
{
/* is a listable service? */
- if ((ref.flags & eServiceReference::flagDirectory) == eServiceReference::flagDirectory) // bouquet
+ if (ref.flags & eServiceReference::canDescent) // bouquet
{
if ( !ref.name.empty() ) // satellites or providers list
ptr = m_StaticServiceDVBInfo;
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_subtitle_widget = 0;
+ m_tune_state = -1;
+
CONNECT(m_subtitle_sync_timer.timeout, eDVBServicePlay::checkSubtitleTiming);
}
void eDVBServicePlay::serviceEvent(int event)
{
+ m_tune_state = event;
+
switch (event)
{
case eDVBServicePMTHandler::eventTuned:
}
break;
}
+ case eDVBServicePMTHandler::eventNoPAT:
+ case eDVBServicePMTHandler::eventNoPATEntry:
+ case eDVBServicePMTHandler::eventNoPMT:
case eDVBServicePMTHandler::eventTuneFailed:
{
- eDebug("DVB service failed to tune");
+ eDebug("DVB service failed to tune - error %d", event);
m_event((iPlayableService*)this, evTuneFailed);
break;
}
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;
+ int no_program_info = 0;
+
if (h.getProgramInfo(program))
- return -1;
+ no_program_info = 1;
switch (w)
{
+#if HAVE_DVB_API_VERSION >= 3
+ case sVideoHeight:
+ if (m_videoEventData.type != iTSMPEGDecoder::videoEvent::eventUnknown)
+ return m_videoEventData.height;
+ return -1;
+ 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
case sAspect:
- if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
+#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
+ if (no_program_info)
+ return -1;
+ else if (!program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
{
ePtr<eServiceEvent> evt;
if (!m_event_handler.getEvent(evt, 0))
}
}
return -1;
- case sIsCrypted: return program.isCrypted();
- case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
- case sVideoType: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type;
- case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid;
- case sPCRPID: return program.pcrPid;
- case sPMTPID: return program.pmtPid;
- case sTXTPID: return program.textPid;
+ 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 sAudioPID: if (no_program_info) return -1; if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid;
+ case sPCRPID: if (no_program_info) return -1; return program.pcrPid;
+ case sPMTPID: if (no_program_info) return -1; return program.pmtPid;
+ case sTXTPID: if (no_program_info) return -1; return program.textPid;
case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get();
case sONID: return ((const eServiceReferenceDVB&)m_reference).getOriginalNetworkID().get();
case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
case sProvider: if (!m_dvb_service) return -1; return -2;
case sServiceref: return resIsString;
+ case sDVBState: return m_tune_state;
default:
return -1;
}
{
h.getDecodeDemux(m_decode_demux);
if (m_decode_demux)
+ {
m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary);
+ if (m_decoder)
+ m_decoder->connectVideoEvent(slot(*this, &eDVBServicePlay::video_event), m_video_event_connection);
+ }
if (m_cue)
m_cue->setDecodingDemux(m_decode_demux, m_decoder);
m_teletext_parser = new eDVBTeletextParser(m_decode_demux);
m_decoder->setPCMDelay(delay);
}
+void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
+{
+ eDebug("!!!!!!!!!! Video Event type %d, aspect %d, %dx%d", event.type, event.aspect, event.width, event.height);
+ memcpy(&m_videoEventData, &event, sizeof(iTSMPEGDecoder::videoEvent));
+ m_event((iPlayableService*)this, evVideoSizeChanged);
+}
+
DEFINE_REF(eDVBServicePlay)
eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");