[trunk] support seeking in files larger than 2 GB
authorJulien Malik <julien.malik@paraiso.me>
Thu, 24 Nov 2011 15:30:09 +0000 (15:30 +0000)
committerJulien Malik <julien.malik@paraiso.me>
Thu, 24 Nov 2011 15:30:09 +0000 (15:30 +0000)
CHANGES
libopenjpeg/openjpeg.c
libopenjpeg/opj_includes.h

diff --git a/CHANGES b/CHANGES
index 89ec382ddbc7d8065eb3777cf257b251ef4f0fb6..53c27636de9cae3b2d8be44e5aded2e255bea651 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+November 24, 2011
+* [jmalik] support seeking in files larger than 2 GB
+
 November 21, 2011
 * [mickael] WIP: fix bug with windows platform and j2k_dump
 
index 73b136d6fe4675ad15d34f113ccc1441cac425e3..f1efde1fd34aaa9c0813742e0062c56b50b4e34c 100644 (file)
@@ -165,7 +165,25 @@ OPJ_SIZE_T opj_skip_from_file (OPJ_SIZE_T p_nb_bytes, FILE * p_user_data)
 
 opj_bool opj_seek_from_file (OPJ_SIZE_T p_nb_bytes, FILE * p_user_data)
 {
-       if (fseek(p_user_data,p_nb_bytes,SEEK_SET)) {
+  /*
+   * p_nb_bytes is 'OPJ_SIZE_T' but fseek takes a 'signed long'
+   * 
+   * As such, fseek can seek to a maximum of 2^31-1 bytes (2 GB)
+   * To support seeking in files between 2 GB and 4 GB :
+   * - first, do a seek with the max supported by fseek
+   * - secondly, seek of the remaining bytes
+   */
+  if (p_nb_bytes > LONG_MAX) {
+    if (fseek(p_user_data,LONG_MAX,SEEK_SET)) {
+      return EXIT_FAILURE;
+    }
+    p_nb_bytes -= LONG_MAX;
+
+    if (fseek(p_user_data,p_nb_bytes,SEEK_CUR)) {
+      return EXIT_FAILURE;
+    }
+  }
+  else if (fseek(p_user_data,p_nb_bytes,SEEK_SET)) {
                return EXIT_FAILURE;
        }
 
index d94237e7fbff290e120ab12337e81bc10a4451a6..8aefbafe27581d09d32fe20b54d4726d691b1ba6 100644 (file)
@@ -41,6 +41,7 @@
 #include <stdarg.h>
 #include <ctype.h>
 #include <assert.h>
+#include <limits.h>
 
 /*
  ==========================================================