MythTV  master
textsubtitleparser.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
7 #ifndef TEXT_SUBTITLE_PARSER_H
8 #define TEXT_SUBTITLE_PARSER_H
9 
10 extern "C" {
11 #include <libavcodec/avcodec.h>
12 #include <libavformat/avformat.h>
13 }
14 
15 // C++ headers
16 #include <cstdint>
17 #include <vector>
18 
19 // Qt headers
20 #include <QObject>
21 #include <QMutexLocker>
22 #include <QStringList>
23 #include <QDateTime>
24 
26 {
27  public:
28  text_subtitle_t(long start_, long end_) : m_start(start_), m_end(end_) {}
29  text_subtitle_t() = default;
30  text_subtitle_t(const text_subtitle_t&) = default;
31  text_subtitle_t& operator= (const text_subtitle_t&) = default;
32 
33  public:
34  uint64_t m_start {0};
35  uint64_t m_end {0};
36  QStringList m_textLines;
37 };
38 
39 using TextSubtitleList = std::vector<text_subtitle_t>;
40 
41 class TextSubtitles : public QObject
42 {
43  Q_OBJECT
44 
45  signals:
46  void TextSubtitlesUpdated();
47 
48  public:
49  ~TextSubtitles() override;
50 
51  void SetFilename(const QString &fileName) {
52  QMutexLocker locker(&m_lock);
53  m_fileName = fileName;
54  }
55 
56  void SetLastLoaded(void);
57  void SetByteCount(off_t count) {
58  QMutexLocker locker(&m_lock);
59  m_byteCount = count;
60  }
61  off_t GetByteCount(void) const { return m_byteCount; }
62  void SetInProgress(bool isInProgress) {
63  QMutexLocker locker(&m_lock);
64  m_isInProgress = isInProgress;
65  }
66  void SetHasSubtitles(bool hasSubs) { m_hasSubtitles = hasSubs; }
67  bool GetHasSubtitles() const { return m_hasSubtitles; }
68 
69  void Lock(void) { m_lock.lock(); }
70  void Unlock(void) { m_lock.unlock(); }
71 
72  private:
73  QString m_fileName;
74  QDateTime m_lastLoaded;
76  // Note: m_isInProgress is overly conservative because it doesn't
77  // change from true to false after a recording completes.
78  bool m_isInProgress {false};
79  bool m_hasSubtitles {false};
80  QRecursiveMutex m_lock;
81 };
82 
83 class SubtitleReader;
84 class SubtitleLoadHelper;
85 
87 {
88  public:
89  TextSubtitleParser(SubtitleReader *parent, QString fileName, TextSubtitles *target);
91  void LoadSubtitles(bool inBackground);
92  int decode(AVPacket *pkt);
93  QByteArray GetSubHeader();
94  void SeekFrame(int64_t ts, int flags);
95  int ReadNextSubtitle(void);
96 
97  private:
98  static int read_packet(void *opaque, uint8_t *buf, int buf_size);
99  static int64_t seek_packet(void *opaque, int64_t offset, int whence);
100 
104  QString m_fileName;
105 
106  AVFormatContext *m_fmtCtx {nullptr};
107  AVCodecContext *m_decCtx {nullptr};
108  AVStream *m_stream {nullptr};
109  AVPacket *m_pkt {nullptr};
110 };
111 
112 #endif
TextSubtitleParser::seek_packet
static int64_t seek_packet(void *opaque, int64_t offset, int whence)
Seek in the file buffer.
Definition: textsubtitleparser.cpp:206
text_subtitle_t::m_start
uint64_t m_start
Starting time in msec or starting frame.
Definition: textsubtitleparser.h:34
TextSubtitleParser::decode
int decode(AVPacket *pkt)
TextSubtitleParser::m_parent
SubtitleReader * m_parent
Definition: textsubtitleparser.h:101
TextSubtitleParser
Definition: textsubtitleparser.h:86
TextSubtitles::Unlock
void Unlock(void)
Definition: textsubtitleparser.h:70
text_subtitle_t
TextSubtitles Copyright (c) 2006 by Pekka Jääskeläinen Distributed as part of MythTV under GPL v2 and...
Definition: textsubtitleparser.h:25
TextSubtitles::SetInProgress
void SetInProgress(bool isInProgress)
Definition: textsubtitleparser.h:62
TextSubtitles::m_lastLoaded
QDateTime m_lastLoaded
Definition: textsubtitleparser.h:74
text_subtitle_t::m_textLines
QStringList m_textLines
Definition: textsubtitleparser.h:36
text_subtitle_t::text_subtitle_t
text_subtitle_t(long start_, long end_)
Definition: textsubtitleparser.h:28
TextSubtitles::SetByteCount
void SetByteCount(off_t count)
Definition: textsubtitleparser.h:57
TextSubtitleParser::m_stream
AVStream * m_stream
Definition: textsubtitleparser.h:108
SubtitleReader
Definition: subtitlereader.h:42
TextSubtitleParser::SeekFrame
void SeekFrame(int64_t ts, int flags)
Definition: textsubtitleparser.cpp:425
text_subtitle_t::operator=
text_subtitle_t & operator=(const text_subtitle_t &)=default
TextSubtitleList
std::vector< text_subtitle_t > TextSubtitleList
Definition: textsubtitleparser.h:39
TextSubtitles::~TextSubtitles
~TextSubtitles() override
Definition: textsubtitleparser.cpp:155
TextSubtitles::m_byteCount
off_t m_byteCount
Definition: textsubtitleparser.h:75
TextSubtitleParser::read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Read data from the file buffer into the avio context buffer.
Definition: textsubtitleparser.cpp:190
SubtitleLoadHelper
Definition: textsubtitleparser.cpp:40
text_subtitle_t::m_end
uint64_t m_end
Ending time in msec or ending frame.
Definition: textsubtitleparser.h:35
TextSubtitles::m_hasSubtitles
bool m_hasSubtitles
Definition: textsubtitleparser.h:79
text_subtitle_t::text_subtitle_t
text_subtitle_t()=default
TextSubtitleParser::m_fileName
QString m_fileName
Definition: textsubtitleparser.h:104
TextSubtitles
Definition: textsubtitleparser.h:41
TextSubtitleParser::TextSubtitleParser
TextSubtitleParser(SubtitleReader *parent, QString fileName, TextSubtitles *target)
Definition: textsubtitleparser.cpp:174
TextSubtitleParser::m_target
TextSubtitles * m_target
Definition: textsubtitleparser.h:103
TextSubtitleParser::m_decCtx
AVCodecContext * m_decCtx
Definition: textsubtitleparser.h:107
off_t
#define off_t
Definition: mythiowrapper.cpp:241
TextSubtitles::Lock
void Lock(void)
Definition: textsubtitleparser.h:69
TextSubtitles::SetHasSubtitles
void SetHasSubtitles(bool hasSubs)
Definition: textsubtitleparser.h:66
TextSubtitles::GetByteCount
off_t GetByteCount(void) const
Definition: textsubtitleparser.h:61
TextSubtitles::GetHasSubtitles
bool GetHasSubtitles() const
Definition: textsubtitleparser.h:67
TextSubtitles::m_fileName
QString m_fileName
Definition: textsubtitleparser.h:73
TextSubtitleParser::~TextSubtitleParser
~TextSubtitleParser()
Definition: textsubtitleparser.cpp:180
TextSubtitles::SetLastLoaded
void SetLastLoaded(void)
Definition: textsubtitleparser.cpp:160
TextSubtitles::m_isInProgress
bool m_isInProgress
Definition: textsubtitleparser.h:78
TextSubtitleParser::m_loadHelper
SubtitleLoadHelper * m_loadHelper
Definition: textsubtitleparser.h:102
TextSubtitles::TextSubtitlesUpdated
void TextSubtitlesUpdated()
TextSubtitleParser::m_fmtCtx
AVFormatContext * m_fmtCtx
Definition: textsubtitleparser.h:106
TextSubtitles::SetFilename
void SetFilename(const QString &fileName)
Definition: textsubtitleparser.h:51
TextSubtitleParser::ReadNextSubtitle
int ReadNextSubtitle(void)
Read the next subtitle in the AV stream.
Definition: textsubtitleparser.cpp:240
TextSubtitleParser::m_pkt
AVPacket * m_pkt
Definition: textsubtitleparser.h:109
TextSubtitleParser::LoadSubtitles
void LoadSubtitles(bool inBackground)
Definition: textsubtitleparser.cpp:262
TextSubtitleParser::GetSubHeader
QByteArray GetSubHeader()
Definition: textsubtitleparser.cpp:417
TextSubtitles::m_lock
QRecursiveMutex m_lock
Definition: textsubtitleparser.h:80