m_event((iPlayableService*)this, evSOF);
break;
case eDVBServicePMTHandler::eventEOF:
- switchToLive();
+ if ((!m_is_paused) && (m_skipmode >= 0))
+ switchToLive();
break;
}
}
loadCuesheet();
m_event(this, evStart);
}
-
- m_event((iPlayableService*)this, evSeekableStatusChanged);
return 0;
}
/* add bookmark for last play position */
if (m_is_pvr)
{
- pts_t play_position;
+ pts_t play_position, length;
if (!getPlayPosition(play_position))
{
/* remove last position */
++i;
}
- m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
+ if (getLength(length))
+ length = 0;
+
+ if (length)
+ {
+ int perc = play_position * 100LL / length;
+
+ /* only store last play position when between 5% and 95% */
+ if ((5 < perc) && (perc < 95))
+ m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
+ }
m_cuesheet_changed = 1;
}
}
return m_decoder->setFastForward(ffratio);
}
-
+
RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
{
if (m_is_pvr || m_timeshift_enabled)
return 0;
}
-RESULT eDVBServicePlay::radioText(ePtr<iRadioText> &ptr)
+RESULT eDVBServicePlay::rdsDecoder(ePtr<iRdsDecoder> &ptr)
{
ptr = this;
return 0;
if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
return -4;
- if (m_radiotext_parser)
- m_radiotext_parser->start(program.audioStreams[i].pid);
+ if (m_rds_decoder)
+ m_rds_decoder->start(program.audioStreams[i].pid);
if (m_dvb_service && !m_is_pvr)
{
return 0;
}
-std::string eDVBServicePlay::getRadioText(int x)
+std::string eDVBServicePlay::getText(int x)
{
- if (m_radiotext_parser)
+ if (m_rds_decoder)
switch(x)
{
- case 0:
- return convertLatin1UTF8(m_radiotext_parser->getCurrentText());
+ case RadioText:
+ return convertLatin1UTF8(m_rds_decoder->getRadioText());
+ case RtpText:
+ return convertLatin1UTF8(m_rds_decoder->getRtpText());
}
return "";
}
-void eDVBServicePlay::radioTextUpdated()
+void eDVBServicePlay::rdsDecoderEvent(int what)
+{
+ switch(what)
+ {
+ case eDVBRdsDecoder::RadioTextChanged:
+ m_event((iPlayableService*)this, evUpdatedRadioText);
+ break;
+ case eDVBRdsDecoder::RtpTextChanged:
+ m_event((iPlayableService*)this, evUpdatedRtpText);
+ break;
+ case eDVBRdsDecoder::RassInteractivePicMaskChanged:
+ m_event((iPlayableService*)this, evUpdatedRassInteractivePicMask);
+ break;
+ case eDVBRdsDecoder::RecvRassSlidePic:
+ m_event((iPlayableService*)this, evUpdatedRassSlidePic);
+ break;
+ }
+}
+
+void eDVBServicePlay::showRassSlidePicture()
{
- m_event((iPlayableService*)this, evUpdatedRadioText);
+ if (m_rds_decoder)
+ {
+ if (m_decoder)
+ {
+ std::string rass_slide_pic = m_rds_decoder->getRassSlideshowPicture();
+ if (rass_slide_pic.length())
+ m_decoder->showSinglePic(rass_slide_pic.c_str());
+ else
+ eDebug("empty filename for rass slide picture received!!");
+ }
+ else
+ eDebug("no MPEG Decoder to show iframes avail");
+ }
+ else
+ eDebug("showRassSlidePicture called.. but not decoder");
+}
+
+void eDVBServicePlay::showRassInteractivePic(int page, int subpage)
+{
+ if (m_rds_decoder)
+ {
+ if (m_decoder)
+ {
+ std::string rass_interactive_pic = m_rds_decoder->getRassPicture(page, subpage);
+ if (rass_interactive_pic.length())
+ m_decoder->showSinglePic(rass_interactive_pic.c_str());
+ else
+ eDebug("empty filename for rass interactive picture %d/%d received!!", page, subpage);
+ }
+ else
+ eDebug("no MPEG Decoder to show iframes avail");
+ }
+ else
+ eDebug("showRassInteractivePic called.. but not decoder");
+}
+
+ePyObject eDVBServicePlay::getRassInteractiveMask()
+{
+ if (m_rds_decoder)
+ return m_rds_decoder->getRassPictureMask();
+ Py_RETURN_NONE;
}
int eDVBServiceBase::getFrontendInfo(int w)
m_decoder = 0;
m_decode_demux = 0;
m_teletext_parser = 0;
- m_radiotext_parser = 0;
+ m_rds_decoder = 0;
m_subtitle_parser = 0;
m_new_dvb_subtitle_page_connection = 0;
m_new_subtitle_page_connection = 0;
- m_radiotext_updated_connection = 0;
+ m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
/* free the timeshift service handler, we need the resources */
m_decode_demux = 0;
m_decoder = 0;
m_teletext_parser = 0;
- m_radiotext_parser = 0;
+ m_rds_decoder = 0;
m_subtitle_parser = 0;
m_new_subtitle_page_connection = 0;
m_new_dvb_subtitle_page_connection = 0;
- m_radiotext_updated_connection = 0;
+ m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
m_timeshift_active = 1;
m_cue = new eCueSheet();
m_service_handler_timeshift.tune(r, 1, m_cue); /* use the decoder demux for everything */
- updateDecoder(); /* mainly to switch off PCR */
+ eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now.");
+ pause();
+ updateDecoder(); /* mainly to switch off PCR, and to set pause */
+
m_event((iPlayableService*)this, evSeekableStatusChanged);
}
ePtr<iDVBDemux> data_demux;
if (!h.getDataDemux(data_demux))
{
- m_radiotext_parser = new eDVBRadioTextParser(data_demux);
- m_radiotext_parser->connectUpdatedRadiotext(slot(*this, &eDVBServicePlay::radioTextUpdated), m_radiotext_updated_connection);
- m_radiotext_parser->start(apid);
+ 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);
}
}
}
if (!m_is_primary)
m_decoder->setTrickmode(1);
- m_decoder->start();
+ if (m_is_paused)
+ m_decoder->preroll();
+ else
+ m_decoder->start();
if (vpid > 0 && vpid < 0x2000)
;
m_event((iPlayableService*)this, evVideoSizeChanged);
}
+RESULT eDVBServicePlay::stream(ePtr<iStreamableService> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
+PyObject *eDVBServicePlay::getStreamingData()
+{
+ eDVBServicePMTHandler::program program;
+ if (m_service_handler.getProgramInfo(program))
+ {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ PyObject *r = program.createPythonObject();
+ 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));
+ }
+
+ return r;
+}
+
+
DEFINE_REF(eDVBServicePlay)
PyObject *eDVBService::getInfoObject(const eServiceReference &ref, int w)