00001 #ifndef CC608READER_H
00002 #define CC608READER_H
00003
00004 #include <stdint.h>
00005
00006 #include <QMutex>
00007
00008 #include "cc608decoder.h"
00009
00010 #include "mythtvexp.h"
00011
00012 #define MAXTBUFFER 60
00013 #define MAXOUTBUFFERS (16 + 1)
00014
00015 class CC608Text
00016 {
00017 public:
00018 CC608Text(QString T, int X, int Y, int TT) :
00019 text(T), x(X), y(Y), teletextmode(TT) {}
00020 QString text;
00021 int x;
00022 int y;
00023 bool teletextmode;
00024 };
00025
00026 struct TextContainer
00027 {
00028 int timecode;
00029 int len;
00030 unsigned char *buffer;
00031 char type;
00032 };
00033
00034 class CC608Buffer
00035 {
00036 public:
00037 ~CC608Buffer(void) { Clear(); }
00038 void Clear(void)
00039 {
00040 lock.lock();
00041 vector<CC608Text*>::iterator i = buffers.begin();
00042 for (; i != buffers.end(); ++i)
00043 {
00044 CC608Text *cc = (*i);
00045 if (cc)
00046 delete cc;
00047 }
00048 buffers.clear();
00049 lock.unlock();
00050 }
00051
00052 QMutex lock;
00053 vector<CC608Text*> buffers;
00054 };
00055
00056 class CC608StateTracker
00057 {
00058 public:
00059 CC608StateTracker() :
00060 m_outputText(""), m_outputCol(0), m_outputRow(0), m_changed(true)
00061 {
00062 }
00063
00064 void Clear(void)
00065 {
00066 m_outputText = "";
00067 m_outputCol = 0;
00068 m_outputRow = 0;
00069 m_changed = true;
00070 m_output.Clear();
00071 }
00072
00073 QString m_outputText;
00074 int m_outputCol;
00075 int m_outputRow;
00076 bool m_changed;
00077 CC608Buffer m_output;
00078 };
00079
00080 class MythPlayer;
00081
00082 class MTV_PUBLIC CC608Reader : public CC608Input
00083 {
00084 public:
00085 CC608Reader(MythPlayer *parent);
00086 ~CC608Reader();
00087
00088 void SetTTPageNum(int page) { m_ccPageNum = page; }
00089 void SetEnabled(bool enable) { m_enabled = enable; }
00090 void FlushTxtBuffers(void);
00091 CC608Buffer *GetOutputText(bool &changed, int &streamIdx);
00092 CC608Buffer* GetOutputText(bool &changed);
00093 void SetMode(int mode);
00094 void ClearBuffers(bool input, bool output, int outputStreamIdx = -1);
00095 void AddTextData(unsigned char *buf, int len,
00096 int64_t timecode, char type);
00097 void TranscodeWriteText(void (*func)
00098 (void *, unsigned char *, int, int, int),
00099 void * ptr);
00100
00101 private:
00102 int Update(unsigned char *inpos);
00103 void Update608Text(vector<CC608Text*> *ccbuf,
00104 int replace = 0, int scroll = 0,
00105 bool scroll_prsv = false,
00106 int scroll_yoff = 0, int scroll_ymax = 15,
00107 int streamIdx = CC_CC1);
00108 int NumInputBuffers(bool need_to_lock = true);
00109
00110 MythPlayer *m_parent;
00111 bool m_enabled;
00112
00113 int m_readPosition;
00114 int m_writePosition;
00115 QMutex m_inputBufLock;
00116 int m_maxTextSize;
00117 TextContainer m_inputBuffers[MAXTBUFFER+1];
00118 int m_ccMode;
00119 int m_ccPageNum;
00120
00121 CC608StateTracker m_state[MAXOUTBUFFERS];
00122 };
00123
00124 #endif // CC608READER_H