diff --git a/mythtv/libs/libmythtv/captions/subtitlereader.cpp b/mythtv/libs/libmythtv/captions/subtitlereader.cpp index 6005dc9088c..4a064af11f9 100644 --- a/mythtv/libs/libmythtv/captions/subtitlereader.cpp +++ b/mythtv/libs/libmythtv/captions/subtitlereader.cpp @@ -57,7 +57,8 @@ void SubtitleReader::SeekFrame(int64_t ts, int flags) bool SubtitleReader::AddAVSubtitle(AVSubtitle &subtitle, bool fix_position, - bool allow_forced) + bool allow_forced, + bool isExternal) { bool enableforced = false; bool forced = false; @@ -66,7 +67,7 @@ bool SubtitleReader::AddAVSubtitle(AVSubtitle &subtitle, forced = forced || static_cast(subtitle.rects[i]->flags & AV_SUBTITLE_FLAG_FORCED); } - if (!m_avSubtitlesEnabled) + if (!m_avSubtitlesEnabled && !isExternal) { if (!forced) { @@ -87,6 +88,19 @@ bool SubtitleReader::AddAVSubtitle(AVSubtitle &subtitle, enableforced = true; } + if (m_textSubtitlesEnabled && !isExternal || m_avSubtitlesEnabled && isExternal) + { + FreeAVSubtitle(subtitle); + return enableforced; + } + + // Sanity check to prevent seg fault + if (subtitle.num_rects > 1000) + { + FreeAVSubtitle(subtitle); + return enableforced; + } + #ifdef DEBUG_SUBTITLES if (VERBOSE_LEVEL_CHECK(VB_PLAYBACK, LOG_DEBUG)) { diff --git a/mythtv/libs/libmythtv/captions/subtitlereader.h b/mythtv/libs/libmythtv/captions/subtitlereader.h index 8ca67bdf7a4..5102e94c626 100644 --- a/mythtv/libs/libmythtv/captions/subtitlereader.h +++ b/mythtv/libs/libmythtv/captions/subtitlereader.h @@ -56,7 +56,7 @@ class SubtitleReader : public QObject AVSubtitles* GetAVSubtitles(void) { return &m_avSubtitles; } bool AddAVSubtitle(AVSubtitle& subtitle, bool fix_position, - bool allow_forced); + bool allow_forced, bool isExternal); void ClearAVSubtitles(void); static void FreeAVSubtitle(AVSubtitle &sub); diff --git a/mythtv/libs/libmythtv/captions/subtitlescreen.cpp b/mythtv/libs/libmythtv/captions/subtitlescreen.cpp index 659059f842e..552d6f823e3 100644 --- a/mythtv/libs/libmythtv/captions/subtitlescreen.cpp +++ b/mythtv/libs/libmythtv/captions/subtitlescreen.cpp @@ -1846,7 +1846,9 @@ void SubtitleScreen::DisplayAVSubtitles(void) AVSubtitles* subs = m_subreader->GetAVSubtitles(); QMutexLocker lock(&(subs->m_lock)); - if (subs->m_buffers.empty() && (kDisplayAVSubtitle != m_subtitleType)) + if (subs->m_buffers.empty() + && (kDisplayAVSubtitle != m_subtitleType) + && (kDisplayTextSubtitle != m_subtitleType)) return; MythVideoOutput *videoOut = m_player->GetVideoOutput(); @@ -1898,7 +1900,11 @@ void SubtitleScreen::DisplayAVSubtitles(void) #endif } lock.relock(); + subs->m_needSync = false; + // extra check to avoid segfault + if (subs->m_buffers.empty()) + return; AVSubtitle subtitle = subs->m_buffers.front(); if (subtitle.end_display_time < currentFrame->m_timecode.count()) { @@ -2060,7 +2066,6 @@ void SubtitleScreen::DisplayAVSubtitles(void) #ifdef USING_LIBASS RenderAssTrack(currentFrame->m_timecode, assForceNext); #endif - subs->m_needSync = false; } int SubtitleScreen::DisplayScaledAVSubtitles(const AVSubtitleRect *rect, diff --git a/mythtv/libs/libmythtv/captions/textsubtitleparser.cpp b/mythtv/libs/libmythtv/captions/textsubtitleparser.cpp index 00b451fea8f..edeb3822342 100644 --- a/mythtv/libs/libmythtv/captions/textsubtitleparser.cpp +++ b/mythtv/libs/libmythtv/captions/textsubtitleparser.cpp @@ -255,7 +255,7 @@ int TextSubtitleParser::ReadNextSubtitle(void) sub.start_display_time = av_q2d(m_stream->time_base) * m_pkt->dts * 1000; sub.end_display_time = av_q2d(m_stream->time_base) * (m_pkt->dts + m_pkt->duration) * 1000; - m_parent->AddAVSubtitle(sub, m_decCtx->codec_id == AV_CODEC_ID_XSUB, false); + m_parent->AddAVSubtitle(sub, m_decCtx->codec_id == AV_CODEC_ID_XSUB, false, true); return ret; } @@ -275,8 +275,8 @@ void TextSubtitleParser::LoadSubtitles(bool inBackground) } // External subtitles are now presented as AV Subtitles. - m_parent->EnableAVSubtitles(true); - m_parent->EnableTextSubtitles(false); + m_parent->EnableAVSubtitles(false); + m_parent->EnableTextSubtitles(true); m_parent->EnableRawTextSubtitles(false); local_buffer_t sub_data {}; diff --git a/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp b/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp index 6950e70cc9f..f2019fd0ef0 100644 --- a/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp +++ b/mythtv/libs/libmythtv/decoders/avformatdecoder.cpp @@ -3969,7 +3969,7 @@ bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt) bool forcedon = m_parent->GetSubReader(pkt->stream_index)->AddAVSubtitle( subtitle, curstream->codecpar->codec_id == AV_CODEC_ID_XSUB, - m_parent->GetAllowForcedSubtitles()); + m_parent->GetAllowForcedSubtitles(), false); m_parent->EnableForcedSubtitles(forcedon || isForcedTrack); } diff --git a/mythtv/libs/libmythtv/mythplayercaptionsui.cpp b/mythtv/libs/libmythtv/mythplayercaptionsui.cpp index 1b1a92ef209..8ec3a75ff5b 100644 --- a/mythtv/libs/libmythtv/mythplayercaptionsui.cpp +++ b/mythtv/libs/libmythtv/mythplayercaptionsui.cpp @@ -216,6 +216,8 @@ void MythPlayerCaptionsUI::EnableCaptions(uint Mode, bool UpdateOSD) if (kDisplayTextSubtitle & Mode) { m_captionsOverlay.EnableSubtitles(kDisplayTextSubtitle); + AVSubtitles* subs = m_subReader.GetAVSubtitles(); + subs->m_needSync = true; msg += tr("Text subtitles"); } @@ -423,7 +425,7 @@ bool MythPlayerCaptionsUI::HasCaptionTrack(uint Mode) if (Mode == kDisplayNUVTeletextCaptions) return true; // External subtitles are now decoded with FFmpeg and are AVSubtitles. - if ((Mode == kDisplayAVSubtitle) && m_captionsState.m_externalTextSubs) + if ((Mode == kDisplayAVSubtitle || Mode == kDisplayTextSubtitle) && m_captionsState.m_externalTextSubs) return true; if (!(Mode == kDisplayTextSubtitle) && m_decoder->GetTrackCount(toTrackType(Mode))) return true;