bool BlurayMetadata::ParseDisc(void) { if (!m_bdnav && !OpenDisc()) return false; m_metadata = bd_get_meta(m_bdnav); if (!m_metadata) return false; m_title = QString(m_metadata->di_name); m_alttitle = QString(m_metadata->di_alternative); m_language = QString(m_metadata->language_code); m_discnumber = m_metadata->di_set_number; m_disctotal = m_metadata->di_num_sets; for (unsigned i = 0; i < m_metadata->toc_count; i++) { uint num = m_metadata->toc_entries[i].title_number; QString title = QString(m_metadata->toc_entries[i].title_name); QPair<uint,QString> ret(num,title); m_titles.append(ret); } for (unsigned i = 0; i < m_metadata->thumb_count; i++) { QString filepath = QString("%1/BDMV/META/DL/%2") .arg(m_path) .arg(m_metadata->thumbnails[i].path); m_images.append(filepath); } return true; }
bool BlurayMetadata::ParseDisc(void) { if (!OpenDisc() && !m_bdnav) return false; const meta_dl *metadata = bd_get_meta(m_bdnav); if (metadata) { m_title = QString(metadata->di_name); m_alttitle = QString(metadata->di_alternative); m_language = QString(metadata->language_code); m_discnumber = metadata->di_set_number; m_disctotal = metadata->di_num_sets; for (unsigned i = 0; i < metadata->toc_count; i++) { uint num = metadata->toc_entries[i].title_number; QString title = QString(metadata->toc_entries[i].title_name); QPair<uint,QString> ret(num,title); m_titles.append(ret); } for (unsigned i = 0; i < metadata->thumb_count; i++) { QString filepath = QString("%1/BDMV/META/DL/%2") .arg(m_path) .arg(metadata->thumbnails[i].path); m_images.append(filepath); } } const BLURAY_DISC_INFO *discinfo = bd_get_disc_info(m_bdnav); if (discinfo) { m_topMenuSupported = discinfo->top_menu_supported; m_firstPlaySupported = discinfo->first_play_supported; m_numHDMVTitles = discinfo->num_hdmv_titles; m_numBDJTitles = discinfo->num_bdj_titles; m_numUnsupportedTitles = discinfo->num_unsupported_titles; m_aacsDetected = discinfo->aacs_detected; m_libaacsDetected = discinfo->libaacs_detected; m_aacsHandled = discinfo->aacs_handled; m_bdplusDetected = discinfo->bdplus_detected; m_libbdplusDetected = discinfo->libbdplus_detected; m_bdplusHandled = discinfo->bdplus_handled; } return true; }
bool BDRingBuffer::GetNameAndSerialNum(QString &name, QString &serial) { if (!bdnav) return false; const meta_dl *metaDiscLibrary = bd_get_meta(bdnav); if (!metaDiscLibrary) return false; name = QString(metaDiscLibrary->di_name); serial = QString::number(metaDiscLibrary->di_set_number); if (name.isEmpty() && serial.isEmpty()) return false; return true; }
bool BDRingBuffer::OpenFile(const QString &lfilename, uint retry_ms) { filename = lfilename; VERBOSE(VB_IMPORTANT, LOC + QString("Opened BDRingBuffer device at %1") .arg(filename.toLatin1().data())); // Ask mythiowrapper to update this object on file open progress. Opening // a bluray disc can involve opening several hundred files which can take // several minutes when the disc structure is remote. The callback allows // us to 'kick' the main UI - as the 'please wait' widget is still visible // at this stage mythfile_open_register_callback(filename.toLatin1().data(), this, file_opened_callback); QMutexLocker locker(&m_infoLock); rwlock.lockForWrite(); if (bdnav) close(); QString keyfile = QString("%1/KEYDB.cfg").arg(GetConfDir()); QByteArray keyarray = keyfile.toAscii(); const char *keyfilepath = keyarray.data(); bdnav = bd_open(filename.toLatin1().data(), keyfilepath); if (!bdnav) { rwlock.unlock(); mythfile_open_register_callback(filename.toLatin1().data(), this, NULL); return false; } m_metaDiscLibrary = bd_get_meta(bdnav); if (m_metaDiscLibrary) { VERBOSE(VB_GENERAL, LOC + QString("Disc Title: %1 (%2)") .arg(m_metaDiscLibrary->di_name) .arg(m_metaDiscLibrary->language_code)); VERBOSE(VB_GENERAL, LOC + QString("Alternative Title: %1") .arg(m_metaDiscLibrary->di_alternative)); VERBOSE(VB_GENERAL, LOC + QString("Disc Number: %1 of %2") .arg(m_metaDiscLibrary->di_set_number) .arg(m_metaDiscLibrary->di_num_sets)); } // Check disc to see encryption status, menu and navigation types. m_topMenuSupported = false; m_firstPlaySupported = false; const BLURAY_DISC_INFO *discinfo = bd_get_disc_info(bdnav); if (discinfo) { m_topMenuSupported = discinfo->top_menu_supported; m_firstPlaySupported = discinfo->first_play_supported; VERBOSE(VB_PLAYBACK, LOC + QString("*** Blu-ray Disc Information ***")); VERBOSE(VB_PLAYBACK, LOC + QString("First Play Supported: %1") .arg(discinfo->first_play_supported ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("Top Menu Supported: %1") .arg(discinfo->top_menu_supported ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("Number of HDMV Titles: %1") .arg(discinfo->num_hdmv_titles)); VERBOSE(VB_PLAYBACK, LOC + QString("Number of BD-J Titles: %1") .arg(discinfo->num_bdj_titles)); VERBOSE(VB_PLAYBACK, LOC + QString("Number of Unsupported Titles: %1") .arg(discinfo->num_unsupported_titles)); VERBOSE(VB_PLAYBACK, LOC + QString("AACS present on disc: %1") .arg(discinfo->aacs_detected ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("libaacs used: %1") .arg(discinfo->libaacs_detected ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("AACS handled: %1") .arg(discinfo->aacs_handled ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("BD+ present on disc: %1") .arg(discinfo->bdplus_detected ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("libbdplus used: %1") .arg(discinfo->libbdplus_detected ? "yes" : "no")); VERBOSE(VB_PLAYBACK, LOC + QString("BD+ handled: %1") .arg(discinfo->bdplus_handled ? "yes" : "no")); } // The following settings affect HDMV navigation // (default audio track selection, // parental controls, menu language, etc. They are not yet used. // Set parental level "age" to 99 for now. TODO: Add support for FE level bd_set_player_setting(bdnav, BLURAY_PLAYER_SETTING_PARENTAL, 99); // Set preferred language to FE guide language const char *langpref = gCoreContext->GetSetting( "ISO639Language0", "eng").toLatin1().data(); QString QScountry = gCoreContext->GetLocale()->GetCountryCode().toLower(); const char *country = QScountry.toLatin1().data(); bd_set_player_setting_str( bdnav, BLURAY_PLAYER_SETTING_AUDIO_LANG, langpref); // Set preferred presentation graphics language to the FE guide language bd_set_player_setting_str(bdnav, BLURAY_PLAYER_SETTING_PG_LANG, langpref); // Set preferred menu language to the FE guide language bd_set_player_setting_str(bdnav, BLURAY_PLAYER_SETTING_MENU_LANG, langpref); // Set player country code via MythLocale. (not a region setting) bd_set_player_setting_str( bdnav, BLURAY_PLAYER_SETTING_COUNTRY_CODE, country); int regioncode = 0; regioncode = gCoreContext->GetNumSetting("BlurayRegionCode"); if (regioncode > 0) bd_set_player_setting(bdnav, BLURAY_PLAYER_SETTING_REGION_CODE, regioncode); VERBOSE(VB_IMPORTANT, LOC + QString("Using %1 as keyfile...") .arg(QString(keyfilepath))); // Return an index of relevant titles (excludes dupe clips + titles) VERBOSE(VB_GENERAL, LOC + QString("Retrieving title list (please wait).")); m_numTitles = bd_get_titles(bdnav, TITLES_RELEVANT); VERBOSE(VB_GENERAL, LOC + QString("Found %1 titles.").arg(m_numTitles)); m_mainTitle = 0; m_currentTitleLength = 0; m_titlesize = 0; m_currentTime = 0; m_currentTitleInfo = NULL; m_currentTitleAngleCount = 0; // Mostly event-driven values below m_currentAngle = 0; m_currentTitle = 0; m_currentPlaylist = 0; m_currentPlayitem = 0; m_currentChapter = 0; m_currentAudioStream = 0; m_currentIGStream = 0; m_currentPGTextSTStream = 0; m_currentSecondaryAudioStream = 0; m_currentSecondaryVideoStream = 0; m_PGTextSTEnabled = false; m_secondaryAudioEnabled = false; m_secondaryVideoEnabled = false; m_secondaryVideoIsFullscreen = false; m_stillMode = BLURAY_STILL_NONE; m_stillTime = 0; m_inMenu = false; // First, attempt to initialize the disc in HDMV navigation mode. // If this fails, fall back to the traditional built-in title switching // mode. if (m_tryHDMVNavigation && m_firstPlaySupported && bd_play(bdnav)) { VERBOSE(VB_IMPORTANT, LOC + QString("Using HDMV navigation mode.")); m_isHDMVNavigation = true; // Register the Menu Overlay Callback bd_register_overlay_proc(bdnav, this, HandleOverlayCallback); } else { VERBOSE(VB_IMPORTANT, LOC + QString("Using title navigation mode.")); // Loop through the relevant titles and find the longest uint64_t titleLength = 0; uint64_t margin = 90000 << 4; // approx 30s BLURAY_TITLE_INFO *titleInfo = NULL; for( unsigned i = 0; i < m_numTitles; ++i) { titleInfo = GetTitleInfo(i); if (titleLength == 0 || (titleInfo->duration > (titleLength + margin))) { m_mainTitle = titleInfo->idx; titleLength = titleInfo->duration; } } SwitchTitle(m_mainTitle); } readblocksize = BD_BLOCK_SIZE * 62; setswitchtonext = false; ateof = false; commserror = false; numfailures = 0; rawbitrate = 8000; CalcReadAheadThresh(); rwlock.unlock(); mythfile_open_register_callback(filename.toLatin1().data(), this, NULL); return true; }
static void bdmv_metadata_thread (GSimpleAsyncResult *result, GObject *object, GCancellable *cancellable) { BLURAY *bd; META_DL *meta; GError *error; GFile *file; char *disc_root; char *icon; char *name; const char *lang; file = G_FILE (object); disc_root = g_file_get_path (file); bd = bd_open (disc_root, NULL); g_free (disc_root); if (bd == NULL) { error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, "Device is not a Blu-Ray disc"); goto error; } lang = get_iso_639_3_for_locale (); if (lang != NULL) bd_set_player_setting_str (bd, BLURAY_PLAYER_SETTING_MENU_LANG, lang); meta = bd_get_meta (bd); if (meta == NULL) { error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, "Device is not a Blu-Ray disc, or has no metadata"); bd_close (bd); goto error; } name = icon = NULL; if (meta != NULL) { if (meta->di_name && *meta->di_name) name = g_strdup (meta->di_name); icon = g_strdup (get_icon (meta)); } /* We're missing either an icon, or the name */ if (!name || !icon) { bd_set_player_setting_str (bd, BLURAY_PLAYER_SETTING_MENU_LANG, "eng"); meta = bd_get_meta (bd); if (meta != NULL && name == NULL && meta->di_name && *meta->di_name) name = meta->di_name; if (meta != NULL && icon == NULL) icon = g_strdup (get_icon (meta)); } /* Set the results */ if (icon != NULL) { char *icon_path; GFile *icon_file; icon_path = g_strdup_printf ("BDMV/META/DL/%s", icon); g_free (icon); icon_file = g_file_resolve_relative_path (file, icon_path); g_free (icon_path); g_simple_async_result_set_op_res_gpointer (result, g_file_icon_new (icon_file), NULL); } else { g_simple_async_result_set_op_res_gpointer (result, NULL, NULL); } if (name != NULL) g_object_set_data_full (G_OBJECT (result), "name", name, g_free); bd_close (bd); return; error: g_simple_async_result_set_from_error (result, error); g_simple_async_result_set_op_res_gpointer (result, NULL, NULL); g_error_free (error); }