MythTV  master
subtitlereader.cpp
Go to the documentation of this file.
3 
4 // If the count of subtitle buffers is greater than this, force a clear
5 static const int MAX_BUFFERS_BEFORE_CLEAR = 175; // 125 too low for karaoke
6 static const int MAX_EXT_BUFFERS_BEFORE_CLEAR = 500; // 2 hr movie, titles every 15 s
7 
9  : m_parent(parent)
10 {
13 }
14 
16 {
17  ClearAVSubtitles(true);
19 }
20 
22 {
23  m_avSubtitlesEnabled = enable;
24 }
25 
27 {
28  m_textSubtitlesEnabled = enable;
29 }
30 
32 {
34 }
35 
36 bool SubtitleReader::AddAVSubtitle(AVSubtitle &subtitle,
37  bool fix_position,
38  bool allow_forced)
39 {
40  bool enableforced = false;
41  bool forced = false;
42  for (unsigned i = 0; i < subtitle.num_rects; i++)
43  {
44  forced = forced || static_cast<bool>(subtitle.rects[i]->flags & AV_SUBTITLE_FLAG_FORCED);
45  }
46 
48  {
49  if (!forced)
50  {
51  FreeAVSubtitle(subtitle);
52  return enableforced;
53  }
54 
55  if (!allow_forced)
56  {
57  LOG(VB_PLAYBACK, LOG_INFO,
58  "SubtitleReader: Ignoring forced AV subtitle.");
59  FreeAVSubtitle(subtitle);
60  return enableforced;
61  }
62 
63  LOG(VB_PLAYBACK, LOG_INFO,
64  "SubtitleReader: Allowing forced AV subtitle.");
65  enableforced = true;
66  }
67 
68  bool clearsubs = false;
69  m_avSubtitles.m_lock.lock();
70  m_avSubtitles.m_fixPosition = fix_position;
71  m_avSubtitles.m_buffers.push_back(subtitle);
72  // in case forced subtitles aren't displayed, avoid leaking by
73  // manually clearing the subtitles
74  size_t max_buffers = m_externalParser
77  if (m_avSubtitles.m_buffers.size() > max_buffers)
78  {
79  LOG(VB_GENERAL, LOG_ERR,
80  QString("SubtitleReader: >%1 AVSubtitles queued - clearing.")
81  .arg(max_buffers));
82  clearsubs = true;
83  }
84  m_avSubtitles.m_lock.unlock();
85 
86  if (clearsubs)
88 
89  return enableforced;
90 }
91 
93 {
94  // Don't flush subtitles loaded from an external file. They won't
95  // get repopulated as the stream continues to play.
96  if (m_externalParser && !force)
97  return;
98 
99  m_avSubtitles.m_lock.lock();
100  while (!m_avSubtitles.m_buffers.empty())
101  {
103  m_avSubtitles.m_buffers.pop_front();
104  }
105  m_avSubtitles.m_lock.unlock();
106 }
107 
108 void SubtitleReader::FreeAVSubtitle(AVSubtitle &subtitle)
109 {
110  avsubtitle_free(&subtitle);
111 }
112 
113 void SubtitleReader::LoadExternalSubtitles(const QString &subtitleFileName,
114  bool isInProgress)
115 {
116  m_textSubtitles.SetInProgress(isInProgress);
117  if (!subtitleFileName.isEmpty())
118  {
119  m_externalParser = new TextSubtitleParser(this, subtitleFileName, &m_textSubtitles);
121  }
122 }
123 
125 {
127 }
128 
129 QStringList SubtitleReader::GetRawTextSubtitles(std::chrono::milliseconds &duration)
130 {
131  QMutexLocker lock(&m_rawTextSubtitles.m_lock);
132  if (m_rawTextSubtitles.m_buffers.empty())
133  return {};
134 
135  duration = m_rawTextSubtitles.m_duration;
136  QStringList result = m_rawTextSubtitles.m_buffers;
138  return result;
139 }
140 
141 void SubtitleReader::AddRawTextSubtitle(const QStringList& list, std::chrono::milliseconds duration)
142 {
143  if (!m_rawTextSubtitlesEnabled || list.empty())
144  return;
145 
146  QMutexLocker lock(&m_rawTextSubtitles.m_lock);
149  m_rawTextSubtitles.m_duration = duration;
150 }
151 
153 {
154  QMutexLocker lock(&m_rawTextSubtitles.m_lock);
156 }
MAX_BUFFERS_BEFORE_CLEAR
static const int MAX_BUFFERS_BEFORE_CLEAR
Definition: subtitlereader.cpp:5
TextSubtitleParser
Definition: textsubtitleparser.h:90
SubtitleReader::TextSubtitlesUpdated
void TextSubtitlesUpdated()
TextSubtitles::SetInProgress
void SetInProgress(bool isInProgress)
Definition: textsubtitleparser.h:62
SubtitleReader::SubtitleReader
SubtitleReader(MythPlayer *parent)
Definition: subtitlereader.cpp:8
SubtitleReader::m_textSubtitles
TextSubtitles m_textSubtitles
Definition: subtitlereader.h:69
SubtitleReader::AddAVSubtitle
bool AddAVSubtitle(AVSubtitle &subtitle, bool fix_position, bool allow_forced)
Definition: subtitlereader.cpp:36
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MAX_EXT_BUFFERS_BEFORE_CLEAR
static const int MAX_EXT_BUFFERS_BEFORE_CLEAR
Definition: subtitlereader.cpp:6
subtitlereader.h
MythPlayer
Definition: mythplayer.h:84
SubtitleReader::EnableAVSubtitles
void EnableAVSubtitles(bool enable)
Definition: subtitlereader.cpp:21
force
bool force
Definition: mythcommflag.cpp:70
RawTextSubs::m_duration
std::chrono::milliseconds m_duration
Definition: subtitlereader.h:31
mythlogging.h
SubtitleReader::ClearAVSubtitles
void ClearAVSubtitles(bool force=false)
Definition: subtitlereader.cpp:92
SubtitleReader::LoadExternalSubtitles
void LoadExternalSubtitles(const QString &subtitleFileName, bool isInProgress)
Definition: subtitlereader.cpp:113
SubtitleReader::EnableTextSubtitles
void EnableTextSubtitles(bool enable)
Definition: subtitlereader.cpp:26
SubtitleReader::~SubtitleReader
~SubtitleReader() override
Definition: subtitlereader.cpp:15
SubtitleReader::ClearRawTextSubtitles
void ClearRawTextSubtitles(void)
Definition: subtitlereader.cpp:152
SubtitleReader::FreeAVSubtitle
static void FreeAVSubtitle(AVSubtitle &sub)
Definition: subtitlereader.cpp:108
RawTextSubs::m_lock
QMutex m_lock
Definition: subtitlereader.h:32
SubtitleReader::m_rawTextSubtitles
RawTextSubs m_rawTextSubtitles
Definition: subtitlereader.h:71
SubtitleReader::EnableRawTextSubtitles
void EnableRawTextSubtitles(bool enable)
Definition: subtitlereader.cpp:31
SubtitleReader::GetRawTextSubtitles
QStringList GetRawTextSubtitles(std::chrono::milliseconds &duration)
Definition: subtitlereader.cpp:129
SubtitleReader::m_rawTextSubtitlesEnabled
bool m_rawTextSubtitlesEnabled
Definition: subtitlereader.h:72
SubtitleReader::m_avSubtitlesEnabled
bool m_avSubtitlesEnabled
Definition: subtitlereader.h:68
AVSubtitles::m_buffers
MythDeque< AVSubtitle > m_buffers
Definition: subtitlereader.h:20
TextSubtitles::GetHasSubtitles
bool GetHasSubtitles() const
Definition: textsubtitleparser.h:67
SubtitleReader::m_textSubtitlesEnabled
bool m_textSubtitlesEnabled
Definition: subtitlereader.h:70
RawTextSubs::m_buffers
QStringList m_buffers
Definition: subtitlereader.h:30
AVSubtitles::m_fixPosition
bool m_fixPosition
Definition: subtitlereader.h:22
AVSubtitles::m_lock
QMutex m_lock
Definition: subtitlereader.h:21
SubtitleReader::HasTextSubtitles
bool HasTextSubtitles(void)
Definition: subtitlereader.cpp:124
SubtitleReader::AddRawTextSubtitle
void AddRawTextSubtitle(const QStringList &list, std::chrono::milliseconds duration)
Definition: subtitlereader.cpp:141
SubtitleReader::m_externalParser
TextSubtitleParser * m_externalParser
Definition: subtitlereader.h:74
TextSubtitles::TextSubtitlesUpdated
void TextSubtitlesUpdated()
SubtitleReader::m_avSubtitles
AVSubtitles m_avSubtitles
Definition: subtitlereader.h:67
TextSubtitleParser::LoadSubtitles
void LoadSubtitles(bool inBackground)
Definition: textsubtitleparser.cpp:245