6 #include <QMutexLocker>
8 #include <QtAlgorithms>
19 #include "dvdread/dvd_reader.h"
20 #include "dvdread/dvd_udf.h"
22 #include "dvd_input.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;