/* * register hook */ static void _process_psr_event(void *handle, BD_PSR_EVENT *ev) { GRAPHICS_CONTROLLER *gc = (GRAPHICS_CONTROLLER *)handle; if (ev->ev_type == BD_PSR_SAVE) { BD_DEBUG(DBG_GC, "PSR SAVE event\n"); /* save menu page state */ bd_mutex_lock(&gc->mutex); _save_page_state(gc); bd_mutex_unlock(&gc->mutex); return; } if (ev->ev_type == BD_PSR_RESTORE) { switch (ev->psr_idx) { case PSR_SELECTED_BUTTON_ID: return; case PSR_MENU_PAGE_ID: /* restore menus */ bd_mutex_lock(&gc->mutex); _restore_page_state(gc); bd_mutex_unlock(&gc->mutex); return; default: /* others: ignore */ return; } } }
int bd_mutex_destroy(BD_MUTEX *p) { bd_mutex_lock(p); bd_mutex_unlock(p); if (pthread_mutex_destroy(&p->mutex)) { BD_DEBUG(DBG_BLURAY|DBG_CRIT, "bd_mutex_destroy() failed !\n"); return -1; } return 0; }
void disc_update(BD_DISC *p, const char *overlay_root) { bd_mutex_lock(&p->ovl_mutex); X_FREE(p->overlay_root); if (overlay_root) { p->overlay_root = str_dup(overlay_root); } bd_mutex_unlock(&p->ovl_mutex); }
JNIEXPORT jint JNICALL Java_org_videolan_Libbluray_writePSRN(JNIEnv * env, jclass cls, jlong np, jint num, jint value) { BDJAVA* bdj = (BDJAVA*)(intptr_t)np; BD_DEBUG(DBG_JNI, "writePSRN(%d,%d)\n", (int)num, (int)value); bd_mutex_lock((BD_MUTEX*)bdj->bd); int res = bd_psr_write(bdj->reg, num, value); bd_mutex_unlock((BD_MUTEX*)bdj->bd); return res; }
int gc_decode_ts(GRAPHICS_CONTROLLER *gc, uint16_t pid, uint8_t *block, unsigned num_blocks, int64_t stc) { if (!gc) { GC_TRACE("gc_decode_ts(): no graphics controller\n"); return -1; } if (pid >= 0x1400 && pid < 0x1500) { /* IG stream */ if (!gc->igp) { gc->igp = graphics_processor_init(); } bd_mutex_lock(&gc->mutex); if (!graphics_processor_decode_ts(gc->igp, &gc->igs, pid, block, num_blocks, stc)) { /* no new complete display set */ bd_mutex_unlock(&gc->mutex); return 0; } if (!gc->igs || !gc->igs->complete) { bd_mutex_unlock(&gc->mutex); return 0; } bd_mutex_unlock(&gc->mutex); return 1; } else if (pid >= 0x1200 && pid < 0x1300) { /* PG stream */ if (!gc->pgp) { gc->pgp = graphics_processor_init(); } graphics_processor_decode_ts(gc->pgp, &gc->pgs, pid, block, num_blocks, stc); if (!gc->pgs || !gc->pgs->complete) { return 0; } return 1; } return -1; }
void gc_decode_ts(GRAPHICS_CONTROLLER *gc, uint16_t pid, uint8_t *block, unsigned num_blocks, int64_t stc) { if (!gc) { TRACE("gc_decode_ts(): no graphics controller\n"); return; } if (pid >= 0x1400 && pid < 0x1500) { /* IG stream */ if (!gc->igp) { gc->igp = graphics_processor_init(); } bd_mutex_lock(&gc->mutex); graphics_processor_decode_ts(gc->igp, &gc->igs, pid, block, num_blocks, stc); if (!gc->igs || !gc->igs->complete) { bd_mutex_unlock(&gc->mutex); return; } bd_psr_write(gc->regs, PSR_MENU_PAGE_ID, 0); gc->ig_drawn = 0; gc->popup_visible = 0; _gc_clear_osd(gc, 1); _reset_enabled_button(gc); bd_mutex_unlock(&gc->mutex); } else if (pid >= 0x1200 && pid < 0x1300) { /* PG stream */ if (!gc->pgp) { gc->pgp = graphics_processor_init(); } graphics_processor_decode_ts(gc->pgp, &gc->pgs, pid, block, num_blocks, stc); if (!gc->pgs || !gc->pgs->complete) { return; } } }
static BD_DIR_H *_overlay_open_dir(BD_DISC *p, const char *dir) { BD_DIR_H *dp = NULL; bd_mutex_lock(&p->ovl_mutex); if (p->overlay_root) { char *abs_path = str_printf("%s%s", p->disc_root, dir); if (abs_path) { dp = dir_open_default()(abs_path); X_FREE(abs_path); } } bd_mutex_unlock(&p->ovl_mutex); return dp; }
static BD_FILE_H *_overlay_open_path(BD_DISC *p, const char *rel_path) { BD_FILE_H *fp = NULL; bd_mutex_lock(&p->ovl_mutex); if (p->overlay_root) { char *abs_path = str_printf("%s%s", p->overlay_root, rel_path); if (abs_path) { fp = file_open(abs_path, "rb"); X_FREE(abs_path); } } bd_mutex_unlock(&p->ovl_mutex); return fp; }
int gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS *cmds) { int result = -1; if (cmds) { cmds->num_nav_cmds = 0; cmds->nav_cmds = NULL; cmds->sound_id_ref = -1; cmds->status = GC_STATUS_NONE; } if (!gc) { GC_TRACE("gc_run(): no graphics controller\n"); return result; } bd_mutex_lock(&gc->mutex); /* always accept reset */ switch (ctrl) { case GC_CTRL_RESET: _gc_reset(gc); bd_mutex_unlock(&gc->mutex); return 0; default:; } /* other operations require complete display set */ if (!gc->igs || !gc->igs->ics || !gc->igs->complete) { GC_TRACE("gc_run(): no interactive composition\n"); bd_mutex_unlock(&gc->mutex); return result; } switch (ctrl) { case GC_CTRL_SET_BUTTON_PAGE: _set_button_page(gc, param); break; case GC_CTRL_VK_KEY: if (param != BD_VK_POPUP) { result = _user_input(gc, param, cmds); break; } param = !gc->popup_visible; /* fall thru (BD_VK_POPUP) */ case GC_CTRL_POPUP: if (gc->igs->ics->interactive_composition.ui_model != IG_UI_MODEL_POPUP) { /* not pop-up menu */ break; } gc->popup_visible = !!param; if (gc->popup_visible) { _select_page(gc, 0); } /* fall thru */ case GC_CTRL_NOP: result = _render_page(gc, 0xffff, cmds); break; case GC_CTRL_INIT_MENU: _select_page(gc, 0); _render_page(gc, 0xffff, cmds); break; case GC_CTRL_IG_END: _update_selected_button(gc); _render_page(gc, 0xffff, cmds); break; case GC_CTRL_ENABLE_BUTTON: _enable_button(gc, param, 1); break; case GC_CTRL_DISABLE_BUTTON: _enable_button(gc, param, 0); break; case GC_CTRL_MOUSE_MOVE: result = _mouse_move(gc, param >> 16, param & 0xffff, cmds); break; case GC_CTRL_RESET: /* already handled */ break; } if (cmds) { if (gc->igs->ics->interactive_composition.ui_model == IG_UI_MODEL_POPUP) { cmds->status |= GC_STATUS_POPUP; } if (gc->ig_drawn) { cmds->status |= GC_STATUS_MENU_OPEN; } } bd_mutex_unlock(&gc->mutex); return result; }
void bd_psr_lock(BD_REGISTERS *p) { bd_mutex_lock(&p->mutex); }