git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mediaplyer: use glib uri escape function for filenames
[enigma2.git]
/
lib
/
service
/
servicedvb.cpp
diff --git
a/lib/service/servicedvb.cpp
b/lib/service/servicedvb.cpp
index 6d9cad09fbe8e9d10d409dad946ac3f8fc2e7590..558bf0c22cd0273428aa24577915a72b6182df3c 100644
(file)
--- a/
lib/service/servicedvb.cpp
+++ b/
lib/service/servicedvb.cpp
@@
-917,7
+917,7
@@
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
m_is_pvr = !m_reference.path.empty();
m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0;
m_is_pvr = !m_reference.path.empty();
m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0;
- m_skipmode = 0;
+ m_skipmode =
m_fastforward = m_slowmotion =
0;
CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift);
CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift);
@@
-1029,6
+1029,9
@@
void eDVBServicePlay::serviceEvent(int event)
m_event((iPlayableService*)this, evUpdatedInfo);
break;
}
m_event((iPlayableService*)this, evUpdatedInfo);
break;
}
+ case eDVBServicePMTHandler::eventPreStart:
+ loadCuesheet();
+ break;
case eDVBServicePMTHandler::eventEOF:
m_event((iPlayableService*)this, evEOF);
break;
case eDVBServicePMTHandler::eventEOF:
m_event((iPlayableService*)this, evEOF);
break;
@@
-1095,7
+1098,6
@@
RESULT eDVBServicePlay::start()
m_event_handler.inject(event, 0);
m_event_handler.inject(empty, 1);
}
m_event_handler.inject(event, 0);
m_event_handler.inject(empty, 1);
}
- loadCuesheet();
m_event(this, evStart);
}
return 0;
m_event(this, evStart);
}
return 0;
@@
-1126,11
+1128,7
@@
RESULT eDVBServicePlay::stop()
if (length)
{
if (length)
{
- int perc = play_position * 100LL / length;
-
- /* 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_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
}
m_cuesheet_changed = 1;
}
}
m_cuesheet_changed = 1;
}
@@
-1185,7
+1183,10
@@
RESULT eDVBServicePlay::setSlowMotion(int ratio)
eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio);
setFastForward_internal(0);
if (m_decoder)
eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio);
setFastForward_internal(0);
if (m_decoder)
+ {
+ m_slowmotion = ratio;
return m_decoder->setSlowMotion(ratio);
return m_decoder->setSlowMotion(ratio);
+ }
else
return -1;
}
else
return -1;
}
@@
-1197,10
+1198,11
@@
RESULT eDVBServicePlay::setFastForward(int ratio)
return setFastForward_internal(ratio);
}
return setFastForward_internal(ratio);
}
-RESULT eDVBServicePlay::setFastForward_internal(int ratio)
+RESULT eDVBServicePlay::setFastForward_internal(int ratio
, bool final_seek
)
{
{
- int skipmode, ffratio;
-
+ int skipmode, ffratio, ret = 0;
+ pts_t pos=0;
+
if (ratio > 8)
{
skipmode = ratio;
if (ratio > 8)
{
skipmode = ratio;
@@
-1225,19
+1227,28
@@
RESULT eDVBServicePlay::setFastForward_internal(int ratio)
if (m_cue)
m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */
}
if (m_cue)
m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */
}
-
+
m_skipmode = skipmode;
m_skipmode = skipmode;
-
+
+ if (final_seek)
+ eDebug("trickplay stopped .. ret %d, pos %lld", getPlayPosition(pos), pos);
+
+ m_fastforward = ffratio;
+
if (!m_decoder)
return -1;
if (!m_decoder)
return -1;
-
+
if (ffratio == 0)
; /* return m_decoder->play(); is done in caller*/
else if (ffratio != 1)
if (ffratio == 0)
; /* return m_decoder->play(); is done in caller*/
else if (ffratio != 1)
- ret
urn
m_decoder->setFastForward(ffratio);
+ ret
=
m_decoder->setFastForward(ffratio);
else
else
- return m_decoder->setTrickmode();
- return 0;
+ ret = m_decoder->setTrickmode();
+
+ if (pos)
+ eDebug("final seek after trickplay ret %d", seekTo(pos));
+
+ return ret;
}
RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
}
RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
@@
-1266,9
+1277,10
@@
RESULT eDVBServicePlay::getLength(pts_t &len)
RESULT eDVBServicePlay::pause()
{
eDebug("eDVBServicePlay::pause");
RESULT eDVBServicePlay::pause()
{
eDebug("eDVBServicePlay::pause");
- setFastForward_internal(0);
+ setFastForward_internal(0
, m_slowmotion || m_fastforward > 1
);
if (m_decoder)
{
if (m_decoder)
{
+ m_slowmotion = 0;
m_is_paused = 1;
return m_decoder->pause();
} else
m_is_paused = 1;
return m_decoder->pause();
} else
@@
-1278,9
+1290,10
@@
RESULT eDVBServicePlay::pause()
RESULT eDVBServicePlay::unpause()
{
eDebug("eDVBServicePlay::unpause");
RESULT eDVBServicePlay::unpause()
{
eDebug("eDVBServicePlay::unpause");
- setFastForward_internal(0);
+ setFastForward_internal(0
, m_slowmotion || m_fastforward > 1
);
if (m_decoder)
{
if (m_decoder)
{
+ m_slowmotion = 0;
m_is_paused = 0;
return m_decoder->play();
} else
m_is_paused = 0;
return m_decoder->play();
} else
@@
-1370,7
+1383,14
@@
RESULT eDVBServicePlay::setTrickmode(int trick)
RESULT eDVBServicePlay::isCurrentlySeekable()
{
RESULT eDVBServicePlay::isCurrentlySeekable()
{
- return m_is_pvr || m_timeshift_active;
+ int ret = 0;
+ if (m_decoder)
+ {
+ ret = (m_is_pvr || m_timeshift_active) ? 3 : 0; // fast forward/backward possible and seeking possible
+ if (m_decoder->getVideoProgressive() == -1)
+ ret &= ~2;
+ }
+ return ret;
}
RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
}
RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
@@
-1728,6
+1748,7
@@
int eDVBServicePlay::selectAudioStream(int i)
{
eDVBServicePMTHandler::program program;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
{
eDVBServicePMTHandler::program program;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+ pts_t position = -1;
if (h.getProgramInfo(program))
return -1;
if (h.getProgramInfo(program))
return -1;
@@
-1750,6
+1771,9
@@
int eDVBServicePlay::selectAudioStream(int i)
apidtype = program.audioStreams[stream].type;
}
apidtype = program.audioStreams[stream].type;
}
+ if (i != -1 && apid != m_current_audio_pid && (m_is_pvr || m_timeshift_active))
+ eDebug("getPlayPosition ret %d, pos %lld in selectAudioStream", getPlayPosition(position), position);
+
m_current_audio_pid = apid;
if (m_is_primary && m_decoder->setAudioPID(apid, apidtype))
m_current_audio_pid = apid;
if (m_is_primary && m_decoder->setAudioPID(apid, apidtype))
@@
-1758,6
+1782,9
@@
int eDVBServicePlay::selectAudioStream(int i)
return -4;
}
return -4;
}
+ if (position != -1)
+ eDebug("seekTo ret %d", seekTo(position));
+
int rdsPid = apid;
/* 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 */
int rdsPid = apid;
/* 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 */
@@
-2058,12
+2085,13
@@
RESULT eDVBServicePlay::startTimeshift()
return 0;
}
return 0;
}
-RESULT eDVBServicePlay::stopTimeshift()
+RESULT eDVBServicePlay::stopTimeshift(
bool swToLive
)
{
if (!m_timeshift_enabled)
return -1;
{
if (!m_timeshift_enabled)
return -1;
- switchToLive();
+ if (swToLive)
+ switchToLive();
m_timeshift_enabled = 0;
m_timeshift_enabled = 0;
@@
-2229,16
+2257,14
@@
void eDVBServicePlay::switchToLive()
m_new_subtitle_page_connection = 0;
m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
m_new_subtitle_page_connection = 0;
m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
- m_is_paused = m_skipmode = 0; /* not supported in live mode */
+ m_is_paused = m_skipmode =
m_fastforward = m_slowmotion =
0; /* not supported in live mode */
/* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
m_timeshift_active = 0;
m_timeshift_changed = 1;
/* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
m_timeshift_active = 0;
m_timeshift_changed = 1;
- m_event((iPlayableService*)this, evSeekableStatusChanged);
-
- updateDecoder();
+ updateDecoder(true);
}
void eDVBServicePlay::switchToTimeshift()
}
void eDVBServicePlay::switchToTimeshift()
@@
-2263,18
+2289,18
@@
void eDVBServicePlay::switchToTimeshift()
r.path = m_timeshift_file;
m_cue = new eCueSheet();
r.path = m_timeshift_file;
m_cue = new eCueSheet();
+ m_cue->seekTo(0, -1000);
m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now.");
pause();
m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now.");
pause();
- updateDecoder(); /* mainly to switch off PCR, and to set pause */
-
- m_event((iPlayableService*)this, evSeekableStatusChanged);
+ updateDecoder(true); /* mainly to switch off PCR, and to set pause */
}
}
-void eDVBServicePlay::updateDecoder()
+void eDVBServicePlay::updateDecoder(
bool sendSeekableStateChanged
)
{
int vpid = -1, vpidtype = -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;
+ bool mustPlay = false;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
@@
-2355,17
+2381,17
@@
void eDVBServicePlay::updateDecoder()
Py_DECREF(subs);
}
}
Py_DECREF(subs);
}
}
- m_decoder->play(); /* pids will be set later */
}
if (m_cue)
m_cue->setDecodingDemux(m_decode_demux, m_decoder);
}
if (m_cue)
m_cue->setDecodingDemux(m_decode_demux, m_decoder);
- m
_decoder->play(); /* pids will be set later. */
+ m
ustPlay = true;
}
m_timeshift_changed = 0;
if (m_decoder)
{
}
m_timeshift_changed = 0;
if (m_decoder)
{
+ bool wasSeekable = m_decoder->getVideoProgressive() != -1;
if (m_dvb_service)
{
achannel = m_dvb_service->getCacheEntry(eDVBService::cACHANNEL);
if (m_dvb_service)
{
achannel = m_dvb_service->getCacheEntry(eDVBService::cACHANNEL);
@@
-2424,7
+2450,11
@@
void eDVBServicePlay::updateDecoder()
m_decoder->setRadioPic(radio_pic);
}
m_decoder->setRadioPic(radio_pic);
}
- m_decoder->set();
+ if (mustPlay)
+ m_decoder->play();
+ else
+ m_decoder->set();
+
m_decoder->setAudioChannel(achannel);
/* don't worry about non-existing services, nor pvr services */
m_decoder->setAudioChannel(achannel);
/* don't worry about non-existing services, nor pvr services */
@@
-2436,8
+2466,13
@@
void eDVBServicePlay::updateDecoder()
m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid);
m_dvb_service->setCacheEntry(eDVBService::cTPID, tpid);
}
m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid);
m_dvb_service->setCacheEntry(eDVBService::cTPID, tpid);
}
+ if (!sendSeekableStateChanged && (m_decoder->getVideoProgressive() != -1) != wasSeekable)
+ sendSeekableStateChanged = true;
}
m_have_video_pid = (vpid > 0 && vpid < 0x2000);
}
m_have_video_pid = (vpid > 0 && vpid < 0x2000);
+
+ if (sendSeekableStateChanged)
+ m_event((iPlayableService*)this, evSeekableStatusChanged);
}
void eDVBServicePlay::loadCuesheet()
}
void eDVBServicePlay::loadCuesheet()
@@
-2538,7
+2573,7
@@
void eDVBServicePlay::cutlistToCuesheet()
{
if (i == m_cue_entries.end())
{
{
if (i == m_cue_entries.end())
{
- if (!have_any_span)
+ if (!have_any_span
&& !in
)
break;
out = length;
} else {
break;
out = length;
} else {
@@
-2568,6
+2603,7
@@
void eDVBServicePlay::cutlistToCuesheet()
{
have_any_span = 1;
m_cue->addSourceSpan(in, out);
{
have_any_span = 1;
m_cue->addSourceSpan(in, out);
+ in = out = 0;
}
in = length;
}
in = length;