int set_VTS_PROG(vm_t *vm, int vtsN, int vts_ttn, int pgcn, int pgn) { int pgcN, pgN, res, title, part = 0; (vm->state).domain = DVD_DOMAIN_VTSTitle; if (vtsN != (vm->state).vtsN) if (!ifoOpenNewVTSI(vm, vm->dvd, vtsN)) /* Also sets (vm->state).vtsN */ return 0; if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts)) { return 0; } pgcN = pgcn; pgN = pgn; (vm->state).TT_PGCN_REG = pgcN; (vm->state).TTN_REG = get_TT(vm, vtsN, vts_ttn); assert( (vm->state.TTN_REG) != 0 ); (vm->state).VTS_TTN_REG = vts_ttn; (vm->state).vtsN = vtsN; /* Not sure about this one. We can get to it easily from TTN_REG */ /* Any other registers? */ res = set_PGCN(vm, pgcN); /* This clobber's state.pgN (sets it to 1), but we don't want clobbering here. */ (vm->state).pgN = pgN; vm_get_current_title_part(vm, &title, &part); (vm->state).PTTN_REG = part; return res; }
link_t play_PGC_post(vm_t *vm) { link_t link_values = { LinkNoLink, 0, 0, 0 }; #ifdef TRACE fprintf(MSG_OUT, "libdvdnav: play_PGC_post:\n"); #endif /* eval -> updates the state and returns either - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN) - just go to next PGC (This is what happens if you fall of the end of the post_cmds) - or an error (are there more cases?) */ if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_post && vmEval_CMD((vm->state).pgc->command_tbl->post_cmds, (vm->state).pgc->command_tbl->nr_of_post, &(vm->state).registers, &link_values)) { return link_values; } #ifdef TRACE fprintf(MSG_OUT, "libdvdnav: ** Fell of the end of the pgc, continuing in NextPGC\n"); #endif /* Should end up in the STOP_DOMAIN if next_pgc is 0. */ if(!set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) { link_values.command = Exit; return link_values; } return play_PGC(vm); }
int set_FP_PGC(vm_t *vm) { if (!vm || !vm->vmgi) return 1; (vm->state).domain = DVD_DOMAIN_FirstPlay; if (!vm->vmgi->first_play_pgc) { return set_PGCN(vm, 1); } (vm->state).pgc = vm->vmgi->first_play_pgc; (vm->state).pgcN = vm->vmgi->vmgi_mat->first_play_pgc; return 1; }
int set_MENU(vm_t *vm, int menu) { assert((vm->state).domain == DVD_DOMAIN_VMGM || (vm->state).domain == DVD_DOMAIN_VTSMenu); return set_PGCN(vm, get_ID(vm, menu)); }