00001 #ifndef BD_RING_BUFFER_H_
00002 #define BD_RING_BUFFER_H_
00003
00004 #define BD_BLOCK_SIZE 6144LL
00005
00006 #include <QString>
00007 #include <QRect>
00008
00009 #include "libmythbluray/bluray.h"
00010 #include "libmythbluray/keys.h"
00011
00012 #include "ringbuffer.h"
00013 #include "mythmiscutil.h"
00014
00021 class BDOverlay
00022 {
00023 public:
00024 static void DeleteOverlay(BDOverlay *overlay)
00025 {
00026 if (!overlay)
00027 return;
00028 if (overlay->m_data)
00029 av_free(overlay->m_data);
00030 if (overlay->m_palette)
00031 av_free(overlay->m_palette);
00032 delete overlay;
00033 overlay = NULL;
00034 }
00035
00036 BDOverlay(uint8_t *data, uint8_t *palette, QRect position, int plane,
00037 int64_t pts)
00038 : m_data(data), m_palette(palette), m_position(position),
00039 m_plane(plane), m_pts(pts) { }
00040
00041 uint8_t *m_data;
00042 uint8_t *m_palette;
00043 QRect m_position;
00044 int m_plane;
00045 int64_t m_pts;
00046 };
00047
00048 class MTV_PUBLIC BDRingBuffer : public RingBuffer
00049 {
00050 public:
00051 BDRingBuffer(const QString &lfilename);
00052 virtual ~BDRingBuffer();
00053
00054 virtual bool IsStreamed(void) { return true; }
00055
00056 void ProgressUpdate(void);
00057
00058
00059 bool BDWaitingForPlayer(void) { return m_playerWait; }
00060 void SkipBDWaitingForPlayer(void) { m_playerWait = false; }
00061 virtual void IgnoreWaitStates(bool ignore) { m_ignorePlayerWait = ignore; }
00062 virtual bool StartFromBeginning(void);
00063 bool GetNameAndSerialNum(QString& _name, QString& _serialnum);
00064
00065 void ClearOverlays(void);
00066 BDOverlay* GetOverlay(void);
00067 void SubmitOverlay(const bd_overlay_s * const overlay);
00068
00069 uint32_t GetNumTitles(void) const { return m_numTitles; }
00070 int GetCurrentTitle(void);
00071 uint64_t GetCurrentAngle(void) const { return m_currentAngle; }
00072 int GetTitleDuration(int title);
00073
00074 uint64_t GetTitleSize(void) const { return m_titlesize; }
00075
00076 uint64_t GetTotalTimeOfTitle(void) const { return (m_currentTitleLength / 90000); }
00077 uint64_t GetCurrentTime(void) { return (m_currentTime / 90000); }
00078 virtual long long GetReadPosition(void) const;
00079 uint64_t GetTotalReadPosition(void);
00080 uint32_t GetNumChapters(void);
00081 uint32_t GetCurrentChapter(void);
00082 uint64_t GetNumAngles(void) { return m_currentTitleAngleCount; }
00083 uint64_t GetChapterStartTime(uint32_t chapter);
00084 uint64_t GetChapterStartFrame(uint32_t chapter);
00085 bool IsOpen(void) const { return bdnav; }
00086 bool IsHDMVNavigation(void) const { return m_isHDMVNavigation; }
00087 bool IsInMenu(void) const { return m_inMenu; }
00088 bool IsInStillFrame(void) const;
00089 virtual bool IsInDiscMenuOrStillFrame(void) const
00090 { return IsInMenu() || IsInStillFrame(); }
00091 bool TitleChanged(void);
00092
00093 void GetDescForPos(QString &desc);
00094 double GetFrameRate(void);
00095
00096 int GetAudioLanguage(uint streamID);
00097 int GetSubtitleLanguage(uint streamID);
00098
00099
00100 virtual bool HandleAction(const QStringList &actions, int64_t pts);
00101 virtual bool OpenFile(const QString &filename,
00102 uint retry_ms = kDefaultOpenTimeout);
00103 void close(void);
00104
00105 bool GoToMenu(const QString str, int64_t pts);
00106 bool SwitchTitle(uint32_t index);
00107 bool SwitchPlaylist(uint32_t index);
00108 bool SwitchAngle(uint angle);
00109
00110 virtual int safe_read(void *data, uint sz);
00111 virtual long long Seek(long long pos, int whence, bool has_lock);
00112 uint64_t Seek(uint64_t pos);
00113
00114 private:
00115
00116
00117 void WaitForPlayer(void);
00118
00119
00120 bool UpdateTitleInfo(void);
00121 BLURAY_TITLE_INFO* GetTitleInfo(uint32_t index);
00122 BLURAY_TITLE_INFO* GetPlaylistInfo(uint32_t index);
00123
00124
00125 void PressButton(int32_t key, int64_t pts);
00126 void ClickButton(int64_t pts, uint16_t x, uint16_t y);
00127
00128
00129 bool HandleBDEvents(void);
00130 void HandleBDEvent(BD_EVENT &event);
00131
00132 BLURAY *bdnav;
00133 meta_dl *m_metaDiscLibrary;
00134 bool m_isHDMVNavigation;
00135 bool m_tryHDMVNavigation;
00136 bool m_topMenuSupported;
00137 bool m_firstPlaySupported;
00138
00139 uint32_t m_numTitles;
00140 uint32_t m_mainTitle;
00141 uint64_t m_currentTitleLength;
00142 BLURAY_TITLE_INFO *m_currentTitleInfo;
00143 uint64_t m_titlesize;
00144 uint64_t m_currentTitleAngleCount;
00145 uint64_t m_currentTime;
00146
00147 int m_currentAngle;
00148 int m_currentTitle;
00149 int m_currentPlaylist;
00150 int m_currentPlayitem;
00151 int m_currentChapter;
00152
00153 int m_currentAudioStream;
00154 int m_currentIGStream;
00155 int m_currentPGTextSTStream;
00156 int m_currentSecondaryAudioStream;
00157 int m_currentSecondaryVideoStream;
00158
00159 bool m_PGTextSTEnabled;
00160 bool m_secondaryAudioEnabled;
00161 bool m_secondaryVideoEnabled;
00162 bool m_secondaryVideoIsFullscreen;
00163
00164 bool m_titleChanged;
00165
00166 bool m_playerWait;
00167 bool m_ignorePlayerWait;
00168
00169 QMutex m_overlayLock;
00170 QList<BDOverlay*> m_overlayImages;
00171
00172 uint8_t m_stillTime;
00173 uint8_t m_stillMode;
00174 volatile bool m_inMenu;
00175
00176 QHash<uint32_t,BLURAY_TITLE_INFO*> m_cachedTitleInfo;
00177 QHash<uint32_t,BLURAY_TITLE_INFO*> m_cachedPlaylistInfo;
00178 QMutex m_infoLock;
00179
00180 QThread *m_mainThread;
00181 };
00182 #endif