00001 #ifndef _MHI_H_
00002 #define _MHI_H_
00003
00004
00005 #include <ft2build.h>
00006 #include FT_FREETYPE_H
00007
00008
00009 #include <list>
00010 #include <vector>
00011 using namespace std;
00012
00013
00014 #include <QWaitCondition>
00015 #include <QRunnable>
00016 #include <QString>
00017 #include <QMutex>
00018 #include <QImage>
00019
00020
00021 #include "../libmythfreemheg/freemheg.h"
00022 #include "interactivetv.h"
00023 #include "dsmcc.h"
00024 #include "mythcontext.h"
00025 #include "mythdbcon.h"
00026 #include "mythdeque.h"
00027 #include "mthread.h"
00028
00029 extern "C" {
00030 #include "libavcodec/avcodec.h"
00031 }
00032
00033 class MythPainter;
00034 class InteractiveScreen;
00035 class DSMCCPacket;
00036 class MHIImageData;
00037 class MHIContext;
00038
00042 class MHIContext : public MHContext, public QRunnable
00043 {
00044 public:
00045 MHIContext(InteractiveTV *parent);
00046 virtual ~MHIContext();
00047
00048 void QueueDSMCCPacket(unsigned char *data, int length, int componentTag,
00049 unsigned carouselId, int dataBroadcastId);
00050
00051 void SetNetBootInfo(const unsigned char *data, uint length);
00053 void Restart(int chanid, int sourceid, bool isLive);
00054
00055
00056 bool OfferKey(QString key);
00058 void UpdateOSD(InteractiveScreen *osdWindow, MythPainter *osdPainter);
00060 void Reinit(const QRect &display);
00061
00063 void StopEngine(void);
00064
00065
00066
00067
00068
00069
00070 virtual bool CheckCarouselObject(QString objectPath);
00071
00072
00073
00074
00075
00076 virtual bool GetCarouselData(QString objectPath, QByteArray &result);
00077
00078
00079
00080 virtual void SetInputRegister(int nReg);
00081
00083 virtual void RequireRedraw(const QRegion ®ion);
00084
00086 virtual bool CheckStop(void) { return m_stop; }
00087
00089 void GetInitialStreams(int &audioTag, int &videoTag);
00090
00092 virtual MHDLADisplay *CreateDynamicLineArt(
00093 bool isBoxed, MHRgba lineColour, MHRgba fillColour);
00094 virtual MHTextDisplay *CreateText(void);
00095 virtual MHBitmapDisplay *CreateBitmap(bool tiling);
00097 virtual void DrawRect(int xPos, int yPos, int width, int height,
00098 MHRgba colour);
00099 virtual void DrawBackground(const QRegion ®);
00100 virtual void DrawVideo(const QRect &videoRect, const QRect &displayRect);
00101
00102 void DrawImage(int x, int y, const QRect &rect, const QImage &image);
00103
00104 virtual int GetChannelIndex(const QString &str);
00106 virtual bool GetServiceInfo(int channelId, int &netId, int &origNetId,
00107 int &transportId, int &serviceId);
00108 virtual bool TuneTo(int channel, int tuneinfo);
00109
00111 virtual bool BeginAudio(const QString &stream, int tag);
00113 virtual void StopAudio(void);
00115 virtual bool BeginVideo(const QString &stream, int tag);
00117 virtual void StopVideo(void);
00118
00119
00120
00121 virtual const char *GetReceiverId(void)
00122 { return "MYT001001"; }
00123 virtual const char *GetDSMCCId(void)
00124 { return "DSMMYT001"; }
00125
00126
00127
00128 void AddToDisplay(const QImage &image, int x, int y);
00129
00130 FT_Face GetFontFace(void) { return m_face; }
00131 bool IsFaceLoaded(void) { return m_face_loaded; }
00132 bool LoadFont(QString name);
00133 bool ImageUpdated(void) { return m_updated; }
00134
00135 static const int StdDisplayWidth = 720;
00136 static const int StdDisplayHeight = 576;
00137 int GetWidth(void) { return m_displayWidth; }
00138 int GetHeight(void) { return m_displayHeight; }
00139
00140 protected:
00141 void run(void);
00142 void ProcessDSMCCQueue(void);
00143 void NetworkBootRequested(void);
00144 void ClearDisplay(void);
00145 void ClearQueue(void);
00146
00147 InteractiveTV *m_parent;
00148
00149 Dsmcc *m_dsmcc;
00150 QMutex m_dsmccLock;
00151 MythDeque<DSMCCPacket*> m_dsmccQueue;
00152
00153 QMutex m_keyLock;
00154 MythDeque<int> m_keyQueue;
00155 int m_keyProfile;
00156
00157 MHEG *m_engine;
00158
00159 mutable QMutex m_runLock;
00160 QWaitCondition m_engine_wait;
00161 bool m_stop;
00162 QMutex m_display_lock;
00163 bool m_updated;
00164 int m_displayWidth;
00165 int m_displayHeight;
00166 float m_xScale;
00167 float m_yScale;
00168
00169 list<MHIImageData*> m_display;
00170
00171 FT_Face m_face;
00172 bool m_face_loaded;
00173
00174 MThread *m_engineThread;
00175
00176 int m_currentChannel;
00177 int m_currentStream;
00178 bool m_isLive;
00179 int m_currentSource;
00180
00181 int m_audioTag;
00182 int m_videoTag;
00183 QList<int> m_tuneinfo;
00184
00185 uint m_lastNbiVersion;
00186 vector<unsigned char> m_nbiData;
00187
00188 QRect m_videoRect;
00189 QRect m_displayRect;
00190 };
00191
00192
00193 class MHIText : public MHTextDisplay
00194 {
00195 public:
00196 MHIText(MHIContext *parent);
00197 virtual ~MHIText() {}
00198
00199 virtual void Draw(int x, int y);
00200 virtual void Clear(void);
00201 virtual void AddText(int x, int y, const QString &, MHRgba colour);
00202
00203 virtual void SetSize(int width, int height);
00204 virtual void SetFont(int size, bool isBold, bool isItalic);
00205
00206 virtual QRect GetBounds(const QString &str, int &strLen, int maxSize = -1);
00207
00208 public:
00209 MHIContext *m_parent;
00210 QImage m_image;
00211 int m_fontsize;
00212 bool m_fontItalic;
00213 bool m_fontBold;
00214 int m_width;
00215 int m_height;
00216 };
00217
00221 class MHIBitmap : public MHBitmapDisplay
00222 {
00223 public:
00224 MHIBitmap(MHIContext *parent, bool tiled)
00225 : m_parent(parent), m_tiled(tiled), m_opaque(false) {}
00226 virtual ~MHIBitmap() {}
00227
00229 virtual void CreateFromPNG(const unsigned char *data, int length);
00230
00232 virtual void CreateFromMPEG(const unsigned char *data, int length);
00233
00241 virtual void Draw(int x, int y, QRect rect, bool tiled);
00242
00244 virtual void ScaleImage(int newWidth, int newHeight);
00245
00246
00247 virtual QSize GetSize(void) { return m_image.size(); }
00248 virtual bool IsOpaque(void) { return !m_image.isNull() && m_opaque; }
00249
00250 public:
00251 MHIContext *m_parent;
00252 bool m_tiled;
00253 QImage m_image;
00254 bool m_opaque;
00255 };
00256
00260 class MHIDLA : public MHDLADisplay
00261 {
00262 public:
00263 MHIDLA(MHIContext *parent, bool isBoxed,
00264 MHRgba lineColour, MHRgba fillColour)
00265 : m_parent(parent), m_width(0),
00266 m_height(0), m_boxed(isBoxed),
00267 m_boxLineColour(lineColour), m_boxFillColour(fillColour),
00268 m_lineWidth(0) {}
00270 virtual void Draw(int x, int y);
00272 virtual void SetSize(int width, int height)
00273 {
00274 m_width = width;
00275 m_height = height;
00276 Clear();
00277 }
00278 virtual void SetLineSize(int width) { m_lineWidth = width; }
00279 virtual void SetLineColour(MHRgba colour) { m_lineColour = colour; }
00280 virtual void SetFillColour(MHRgba colour) { m_fillColour = colour; }
00281
00283 virtual void Clear(void);
00284
00285
00286 virtual void DrawLine(int x1, int y1, int x2, int y2);
00287 virtual void DrawBorderedRectangle(int x, int y, int width, int height);
00288 virtual void DrawOval(int x, int y, int width, int height);
00289 virtual void DrawArcSector(int x, int y, int width, int height,
00290 int start, int arc, bool isSector);
00291 virtual void DrawPoly(bool isFilled, int nPoints, const int *xArray, const int *yArray);
00292
00293 protected:
00294 void DrawRect(int x, int y, int width, int height, MHRgba colour);
00295 void DrawLineSub(int x1, int y1, int x2, int y2, bool swapped);
00296
00297 protected:
00298 MHIContext *m_parent;
00299 QImage m_image;
00300 int m_width;
00301 int m_height;
00302 bool m_boxed;
00303 MHRgba m_boxLineColour;
00304 MHRgba m_boxFillColour;
00305 MHRgba m_lineColour;
00306 MHRgba m_fillColour;
00307 int m_lineWidth;
00308 };
00309
00313 class DSMCCPacket
00314 {
00315 public:
00316 DSMCCPacket(unsigned char *data, int length, int tag,
00317 unsigned car, int dbid)
00318 : m_data(data), m_length(length),
00319 m_componentTag(tag), m_carouselId(car),
00320 m_dataBroadcastId(dbid)
00321 {
00322 }
00323
00324 ~DSMCCPacket()
00325 {
00326 free(m_data);
00327 }
00328
00329 public:
00330 unsigned char *m_data;
00331 int m_length;
00332 int m_componentTag;
00333 unsigned m_carouselId;
00334 int m_dataBroadcastId;
00335 };
00336
00337 #endif // _MHI_H_