19#include "dvdread/dvd_reader.h"
20#include "dvdread/dvd_udf.h"
25#define LOC QString("DVDStream: ")
56 size_t block_count,
unsigned char *data,
62 return (Length + (DVD_VIDEO_LB_LEN - 1)) / DVD_VIDEO_LB_LEN;
91 const QString root = Filename.section(
"/VIDEO_TS/", 0, 0);
92 const QString path = Filename.section(root, 1);
97 m_reader = DVDOpen(qPrintable(root));
100 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"DVDOpen(%1) failed").arg(Filename));
112 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"(%1) UDFFindFile(%2) failed").
127 QString name {
"VIDEO_TS/VIDEO_TS.VOB" };
128 uint32_t
start = UDFFindFile(
m_reader, qPrintable(name), &len);
129 if(
start != 0 && len != 0 )
132 const int kTitles = 100;
133 for (
int title = 1; title < kTitles; ++title)
136 name = QString(
"/VIDEO_TS/VTS_%1_0.VOB").arg(title,2,10,QChar(
'0'));
138 if(
start != 0 && len != 0 )
141 for (
int part = 1; part < 10; ++part)
144 name = QString(
"/VIDEO_TS/VTS_%1_%2.VOB").arg(title,2,10,QChar(
'0')).arg(part);
146 if(
start != 0 && len != 0 )
154 dvd_file_t *
file = DVDOpenFile(
m_reader, 0, DVD_READ_MENU_VOBS);
158 LOG(VB_GENERAL, LOG_ERR,
LOC +
"DVDOpenFile(VOBS_1) failed");
175 uint32_t block = Size / DVD_VIDEO_LB_LEN;
178 LOG(VB_GENERAL, LOG_ERR,
LOC +
"SafeRead too small");
192 else if (m_pos < it->
Start())
193 b = it->Start() -
m_pos;
200 LOG(VB_GENERAL, LOG_ERR,
LOC +
"SafeRead DVDReadBlocks error");
205 block -=
static_cast<uint>(ret);
207 return ret * DVD_VIDEO_LB_LEN;
210 (
static_cast<ptrdiff_t
>(ret) * DVD_VIDEO_LB_LEN);
213 b = it->End() -
m_pos;
214 b = std::min(b, block);
217 int flags = DVDINPUT_READ_DECRYPT;
221 flags |= DVDCSS_SEEK_KEY;
228 LOG(VB_GENERAL, LOG_ERR,
LOC +
"SafeRead DVDReadBlocks error");
235 block -=
static_cast<uint>(ret2);
237 (
static_cast<ptrdiff_t
>(ret2) * DVD_VIDEO_LB_LEN);
245 LOG(VB_GENERAL, LOG_ERR,
LOC +
"SafeRead DVDReadBlocks error");
253 return ret * DVD_VIDEO_LB_LEN;
261 if (SEEK_END == Whence)
267 auto block =
static_cast<uint32_t
>(Position / DVD_VIDEO_LB_LEN);
268 if (
static_cast<int64_t
>(block) * DVD_VIDEO_LB_LEN != Position)
270 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Seek not block aligned");
284 long long ret =
static_cast<long long>(
m_pos) * DVD_VIDEO_LB_LEN;
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
bool operator<(const BlockRange rhs) const
uint32_t Start(void) const
BlockRange(uint32_t Start, uint32_t Count, int Title)
QList< BlockRange > m_blocks
bool IsOpen(void) const override
long long SeekInternal(long long Position, int Whence) override
bool OpenFile(const QString &Filename, std::chrono::milliseconds Retry=0ms) override
long long GetReadPosition(void) const override
~MythDVDStream() override
MythDVDStream(const QString &Filename)
int SafeRead(void *Buffer, uint Size) override
int InternalUDFReadBlocksRaw(dvd_reader_t *device, uint32_t lb_number, size_t block_count, unsigned char *data, int encrypted)
uint32_t Len2Blocks(uint32_t Length)
Roundup bytes to DVD blocks.
dvd_reader_s dvd_reader_t
#define LOG(_MASK_, _LEVEL_, _QSTRING_)