Skip to content

Commit

Permalink
libmythtv: RingBuffer cleanup part 1
Browse files Browse the repository at this point in the history
- mostly coding standards, include cleanup, remove unused code, sundry
small clang-tidy warnings
  • Loading branch information
mark-kendall committed Apr 8, 2020
1 parent be7417f commit 3029c2d
Show file tree
Hide file tree
Showing 26 changed files with 3,024 additions and 3,450 deletions.
1,209 changes: 534 additions & 675 deletions mythtv/libs/libmythtv/Bluray/bdringbuffer.cpp

Large diffs are not rendered by default.

302 changes: 134 additions & 168 deletions mythtv/libs/libmythtv/Bluray/bdringbuffer.h
@@ -1,68 +1,65 @@
#ifndef BD_RING_BUFFER_H_
#define BD_RING_BUFFER_H_

#include "config.h"

#define BD_BLOCK_SIZE 6144LL

//Qt headers
// Qt
#include <QString>
#include <QRect>
#include <QHash>
#include <QImage>
#include <QCoreApplication>

// external/libmythbluray
// MythTV
#include "config.h"
#include "ringbuffer.h"

// BluRay
#include "libbluray/bluray.h"
#if CONFIG_LIBBLURAY_EXTERNAL
#include "libbluray/overlay.h"
#else
#include "libbluray/decoders/overlay.h"
#endif

#include "ringbuffer.h"
#define BD_BLOCK_SIZE 6144LL

class MTV_PUBLIC BDInfo
{
friend class BDRingBuffer;
Q_DECLARE_TR_FUNCTIONS(BDInfo);
Q_DECLARE_TR_FUNCTIONS(BDInfo)

public:
explicit BDInfo(const QString &filename);
explicit BDInfo(const QString &Filename);
~BDInfo(void) = default;
bool IsValid(void) const { return m_isValid; }
bool GetNameAndSerialNum(QString &name, QString &serialnum);
QString GetLastError(void) const { return m_lastError; }
bool IsValid (void) const;
QString GetLastError (void) const;
bool GetNameAndSerialNum(QString &Name, QString &SerialNum);

protected:
static void GetNameAndSerialNum(BLURAY* nav,
QString &name,
QString &serialnum,
const QString &filename,
const QString &logPrefix);
protected:
static void GetNameAndSerialNum(BLURAY* BluRay, QString &Name,
QString &SerialNum, const QString &Filename,
const QString &LogPrefix);

protected:
QString m_name;
QString m_serialnumber;
QString m_lastError;
bool m_isValid {true};
QString m_name;
QString m_serialnumber;
QString m_lastError;
bool m_isValid { true };
};

class BDOverlay
{
public:
BDOverlay() = default;
explicit BDOverlay(const bd_overlay_s * overlay);
explicit BDOverlay(const bd_argb_overlay_s * overlay);

void setPalette(const BD_PG_PALETTE_ENTRY *palette);
void wipe();
void wipe(int x, int y, int width, int height);

QImage m_image;
int64_t m_pts {-1};
int m_x {0};
int m_y {0};
explicit BDOverlay(const bd_overlay_s* Overlay);
explicit BDOverlay(const bd_argb_overlay_s* Overlay);
void SetPalette(const BD_PG_PALETTE_ENTRY* Palette);
void Wipe(void);
void Wipe(int Left, int Top, int Width, int Height);

QImage m_image;
int64_t m_pts { -1 };
int m_x { 0 };
int m_y { 0 };
};

