diff --git a/CHANGES b/CHANGES index 89ec382d..53c27636 100644 --- 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 diff --git a/libopenjpeg/openjpeg.c b/libopenjpeg/openjpeg.c index 73b136d6..f1efde1f 100644 --- a/libopenjpeg/openjpeg.c +++ b/libopenjpeg/openjpeg.c @@ -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; } diff --git a/libopenjpeg/opj_includes.h b/libopenjpeg/opj_includes.h index d94237e7..8aefbafe 100644 --- a/libopenjpeg/opj_includes.h +++ b/libopenjpeg/opj_includes.h @@ -41,6 +41,7 @@ #include #include #include +#include /* ==========================================================