Skip to content

Commit 154bf94

Browse files
authored
Fix subtitle crash and audio/video info when SoftDecoder is active (#4297)
1 parent e526448 commit 154bf94

File tree

1 file changed

+59
-32
lines changed

1 file changed

+59
-32
lines changed

lib/service/servicedvb.cpp

Lines changed: 59 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2027,18 +2027,22 @@ int eDVBServicePlay::getInfo(int w)
20272027
case sVideoHeight:
20282028
if (m_soft_decoder && m_csa_session && m_csa_session->isActive()) return m_soft_decoder->getVideoHeight();
20292029
if (m_decoder) return m_decoder->getVideoHeight();
2030+
else if (m_soft_decoder) return m_soft_decoder->getVideoHeight();
20302031
break;
20312032
case sVideoWidth:
20322033
if (m_soft_decoder && m_csa_session && m_csa_session->isActive()) return m_soft_decoder->getVideoWidth();
20332034
if (m_decoder) return m_decoder->getVideoWidth();
2035+
else if (m_soft_decoder) return m_soft_decoder->getVideoWidth();
20342036
break;
20352037
case sFrameRate:
20362038
if (m_soft_decoder && m_csa_session && m_csa_session->isActive()) return m_soft_decoder->getVideoFrameRate();
20372039
if (m_decoder) return m_decoder->getVideoFrameRate();
2040+
else if (m_soft_decoder) return m_soft_decoder->getVideoFrameRate();
20382041
break;
20392042
case sProgressive:
20402043
if (m_soft_decoder && m_csa_session && m_csa_session->isActive()) return m_soft_decoder->getVideoProgressive();
20412044
if (m_decoder) return m_decoder->getVideoProgressive();
2045+
else if (m_soft_decoder) return m_soft_decoder->getVideoProgressive();
20422046
break;
20432047
case sAspect:
20442048
{
@@ -2047,6 +2051,8 @@ int eDVBServicePlay::getInfo(int w)
20472051
aspect = m_soft_decoder->getVideoAspect();
20482052
else if (m_decoder)
20492053
aspect = m_decoder->getVideoAspect();
2054+
else if (m_soft_decoder)
2055+
aspect = m_soft_decoder->getVideoAspect();
20502056
if (aspect == -1 && no_program_info)
20512057
break;
20522058
else if (aspect == -1 && !program.videoStreams.empty() && program.videoStreams[0].component_tag != -1)
@@ -2093,6 +2099,7 @@ int eDVBServicePlay::getInfo(int w)
20932099
case sGamma:
20942100
if (m_soft_decoder && m_csa_session && m_csa_session->isActive()) return m_soft_decoder->getVideoGamma();
20952101
if (m_decoder) return m_decoder->getVideoGamma();
2102+
else if (m_soft_decoder) return m_soft_decoder->getVideoGamma();
20962103
break;
20972104
case sIsCrypted:
20982105
if (no_program_info) return false;
@@ -2302,8 +2309,15 @@ RESULT eDVBServicePlay::selectTrack(unsigned int i)
23022309

23032310
int ret = selectAudioStream(i);
23042311

2305-
if (m_decoder->set())
2306-
return -5;
2312+
if (m_decoder)
2313+
{
2314+
if (m_decoder->set())
2315+
return -5;
2316+
}
2317+
else if (m_soft_decoder)
2318+
{
2319+
// SoftDecoder handles set() internally in selectAudioTrack
2320+
}
23072321

23082322
return ret;
23092323
}
@@ -2374,7 +2388,7 @@ int eDVBServicePlay::selectAudioStream(int i)
23742388
if ((i != -1) && ((unsigned int)i >= program.audioStreams.size()))
23752389
return -2;
23762390

2377-
if (!m_decoder)
2391+
if (!m_decoder && !m_soft_decoder)
23782392
return -3;
23792393

23802394
int stream = i;
@@ -2397,10 +2411,24 @@ int eDVBServicePlay::selectAudioStream(int i)
23972411

23982412
m_current_audio_pid = apid;
23992413

2400-
if ((m_is_primary || !m_noaudio) && m_decoder->setAudioPID(apid, apidtype))
2414+
if (m_is_primary || !m_noaudio)
24012415
{
2402-
eDebug("[eDVBServicePlay] set audio pid %04x failed", apid);
2403-
return -4;
2416+
if (m_decoder)
2417+
{
2418+
if (m_decoder->setAudioPID(apid, apidtype))
2419+
{
2420+
eDebug("[eDVBServicePlay] set audio pid %04x failed", apid);
2421+
return -4;
2422+
}
2423+
}
2424+
else if (m_soft_decoder)
2425+
{
2426+
if (m_soft_decoder->setAudioPID(apid, apidtype))
2427+
{
2428+
eDebug("[eDVBServicePlay] SoftDecoder set audio pid %04x failed", apid);
2429+
return -4;
2430+
}
2431+
}
24042432
}
24052433

24062434
if (position != -1)
@@ -2465,9 +2493,11 @@ int eDVBServicePlay::selectAudioStream(int i)
24652493

24662494
int eDVBServicePlay::getCurrentChannel()
24672495
{
2468-
if (m_soft_decoder && m_csa_session && m_csa_session->isActive())
2496+
if (m_decoder)
2497+
return m_decoder->getAudioChannel();
2498+
else if (m_soft_decoder)
24692499
return m_soft_decoder->getAudioChannel();
2470-
return m_decoder ? m_decoder->getAudioChannel() : STEREO;
2500+
return STEREO;
24712501
}
24722502

24732503
RESULT eDVBServicePlay::selectChannel(int i)
@@ -2476,10 +2506,10 @@ RESULT eDVBServicePlay::selectChannel(int i)
24762506
i = -1; // Stereo
24772507
if (m_dvb_service)
24782508
m_dvb_service->setCacheEntry(eDVBService::cACHANNEL, i);
2479-
if (m_soft_decoder && m_csa_session && m_csa_session->isActive())
2480-
m_soft_decoder->setAudioChannel(i);
24812509
if (m_decoder)
24822510
m_decoder->setAudioChannel(i);
2511+
else if (m_soft_decoder)
2512+
m_soft_decoder->setAudioChannel(i);
24832513
return 0;
24842514
}
24852515

