changeset 124:e404d210ff91 src

- fix vm copying when the vtsN has not yet been set - change still detection heuristics - small TRACE output beautification - fix handling of PTT register - stop the VM when LinkRSM is called without resume info set
author mroi
date Fri, 14 Mar 2003 18:47:51 +0000
parents da88fc974592
children 87400040e4a4
files vm.c
diffstat 1 files changed, 39 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/vm.c	Wed Mar 12 11:40:10 2003 +0000
+++ b/vm.c	Fri Mar 14 18:47:51 2003 +0000
@@ -378,13 +378,15 @@
   /* open a new vtsi handle, because the copy might switch to another VTS */
   target->vtsi = NULL;
   vtsN = (target->state).vtsN;
-  (target->state).vtsN = 0;
-  ifoOpenNewVTSI(target, target->dvd, vtsN);
+  if (vtsN > 0) {
+    (target->state).vtsN = 0;
+    ifoOpenNewVTSI(target, target->dvd, vtsN);
   
-  /* restore pgc pointer into the new vtsi */
-  if (!set_PGCN(target, pgcN))
-    assert(0);
-  (target->state).pgN = pgN;
+    /* restore pgc pointer into the new vtsi */
+    if (!set_PGCN(target, pgcN))
+      assert(0);
+    (target->state).pgN = pgN;
+  }
   
   return target;
 }
@@ -438,14 +440,19 @@
   if (((vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector ==
        (vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_vobu_start_sector) &&
       ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector -
-       (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector < 250)) {
+       (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector < 1024)) {
     int time;
+    int size = (vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector -
+	       (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector;
     time  = ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.hour   & 0xf0) * 36000;
     time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.hour   & 0x0f) * 3600;
     time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.minute & 0xf0) * 600;
     time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.minute & 0x0f) * 60;
     time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.second & 0xf0) * 10;
     time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.second & 0x0f) * 1;
+    if (size / time > 30)
+      /* datarate is too high, it might be a very short, but regular cell */
+      return;
     if (time > 0xff) time = 0xff;
     position->still = time;
   }
@@ -564,7 +571,9 @@
 
 int vm_get_current_title_part(vm_t *vm, int *title_result, int *part_result) {
   vts_ptt_srpt_t *vts_ptt_srpt;
-  int title, part = 0, vts_ttn;
+  int title   = (vm->state).TTN_REG;
+  int part    = (vm->state).PTTN_REG;
+  int vts_ttn = (vm->state).VTS_TTN_REG;
   int found;
   int16_t pgcN, pgN;
 
@@ -593,8 +602,8 @@
     fprintf(MSG_OUT, "libdvdnav: ************ this chapter FOUND!\n");
     fprintf(MSG_OUT, "libdvdnav: VTS_PTT_SRPT - Title %3i part %3i: PGC: %3i PG: %3i\n",
              title, part,
-             vts_ptt_srpt->title[ttn-1].ptt[part-1].pgcn ,
-             vts_ptt_srpt->title[ttn-1].ptt[part-1].pgn );
+             vts_ptt_srpt->title[vts_ttn-1].ptt[part-1].pgcn ,
+             vts_ptt_srpt->title[vts_ttn-1].ptt[part-1].pgn );
   } else {
     fprintf(MSG_OUT, "libdvdnav: ************ this chapter NOT FOUND!\n");
   }
@@ -858,7 +867,7 @@
   link_t link_values;
   
 #ifdef TRACE
-  fprintf(MSG_OUT, "libdvdnav: vm: play_PGC:");
+  fprintf(MSG_OUT, "libdvdnav: play_PGC:");
   if((vm->state).domain != FP_DOMAIN) {
     fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
   } else {
@@ -898,7 +907,7 @@
   link_t link_values;
   
 #ifdef TRACE
-  fprintf(MSG_OUT, "libdvdnav: vm: play_PGC:");
+  fprintf(MSG_OUT, "libdvdnav: play_PGC:");
   if((vm->state).domain != FP_DOMAIN) {
     fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
   } else {
@@ -1270,8 +1279,13 @@
 	/* Link to Resume point */
 	int i;
 	
-	/*  Check and see if there is any rsm info!! */
-	assert((vm->state).rsm_vtsN);
+	/* 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;
 	ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN);
 	set_PGCN(vm, (vm->state).rsm_pgcN);
@@ -1520,7 +1534,7 @@
   pgN = vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].ptt[part - 1].pgn;
  
   (vm->state).TT_PGCN_REG = pgcN;
-  (vm->state).PTTN_REG    = pgN;
+  (vm->state).PTTN_REG    = part;
   (vm->state).TTN_REG     = get_TT(vm, vtsN, vts_ttn);
   assert( (vm->state.TTN_REG) != 0 );
   (vm->state).VTS_TTN_REG = vts_ttn;
@@ -1586,7 +1600,7 @@
       return 0; /* ?? */
     pb_ty = &vm->vmgi->tt_srpt->title[(vm->state).TTN_REG - 1].pb_ty;
     if(pb_ty->multi_or_random_pgc_title == /* One_Sequential_PGC_Title */ 0) {
-      int dummy;
+      int dummy, part;
 #if 0
       /* TTN_REG can't be trusted to have a correct value here... */
       vts_ptt_srpt_t *ptt_srpt = vtsi->vts_ptt_srpt;
@@ -1594,8 +1608,8 @@
       assert(get_PGCN() == ptt_srpt->title[(vm->state).VTS_TTN_REG - 1].ptt[0].pgcn);
       assert(1 == ptt_srpt->title[(vm->state).VTS_TTN_REG - 1].ptt[0].pgn);
 #endif
-      vm_get_current_title_part(vm, &dummy, &(vm->state).pgN);
-      (vm->state).PTTN_REG = (vm->state).pgN;
+      vm_get_current_title_part(vm, &dummy, &part);
+      (vm->state).PTTN_REG = part;
     } else {
       /* FIXME: Handle RANDOM or SHUFFLE titles. */
       fprintf(MSG_OUT, "libdvdnav: RANDOM or SHUFFLE titles are NOT handled yet.\n");
@@ -1783,6 +1797,13 @@
 
 /*
  * $Log$
+ * Revision 1.45  2003/03/14 18:47:51  mroi
+ * - fix vm copying when the vtsN has not yet been set
+ * - change still detection heuristics
+ * - small TRACE output beautification
+ * - fix handling of PTT register
+ * - stop the VM when LinkRSM is called without resume info set
+ *
  * Revision 1.44  2003/03/12 11:38:10  mroi
  * - provide the means to make copies of the VM to try certain operations on a copy and
  *   merge the changes back on success