void SubtitleScreen::DisplayTextSubtitles(void) { if (!InitialiseFont(m_fontStretch) || !m_player || !m_subreader) return; bool changed = false; VideoOutput *vo = m_player->GetVideoOutput(); if (vo) { QRect oldsafe = m_safeArea; m_safeArea = m_player->GetVideoOutput()->GetSafeRect(); if (oldsafe != m_safeArea) { changed = true; int height = (m_safeArea.height() * m_textFontZoom) / 2000; gTextSubFont->GetFace()->setPixelSize(height); gTextSubFont->GetFace()->setItalic(false); gTextSubFont->GetFace()->setUnderline(false); gTextSubFont->SetColor(Qt::white); } } else { return; } VideoFrame *currentFrame = vo->GetLastShownFrame(); if (!currentFrame) return; TextSubtitles *subs = m_subreader->GetTextSubtitles(); subs->Lock(); uint64_t playPos = 0; if (subs->IsFrameBasedTiming()) { // frame based subtitles get out of synch after running mythcommflag // for the file, i.e., the following number is wrong and does not // match the subtitle frame numbers: playPos = currentFrame->frameNumber; } else { // Use timecodes for time based SRT subtitles. Feeding this into // NormalizeVideoTimecode() should adjust for non-zero start times // and wraps. For MPEG, wraps will occur just once every 26.5 hours // and other formats less frequently so this should be sufficient. // Note: timecodes should now always be valid even in the case // when a frame doesn't have a valid timestamp. If an exception is // found where this is not true then we need to use the frameNumber // when timecode is not defined by uncommenting the following lines. //if (currentFrame->timecode == 0) // playPos = (uint64_t) // ((currentFrame->frameNumber / video_frame_rate) * 1000); //else playPos = m_player->GetDecoder()->NormalizeVideoTimecode(currentFrame->timecode); } if (playPos != 0) changed |= subs->HasSubtitleChanged(playPos); if (!changed) { subs->Unlock(); return; } DeleteAllChildren(); SetRedraw(); if (playPos == 0) { subs->Unlock(); return; } QStringList rawsubs = subs->GetSubtitles(playPos); if (rawsubs.empty()) { subs->Unlock(); return; } OptimiseTextSubs(rawsubs); subs->Unlock(); DrawTextSubtitles(rawsubs, 0, 0); }