7 #include <QCoreApplication>
24 #include "libbluray/bluray.h"
32 #include <libbluray/log_control.h>
33 #include <libbluray/meta_data.h>
34 #include <libbluray/overlay.h>
35 #include <libbluray/keys.h>
37 #include "util/log_control.h"
38 #include "libbluray/bdnav/meta_data.h"
39 #include "libbluray/decoders/overlay.h"
40 #include "libbluray/keys.h"
43 #define LOC QString("BDBuffer: ")
68 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(Message).trimmed());
71 static int BDRead(
void *Handle,
void *
Buf,
int LBA,
int NumBlocks)
73 if (
MythFileSeek(*(
static_cast<int*
>(Handle)), LBA * 2048LL, SEEK_SET) != -1)
75 static_cast<size_t>(NumBlocks) * 2048) / 2048);
81 m_overlayPlanes(2, nullptr)
100 bd_free_title_info(it.value());
103 bd_free_title_info(it.value());
127 ((Whence == SEEK_SET && Position ==
m_readPos) || (Whence == SEEK_CUR && Position == 0)))
135 long long newposition = (SEEK_SET == Whence) ? Position :
m_readPos + Position;
140 if ((SEEK_END == Whence) || ((SEEK_CUR == Whence) && newposition != 0))
162 QString cmd = QString(
"Seek(%1, %2)").arg(Position)
163 .arg((Whence == SEEK_SET) ?
"SEEK_SET" :
164 ((Whence == SEEK_CUR) ?
"SEEK_CUR" :
"SEEK_END"));
165 LOG(VB_GENERAL, LOG_ERR,
LOC + cmd +
" Failed" +
ENO);
175 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Seeking to '%1'").arg(Position));
178 return static_cast<uint64_t
>(bd_seek_time(
m_bdnav, Position));
213 else if (Actions.contains(
ACTION_0))
215 else if (Actions.contains(
ACTION_1))
217 else if (Actions.contains(
ACTION_2))
219 else if (Actions.contains(
ACTION_3))
221 else if (Actions.contains(
ACTION_4))
223 else if (Actions.contains(
ACTION_5))
225 else if (Actions.contains(
ACTION_6))
227 else if (Actions.contains(
ACTION_7))
229 else if (Actions.contains(
ACTION_8))
231 else if (Actions.contains(
ACTION_9))
250 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
277 QString
filename = QDir(QDir::cleanPath(Filename)).canonicalPath();
280 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"%1 nonexistent").arg(Filename));
285 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Opened MythBDBuffer device at %1")
290 bd_set_debug_mask(DBG_CRIT | DBG_NAV | DBG_BLURAY);
308 QString keyfile = QString(
"%1/KEYDB.cfg").arg(
GetConfDir());
339 const meta_dl *metaDiscLibrary = bd_get_meta(
m_bdnav);
343 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Disc Title: %1 (%2)")
344 .arg(metaDiscLibrary->di_name, metaDiscLibrary->language_code));
345 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Alternative Title: %1")
346 .arg(metaDiscLibrary->di_alternative));
347 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Disc Number: %1 of %2")
348 .arg(metaDiscLibrary->di_set_number).arg(metaDiscLibrary->di_num_sets));
356 const BLURAY_DISC_INFO *discinfo = bd_get_disc_info(
m_bdnav);
359 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to retrieve disc info");
368 if ((discinfo->aacs_detected && !discinfo->aacs_handled) ||
369 (discinfo->bdplus_detected && !discinfo->bdplus_handled))
385 bd_set_player_setting(
m_bdnav, BLURAY_PLAYER_SETTING_PARENTAL, 99);
390 std::string country = QScountry.toLatin1().data();
391 bd_set_player_setting_str(
m_bdnav, BLURAY_PLAYER_SETTING_AUDIO_LANG, langpref.c_str());
393 bd_set_player_setting_str(
m_bdnav, BLURAY_PLAYER_SETTING_PG_LANG, langpref.c_str());
395 bd_set_player_setting_str(
m_bdnav, BLURAY_PLAYER_SETTING_MENU_LANG, langpref.c_str());
397 bd_set_player_setting_str(
m_bdnav, BLURAY_PLAYER_SETTING_COUNTRY_CODE, country.c_str());
401 bd_set_player_setting(
m_bdnav, BLURAY_PLAYER_SETTING_REGION_CODE, regioncode);
403 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Using %1 as keyfile...").arg(keyfile));
406 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Retrieving title list (please wait).");
414 m_lastError = tr(
"Unable to find any Blu-ray compatible titles");
423 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"*** Blu-ray Disc Information ***");
424 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"First Play Supported: %1")
425 .arg(discinfo->first_play_supported ?
"yes" :
"no"));
426 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Top Menu Supported: %1")
427 .arg(discinfo->top_menu_supported ?
"yes" :
"no"));
428 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Number of HDMV Titles: %1")
429 .arg(discinfo->num_hdmv_titles));
430 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Number of BD-J Titles: %1")
431 .arg(discinfo->num_bdj_titles));
432 if (discinfo->num_bdj_titles && discinfo->bdj_detected)
434 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"BD-J Supported: %1")
435 .arg(discinfo->bdj_handled ?
"yes" :
"no"));
437 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Number of Unsupported Titles: %1")
438 .arg(discinfo->num_unsupported_titles));
439 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"AACS present on disc: %1")
440 .arg(discinfo->aacs_detected ?
"yes" :
"no"));
441 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"libaacs used: %1")
442 .arg(discinfo->libaacs_detected ?
"yes" :
"no"));
443 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"AACS handled: %1")
444 .arg(discinfo->aacs_handled ?
"yes" :
"no"));
445 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"BD+ present on disc: %1")
446 .arg(discinfo->bdplus_detected ?
"yes" :
"no"));
447 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"libbdplus used: %1")
448 .arg(discinfo->libbdplus_detected ?
"yes" :
"no"));
449 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"BD+ handled: %1")
450 .arg(discinfo->bdplus_handled ?
"yes" :
"no"));
487 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Using HDMV navigation mode.");
496 LOG(VB_GENERAL, LOG_INFO,
LOC +
"Using title navigation mode.");
499 uint64_t titleLength = 0;
500 BLURAY_TITLE_INFO *titleInfo =
nullptr;
507 if (titleLength == 0 || (titleInfo->duration > titleLength))
510 titleLength = titleInfo->duration;
520 m_lastError = tr(
"Unable to find any usable Blu-ray titles");
543 return static_cast<long long>(bd_tell(
m_bdnav));
563 return bd_get_current_chapter(
m_bdnav);
573 return duration_cast<std::chrono::milliseconds>(
start);
582 return duration_cast<std::chrono::seconds>(
start);
613 if (numTitles <= 0 || Title < 0 || Title >=
static_cast<int>(numTitles))
616 BLURAY_TITLE_INFO *info =
GetTitleInfo(
static_cast<uint32_t
>(Title));
646 bd_select_title(
m_bdnav, Index);
656 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"SwitchPlaylist - start");
664 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"SwitchPlaylist - end");
680 BLURAY_TITLE_INFO* result = bd_get_title_info(
m_bdnav, Index, 0);
683 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Found title %1 info").arg(Index));
699 BLURAY_TITLE_INFO* result = bd_get_playlist_info(
m_bdnav, Index, 0);
702 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Found playlist %1 info").arg(Index));
725 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"New title info: Index %1 Playlist: %2 Duration: %3 ""Chapters: %5")
727 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"New title info: Clips: %1 Angles: %2 Title Size: %3 Frame Rate %4")
731 for (
uint i = 0; i < chapter_count; i++)
734 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Chapter %1 found @ [%2]->%3")
737 QString::number(framenum)));
740 int still = BLURAY_STILL_NONE;
741 std::chrono::seconds time = 0s;
746 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
747 QString(
"Clip %1 stillmode %2 stilltime %3 videostreams %4 audiostreams %5 igstreams %6")
760 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Warning: more than 1 clip, following still "
761 "frame analysis may be wrong");
764 if (still == BLURAY_STILL_TIME)
766 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Entering still frame (%1 seconds) UNSUPPORTED").arg(time.count()));
769 else if (still == BLURAY_STILL_INFINITE)
771 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Entering infinite still frame.");
791 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Switching to Angle '%1'").arg(Angle));
792 bd_seamless_angle_change(
m_bdnav, Angle);
805 return bd_get_title_size(
m_bdnav);
811 int64_t newTimestamp = Timestamp;
812 if ((newTimestamp != AV_NOPTS_VALUE) && (newTimestamp >=
m_timeDiff))
826 result = bd_read_ext(
m_bdnav,
static_cast<unsigned char*
>(
Buffer),
827 static_cast<int>(Size), &event);
842 result = bd_read(
m_bdnav,
static_cast<unsigned char*
>(
Buffer),
static_cast<int>(Size));
879 case BLURAY_VIDEO_RATE_24000_1001:
return 23.97;
880 case BLURAY_VIDEO_RATE_24:
return 24.00;
881 case BLURAY_VIDEO_RATE_25:
return 25.00;
882 case BLURAY_VIDEO_RATE_30000_1001:
return 29.97;
883 case BLURAY_VIDEO_RATE_50:
return 50.00;
884 case BLURAY_VIDEO_RATE_60000_1001:
return 59.94;
900 const BLURAY_STREAM_INFO* stream =
FindStream(
StreamID, clip.audio_streams, clip.audio_stream_count);
903 const uint8_t* lang = stream->lang;
908 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Audio Lang: 0x%1 Code: %2")
920 const BLURAY_STREAM_INFO* stream =
FindStream(
StreamID, clip.pg_streams, clip.pg_stream_count);
923 const uint8_t* lang = stream->lang;
928 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Subtitle Lang: 0x%1 Code: %2")
935 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Key %1 (pts %2)").arg(Key).arg(Pts.count()));
940 bd_user_input(
m_bdnav, Pts.count(),
static_cast<uint32_t
>(Key));
947 if (Pts <= 0 || X == 0 || Y == 0)
949 bd_mouse_select(
m_bdnav, Pts, X, Y);
961 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Top Menu not supported");
965 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"GoToMenu %1").arg(Menu));
967 if (Menu.compare(
"root") == 0)
969 if (bd_menu_call(
m_bdnav, Pts.count()))
971 LOG(VB_PLAYBACK, LOG_INFO,
LOC +QString(
"Invoked Top Menu (pts %1)").arg(Pts.count()));
975 else if (Menu.compare(
"popup") == 0)
1007 switch (
Event.event) {
1010 case BD_EVENT_ERROR:
1011 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_ERROR %1").arg(
Event.param));
1013 case BD_EVENT_ENCRYPTED:
1014 LOG(VB_GENERAL, LOG_ERR,
LOC +
"EVENT_ENCRYPTED, playback will fail.");
1019 case BD_EVENT_ANGLE:
1020 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_ANGLE %1").arg(
Event.param));
1023 case BD_EVENT_TITLE:
1024 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_TITLE %1 (old %2)")
1028 case BD_EVENT_END_OF_TITLE:
1032 case BD_EVENT_PLAYLIST:
1033 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_PLAYLIST %1 (old %2)")
1040 case BD_EVENT_PLAYITEM:
1041 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_PLAYITEM %1").arg(
Event.param));
1047 int64_t diff = in - out;
1050 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC + QString(
"PTS discontinuity - waiting for decoder: this %1, last %2, diff %3")
1051 .arg(in).arg(out).arg(diff));
1062 case BD_EVENT_CHAPTER:
1064 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_CHAPTER %1").arg(
Event.param));
1067 case BD_EVENT_PLAYMARK:
1069 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_PLAYMARK"));
1073 case BD_EVENT_PLAYLIST_STOP:
1075 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"ToDo EVENT_PLAYLIST_STOP %1")
1079 case BD_EVENT_STILL:
1080 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_STILL %1").arg(
Event.param));
1082 case BD_EVENT_STILL_TIME:
1085 std::this_thread::sleep_for(10ms);
1088 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SEEK"));
1093 case BD_EVENT_AUDIO_STREAM:
1094 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_AUDIO_STREAM %1").arg(
Event.param));
1097 case BD_EVENT_IG_STREAM:
1098 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_IG_STREAM %1").arg(
Event.param));
1101 case BD_EVENT_PG_TEXTST_STREAM:
1102 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_PG_TEXTST_STREAM %1").arg(
Event.param));
1105 case BD_EVENT_SECONDARY_AUDIO_STREAM:
1106 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SECONDARY_AUDIO_STREAM %1").arg(
Event.param));
1109 case BD_EVENT_SECONDARY_VIDEO_STREAM:
1110 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SECONDARY_VIDEO_STREAM %1").arg(
Event.param));
1114 case BD_EVENT_PG_TEXTST:
1115 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_PG_TEXTST %1")
1116 .arg(
Event.param ?
"enable" :
"disable"));
1119 case BD_EVENT_SECONDARY_AUDIO:
1120 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SECONDARY_AUDIO %1")
1121 .arg(
Event.param ?
"enable" :
"disable"));
1124 case BD_EVENT_SECONDARY_VIDEO:
1125 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SECONDARY_VIDEO %1")
1126 .arg(
Event.param ?
"enable" :
"disable"));
1129 case BD_EVENT_SECONDARY_VIDEO_SIZE:
1130 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_SECONDARY_VIDEO_SIZE %1")
1131 .arg(
Event.param==0 ?
"PIP" :
"fullscreen"));
1139 std::this_thread::sleep_for(40ms);
1144 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"EVENT_MENU %1")
1145 .arg(
Event.param==0 ?
"no" :
"yes"));
1149 case BD_EVENT_KEY_INTEREST_TABLE:
1151 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"ToDo EVENT_KEY_INTEREST_TABLE %1")
1155 case BD_EVENT_UO_MASK_CHANGED:
1157 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"ToDo EVENT_UO_MASK_CHANGED %1")
1162 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"Unknown Event! %1 %2")
1181 BLURAY_STREAM_INFO* Streams,
1184 const BLURAY_STREAM_INFO* stream =
nullptr;
1185 for (
int i = 0; i < StreamCount && !stream; i++)
1187 stream = &Streams[i];
1196 if (
FindStream(StreamId, clip.audio_streams, clip.audio_stream_count) ||
1197 FindStream(StreamId, clip.video_streams, clip.video_stream_count) ||
1198 FindStream(StreamId, clip.ig_streams, clip.ig_stream_count) ||
1199 FindStream(StreamId, clip.pg_streams, clip.pg_stream_count) ||
1200 FindStream(StreamId, clip.sec_audio_streams, clip.sec_audio_stream_count) ||
1201 FindStream(StreamId, clip.sec_video_streams, clip.sec_video_stream_count))
1230 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Waiting for player's buffers to drain");
1234 std::this_thread::sleep_for(10ms);
1237 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Player wait state was not cleared");
1251 LOG(VB_PLAYBACK, LOG_INFO,
LOC +
"Starting from beginning...");
1263 return !SerialNum.isEmpty();
1274 State = QString(
"title:%1,time:%2,angle:%3").arg(title).arg(time.count()).arg(angle);
1277 return !
State.isEmpty();
1284 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
1285 QStringList states =
State.split(
",", QString::SkipEmptyParts);
1287 QStringList states =
State.split(
",", Qt::SkipEmptyParts);
1289 QHash<QString, uint64_t> settings;
1291 for (
const QString& state : states)
1293 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
1294 QStringList keyvalue = state.split(
":", QString::SkipEmptyParts);
1296 QStringList keyvalue = state.split(
":", Qt::SkipEmptyParts);
1298 if (keyvalue.length() != 2)
1300 LOG(VB_PLAYBACK, LOG_ERR,
LOC + QString(
"Invalid BD state: %1 (%2)")
1301 .arg(state,
State));
1305 settings[keyvalue[0]] = keyvalue[1].toULongLong();
1310 if (settings.contains(
"title") && settings.contains(
"time"))
1312 uint32_t title =
static_cast<uint32_t
>(settings[
"title"]);
1313 uint64_t time = settings[
"time"];
1316 if (settings.contains(
"angle"))
1317 angle = settings[
"angle"];
1368 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"--------------------"));
1369 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay->cmd = %1, %2")
1370 .arg(Overlay->cmd).arg(Overlay->plane));
1371 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay rect = (%1,%2,%3,%4)")
1372 .arg(Overlay->x).arg(Overlay->y).arg(Overlay->w).arg(Overlay->h));
1373 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay->pts = %1")
1374 .arg(Overlay->pts));
1375 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"update palette = %1")
1376 .arg(Overlay->palette_update_flag ?
"yes":
"no"));
1380 switch(Overlay->cmd)
1382 case BD_OVERLAY_INIT:
1388 case BD_OVERLAY_CLOSE:
1403 case BD_OVERLAY_HIDE:
1404 case BD_OVERLAY_CLEAR:
1408 case BD_OVERLAY_WIPE:
1410 osd->
Wipe(Overlay->x, Overlay->y, Overlay->w, Overlay->h);
1412 case BD_OVERLAY_DRAW:
1415 const BD_PG_RLE_ELEM *rlep = Overlay->img;
1416 int actual = Overlay->w * Overlay->h;
1417 uint8_t *data = osd->
m_image.bits();
1418 data = &data[(Overlay->y * osd->
m_image.bytesPerLine()) + Overlay->x];
1419 for (
int i = 0; i < actual; i += rlep->len, rlep++)
1421 int dst_y = (i / Overlay->w) * osd->
m_image.bytesPerLine();
1422 int dst_x = (i % Overlay->w);
1423 memset(data + dst_y + dst_x, rlep->color, rlep->len);
1429 case BD_OVERLAY_FLUSH:
1433 newOverlay->m_image = osd->
m_image.convertToFormat(QImage::Format_ARGB32);
1434 newOverlay->m_pts = Overlay->pts;
1448 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"--------------------"));
1449 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay->cmd,plane = %1, %2")
1450 .arg(Overlay->cmd).arg(Overlay->plane));
1451 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay->(x,y,w,h) = %1,%2,%3x%4 - %5")
1452 .arg(Overlay->x).arg(Overlay->y).arg(Overlay->w).arg(Overlay->h).arg(Overlay->stride));
1453 LOG(VB_PLAYBACK, LOG_DEBUG, QString(
"overlay->pts = %1").arg(Overlay->pts));
1456 switch(Overlay->cmd)
1458 case BD_ARGB_OVERLAY_INIT:
1463 case BD_ARGB_OVERLAY_CLOSE:
1478 case BD_ARGB_OVERLAY_DRAW:
1482 uint8_t* data = osd->
m_image.bits();
1483 int32_t srcOffset = 0;
1484 int32_t dstOffset = (Overlay->y * osd->
m_image.bytesPerLine()) + (Overlay->x * 4);
1485 for (
uint16_t y = 0; y < Overlay->h; y++)
1487 memcpy(&data[dstOffset], &Overlay->argb[srcOffset], Overlay->w * 4_UZ);
1488 dstOffset += osd->
m_image.bytesPerLine();
1489 srcOffset += Overlay->stride;
1493 case BD_ARGB_OVERLAY_FLUSH:
1499 newOverlay->m_pts = Overlay->pts;
1504 LOG(VB_PLAYBACK, LOG_ERR, QString(
"Unknown ARGB overlay - %1").arg(Overlay->cmd));