Skip to content

Commit 80790f1

Browse files
committed
[servicedvb]
* re-enable precise recovery feature to fix time shift issues * add extra setting for hardware latency correction for DM9x0
1 parent 2c1b8b0 commit 80790f1

File tree

4 files changed

+35
-20
lines changed

4 files changed

+35
-20
lines changed

data/setup.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,7 @@
10361036
<item level="2" text="Time shift buffer delete after zap" description="Select 'No' to save older events even after zapping or interrupting time shifting.">config.timeshift.deleteAfterZap</item>
10371037
<item level="2" text="Time shift event based file splitting" description="Select 'No' to make time shift use a single buffer file. Use 'Time shift checking for older files [in minutes]' and 'Time shift checking for free space?' to control the size of the buffer file.">config.timeshift.fileSplitting</item>
10381038
<item level="2" text="Streaming recovery delay" description="Enter the duration to be added to the streaming buffer after a streaming error. This extra buffer can help to avoid further streaming issues due to a lack of buffer space.">config.timeshift.recoveryBufferDelay</item>
1039+
<item level="2" text="Hardware latency correction" description="Adjusts compensation for hardware buffer latency for DM9x0." requires="DM9X0">config.timeshift.hwLatencyCorrection</item>
10391040
</setup>
10401041
<setup key="Tuner" title="Tuner Settings" level="1">
10411042
<item level="1" text="Force LNB Power" description="Force LNB Tuner Power settings." requires="ForceLNBPowerChanged">config.tunermisc.forceLnbPower</item>

lib/python/Components/SystemInfo.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22
from glob import glob
33
from hashlib import md5
44
from os import listdir, readlink
5-
from os.path import basename, exists, isfile, join, islink
5+
from os.path import basename, exists, isfile, islink, join
66
from subprocess import PIPE, Popen
77

8-
from enigma import Misc_Options, eDVBResourceManager, eGetEnigmaDebugLvl, eDBoxLCD, eDVBCIInterfaces, getE2Rev, eDVBCSAEngine
9-
10-
from Tools.Directories import SCOPE_LIBDIR, SCOPE_SKINS, isPluginInstalled, fileCheck, fileReadLine, fileReadLines, resolveFilename, fileExists, fileHas, pathExists
8+
from enigma import eDBoxLCD, eDVBCIInterfaces, eDVBCSAEngine, eDVBResourceManager, eGetEnigmaDebugLvl, getE2Rev, Misc_Options
9+
from Tools.Directories import fileCheck, fileExists, fileHas, fileReadLine, fileReadLines, isPluginInstalled, pathExists, resolveFilename, SCOPE_LIBDIR, SCOPE_SKINS
1110
from Tools.MultiBoot import MultiBoot
1211

1312
MODULE_NAME = __name__.split(".")[-1]
@@ -363,7 +362,7 @@ def getWakeOnLANType(fileName):
363362
# ]
364363
# BoxInfo.setItem("InformationDistributionWelcome", welcome)
365364

366-
BoxInfo.setItem("12V_Output", Misc_Options.getInstance().detected_12V_output()) #FIXME : Do we need this?
365+
BoxInfo.setItem("12V_Output", Misc_Options.getInstance().detected_12V_output()) # FIXME : Do we need this?
367366
BoxInfo.setItem("3DMode", fileCheck("/proc/stb/fb/3dmode") or fileCheck("/proc/stb/fb/primary/3d"))
368367
BoxInfo.setItem("3DZNorm", fileCheck("/proc/stb/fb/znorm") or fileCheck("/proc/stb/fb/primary/zoffset"))
369368
BoxInfo.setItem("7segment", DISPLAYTYPE in ("7segment",))
@@ -455,6 +454,8 @@ def getWakeOnLANType(fileName):
455454
BoxInfo.setItem("XcoreVFD", MODEL in ("xc7346", "xc7439"))
456455
BoxInfo.setItem("ZapMode", fileCheck("/proc/stb/video/zapmode") or fileCheck("/proc/stb/video/zapping_mode"))
457456
BoxInfo.setItem("DisplaySetup", MODEL not in ("dreamone",))
457+
BoxInfo.setItem("DM9X0", MODEL in ("dm900", "dm920"))
458+
458459

459460
# Dont't sort.
460461
BoxInfo.setItem("ConfigDisplay", BoxInfo.getItem("FrontpanelDisplay") and DISPLAYTYPE not in ("7segment",))