@@ -3756,8 +3786,11 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page)
37563786
if (m_subtitle_widget)
37573787
{
37583788
int subtitledelay = 0;
3759-
pts_t pts;
3760-
m_decoder->getPTS(0, pts);
3789+
pts_t pts = 0;
3790+
if (m_decoder)
3791+
m_decoder->getPTS(0, pts);
3792+
else if (m_soft_decoder)
3793+
m_soft_decoder->getPTS(0, pts);
37613794
if (m_is_pvr || m_timeshift_enabled)
37623795
{
37633796
eDebug("[eDVBServicePlay] Subtitle in recording/timeshift");
@@ -3794,9 +3827,9 @@ void eDVBServicePlay::checkSubtitleTiming()
37943827
return;
37953828
}
37963829
if (m_decoder)
3797-
{
37983830
m_decoder->getPTS(0, pos);
3799-
}
3831+
else if (m_soft_decoder)
3832+
m_soft_decoder->getPTS(0, pos);
38003833

38013834
while (1)
38023835
{
@@ -3852,6 +3885,8 @@ void eDVBServicePlay::newDVBSubtitlePage(const eDVBSubtitlePage &p)
38523885
pts_t pos = 0;
38533886
if (m_decoder)
38543887
m_decoder->getPTS(0, pos);
3888+
else if (m_soft_decoder)
3889+
m_soft_decoder->getPTS(0, pos);
38553890

38563891
// Where subtitles are delivered out of sync with video, only treat subtitles in the past as having bad timing.
38573892
// Those that are delivered too early are cached for displaying at the appropriate later time
@@ -3892,8 +3927,9 @@ int eDVBServicePlay::getAC3Delay()
38923927
return m_soft_decoder->getAC3Delay();
38933928
else if (m_decoder)
38943929
return m_decoder->getAC3Delay();
3895-
else
3896-
return 0;
3930+
else if (m_soft_decoder)
3931+
return m_soft_decoder->getAC3Delay();
3932+
return 0;
38973933
}
38983934

38993935
int eDVBServicePlay::getPCMDelay()
@@ -3904,40 +3940,31 @@ int eDVBServicePlay::getPCMDelay()
39043940
return m_soft_decoder->getPCMDelay();
39053941
else if (m_decoder)
39063942
return m_decoder->getPCMDelay();
3907-
else
3908-
return 0;
3943+
else if (m_soft_decoder)
3944+
return m_soft_decoder->getPCMDelay();
3945+
return 0;
39093946
}
39103947

39113948
void eDVBServicePlay::setAC3Delay(int delay)
39123949
{
39133950
int generalAC3delay = eConfigManager::getConfigIntValue("config.av.generalAC3delay");
39143951
if (m_dvb_service)
39153952
m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1);
3916-
if (m_soft_decoder && m_csa_session && m_csa_session->isActive())
3917-
{
3918-
m_soft_decoder->setAC3Delay(delay + generalAC3delay);
3919-
eDebug("[eDVBServicePlay] Setting audio delay: setAC3Delay (SoftDecoder), %d + %d", delay, generalAC3delay);
3920-
}
39213953
if (m_decoder)
3922-
{
39233954
m_decoder->setAC3Delay(delay + generalAC3delay);
3924-
}
3955+
else if (m_soft_decoder)
3956+
m_soft_decoder->setAC3Delay(delay + generalAC3delay);
39253957
}
39263958

39273959
void eDVBServicePlay::setPCMDelay(int delay)
39283960
{
39293961
int generalPCMdelay = eConfigManager::getConfigIntValue("config.av.generalPCMdelay");
39303962
if (m_dvb_service)
39313963
m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1);
3932-
if (m_soft_decoder && m_csa_session && m_csa_session->isActive())
3933-
{
3934-
m_soft_decoder->setPCMDelay(delay + generalPCMdelay);
3935-
eDebug("[eDVBServicePlay] Setting audio delay: setPCMDelay (SoftDecoder), %d + %d", delay, generalPCMdelay);
3936-
}
39373964
if (m_decoder)
3938-
{
39393965
m_decoder->setPCMDelay(delay + generalPCMdelay);
3940-
}
3966+
else if (m_soft_decoder)
3967+
m_soft_decoder->setPCMDelay(delay + generalPCMdelay);
39413968
}
39423969

39433970
void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)

0 commit comments

Comments
 (0)