[cvs-annodex] commit (/annodex): liboggz/trunk/src/liboggz/oggz_seek.c

conrad nobody at lists.annodex.net
Wed Feb 2 12:47:10 EST 2005


Update of /annodex (new revision 820)

Modified files:
   liboggz/trunk/src/liboggz/oggz_seek.c

Log Message:
cleanups -- move file length and offset guessing routines to separate functions


Modified: liboggz/trunk/src/liboggz/oggz_seek.c
===================================================================
--- liboggz/trunk/src/liboggz/oggz_seek.c	2005-02-02 01:43:19 UTC (rev 819)
+++ liboggz/trunk/src/liboggz/oggz_seek.c	2005-02-02 01:47:09 UTC (rev 820)
@@ -373,7 +373,7 @@
 
   if (offset_at == -1) return -1;
 
-  if (offset_at > 0)
+  if (offset_at >= 0)
     return prev_offset;
   else
     return -1;
@@ -479,7 +479,7 @@
 
 #define GUESS_MULTIPLIER (1<<16)
 
-static ogg_int64_t
+static oggz_off_t
 guess (ogg_int64_t unit_at, ogg_int64_t unit_target,
        ogg_int64_t unit_begin, ogg_int64_t unit_end,
        oggz_off_t offset_begin, oggz_off_t offset_end)
@@ -505,31 +505,41 @@
   return offset_guess;
 }
 
