From c974cb1b8ebe678fe126a7392d0b8279bb154ebc Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Thu, 24 Nov 2011 15:30:09 +0000 Subject: [PATCH] [trunk] support seeking in files larger than 2 GB --- CHANGES | 3 +++ libopenjpeg/openjpeg.c | 20 +++++++++++++++++++- libopenjpeg/opj_includes.h | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) 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 /* ==========================================================