00001 #include "mythlogging.h"
00002 #include "subtitlereader.h"
00003
00004 SubtitleReader::SubtitleReader()
00005 : m_AVSubtitlesEnabled(false), m_TextSubtitlesEnabled(false),
00006 m_RawTextSubtitlesEnabled(false)
00007 {
00008 }
00009
00010 SubtitleReader::~SubtitleReader()
00011 {
00012 ClearAVSubtitles();
00013 m_TextSubtitles.Clear();
00014 ClearRawTextSubtitles();
00015 }
00016
00017 void SubtitleReader::EnableAVSubtitles(bool enable)
00018 {
00019 m_AVSubtitlesEnabled = enable;
00020 }
00021
00022 void SubtitleReader::EnableTextSubtitles(bool enable)
00023 {
00024 m_TextSubtitlesEnabled = enable;
00025 }
00026
00027 void SubtitleReader::EnableRawTextSubtitles(bool enable)
00028 {
00029 m_RawTextSubtitlesEnabled = enable;
00030 }
00031
00032 bool SubtitleReader::AddAVSubtitle(const AVSubtitle &subtitle,
00033 bool fix_position,
00034 bool allow_forced)
00035 {
00036 bool enableforced = false;
00037 if (!m_AVSubtitlesEnabled && !subtitle.forced)
00038 {
00039 FreeAVSubtitle(subtitle);
00040 return enableforced;
00041 }
00042
00043 if (!m_AVSubtitlesEnabled && subtitle.forced)
00044 {
00045 if (!allow_forced)
00046 {
00047 LOG(VB_PLAYBACK, LOG_INFO,
00048 "SubtitleReader: Ignoring forced AV subtitle.");
00049 FreeAVSubtitle(subtitle);
00050 return enableforced;
00051 }
00052 LOG(VB_PLAYBACK, LOG_INFO,
00053 "SubtitleReader: Allowing forced AV subtitle.");
00054 enableforced = true;
00055 }
00056
00057 bool clearsubs = false;
00058 m_AVSubtitles.lock.lock();
00059 m_AVSubtitles.fixPosition = fix_position;
00060 m_AVSubtitles.buffers.push_back(subtitle);
00061
00062
00063 if (m_AVSubtitles.buffers.size() > 20)
00064 {
00065 LOG(VB_GENERAL, LOG_ERR,
00066 "SubtitleReader: >20 AVSubtitles queued - clearing.");
00067 clearsubs = true;
00068 }
00069 m_AVSubtitles.lock.unlock();
00070
00071 if (clearsubs)
00072 ClearAVSubtitles();
00073
00074 return enableforced;
00075 }
00076
00077 void SubtitleReader::ClearAVSubtitles(void)
00078 {
00079 m_AVSubtitles.lock.lock();
00080 while (!m_AVSubtitles.buffers.empty())
00081 {
00082 FreeAVSubtitle(m_AVSubtitles.buffers.front());
00083 m_AVSubtitles.buffers.pop_front();
00084 }
00085 m_AVSubtitles.lock.unlock();
00086 }
00087
00088 void SubtitleReader::FreeAVSubtitle(const AVSubtitle &subtitle)
00089 {
00090 for (std::size_t i = 0; i < subtitle.num_rects; ++i)
00091 {
00092 AVSubtitleRect* rect = subtitle.rects[i];
00093 av_free(rect->pict.data[0]);
00094 av_free(rect->pict.data[1]);
00095 }
00096 if (subtitle.num_rects > 0)
00097 av_free(subtitle.rects);
00098 }
00099
00100 bool SubtitleReader::LoadExternalSubtitles(const QString &subtitleFileName)
00101 {
00102 m_TextSubtitles.Clear();
00103 return TextSubtitleParser::LoadSubtitles(subtitleFileName, m_TextSubtitles);
00104 }
00105
00106 bool SubtitleReader::HasTextSubtitles(void)
00107 {
00108 return m_TextSubtitles.GetSubtitleCount() > 0;
00109 }
00110
00111 QStringList SubtitleReader::GetRawTextSubtitles(uint64_t &duration)
00112 {
00113 QMutexLocker lock(&m_RawTextSubtitles.lock);
00114 if (m_RawTextSubtitles.buffers.empty())
00115 return QStringList();
00116
00117 duration = m_RawTextSubtitles.duration;
00118 QStringList result = m_RawTextSubtitles.buffers;
00119 result.detach();
00120 m_RawTextSubtitles.buffers.clear();
00121 return result;
00122 }
00123
00124 void SubtitleReader::AddRawTextSubtitle(QStringList list, uint64_t duration)
00125 {
00126 if (!m_RawTextSubtitlesEnabled || list.empty())
00127 return;
00128
00129 QMutexLocker lock(&m_RawTextSubtitles.lock);
00130 m_RawTextSubtitles.buffers.clear();
00131 m_RawTextSubtitles.buffers = list;
00132 m_RawTextSubtitles.duration = duration;
00133 }
00134
00135 void SubtitleReader::ClearRawTextSubtitles(void)
00136 {
00137 QMutexLocker lock(&m_RawTextSubtitles.lock);
00138 m_RawTextSubtitles.buffers.clear();
00139 }