lib/python/Components/UsageConfig.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,6 +2493,7 @@ def partitionListChanged(action, device):
24932493
config.timeshift.startDelay = ConfigSelection(default=0, choices=choiceList)
24942494
config.timeshift.stopWhileRecording = ConfigYesNo(default=False)
24952495
config.timeshift.recoveryBufferDelay = ConfigSelection(default=300, choices=[(x, _("%d ms") % x) for x in range(100, 1500, 100)])
2496+
config.timeshift.hwLatencyCorrection = ConfigSelection(default=2000, choices=[(x, _("%d ms") % x) for x in range(0, 2100, 100)])
24962497

24972498
defaultPath = resolveFilename(SCOPE_TIMESHIFT)
24982499
config.timeshift.allowedPaths = ConfigLocations(default=[defaultPath])

lib/service/servicedvb.cpp

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ void eDVBServicePlay::serviceEvent(int event)
12851285
case eDVBServicePMTHandler::eventNoPAT:
12861286
case eDVBServicePMTHandler::eventNoPMT:
12871287
{
1288-
bool recovery_enabled = false; // Disable precise recovery for now
1288+
bool recovery_enabled = true;
12891289
// Check if timeshift is active and we are not already in a recovery state
12901290
if (recovery_enabled && m_timeshift_enabled && !m_stream_corruption_detected)
12911291
{
@@ -1456,12 +1456,17 @@ void eDVBServicePlay::startPreciseRecoveryCheck() {
14561456
pts_t final_target_delay = m_original_timeshift_delay + safety_buffer_pts;
14571457

14581458
#ifdef ENABLE_TIMESHIFT_HW_LATENCY_FIX
1459-
const pts_t latency_correction = 2000 * 90;
1459+
int hw_latency_ms = eSimpleConfig::getInt("config.timeshift.hwLatencyCorrection", 2000);
1460+
1461+
if (hw_latency_ms < 0) hw_latency_ms = 0;
1462+
if (hw_latency_ms > 5000) hw_latency_ms = 5000;
1463+
1464+
const pts_t latency_correction = hw_latency_ms * 90;
14601465

14611466
if (final_target_delay > latency_correction)
14621467
final_target_delay -= latency_correction;
14631468
else
1464-
final_target_delay = 9000;
1469+
final_target_delay = 9000;
14651470
#endif
14661471

14671472
if (current_delay >= final_target_delay) {
@@ -2014,24 +2019,32 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
20142019

20152020
int r = 0;
20162021

2017-
/* if there is a decoder, use audio or video PTS */
2018-
// Check SoftDecoder only if session is active AND not in timeshift playback
2019-
if (m_soft_decoder && m_csa_session && m_csa_session->isActive() && !m_timeshift_active)
2020-
{
2021-
r = m_soft_decoder->getPTS(0, pos);
2022+
/* if there is a decoder, use audio or video PTS */
2023+
2024+
// Case 1: SoftDecoder active (for live descrambling, NOT during timeshift playback)
2025+
if (m_soft_decoder && m_csa_session && m_csa_session->isActive() && !m_timeshift_active) {
2026+
if (m_noaudio && m_have_video_pid)
2027+
r = m_soft_decoder->getPTS(1, pos); // Video PTS
2028+
else
2029+
r = m_soft_decoder->getPTS(0, pos); // Auto
2030+
20222031
if (r)
20232032
return r;
20242033
}
2025-
else if (m_decoder)
2026-
{
2027-
r = m_decoder->getPTS(0, pos);
2034+
// Case 2: Normal hardware decoder
2035+
else if (m_decoder) {
2036+
if (m_noaudio && m_have_video_pid)
2037+
r = m_decoder->getPTS(1, pos); // Video PTS
2038+
else
2039+
r = m_decoder->getPTS(0, pos); // Auto (original behavior)
2040+
20282041
if (r)
20292042
return r;
20302043
}
20312044

2032-
/* fixup */
2033-
ePtr<iTSMPEGDecoder> decoder = (m_soft_decoder && m_csa_session && m_csa_session->isActive() && !m_timeshift_active)
2034-
? m_soft_decoder->getDecoder() : m_decoder;
2045+
/* fixup */
2046+
ePtr<iTSMPEGDecoder> decoder = (m_soft_decoder && m_csa_session && m_csa_session->isActive() && !m_timeshift_active) ? m_soft_decoder->getDecoder() : m_decoder;
2047+
20352048
return pvr_channel->getCurrentPosition(m_decode_demux, pos, decoder);
20362049
}
20372050

@@ -3107,7 +3120,6 @@ void eDVBServicePlay::recordEvent(int event) {
31073120
eWarning("[eDVBServicePlay] recordEvent write error");
31083121
return;
31093122
case iDVBTSRecorder::eventStreamCorrupt: {
3110-
return; // Disabled for now.
31113123
// Do not re-trigger if a recovery is already in progress.
31123124
if (m_stream_corruption_detected)
31133125
return;

0 commit comments

Comments
 (0)