Skip to content

Commit

Permalink
Dont erase subtitles when a forced subtitle appears
Browse files Browse the repository at this point in the history
* Also fixes usage of pts for AV subtitles
Fixes #13639
  • Loading branch information
mspieth committed Jun 23, 2020
1 parent 4ba580d commit d0e5651
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 39 deletions.
83 changes: 48 additions & 35 deletions mythtv/libs/libmythtv/captions/subtitlescreen.cpp
Expand Up @@ -1385,51 +1385,60 @@ SubtitleScreen::~SubtitleScreen(void)

void SubtitleScreen::EnableSubtitles(int type, bool forced_only)
{
int prevType = m_subtitleType;
m_subtitleType = type;

if (forced_only)
{
SetElementDeleted();
SetVisible(true);
SetArea(MythRect());
return;
if (prevType == kDisplayNone)
{
SetElementDeleted();
SetVisible(true);
SetArea(MythRect());
}
}

if (m_subreader)
else
{
m_subreader->EnableAVSubtitles(kDisplayAVSubtitle == m_subtitleType);
m_subreader->EnableTextSubtitles(kDisplayTextSubtitle == m_subtitleType);
m_subreader->EnableRawTextSubtitles(kDisplayRawTextSubtitle == m_subtitleType);
if (m_subreader)
{
m_subreader->EnableAVSubtitles(kDisplayAVSubtitle == m_subtitleType);
m_subreader->EnableTextSubtitles(kDisplayTextSubtitle == m_subtitleType);
m_subreader->EnableRawTextSubtitles(kDisplayRawTextSubtitle == m_subtitleType);
}
if (m_cc608reader)
m_cc608reader->SetEnabled(kDisplayCC608 == m_subtitleType);
if (m_cc708reader)
m_cc708reader->SetEnabled(kDisplayCC708 == m_subtitleType);
ClearAllSubtitles();
SetVisible(m_subtitleType != kDisplayNone);
SetArea(MythRect());
}
if (m_cc608reader)
m_cc608reader->SetEnabled(kDisplayCC608 == m_subtitleType);
if (m_cc708reader)
m_cc708reader->SetEnabled(kDisplayCC708 == m_subtitleType);
ClearAllSubtitles();
SetVisible(m_subtitleType != kDisplayNone);
SetArea(MythRect());
switch (m_subtitleType)
{
case kDisplayTextSubtitle:
case kDisplayRawTextSubtitle:
m_family = kSubFamilyText;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayCC608:
m_family = kSubFamily608;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayCC708:
m_family = kSubFamily708;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayAVSubtitle:
m_family = kSubFamilyAV;
m_textFontZoom = gCoreContext->GetNumSetting("OSDAVSubZoom", 100);
break;
if (!forced_only || m_family.isEmpty()) {
switch (m_subtitleType)
{
case kDisplayTextSubtitle:
case kDisplayRawTextSubtitle:
m_family = kSubFamilyText;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayCC608:
m_family = kSubFamily608;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayCC708:
m_family = kSubFamily708;
m_textFontZoom = gCoreContext->GetNumSetting("OSDCC708TextZoom", 100);
break;
case kDisplayAVSubtitle:
m_family = kSubFamilyAV;
m_textFontZoom = gCoreContext->GetNumSetting("OSDAVSubZoom", 100);
break;
}
}
m_textFontZoomPrev = m_textFontZoom;
m_textFontDelayMsPrev = m_textFontDelayMs;
m_textFontMinDurationMsPrev = m_textFontMinDurationMs;
m_textFontDurationExtensionMsPrev = m_textFontDurationExtensionMs;
}

void SubtitleScreen::DisableForcedSubtitles(void)
Expand Down Expand Up @@ -1770,6 +1779,8 @@ void SubtitleScreen::Pulse(void)
MythScreenType::Pulse();
m_textFontZoomPrev = m_textFontZoom;
m_textFontDelayMsPrev = m_textFontDelayMs;
m_textFontMinDurationMsPrev = m_textFontMinDurationMs;
m_textFontDurationExtensionMsPrev = m_textFontDurationExtensionMs;
ResetElementState();
}

Expand Down Expand Up @@ -2109,6 +2120,8 @@ void SubtitleScreen::DisplayTextSubtitles(void)

bool changed = (m_textFontZoom != m_textFontZoomPrev);
changed |= (m_textFontDelayMs != m_textFontDelayMsPrev);
changed |= (m_textFontMinDurationMsPrev != m_textFontMinDurationMs);
changed |= (m_textFontDurationExtensionMsPrev != m_textFontDurationExtensionMs);
MythVideoOutput *vo = m_player->GetVideoOutput();
if (!vo)
return;
Expand Down
13 changes: 9 additions & 4 deletions mythtv/libs/libmythtv/decoders/avformatdecoder.cpp
Expand Up @@ -3975,10 +3975,15 @@ bool AvFormatDecoder::ProcessSubtitlePacket(AVStream *curstream, AVPacket *pkt)
if (!m_parent->GetSubReader(pkt->stream_index))
return true;

long long pts = 0;

if (pkt->dts != AV_NOPTS_VALUE)
pts = (long long)(av_q2d(curstream->time_base) * pkt->dts * 1000);
long long pts = pkt->pts;
if (pts == AV_NOPTS_VALUE)
pts = pkt->dts;
if (pts == AV_NOPTS_VALUE)
{
LOG(VB_GENERAL, LOG_ERR, LOC + "No PTS found - unable to process subtitle.");
return false;
}
pts = static_cast<long long>(av_q2d(curstream->time_base) * pts * 1000);

m_trackLock.lock();
int subIdx = m_selectedTrack[kTrackTypeSubtitle].m_av_stream_index;
Expand Down

0 comments on commit d0e5651

Please sign in to comment.