-static ogg_int64_t
-oggz_seek_set (OGGZ * oggz, ogg_int64_t unit_target)
+static oggz_off_t
+oggz_seek_guess (ogg_int64_t unit_at, ogg_int64_t unit_target,
+		 ogg_int64_t unit_begin, ogg_int64_t unit_end,
+		 oggz_off_t offset_at,
+		 oggz_off_t offset_begin, oggz_off_t offset_end)
 {
-  OggzReader * reader = &oggz->x.reader;
-  int fd;
-  struct stat statbuf;
-  oggz_off_t offset_orig, offset_at, offset_guess;
-  oggz_off_t offset_begin, offset_end = -1, offset_next;
-  ogg_int64_t granule_at;
-  ogg_int64_t unit_at, unit_begin = 0, unit_end = -1, unit_last_iter = -1;
-  long serialno;
-  ogg_page * og;
-  int looping = 0;
+  oggz_off_t offset_guess;
 
-  if (oggz == NULL) {
-    return -1;
-  }
-
-  if (unit_target > 0 && !oggz_has_metrics (oggz)) {
+  if (unit_end == -1) {
+    if (unit_at == unit_begin) {
+      offset_guess = offset_begin + (offset_end - offset_begin)/2;
+    } else {
+      offset_guess = guess (unit_at, unit_target, unit_begin, unit_end,
+			    offset_begin, offset_at);
+    }
+  } else if (unit_end <= unit_begin) {
 #ifdef DEBUG
-    printf ("oggz_seek_set: No metric defined, FAIL\n");
+    printf ("oggz_seek_guess: unit_end <= unit_begin (ERROR)\n");
 #endif
-    return -1;
+    offset_guess = -1;
+  } else {
+    offset_guess = guess (unit_at, unit_target, unit_begin, unit_end,
+			  offset_begin, offset_end);
   }
 
+  return offset_guess;
+}
+
+static oggz_off_t
+oggz_offset_end (OGGZ * oggz)
+{
+  int fd;
+  struct stat statbuf;
+  oggz_off_t offset_end = -1;
+
   if (oggz->file != NULL) {
     if ((fd = fileno (oggz->file)) == -1) {
       /*oggz_set_error (oggz, OGGZ_ERR_SYSTEM);*/
@@ -544,7 +554,7 @@
     if (oggz_stat_regular (statbuf.st_mode)) {
       offset_end = statbuf.st_size;
 #ifdef DEBUG
-      printf ("oggz_seek_set: stat size %ld\n", offset_end);
+      printf ("oggz_offset_end: stat size %ld\n", offset_end);
 #endif
     } else {
       /*oggz_set_error (oggz, OGGZ_ERR_NOSEEK);*/
@@ -571,6 +581,36 @@
     }
   }
 
+  return offset_end;
+}
+
+static ogg_int64_t
+oggz_seek_set (OGGZ * oggz, ogg_int64_t unit_target)
+{
+  OggzReader * reader = &oggz->x.reader;
+  oggz_off_t offset_orig, offset_at, offset_guess;
+  oggz_off_t offset_begin, offset_end = -1, offset_next;
+  ogg_int64_t granule_at;
+  ogg_int64_t unit_at, unit_begin = 0, unit_end = -1, unit_last_iter = -1;
+  long serialno;
+  ogg_page * og;
+  int hit_eof = 0;
+
+  if (oggz == NULL) {
+    return -1;
+  }
+
+  if (unit_target > 0 && !oggz_has_metrics (oggz)) {
+#ifdef DEBUG
+    printf ("oggz_seek_set: No metric defined, FAIL\n");
+#endif
+    return -1;
+  }
+
+  if ((offset_end = oggz_offset_end (oggz)) == -1) {
+    return -1;
+  }
+
   if (unit_target == reader->current_unit) {
     return (long)reader->current_unit;
   }
@@ -597,33 +637,18 @@
   for ( ; ; ) {
 
     unit_last_iter = unit_at;
+    hit_eof = 0;
 
 #ifdef DEBUG
     printf ("oggz_seek_set: [A] want u%lld: (u%lld - u%lld) [@%ld - @%ld]\n",
 	    unit_target, unit_begin, unit_end, offset_begin, offset_end);
 #endif
 
-    if (unit_end == -1) {
-      if (unit_at == unit_begin) {
-	offset_guess = offset_begin + (offset_end - offset_begin)/2;
-      } else {
-	offset_guess = guess (unit_at, unit_target, unit_begin, unit_end,
-			      offset_begin, offset_at);
-      }
-    } else if (unit_end == unit_begin) {
-#ifdef DEBUG
-      printf ("oggz_seek_set: unit_end == unit_begin (FOUND)\n");
-#endif
-      goto found;
-    } else if (unit_end <= unit_begin) {
-#ifdef DEBUG
-      printf ("oggz_seek_set: unit_end <= unit_begin (ERROR)\n");
-#endif
-      break;
-    } else {
-      offset_guess = guess (unit_at, unit_target, unit_begin, unit_end,
-			    offset_begin, offset_end);
-    }
+    offset_guess = oggz_seek_guess (unit_at, unit_target,
+				    unit_begin, unit_end,
+				    offset_at,
+				    offset_begin, offset_end);
+    if (offset_guess == -1) break;
 
 #ifdef DEBUG
     printf ("oggz_seek_set: guessed %ld\n", offset_guess);
@@ -631,7 +656,7 @@
 
     if (offset_guess == offset_at) {
       /* Already there, looping */
-      looping = 1;
+      break;
     }
 
     offset_at = oggz_seek_raw (oggz, offset_guess, SEEK_SET);
@@ -646,6 +671,7 @@
 #endif
 
     if (unit_end == -1 && offset_next == -2) { /* reached eof, backtrack */
+      hit_eof = 1;
       offset_next = oggz_get_prev_start_page (oggz, og, &granule_at,
 					      &serialno);
       unit_end = oggz_get_unit (oggz, serialno, granule_at);
@@ -664,7 +690,7 @@
       goto notfound;
     }
 
-    if (offset_next > offset_end) {
+    if (hit_eof || offset_next > offset_end) {
       offset_next =
 	oggz_scan_for_page (oggz, og, unit_target, offset_begin, offset_end);
       if (offset_next < 0) goto notfound;
@@ -682,19 +708,21 @@
 
     unit_at = oggz_get_unit (oggz, serialno, granule_at);
 
-    if (unit_at == unit_last_iter) looping = 1;
+    if (unit_at == unit_last_iter) break;
 
 #ifdef DEBUG
     printf ("oggz_seek_set: [D] want u%lld, got page u%lld @%ld g%lld\n",
 	    unit_target, unit_at, offset_at, granule_at);
 #endif
 
-    if (!looping && unit_at < unit_target) {
+    if (unit_at < unit_target) {
       offset_begin = offset_at;
       unit_begin = unit_at;
-    } else if (!looping && unit_at > unit_target) {
+      if (unit_end == unit_begin) break;
+    } else if (unit_at > unit_target) {
       offset_end = offset_at-1;
       unit_end = unit_at;
+      if (unit_end == unit_begin) break;
     } else {
       break;
     }


-- 
conrad



More information about the cvs-annodex mailing list