00001 #ifndef _MHI_H_
00002 #define _MHI_H_
00003
00004
00005 #include <pthread.h>
00006
00007
00008 #include <ft2build.h>
00009 #include FT_FREETYPE_H
00010
00011
00012 #include <qmutex.h>
00013 #include <qcstring.h>
00014 #include <qstring.h>
00015 #include <qptrlist.h>
00016 #include <qwaitcondition.h>
00017 #include <qimage.h>
00018 #include <qvaluelist.h>
00019 #include <qptrqueue.h>
00020
00021
00022 #include "../libmythfreemheg/freemheg.h"
00023 #include "interactivetv.h"
00024 #include "dsmcc.h"
00025 #include "osdtypes.h"
00026 #include "mythcontext.h"
00027 #include "mythdbcon.h"
00028 #include "NuppelVideoPlayer.h"
00029
00030 extern "C" {
00031 #include "../libavcodec/avcodec.h"
00032 }
00033
00034 class OSDSet;
00035 class DSMCCPacket;
00036 class MHIImageData;
00037
00041 class MHIContext : public MHContext
00042 {
00043 public:
00044 MHIContext(InteractiveTV *parent);
00045 virtual ~MHIContext();
00046
00047 void QueueDSMCCPacket(unsigned char *data, int length, int componentTag,
00048 unsigned carouselId, int dataBroadcastId);
00049
00050 void SetNetBootInfo(const unsigned char *data, uint length);
00052 void Restart(uint chanid, uint cardid, bool isLive);
00053
00054
00055 bool OfferKey(QString key);
00057 void UpdateOSD(OSDSet *osdSet);
00059 void Reinit(const QRect &display);
00060
00062 void StopEngine(void);
00063
00064
00065
00066
00067
00068
00069 virtual bool CheckCarouselObject(QString objectPath);
00070
00071
00072
00073
00074
00075 virtual bool GetCarouselData(QString objectPath, QByteArray &result);
00076
00077
00078
00079 virtual void SetInputRegister(int nReg);
00080
00082 virtual void RequireRedraw(const QRegion ®ion);
00083
00085 virtual bool CheckStop(void) { return m_stop; }
00086
00088 void GetInitialStreams(int &audioTag, int &videoTag);
00089
00091 virtual MHDLADisplay *CreateDynamicLineArt(
00092 bool isBoxed, MHRgba lineColour, MHRgba fillColour);
00093 virtual MHTextDisplay *CreateText(void);
00094 virtual MHBitmapDisplay *CreateBitmap(bool tiling);
00096 virtual void DrawRect(int xPos, int yPos, int width, int height,
00097 MHRgba colour);
00098 virtual void DrawBackground(const QRegion ®);
00099 virtual void DrawVideo(const QRect &videoRect, const QRect &displayRect);
00100
00101 void DrawImage(int x, int y, const QRect &rect, const QImage &image);
00102
00103 virtual int GetChannelIndex(const QString &str);
00105 virtual bool GetServiceInfo(int channelId, int &netId, int &origNetId,
00106 int &transportId, int &serviceId);
00107 virtual bool TuneTo(int channel);
00108
00110 virtual bool BeginAudio(const QString &stream, int tag);
00112 virtual void StopAudio(void);
00114 virtual bool BeginVideo(const QString &stream, int tag);
00116 virtual void StopVideo(void);
00117
00118
00119
00120 virtual const char *GetReceiverId(void)
00121 { return "MYT001001"; }
00122 virtual const char *GetDSMCCId(void)
00123 { return "DSMMYT001"; }
00124
00125
00126
00127 void AddToDisplay(const QImage &image, int x, int y);
00128
00129 FT_Face GetFontFace(void) { return m_face; }
00130 bool IsFaceLoaded(void) { return m_face_loaded; }
00131 bool LoadFont(QString name);
00132 bool ImageUpdated(void) { return m_updated; }
00133
00134 static const int StdDisplayWidth = 720;
00135 static const int StdDisplayHeight = 576;
00136 int GetWidth(void) { return m_displayWidth; }
00137 int GetHeight(void) { return m_displayHeight; }
00138
00139 protected:
00140 static void *StartMHEGEngine(void *param);
00141 void RunMHEGEngine(void);
00142 void ProcessDSMCCQueue(void);
00143 void NetworkBootRequested(void);
00144
00145 InteractiveTV *m_parent;
00146
00147 Dsmcc *m_dsmcc;
00148 QMutex m_dsmccLock;
00149 QPtrQueue<DSMCCPacket> m_dsmccQueue;
00150
00151 QMutex m_keyLock;
00152 QValueList<int> m_keyQueue;
00153 int m_keyProfile;
00154
00155 MHEG *m_engine;
00156
00157 QWaitCondition m_engine_wait;
00158 bool m_stop;
00159 bool m_stopped;
00160 QMutex m_display_lock;
00161 bool m_updated;
00162 int m_displayWidth;
00163 int m_displayHeight;
00164
00165
00166 QPtrList<MHIImageData> m_display;
00167
00168 FT_Face m_face;
00169 bool m_face_loaded;
00170
00171 pthread_t m_engineThread;
00172
00173 int m_currentChannel;
00174 bool m_isLive;
00175 int m_currentCard;
00176
00177 int m_audioTag;
00178 int m_videoTag;
00179 int m_tuningTo;
00180
00181 uint m_lastNbiVersion;
00182 QMemArray<unsigned char> m_nbiData;
00183
00184 QRect m_videoRect;
00185 };
00186
00187
00188 class MHIText : public MHTextDisplay
00189 {
00190 public:
00191 MHIText(MHIContext *parent);
00192 virtual ~MHIText() {}
00193
00194 virtual void Draw(int x, int y);
00195 virtual void Clear(void);
00196 virtual void AddText(int x, int y, const QString &, MHRgba colour);
00197
00198 virtual void SetSize(int width, int height);
00199 virtual void SetFont(int size, bool isBold, bool isItalic);
00200
00201 virtual QRect GetBounds(const QString &str, int &strLen, int maxSize = -1);
00202
00203 public:
00204 MHIContext *m_parent;
00205 QImage m_image;
00206 int m_fontsize;
00207 bool m_fontItalic;
00208 bool m_fontBold;
00209 int m_width;
00210 int m_height;
00211 };
00212
00216 class MHIBitmap : public MHBitmapDisplay
00217 {
00218 public:
00219 MHIBitmap(MHIContext *parent, bool tiled)
00220 : m_parent(parent), m_tiled(tiled), m_opaque(false) {}
00221 virtual ~MHIBitmap() {}
00222
00224 virtual void CreateFromPNG(const unsigned char *data, int length);
00225
00227 virtual void CreateFromMPEG(const unsigned char *data, int length);
00228
00236 virtual void Draw(int x, int y, QRect rect, bool tiled);
00237
00239 virtual void ScaleImage(int newWidth, int newHeight);
00240
00241
00242 virtual QSize GetSize(void) { return m_image.size(); }
00243 virtual bool IsOpaque(void) { return !m_image.isNull() && m_opaque; }
00244
00245 public:
00246 MHIContext *m_parent;
00247 bool m_tiled;
00248 QImage m_image;
00249 bool m_opaque;
00250 };
00251
00255 class MHIDLA : public MHDLADisplay
00256 {
00257 public:
00258 MHIDLA(MHIContext *parent, bool isBoxed,
00259 MHRgba lineColour, MHRgba fillColour)
00260 : m_parent(parent), m_boxed(isBoxed),
00261 m_boxLineColour(lineColour), m_boxFillColour(fillColour) {}
00263 virtual void Draw(int x, int y);
00265 virtual void SetSize(int width, int height)
00266 {
00267 m_width = width;
00268 m_height = height;
00269 Clear();
00270 }
00271 virtual void SetLineSize(int width) { m_lineWidth = width; }
00272 virtual void SetLineColour(MHRgba colour) { m_lineColour = colour; }
00273 virtual void SetFillColour(MHRgba colour) { m_fillColour = colour; }
00274
00276 virtual void Clear(void);
00277
00278
00279 virtual void DrawLine(int x1, int y1, int x2, int y2);
00280 virtual void DrawBorderedRectangle(int x, int y, int width, int height);
00281 virtual void DrawOval(int x, int y, int width, int height);
00282 virtual void DrawArcSector(int x, int y, int width, int height,
00283 int start, int arc, bool isSector);
00284 virtual void DrawPoly(bool isFilled, const QPointArray &points);
00285
00286 protected:
00287 void DrawRect(int x, int y, int width, int height, MHRgba colour);
00288 void DrawLineSub(int x1, int y1, int x2, int y2, bool swapped);
00289
00290 protected:
00291 MHIContext *m_parent;
00292 QImage m_image;
00293 int m_width;
00294 int m_height;
00295 bool m_boxed;
00296 MHRgba m_boxLineColour;
00297 MHRgba m_boxFillColour;
00298 MHRgba m_lineColour;
00299 MHRgba m_fillColour;
00300 int m_lineWidth;
00301 };
00302
00306 class DSMCCPacket
00307 {
00308 public:
00309 DSMCCPacket(unsigned char *data, int length, int tag,
00310 unsigned car, int dbid)
00311 : m_data(data), m_length(length),
00312 m_componentTag(tag), m_carouselId(car),
00313 m_dataBroadcastId(dbid)
00314 {
00315 }
00316
00317 ~DSMCCPacket()
00318 {
00319 free(m_data);
00320 }
00321
00322 public:
00323 unsigned char *m_data;
00324 int m_length;
00325 int m_componentTag;
00326 unsigned m_carouselId;
00327 int m_dataBroadcastId;
00328 };
00329
00330 #endif // _MHI_H_