/** \class BDRingBufferPriv
Expand All @@ -72,97 +69,80 @@ class BDOverlay
*/
class MTV_PUBLIC BDRingBuffer : public RingBuffer
{
Q_DECLARE_TR_FUNCTIONS(BDRingBuffer);
Q_DECLARE_TR_FUNCTIONS(BDRingBuffer)

public:
explicit BDRingBuffer(const QString &lfilename);
explicit BDRingBuffer(const QString &Filename);
~BDRingBuffer() override;

bool IsStreamed(void) override { return true; } // RingBuffer

void ProgressUpdate(void);

// Player interaction
bool BDWaitingForPlayer(void) { return m_playerWait; }
void SkipBDWaitingForPlayer(void) { m_playerWait = false; }
void IgnoreWaitStates(bool ignore) override { m_ignorePlayerWait = ignore; } // RingBuffer
bool StartFromBeginning(void) override; // RingBuffer
bool GetNameAndSerialNum(QString& _name, QString& _serialnum);
bool GetBDStateSnapshot(QString& state);
bool RestoreBDStateSnapshot(const QString &state);

void ClearOverlays(void);
BDOverlay* GetOverlay(void);
void SubmitOverlay(const bd_overlay_s * overlay);
void SubmitARGBOverlay(const bd_argb_overlay_s * overlay);

uint32_t GetNumTitles(void) const { return m_numTitles; }
int GetCurrentTitle(void);
uint64_t GetCurrentAngle(void) const { return m_currentAngle; }
int GetTitleDuration(int title);
// Get the size in bytes of the current title (playlist item).
uint64_t GetTitleSize(void) const { return m_titlesize; }
// Get The total duration of the current title in 90Khz ticks.
uint64_t GetTotalTimeOfTitle(void) const { return (m_currentTitleLength / 90000); }
uint64_t GetCurrentTime(void) { return (m_currentTime / 90000); }
long long GetReadPosition(void) const override; // RingBuffer
uint64_t GetTotalReadPosition(void);
uint32_t GetNumChapters(void);
uint32_t GetCurrentChapter(void);
uint64_t GetNumAngles(void) { return m_currentTitleAngleCount; }
uint64_t GetChapterStartTime(uint32_t chapter);
uint64_t GetChapterStartFrame(uint32_t chapter);
bool IsOpen(void) const override { return m_bdnav; } // RingBuffer
bool IsHDMVNavigation(void) const { return m_isHDMVNavigation; }
bool IsInMenu(void) const override { return m_inMenu; } // RingBuffer
bool IsInStillFrame(void) const override; // RingBuffer
bool TitleChanged(void);
bool IsValidStream(int streamid);
void UnblockReading(void) { m_processState = PROCESS_REPROCESS; }
bool IsReadingBlocked(void) { return (m_processState == PROCESS_WAIT); }
int64_t AdjustTimestamp(int64_t timestamp);

void GetDescForPos(QString &desc);
double GetFrameRate(void);

int GetAudioLanguage(uint streamID);
int GetSubtitleLanguage(uint streamID);

// commands
bool HandleAction(const QStringList &actions, int64_t pts) override; // RingBuffer
bool OpenFile(const QString &lfilename,
uint retry_ms = kDefaultOpenTimeout) override; // RingBuffer
void close(void);

bool GoToMenu(const QString &str, int64_t pts);
bool SwitchTitle(uint32_t index);
bool SwitchPlaylist(uint32_t index);
bool SwitchAngle(uint angle);
bool IsStreamed (void) override { return true; }
void IgnoreWaitStates (bool Ignore) override;
bool StartFromBeginning (void) override;
long long GetReadPosition (void) const override;
bool IsOpen (void) const override;
bool IsInMenu (void) const override;
bool IsInStillFrame (void) const override;
bool HandleAction (const QStringList &Actions, int64_t Pts) override;
bool OpenFile (const QString &Filename,
uint Retry = static_cast<uint>(kDefaultOpenTimeout)) override;

void ProgressUpdate (void);
bool BDWaitingForPlayer (void);
void SkipBDWaitingForPlayer(void);
bool GetNameAndSerialNum(QString& Name, QString& SerialNum);
bool GetBDStateSnapshot (QString& State);
bool RestoreBDStateSnapshot(const QString &State);
void ClearOverlays (void);
BDOverlay* GetOverlay (void);
void SubmitOverlay (const bd_overlay_s* Overlay);
void SubmitARGBOverlay (const bd_argb_overlay_s* Overlay);
uint32_t GetNumTitles (void) const;
int GetCurrentTitle (void);
uint64_t GetCurrentAngle (void) const;
int GetTitleDuration (int Title);
uint64_t GetTitleSize (void) const;
uint64_t GetTotalTimeOfTitle(void) const;
uint64_t GetCurrentTime (void);
uint64_t GetTotalReadPosition(void);
uint32_t GetNumChapters (void);
uint32_t GetCurrentChapter (void);
uint64_t GetNumAngles (void);
uint64_t GetChapterStartTime (uint32_t Chapter);
uint64_t GetChapterStartFrame (uint32_t Chapter);
bool IsHDMVNavigation (void) const;
bool TitleChanged (void);
bool IsValidStream (uint StreamId);
void UnblockReading (void);
bool IsReadingBlocked (void);
int64_t AdjustTimestamp (int64_t Timestamp);
void GetDescForPos (QString &Desc);
double GetFrameRate (void);
int GetAudioLanguage (uint StreamID);
int GetSubtitleLanguage(uint StreamID);
void Close (void);
bool GoToMenu (const QString &Menu, int64_t Pts);
bool SwitchTitle (uint32_t Index);
bool SwitchPlaylist (uint32_t Index);
bool SwitchAngle (uint Angle);

protected:
int safe_read(void *data, uint sz) override; // RingBuffer
long long SeekInternal(long long pos, int whence) override; // RingBuffer
uint64_t SeekInternal(uint64_t pos);
int SafeRead (void *Buffer, uint Size) override;
long long SeekInternal (long long Position, int Whence) override;
uint64_t SeekInternal (uint64_t Position);

private:
// private player interaction
void WaitForPlayer(void);

// private title handling
bool UpdateTitleInfo(void);
BLURAY_TITLE_INFO* GetTitleInfo(uint32_t index);
BLURAY_TITLE_INFO* GetPlaylistInfo(uint32_t index);

// private menu handling methods
void PressButton(int32_t key, int64_t pts); // Keyboard
void ClickButton(int64_t pts, uint16_t x, uint16_t y); // Mouse

// private bluray event handling
bool HandleBDEvents(void);
void HandleBDEvent(BD_EVENT &event);

static const BLURAY_STREAM_INFO* FindStream(int streamid, BLURAY_STREAM_INFO* streams, int streamCount);

void WaitForPlayer (void);
bool UpdateTitleInfo (void);
BLURAY_TITLE_INFO* GetTitleInfo (uint32_t Index);
BLURAY_TITLE_INFO* GetPlaylistInfo(uint32_t Index);
void PressButton (int32_t Key, int64_t Pts);
void ClickButton (int64_t Pts, uint16_t X, uint16_t Y);
bool HandleBDEvents (void);
void HandleBDEvent (BD_EVENT &Event);

static const BLURAY_STREAM_INFO* FindStream(uint StreamID,
BLURAY_STREAM_INFO* Streams,
int StreamCount);

enum processState_t
{
Expand All @@ -171,65 +151,51 @@ class MTV_PUBLIC BDRingBuffer : public RingBuffer
PROCESS_WAIT
};

BLURAY *m_bdnav {nullptr};
bool m_isHDMVNavigation {false};
bool m_tryHDMVNavigation {false};
bool m_topMenuSupported {false};
bool m_firstPlaySupported {false};

uint32_t m_numTitles {0};
// Index number of main title
uint32_t m_mainTitle {0};
// Selected title's duration, in ticks (90Khz)
uint64_t m_currentTitleLength {0};
// Selected title info from struct in bluray.h
BLURAY_TITLE_INFO *m_currentTitleInfo {nullptr};
uint64_t m_titlesize {0};
uint64_t m_currentTitleAngleCount {0};
uint64_t m_currentTime {0};

int m_imgHandle {-1};

int m_currentAngle {0};
int m_currentTitle {-1};
int m_currentPlaylist {0};
int m_currentPlayitem {0};
int m_currentChapter {0};

int m_currentAudioStream {0};
int m_currentIGStream {0};
int m_currentPGTextSTStream {0};
int m_currentSecondaryAudioStream {0};
int m_currentSecondaryVideoStream {0};

bool m_pgTextSTEnabled {false};
bool m_secondaryAudioEnabled {false};
bool m_secondaryVideoEnabled {false};
bool m_secondaryVideoIsFullscreen {false};

bool m_titleChanged {false};

bool m_playerWait {false};
bool m_ignorePlayerWait {true};

BLURAY *m_bdnav { nullptr };
bool m_isHDMVNavigation { false };
bool m_tryHDMVNavigation { false };
bool m_topMenuSupported { false };
bool m_firstPlaySupported { false };
uint32_t m_numTitles { 0 };
uint32_t m_mainTitle { 0 };
uint64_t m_currentTitleLength { 0 };
BLURAY_TITLE_INFO *m_currentTitleInfo { nullptr };
uint64_t m_titlesize { 0 };
uint64_t m_currentTitleAngleCount { 0 };
uint64_t m_currentTime { 0 };
int m_imgHandle { -1 };
int m_currentAngle { 0 };
int m_currentTitle { -1 };
int m_currentPlaylist { 0 };
int m_currentPlayitem { 0 };
int m_currentChapter { 0 };
int m_currentAudioStream { 0 };
int m_currentIGStream { 0 };
int m_currentPGTextSTStream { 0 };
int m_currentSecondaryAudioStream { 0 };
int m_currentSecondaryVideoStream { 0 };
bool m_pgTextSTEnabled { false };
bool m_secondaryAudioEnabled { false };
bool m_secondaryVideoEnabled { false };
bool m_secondaryVideoIsFullscreen { false };
bool m_titleChanged { false };
bool m_playerWait { false };
bool m_ignorePlayerWait { true };
QMutex m_overlayLock;
QList<BDOverlay*> m_overlayImages;
QVector<BDOverlay*> m_overlayPlanes;

uint8_t m_stillTime {0};
uint8_t m_stillMode {BLURAY_STILL_NONE};
volatile bool m_inMenu {false};
BD_EVENT m_lastEvent {BD_EVENT_NONE, 0};
processState_t m_processState {PROCESS_NORMAL};
int m_stillTime { 0 };
int m_stillMode { BLURAY_STILL_NONE};
volatile bool m_inMenu { false };
BD_EVENT m_lastEvent { BD_EVENT_NONE, 0};
processState_t m_processState { PROCESS_NORMAL};
QByteArray m_pendingData;
int64_t m_timeDiff {0};

int64_t m_timeDiff { 0 };
QHash<uint32_t,BLURAY_TITLE_INFO*> m_cachedTitleInfo;
QHash<uint32_t,BLURAY_TITLE_INFO*> m_cachedPlaylistInfo;
QMutex m_infoLock {QMutex::Recursive};
QMutex m_infoLock { QMutex::Recursive };
QString m_name;
QString m_serialNumber;

QThread *m_mainThread {nullptr};
QThread *m_mainThread { nullptr };
};
#endif
2 changes: 1 addition & 1 deletion mythtv/libs/libmythtv/DVD/avformatdecoderdvd.cpp
Expand Up @@ -247,7 +247,7 @@ void AvFormatDecoderDVD::CheckContext(int64_t pts)

if (lastVideoSector != INVALID_LBA)
{
LOG(VB_PLAYBACK, LOG_DEBUG, LOC + QString( "Missing video. Jumping to sector %1")
LOG(VB_PLAYBACK, LOG_DEBUG, LOC + QString("Missing video. Jumping to sector %1")
.arg(lastVideoSector));

m_ringBuffer->DVD()->SectorSeek(lastVideoSector);
Expand Down

0 comments on commit 3029c2d

Please sign in to comment.