MythTV  0.26-pre
dvdringbuffer.h
Go to the documentation of this file.
00001 // -*- Mode: c++ -*-
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 <QMap>
00009 #include <QString>
00010 #include <QMutex>
00011 #include <QRect>
00012 
00013 #include "ringbuffer.h"
00014 #include "mythmiscutil.h"
00015 
00016 extern "C" {
00017 #include "libavcodec/avcodec.h"
00018 }
00019 
00020 #include "dvdnav/dvdnav.h"
00021 
00028 class MythDVDPlayer;
00029 
00030 class MTV_PUBLIC DVDInfo
00031 {
00032   public:
00033     DVDInfo(const QString &filename);
00034    ~DVDInfo(void);
00035     bool IsValid(void) const { return m_nav != NULL; }
00036     bool GetNameAndSerialNum(QString &name, QString &serialnum);
00037 
00038   protected:
00039     dvdnav_t   *m_nav;
00040     const char *m_name;
00041     const char *m_serialnumber;
00042 };
00043 
00044 class MTV_PUBLIC DVDRingBuffer : public RingBuffer
00045 {
00046   public:
00047     DVDRingBuffer(const QString &lfilename);
00048     virtual ~DVDRingBuffer();
00049 
00050     // gets
00051     int  GetTitle(void)        const { return m_title;                  }
00052     bool DVDWaitingForPlayer(void)   { return m_playerWait;             }
00053     int  GetPart(void)         const { return m_part;                   }
00054     int  GetCurrentAngle(void) const { return m_currentAngle;           }
00055     int  GetNumAngles(void)          { return m_currentTitleAngleCount; }
00056     bool IsOpen(void)          const { return m_dvdnav;                 }
00057     long long GetTotalReadPosition(void) { return m_titleLength;        }
00058     uint GetChapterLength(void)    const { return m_pgLength / 90000;   }
00059     void GetChapterTimes(QList<long long> &times);
00060     uint64_t GetChapterTimes(uint title);
00061     virtual long long GetReadPosition(void) const;
00062     void GetDescForPos(QString &desc);
00063     void GetPartAndTitle(int &_part, int &_title) const
00064         { _part  = m_part; _title = m_title; }
00065     uint GetTotalTimeOfTitle(void);
00066     float GetAspectOverride(void)     { return m_forcedAspect; }
00067     virtual bool IsBookmarkAllowed(void);
00068     virtual bool IsStreamed(void)     { return true; }
00069     virtual int  BestBufferSize(void) { return 2048; }
00070 
00071     uint GetCellStart(void);
00072     bool PGCLengthChanged(void);
00073     bool CellChanged(void);
00074     bool IsInStillFrame(void)   const { return m_still > 0;             }
00075     bool NeedsStillFrame(void) { return IsInStillFrame() || NewSequence(); }
00076     bool NewSequence(bool new_sequence = false);
00077     bool AudioStreamsChanged(void) const { return m_audioStreamsChanged; }
00078     bool IsWaiting(void) const           { return m_dvdWaiting;          }
00079     int  NumPartsInTitle(void)     const { return m_titleParts;          }
00080     void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
00081     virtual bool IsInDiscMenuOrStillFrame(void) const
00082         { return IsInMenu() || IsInStillFrame(); }
00083 
00084     // Public menu/button stuff
00085     AVSubtitle *GetMenuSubtitle(uint &version);
00086     int         NumMenuButtons(void) const;
00087     QRect       GetButtonCoords(void);
00088     void        ReleaseMenuButton(void);
00089     bool        IsInMenu(void) const { return m_inMenu; }
00090     virtual bool HandleAction(const QStringList &actions, int64_t pts);
00091 
00092     // Subtitles
00093     uint GetSubtitleLanguage(int key);
00094     bool DecodeSubtitles(AVSubtitle * sub, int * gotSubtitles,
00095                          const uint8_t * buf, int buf_size);
00096 
00097     uint GetAudioLanguage(int id);
00098     int  GetAudioTrackNum(uint key);
00099     int  GetAudioTrackType(uint stream_id);
00100 
00101     bool GetNameAndSerialNum(QString& _name, QString& _serialnum);
00102     double GetFrameRate(void);
00103     bool StartOfTitle(void) { return (m_part == 0); }
00104     bool EndOfTitle(void)   { return ((!m_titleParts) ||
00105                                      (m_part == (m_titleParts - 1)) ||
00106                                      (m_titleParts == 1)); }
00107 
00108     // commands
00109     virtual bool OpenFile(const QString &lfilename,
00110                           uint retry_ms = kDefaultOpenTimeout);
00111     void PlayTitleAndPart(int _title, int _part)
00112         { dvdnav_part_play(m_dvdnav, _title, _part); }
00113     virtual bool StartFromBeginning(void);
00114     void CloseDVD(void);
00115     bool playTrack(int track);
00116     bool nextTrack(void);
00117     void prevTrack(void);
00118     virtual int safe_read(void *data, uint sz);
00119     virtual long long Seek(long long pos, int whence, bool has_lock);
00120     long long NormalSeek(long long time);
00121     void SkipStillFrame(void);
00122     void WaitSkip(void);
00123     void SkipDVDWaitingForPlayer(void)    { m_playerWait = false;           }
00124     bool GoToMenu(const QString str);
00125     void GoToNextProgram(void);
00126     void GoToPreviousProgram(void);
00127 
00128     virtual void IgnoreWaitStates(bool ignore) { m_skipstillorwait = ignore; }
00129     void AudioStreamsChanged(bool change) { m_audioStreamsChanged = change; }
00130     uint GetCurrentTime(void)             { return (m_currentTime / 90000); }
00131     uint TitleTimeLeft(void);
00132     void  SetTrack(uint type, int trackNo);
00133     int   GetTrack(uint type);
00134     uint8_t GetNumAudioChannels(int id);
00135     void SetDVDSpeed(void);
00136     void SetDVDSpeed(int speed);
00137     bool SwitchAngle(uint angle);
00138 
00139     void SetParent(MythDVDPlayer *p) { m_parent = p; }
00140 
00141   protected:
00142     dvdnav_t      *m_dvdnav;
00143     unsigned char  m_dvdBlockWriteBuf[DVD_BLOCK_SIZE];
00144     unsigned char *m_dvdBlockReadBuf;
00145     int            m_dvdBlockRPos;
00146     int            m_dvdBlockWPos;
00147     long long      m_pgLength;
00148     long long      m_pgcLength;
00149     long long      m_cellStart;
00150     bool           m_cellChanged;
00151     bool           m_pgcLengthChanged;
00152     long long      m_pgStart;
00153     long long      m_currentpos;
00154     dvdnav_t      *m_lastNav; // This really belongs in the player.
00155     int32_t        m_part;
00156     int32_t        m_lastPart;
00157     int32_t        m_title;
00158     int32_t        m_lastTitle;
00159     bool           m_playerWait;
00160     int32_t        m_titleParts;
00161     bool           m_gotStop;
00162     int            m_currentAngle;
00163     int            m_currentTitleAngleCount;
00164 
00165     bool           m_newSequence;
00166     int            m_still;
00167     int            m_lastStill;
00168     bool           m_audioStreamsChanged;
00169     bool           m_dvdWaiting;
00170     long long      m_titleLength;
00171     bool           m_skipstillorwait;
00172     long long      m_cellstartPos;
00173     bool           m_buttonSelected;
00174     bool           m_buttonExists;
00175     int            m_cellid;
00176     int            m_lastcellid;
00177     int            m_vobid;
00178     int            m_lastvobid;
00179     bool           m_cellRepeated;
00180 
00181     int            m_curAudioTrack;
00182     int8_t         m_curSubtitleTrack;
00183     bool           m_autoselectsubtitle;
00184     long long      m_seekpos;
00185     const char    *m_dvdname;
00186     const char    *m_serialnumber;
00187     bool           m_seeking;
00188     uint64_t       m_seektime;
00189     uint           m_currentTime;
00190     QMap<uint, uint> m_seekSpeedMap;
00191     QMap<uint, QList<uint64_t> > m_chapterMap;
00192 
00193     MythDVDPlayer *m_parent;
00194     float          m_forcedAspect;
00195 
00196     // Private menu/button stuff
00197     void ActivateButton(void);
00198     void MoveButtonLeft(void);
00199     void MoveButtonRight(void);
00200     void MoveButtonUp(void);
00201     void MoveButtonDown(void);
00202     bool DVDButtonUpdate(bool b_mode);
00203     void ClearMenuSPUParameters(void);
00204     void ClearMenuButton(void);
00205 
00206     bool           m_inMenu;
00207     uint           m_buttonVersion;
00208     int            m_buttonStreamID;
00209     uint32_t       m_clut[16];
00210     uint8_t        m_button_color[4];
00211     uint8_t        m_button_alpha[4];
00212     QRect          m_hl_button;
00213     uint8_t       *m_menuSpuPkt;
00214     int            m_menuBuflength;
00215     AVSubtitle     m_dvdMenuButton;
00216     QMutex m_menuBtnLock;
00217 
00218     QMutex m_seekLock;
00219     long long Seek(long long time);
00220 
00221     void ClearChapterCache(void);
00222     uint ConvertLangCode(uint16_t code);
00223     void SelectDefaultButton(void);
00224     void WaitForPlayer(void);
00225 
00226     int get_nibble(const uint8_t *buf, int nibble_offset);
00227     int decode_rle(uint8_t *bitmap, int linesize, int w, int h,
00228                     const uint8_t *buf, int nibble_offset, int buf_size);
00229     void guess_palette(uint32_t *rgba_palette,uint8_t *palette,
00230                        uint8_t *alpha);
00231     int is_transp(const uint8_t *buf, int pitch, int n,
00232                   const uint8_t *transp_color);
00233     int find_smallest_bounding_rectangle(AVSubtitle *s);
00234 };
00235 
00236 #endif // DVD_RING_BUFFER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends