static int _libbdplus_init(BD_DEC *dec, struct dec_dev *dev, BD_ENC_INFO *i, void *regs, void *psr_read, void *psr_write) { if (!dec->bdplus) { return 0; } const uint8_t *vid = libaacs_get_aacs_data(dec->aacs, BD_AACS_MEDIA_VID); const uint8_t *mk = libaacs_get_aacs_data(dec->aacs, BD_AACS_MEDIA_KEY); if (!vid) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "BD+ initialization failed (no AACS ?)\n"); libbdplus_unload(&dec->bdplus); return 0; } if (libbdplus_init(dec->bdplus, dev->root, dev->file_open_bdrom_handle, (void*)dev->pf_file_open_bdrom, vid, mk)) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bdplus_init() failed\n"); i->bdplus_handled = 0; libbdplus_unload(&dec->bdplus); return 0; } BD_DEBUG(DBG_BLURAY, "libbdplus initialized\n"); /* map player memory regions */ libbdplus_mmap(dec->bdplus, 0, regs); libbdplus_mmap(dec->bdplus, 1, (void*)((uint8_t *)regs + sizeof(uint32_t) * 128)); /* connect registers */ libbdplus_psr(dec->bdplus, regs, psr_read, psr_write); i->bdplus_gen = libbdplus_get_gen(dec->bdplus); i->bdplus_date = libbdplus_get_date(dec->bdplus); i->bdplus_handled = 1; if (i->bdplus_date == 0) { // libmmbd -> no menu support BD_DEBUG(DBG_BLURAY | DBG_CRIT, "WARNING: using libmmbd for BD+. On-disc menus will not work.\n"); i->no_menu_support = 1; } return 1; }
void dec_close(BD_DEC **pp) { if (pp && *pp) { BD_DEC *p = *pp; libaacs_unload(&p->aacs); libbdplus_unload(&p->bdplus); X_FREE(*pp); } }
BD_BDPLUS *libbdplus_load(void) { BD_BDPLUS *p = calloc(1, sizeof(BD_BDPLUS)); BD_DEBUG(DBG_BDPLUS, "attempting to load libbdplus\n"); p->h_libbdplus = _libbdplus_open(); if (!p->h_libbdplus) { X_FREE(p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loading libbdplus (%p)\n", p->h_libbdplus); *(void **)(&p->event) = dl_dlsym(p->h_libbdplus, "bdplus_event"); *(void **)(&p->m2ts) = dl_dlsym(p->h_libbdplus, "bdplus_m2ts"); *(void **)(&p->seek) = dl_dlsym(p->h_libbdplus, "bdplus_seek"); *(void **)(&p->fixup) = dl_dlsym(p->h_libbdplus, "bdplus_fixup"); *(void **)(&p->m2ts_close) = dl_dlsym(p->h_libbdplus, "bdplus_m2ts_close"); if (!p->m2ts) { /* Old API */ *(void **)(&p->title) = dl_dlsym(p->h_libbdplus, "bdplus_set_title"); if (!p->title) { *(void **)(&p->title) = dl_dlsym(p->h_libbdplus, "bdplus_set_m2ts"); } } if (!p->seek || !p->fixup || !((p->m2ts && p->m2ts_close) || p->title)) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "libbdplus dlsym failed! (%p)\n", p->h_libbdplus); libbdplus_unload(&p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loaded libbdplus (%p)\n", p->h_libbdplus); if (file_open != file_open_default()) { BD_DEBUG(DBG_BLURAY, "Registering libbdplus filesystem handler %p (%p)\n", (void *)(intptr_t)file_open, p->h_libbdplus); DL_CALL(p->h_libbdplus, bdplus_register_file, file_open); } return p; }
BD_BDPLUS *libbdplus_load(void) { BD_BDPLUS *p = calloc(1, sizeof(BD_BDPLUS)); BD_DEBUG(DBG_BDPLUS, "attempting to load libbdplus\n"); p->h_libbdplus = _libbdplus_open(); if (!p->h_libbdplus) { X_FREE(p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loading libbdplus (%p)\n", p->h_libbdplus); *(void **)(&p->event) = dl_dlsym(p->h_libbdplus, "bdplus_event"); *(void **)(&p->m2ts) = dl_dlsym(p->h_libbdplus, "bdplus_m2ts"); *(void **)(&p->seek) = dl_dlsym(p->h_libbdplus, "bdplus_seek"); *(void **)(&p->fixup) = dl_dlsym(p->h_libbdplus, "bdplus_fixup"); *(void **)(&p->m2ts_close) = dl_dlsym(p->h_libbdplus, "bdplus_m2ts_close"); if (!p->m2ts) { /* Old API */ *(void **)(&p->title) = dl_dlsym(p->h_libbdplus, "bdplus_set_title"); if (!p->title) { *(void **)(&p->title) = dl_dlsym(p->h_libbdplus, "bdplus_set_m2ts"); } } if (!p->seek || !p->fixup || !((p->m2ts && p->m2ts_close) || p->title)) { BD_DEBUG(DBG_BLURAY | DBG_CRIT, "libbdplus dlsym failed! (%p)\n", p->h_libbdplus); libbdplus_unload(&p); return NULL; } BD_DEBUG(DBG_BLURAY, "Loaded libbdplus (%p)\n", p->h_libbdplus); return p; }