⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vm.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 4 页
字号:
     - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)     - just play video i.e first PG       (This is what happens if you fall of the end of the pre_cmds)     - or an error (are there more cases?) */  if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_pre) {    if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds, 		  (vm->state).pgc->command_tbl->nr_of_pre, 		  &(vm->state).registers, &link_values)) {      /*  link_values contains the 'jump' return value */      return link_values;    } else {#ifdef TRACE      fprintf(MSG_OUT, "libdvdnav: PGC pre commands didn't do a Jump, Link or Call\n");#endif    }  }  return play_PG(vm);}  static link_t play_PGC_PG(vm_t *vm, int pgN) {      link_t link_values;  #ifdef TRACE  fprintf(MSG_OUT, "libdvdnav: play_PGC_PG:");  if((vm->state).domain != FP_DOMAIN) {    fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));  } else {    fprintf(MSG_OUT, " first_play_pgc\n");  }#endif  /*  This must be set before the pre-commands are executed because they   *  might contain a CallSS that will save resume state */  /* FIXME: This may be only a temporary fix for something... */  (vm->state).pgN = pgN;  (vm->state).cellN = 0;  (vm->state).blockN = 0;  /* eval -> updates the state and returns either      - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)     - just play video i.e first PG       (This is what happens if you fall of the end of the pre_cmds)     - or an error (are there more cases?) */  if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_pre) {    if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds, 		  (vm->state).pgc->command_tbl->nr_of_pre, 		  &(vm->state).registers, &link_values)) {      /*  link_values contains the 'jump' return value */      return link_values;    } else {#ifdef TRACE      fprintf(MSG_OUT, "libdvdnav: PGC pre commands didn't do a Jump, Link or Call\n");#endif    }  }  return play_PG(vm);}  static link_t play_PGC_post(vm_t *vm) {  link_t link_values;#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);}static link_t play_PG(vm_t *vm) {#ifdef TRACE  fprintf(MSG_OUT, "libdvdnav: play_PG: (vm->state).pgN (%i)\n", (vm->state).pgN);#endif    assert((vm->state).pgN > 0);  if((vm->state).pgN > (vm->state).pgc->nr_of_programs) {#ifdef TRACE    fprintf(MSG_OUT, "libdvdnav: play_PG: (vm->state).pgN (%i) > pgc->nr_of_programs (%i)\n", 	    (vm->state).pgN, (vm->state).pgc->nr_of_programs );#endif    assert((vm->state).pgN == (vm->state).pgc->nr_of_programs + 1);     return play_PGC_post(vm);  }    (vm->state).cellN = (vm->state).pgc->program_map[(vm->state).pgN - 1];    return play_Cell(vm);}static link_t play_Cell(vm_t *vm) {  static const link_t play_this = {PlayThis, /* Block in Cell */ 0, 0, 0};#ifdef TRACE  fprintf(MSG_OUT, "libdvdnav: play_Cell: (vm->state).cellN (%i)\n", (vm->state).cellN);#endif    assert((vm->state).cellN > 0);  if((vm->state).cellN > (vm->state).pgc->nr_of_cells) {#ifdef TRACE    fprintf(MSG_OUT, "libdvdnav: (vm->state).cellN (%i) > pgc->nr_of_cells (%i)\n", 	    (vm->state).cellN, (vm->state).pgc->nr_of_cells );#endif    assert((vm->state).cellN == (vm->state).pgc->nr_of_cells + 1);     return play_PGC_post(vm);  }    /* Multi angle/Interleaved */  switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {  case 0: /*  Normal */    assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);    break;  case 1: /*  The first cell in the block */    switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {    case 0: /*  Not part of a block */      assert(0);      break;    case 1: /*  Angle block */      /* Loop and check each cell instead? So we don't get outside the block? */      (vm->state).cellN += (vm->state).AGL_REG - 1;#ifdef STRICT      assert((vm->state).cellN <= (vm->state).pgc->nr_of_cells);      assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0);      assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1);#else      if (!((vm->state).cellN <= (vm->state).pgc->nr_of_cells) ||          !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0) ||	  !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1)) {	fprintf(MSG_OUT, "libdvdnav: Invalid angle block\n");	(vm->state).cellN -= (vm->state).AGL_REG - 1;      }#endif      break;    case 2: /*  ?? */    case 3: /*  ?? */    default:      fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",	      (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,	      (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);      assert(0);    }    break;  case 2: /*  Cell in the block */  case 3: /*  Last cell in the block */  /* These might perhaps happen for RSM or LinkC commands? */  default:    fprintf(MSG_OUT, "libdvdnav: Cell is in block but did not enter at first cell!\n");  }    /* Updates (vm->state).pgN and PTTN_REG */  if(!set_PGN(vm)) {    /* Should not happen */    assert(0);    return play_PGC_post(vm);  }  (vm->state).cell_restart++;  (vm->state).blockN = 0;#ifdef TRACE  fprintf(MSG_OUT, "libdvdnav: Cell should restart here\n");#endif  return play_this;}static link_t play_Cell_post(vm_t *vm) {  cell_playback_t *cell;  #ifdef TRACE  fprintf(MSG_OUT, "libdvdnav: play_Cell_post: (vm->state).cellN (%i)\n", (vm->state).cellN);#endif    cell = &(vm->state).pgc->cell_playback[(vm->state).cellN - 1];    /* Still time is already taken care of before we get called. */    /* Deal with a Cell command, if any */  if(cell->cell_cmd_nr != 0) {    link_t link_values;    /*  These asserts are now not needed. *  Some DVDs have no cell commands listed in the PGC, *  but the Cell itself points to a cell command that does not exist. *  For this situation, just ignore the cell command and continue. * *  assert((vm->state).pgc->command_tbl != NULL); *  assert((vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr); */    if ((vm->state).pgc->command_tbl != NULL &&        (vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr) {#ifdef TRACE      fprintf(MSG_OUT, "libdvdnav: Cell command present, executing\n");#endif      if(vmEval_CMD(&(vm->state).pgc->command_tbl->cell_cmds[cell->cell_cmd_nr - 1], 1,		    &(vm->state).registers, &link_values)) {        return link_values;      } else {#ifdef TRACE        fprintf(MSG_OUT, "libdvdnav: Cell command didn't do a Jump, Link or Call\n");#endif      }    } else {#ifdef TRACE      fprintf(MSG_OUT, "libdvdnav: Invalid Cell command\n");#endif    }  }    /* Where to continue after playing the cell... */  /* Multi angle/Interleaved */  switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {  case 0: /*  Normal */    assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);    (vm->state).cellN++;    break;  case 1: /*  The first cell in the block */  case 2: /*  A cell in the block */  case 3: /*  The last cell in the block */  default:    switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {    case 0: /*  Not part of a block */      assert(0);      break;    case 1: /*  Angle block */      /* Skip the 'other' angles */      (vm->state).cellN++;      while((vm->state).cellN <= (vm->state).pgc->nr_of_cells &&	    (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode >= 2) {	(vm->state).cellN++;      }      break;    case 2: /*  ?? */    case 3: /*  ?? */    default:      fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",	      (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,	      (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);      assert(0);    }    break;  }    /* Figure out the correct pgN for the new cell */   if(!set_PGN(vm)) {#ifdef TRACE    fprintf(MSG_OUT, "libdvdnav: last cell in this PGC\n");#endif    return play_PGC_post(vm);  }  return play_Cell(vm);}/* link processing */static int process_command(vm_t *vm, link_t link_values) {    while(link_values.command != PlayThis) {    #ifdef TRACE    fprintf(MSG_OUT, "libdvdnav: Before printout starts:\n");    vm_print_link(link_values);    fprintf(MSG_OUT, "libdvdnav: Link values %i %i %i %i\n", link_values.command, 	    link_values.data1, link_values.data2, link_values.data3);    vm_print_current_domain_state(vm);    fprintf(MSG_OUT, "libdvdnav: Before printout ends.\n");#endif        switch(link_values.command) {    case LinkNoLink:      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      return 0;  /* no actual jump */    case LinkTopC:      /* Restart playing from the beginning of the current Cell. */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      link_values = play_Cell(vm);      break;    case LinkNextC:      /* Link to Next Cell */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      (vm->state).cellN += 1;      link_values = play_Cell(vm);      break;    case LinkPrevC:      /* Link to Previous Cell */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      assert((vm->state).cellN > 1);      (vm->state).cellN -= 1;      link_values = play_Cell(vm);      break;          case LinkTopPG:      /* Link to Top of current Program */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      link_values = play_PG(vm);      break;    case LinkNextPG:      /* Link to Next Program */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      (vm->state).pgN += 1;      link_values = play_PG(vm);      break;    case LinkPrevPG:      /* Link to Previous Program */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      assert((vm->state).pgN > 1);      (vm->state).pgN -= 1;      link_values = play_PG(vm);      break;    case LinkTopPGC:      /* Restart playing from beginning of current Program Chain */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      link_values = play_PGC(vm);      break;    case LinkNextPGC:      /* Link to Next Program Chain */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      assert((vm->state).pgc->next_pgc_nr != 0);      if(set_PGCN(vm, (vm->state).pgc->next_pgc_nr))	link_values = play_PGC(vm);      else	link_values.command = Exit;      break;    case LinkPrevPGC:      /* Link to Previous Program Chain */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      assert((vm->state).pgc->prev_pgc_nr != 0);      if(set_PGCN(vm, (vm->state).pgc->prev_pgc_nr))	link_values = play_PGC(vm);      else	link_values.command = Exit;      break;    case LinkGoUpPGC:      /* Link to GoUp Program Chain */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      assert((vm->state).pgc->goup_pgc_nr != 0);      if(set_PGCN(vm, (vm->state).pgc->goup_pgc_nr))	link_values = play_PGC(vm);      else	link_values.command = Exit;      break;    case LinkTailPGC:      /* Link to Tail of Program Chain */      /* BUTTON number:data1 */      if(link_values.data1 != 0)	(vm->state).HL_BTNN_REG = link_values.data1 << 10;      link_values = play_PGC_post(vm);    break;    case LinkRSM:      {	/* Link to Resume point */	int i;		/* Check and see if there is any rsm info!! */	if (!(vm->state).rsm_vtsN) {	  fprintf(MSG_OUT, "libdvdnav: trying to resume without any resume info set\n");	  link_values.command = Exit;	  break;	}		(vm->state).domain = VTS_DOMAIN;	if (!ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN))	  assert(0);	set_PGCN(vm, (vm->state).rsm_pgcN);		/* These should never be set in SystemSpace and/or MenuSpace */ 	/* (vm->state).TTN_REG = rsm_tt; ?? */	/* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */	for(i = 0; i < 5; i++) {	  (vm->state).registers.SPRM[4 + i] = (vm->state).rsm_regs[i];	}		if(link_values.data1 != 0)	  (vm->state).HL_BTNN_REG = link_values.data1 << 10;		if((vm->state).rsm_cellN == 0) {	  assert((vm->state).cellN); /*  Checking if this ever happens */	  (vm->state).pgN = 1;	  link_values = play_PG(vm);	} else { 	  /* (vm->state).pgN = ?? this gets the right value in set_PGN() below */	  (vm->state).cellN = (vm->state).rsm_cellN;	  link_values.command = PlayThis;	  link_values.data1 = (vm->state).rsm_blockN & 0xffff;	  link_values.data2 = (vm->state).rsm_blockN >> 16;	  if(!set_PGN(vm)) {	    /* Were at the end of the PGC, should not happen for a RSM */	    assert(0);	    link_values.command = LinkTailPGC;	    link_values.data1 = 0;  /* No button */	  }	}      }      break;    case LinkPGCN:      /* Link to Program Chain Number:data1 */      if(!set_PGCN(vm, link_values.data1))	assert(0);      link_values = play_PGC(vm);      break;    case LinkPTTN:      /* Link to Part of current Title Number:data1 */      /* BUTTON number:data2 */      /* PGC Pre-Commands are not executed */      assert((vm->state).domain == VTS_DOMAIN);      if(link_values.data2 != 0)	(vm->state).HL_BTNN_REG = link_values.data2 << 10;      if(!set_VTS_PTT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG, link_values.data1))	assert(0);      link_values = play_PG(vm);      break;    case LinkPGN:      /* Link to Program Number:data1 */      /* BUTTON number:data2 */      if(link_values.data2 != 0)	(vm->state).HL_BTNN_REG = link_values.data2 << 10;      /* Update any other state, PTTN perhaps? */      (vm->state).pgN = link_values.data1;      link_values = play_PG(vm);      break;    case LinkCN:      /* Link to Cell Number:data1 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -