[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdesupport/taglib/taglib/mpeg
From:       Scott Wheeler <wheeler () kde ! org>
Date:       2008-02-01 0:49:02
Message-ID: 1201826942.046186.2226.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 769284 by wheeler:

A couple of small bugs (the more significant ones were already fixed) from Oskar Liljeblad

BUG:126010


 M  +29 -19    mpegfile.cpp  


--- trunk/kdesupport/taglib/taglib/mpeg/mpegfile.cpp #769283:769284
@@ -313,45 +313,55 @@
 
 long MPEG::File::nextFrameOffset(long position)
 {
-  // TODO: This will miss syncs spanning buffer read boundaries.
+  bool foundLastSyncPattern = false;
 
-  ByteVector buffer = readBlock(bufferSize());
-
-  while(buffer.size() > 0) {
+  ByteVector buffer;
+ 
+  while(true) {
     seek(position);
     buffer = readBlock(bufferSize());
 
-    for(int i = 0; i < int(buffer.size()) - 1; i++) {
+    if(buffer.size() <= 0)
+      return -1;
+
+    if(foundLastSyncPattern && secondSynchByte(buffer[0]))
+      return position - 1;
+ 
+    for(uint i = 0; i < buffer.size() - 1; i++) {
       if(uchar(buffer[i]) == 0xff && secondSynchByte(buffer[i + 1]))
         return position + i;
     }
-    position += bufferSize();
+
+    foundLastSyncPattern = uchar(buffer[buffer.size() - 1]) == 0xff;
+    position += buffer.size();
   }
-
-  return -1;
 }
 
 long MPEG::File::previousFrameOffset(long position)
 {
-  // TODO: This will miss syncs spanning buffer read boundaries.
+  bool foundFirstSyncPattern = false;
+  ByteVector buffer;
 
-  while(int(position - bufferSize()) > int(bufferSize())) {
-    position -= bufferSize();
+  while (position > 0) {
+    long size = ulong(position) < bufferSize() ? position : bufferSize();
+    position -= size;
+ 
     seek(position);
-    ByteVector buffer = readBlock(bufferSize());
+    buffer = readBlock(size);
 
-    // If the amount of data is smaller than an MPEG header (4 bytes) there's no
-    // chance of this being valid.
-
-    if(buffer.size() < 4)
-      return -1;
-
+    if(buffer.size() <= 0)
+      break;
+ 
+    if(foundFirstSyncPattern && uchar(buffer[buffer.size() - 1]) == 0xff)
+      return position + buffer.size() - 1;
+ 
     for(int i = buffer.size() - 2; i >= 0; i--) {
       if(uchar(buffer[i]) == 0xff && secondSynchByte(buffer[i + 1]))
         return position + i;
     }
+
+    foundFirstSyncPattern = secondSynchByte(buffer[0]);
   }
-
   return -1;
 }
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic