00001
00002 #ifndef DVD_RING_BUFFER_H_
00003 #define DVD_RING_BUFFER_H_
00004
00005 #define DVD_BLOCK_SIZE 2048LL
00006 #define DVD_MENU_MAX 7
00007
00008 #include <qstring.h>
00009 #include <qobject.h>
00010 #include <qmutex.h>
00011 #include "util.h"
00012 extern "C" {
00013 #include "../libavcodec/avcodec.h"
00014 }
00015
00016 #define DVDNAV_COMPILE
00017 #include "../libmythdvdnav/dvdnav.h"
00018
00025 class NuppelVideoPlayer;
00026
00027 class MPUBLIC DVDRingBufferPriv
00028 {
00029 public:
00030 DVDRingBufferPriv();
00031 virtual ~DVDRingBufferPriv();
00032
00033
00034 int GetTitle(void) const { return title; }
00035 int GetPart(void) const { return part; }
00036 bool IsInMenu(void) const;
00037 bool IsOpen(void) const { return dvdnav; }
00038 long long GetReadPosition(void);
00039 long long GetTotalReadPosition(void) { return titleLength; }
00040 void GetDescForPos(QString &desc) const;
00041 void GetPartAndTitle(int &_part, int &_title) const
00042 { _part = part; _title = title; }
00043 uint GetTotalTimeOfTitle(void);
00044 uint GetChapterLength(void) const { return pgLength / 90000; }
00045 uint GetCellStart(void);
00046 bool PGCLengthChanged(void);
00047 bool CellChanged(void);
00048 bool InStillFrame(void) const { return cellHasStillFrame; }
00049 bool AudioStreamsChanged(void) const { return audioStreamsChanged; }
00050 bool IsWaiting(void) const { return dvdWaiting; }
00051 int NumPartsInTitle(void) const { return titleParts; }
00052 void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
00053
00054 QRect GetButtonCoords(void);
00055 AVSubtitle *GetMenuSubtitle(void);
00056 void ReleaseMenuButton(void);
00057
00058 bool IgnoringStillorWait(void) { return skipstillorwait; }
00059 uint GetAudioLanguage(int id);
00060 int GetSubTrackNum(uint key);
00061 int GetAudioTrackNum(uint key);
00062 uint GetSubtitleLanguage(int key);
00063 void SetMenuPktPts(long long pts) { menupktpts = pts; }
00064 long long GetMenuPktPts(void) { return menupktpts; }
00065 bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
00066 const uint8_t * buf, int buf_size);
00067 bool GetNameAndSerialNum(QString& _name, QString& _serialnum);
00068 bool JumpToTitle(void) { return jumptotitle; }
00069 double GetFrameRate(void);
00070 bool StartOfTitle(void) { return (part == 0); }
00071 bool EndOfTitle(void) { return ((!titleParts) ||
00072 (part == (titleParts - 1)) ||
00073 (titleParts == 1)); }
00074 int GetCellID(void) { return cellid; }
00075 int GetVobID(void) { return vobid; }
00076 bool IsSameChapter(int tmpcellid, int tmpvobid);
00077 void RunSeekCellStart(void);
00078
00079
00080 bool OpenFile(const QString &filename);
00081 void PlayTitleAndPart(int _title, int _part)
00082 { dvdnav_part_play(dvdnav, _title, _part); }
00083 void CloseDVD(void);
00084 bool nextTrack(void);
00085 void prevTrack(void);
00086 int safe_read(void *data, unsigned sz);
00087 long long NormalSeek(long long time);
00088 void SkipStillFrame(void);
00089 void WaitSkip(void);
00090 bool GoToMenu(const QString str);
00091 void GoToNextProgram(void);
00092 void GoToPreviousProgram(void);
00093 void MoveButtonLeft(void);
00094 void MoveButtonRight(void);
00095 void MoveButtonUp(void);
00096 void MoveButtonDown(void);
00097 void ActivateButton(void);
00098 int NumMenuButtons(void) const;
00099 void IgnoreStillOrWait(bool skip) { skipstillorwait = skip; }
00100 void InStillFrame(bool change) { cellHasStillFrame = change; }
00101 void AudioStreamsChanged(bool change) { audioStreamsChanged = change; }
00102 uint GetCurrentTime(void) { return (currentTime / 90000); }
00103 uint TitleTimeLeft(void);
00104 void SetTrack(uint type, int trackNo);
00105 int GetTrack(uint type);
00106 uint8_t GetNumAudioChannels(int id);
00107 void JumpToTitle(bool change) { jumptotitle = change; }
00108 void SetDVDSpeed(void);
00109 void SetDVDSpeed(int speed);
00110 void SetRunSeekCellStart(bool change) { runSeekCellStart = change; }
00111
00112 void SetParent(NuppelVideoPlayer *p) { parent = p; }
00113
00114
00115 protected:
00116 dvdnav_t *dvdnav;
00117 unsigned char dvdBlockWriteBuf[DVD_BLOCK_SIZE];
00118 unsigned char *dvdBlockReadBuf;
00119 const char *dvdFilename;
00120 int dvdBlockRPos;
00121 int dvdBlockWPos;
00122 long long pgLength;
00123 long long pgcLength;
00124 long long cellStart;
00125 bool cellChanged;
00126 bool pgcLengthChanged;
00127 long long pgStart;
00128 long long currentpos;
00129 dvdnav_t *lastNav;
00130 int32_t part;
00131 int32_t title;
00132 int32_t titleParts;
00133 bool gotStop;
00134
00135 bool cellHasStillFrame;
00136 bool audioStreamsChanged;
00137 bool dvdWaiting;
00138 long long titleLength;
00139 MythTimer stillFrameTimer;
00140 uint32_t clut[16];
00141 uint8_t button_color[4];
00142 uint8_t button_alpha[4];
00143 QRect hl_button;
00144 uint8_t *menuSpuPkt;
00145 int menuBuflength;
00146 AVSubtitle dvdMenuButton;
00147 bool skipstillorwait;
00148 long long cellstartPos;
00149 bool buttonSelected;
00150 bool buttonExists;
00151 int cellid;
00152 int lastcellid;
00153 int vobid;
00154 int lastvobid;
00155 bool cellRepeated;
00156 int buttonstreamid;
00157 bool runningCellStart;
00158 bool runSeekCellStart;
00159 long long menupktpts;
00160 int curAudioTrack;
00161 int8_t curSubtitleTrack;
00162 bool autoselectaudio;
00163 bool autoselectsubtitle;
00164 bool jumptotitle;
00165 long long seekpos;
00166 int seekwhence;
00167 QString dvdname;
00168 QString serialnumber;
00169 bool seeking;
00170 uint64_t seektime;
00171 uint currentTime;
00172 QMap<uint, uint> seekSpeedMap;
00173 QMap<uint, uint> audioTrackMap;
00174 QMap<uint, uint> subTrackMap;
00175
00176 NuppelVideoPlayer *parent;
00177
00178 QMutex menuBtnLock;
00179 QMutex seekLock;
00180
00181 long long Seek(long long time);
00182 bool DVDButtonUpdate(bool b_mode);
00183 void ClearMenuSPUParameters(void);
00184 void ClearMenuButton(void);
00185 bool MenuButtonChanged(void);
00186 uint ConvertLangCode(uint16_t code);
00187 void SelectDefaultButton(void);
00188 void ClearSubtitlesOSD(void);
00189 bool SeekCellStart(void);
00190
00191 int get_nibble(const uint8_t *buf, int nibble_offset);
00192 int decode_rle(uint8_t *bitmap, int linesize, int w, int h,
00193 const uint8_t *buf, int nibble_offset, int buf_size);
00194 void guess_palette(uint32_t *rgba_palette,uint8_t *palette,
00195 uint8_t *alpha);
00196 int is_transp(const uint8_t *buf, int pitch, int n,
00197 const uint8_t *transp_color);
00198 int find_smallest_bounding_rectangle(AVSubtitle *s);
00199 };
00200
00201 #endif // DVD_RING_BUFFER_H_
00202