media/liboggz/offset_next.patch
author Timothy Nikkel <tnikkel@gmail.com>
Thu, 18 Feb 2010 13:23:23 -0600
changeset 38273 5b74da35092c9cd5d8c942adc89c47fa9dc86d45
parent 32523 c65d2fc3d03b19701d44777b981ca30a2874a09b
permissions -rw-r--r--
Bug 545593. Remove nsViewManager::Enable/DisableRefresh. r=roc

diff --git a/media/liboggz/src/liboggz/oggz_read.c b/media/liboggz/src/liboggz/oggz_read.c
--- a/media/liboggz/src/liboggz/oggz_read.c
+++ b/media/liboggz/src/liboggz/oggz_read.c
@@ -176,43 +176,46 @@ oggz_set_read_page (OGGZ * oggz, long se
  * returns >= 0 if found; return value is offset of page start
  * returns -1 on error
  * returns -2 if EOF was encountered
  */
 static oggz_off_t
 oggz_read_get_next_page (OGGZ * oggz, ogg_page * og)
 {
   OggzReader * reader = &oggz->x.reader;
-  long more;
+  long more = 0, page_offset = 0;
   int found = 0;
 
   /* Increment oggz->offset by length of the last page processed */
   oggz->offset += reader->current_page_bytes;
 
   do {
     more = ogg_sync_pageseek (&reader->ogg_sync, og);
 
     if (more == 0) {
       /* No page available */
+      reader->current_page_bytes = 0;
       return -2;
     } else if (more < 0) {
 #ifdef DEBUG_VERBOSE
       printf ("get_next_page: skipped %ld bytes\n", -more);
 #endif
-      oggz->offset += (-more);
+      page_offset += (-more);
     } else {
 #ifdef DEBUG_VERBOSE
       printf ("get_next_page: page has %ld bytes\n", more);
 #endif
       reader->current_page_bytes = more;
       found = 1;
     }
 
   } while (!found);
 
+  oggz->offset += page_offset;
+
   return oggz->offset;
 }
 
 typedef struct {
   ogg_packet      packet;
   ogg_int64_t     calced_granulepos;
   oggz_stream_t * stream;
   OggzReader    * reader;
diff --git a/media/liboggz/src/liboggz/oggz_seek.c b/media/liboggz/src/liboggz/oggz_seek.c
--- a/media/liboggz/src/liboggz/oggz_seek.c
+++ b/media/liboggz/src/liboggz/oggz_seek.c
@@ -115,16 +115,18 @@ oggz_seek_raw (OGGZ * oggz, oggz_off_t o
   offset_at = oggz_io_tell (oggz);
 
   oggz->offset = offset_at;
 
   ogg_sync_reset (&reader->ogg_sync);
 
   oggz_vector_foreach(oggz->streams, oggz_seek_reset_stream);
   
+  reader->current_page_bytes = 0;
+  
   return offset_at;
 }
 
 static int
 oggz_stream_reset (void * data)
 {
   oggz_stream_t * stream = (oggz_stream_t *) data;
 
@@ -196,74 +198,70 @@ oggz_purge (OGGZ * oggz)
  * returns -2 if EOF was encountered
  */
 static oggz_off_t
 oggz_get_next_page (OGGZ * oggz, ogg_page * og)
 {
   OggzReader * reader = &oggz->x.reader;
   char * buffer;
   long bytes = 0, more;
-  oggz_off_t page_offset = 0, ret;
+  oggz_off_t page_offset = 0;
   int found = 0;
 
+  /* Increment oggz->offset by length of the last page processed */
+  oggz->offset += reader->current_page_bytes;
+
   do {
     more = ogg_sync_pageseek (&reader->ogg_sync, og);
 
     if (more == 0) {
-      page_offset = 0;
-
       buffer = ogg_sync_buffer (&reader->ogg_sync, CHUNKSIZE);
       if ((bytes = (long) oggz_io_read (oggz, buffer, CHUNKSIZE)) == 0) {
-	if (oggz->file && feof (oggz->file)) {
+        if (oggz->file && feof (oggz->file)) {
 #ifdef DEBUG_VERBOSE
-	  printf ("get_next_page: feof (oggz->file), returning -2\n");
+          printf ("get_next_page: feof (oggz->file), returning -2\n");
 #endif
-	  clearerr (oggz->file);
-	  return -2;
-	}
+          clearerr (oggz->file);
+          reader->current_page_bytes = 0;
+          return -2;
+        }
       }
       if (bytes == OGGZ_ERR_SYSTEM) {
-	  /*oggz_set_error (oggz, OGGZ_ERR_SYSTEM);*/
-	  return -1;
+        reader->current_page_bytes = 0;
+        return -1;
       }
 
       if (bytes == 0) {
 #ifdef DEBUG_VERBOSE
-	printf ("get_next_page: bytes == 0, returning -2\n");
+        printf ("get_next_page: bytes == 0, returning -2\n");
 #endif
-	return -2;
+        reader->current_page_bytes = 0;
+        return -2;
       }
 
       ogg_sync_wrote(&reader->ogg_sync, bytes);
 
     } else if (more < 0) {
 #ifdef DEBUG_VERBOSE
       printf ("get_next_page: skipped %ld bytes\n", -more);
 #endif
-      page_offset -= more;
+      page_offset += (-more);
     } else {
 #ifdef DEBUG_VERBOSE
       printf ("get_next_page: page has %ld bytes\n", more);
 #endif
+      reader->current_page_bytes = more;
       found = 1;
     }
 
   } while (!found);
 
-  /* Calculate the byte offset of the page which was found */
-  if (bytes > 0) {
-    oggz->offset = oggz_tell_raw (oggz) - bytes + page_offset;
-  } else {
-    /* didn't need to do any reading -- accumulate the page_offset */
-    oggz->offset += page_offset;
-  }
-  
-  ret = oggz->offset + more;
+  oggz->offset += page_offset;
 
-  return ret;
+  return oggz->offset;
 }
 
 static oggz_off_t
 oggz_get_next_start_page (OGGZ * oggz, ogg_page * og)
 {
   oggz_off_t page_offset;
   int found = 0;