2 * The copyright in this software is being made available under the 2-clauses
3 * BSD License, included below. This software may be subject to other third
4 * party and contributor rights, including patent rights, and no such rights
5 * are granted under this license.
7 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8 * Copyright (c) 2002-2014, Professor Benoit Macq
9 * Copyright (c) 2001-2003, David Janssens
10 * Copyright (c) 2002-2003, Yannick Verschueren
11 * Copyright (c) 2003-2007, Francois-Olivier Devaux
12 * Copyright (c) 2003-2014, Antonin Descampe
13 * Copyright (c) 2005, Herve Drolon, FreeImage Team
14 * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
15 * Copyright (c) 2012, CS Systemes d'Information, France
16 * All rights reserved.
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in the
25 * documentation and/or other materials provided with the distribution.
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
40 #include "opj_includes.h"
42 /* ----------------------------------------------------------------------- */
45 /* ----------------------------------------------------------------------- */
47 void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
49 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes;
51 assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
53 memcpy(p_buffer,l_data_ptr,p_nb_bytes);
56 void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
58 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;
61 assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
63 for (i=0;i<p_nb_bytes;++i) {
64 *(p_buffer++) = *(l_data_ptr--);
68 void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
70 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
72 assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
75 memcpy(l_data_ptr+4-p_nb_bytes,p_buffer,p_nb_bytes);
78 void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
80 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes-1;
83 assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
86 for (i=0;i<p_nb_bytes;++i) {
87 *(l_data_ptr--) = *(p_buffer++);
91 void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
93 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
94 memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT64));
97 void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
99 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT64) - 1;
101 for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
102 *(p_buffer++) = *(l_data_ptr--);
106 void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
108 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
109 memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT64));
112 void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
114 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64)-1;
116 for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
117 *(l_data_ptr--) = *(p_buffer++);
121 void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
123 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
124 memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT32));
127 void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
129 const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT32) - 1;
131 for (i=0;i<sizeof(OPJ_FLOAT32);++i) {
132 *(p_buffer++) = *(l_data_ptr--);
136 void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
138 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
139 memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT32));
142 void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
144 OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32)-1;
146 for (i=0;i<sizeof(OPJ_FLOAT32);++i) {
147 *(l_data_ptr--) = *(p_buffer++);
151 opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,OPJ_BOOL l_is_input)
153 opj_stream_private_t * l_stream = 00;
154 l_stream = (opj_stream_private_t*) opj_malloc(sizeof(opj_stream_private_t));
159 memset(l_stream,0,sizeof(opj_stream_private_t));
160 l_stream->m_buffer_size = p_buffer_size;
161 l_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);
162 if (! l_stream->m_stored_data) {
167 l_stream->m_current_data = l_stream->m_stored_data;
170 l_stream->m_status |= opj_stream_e_input;
171 l_stream->m_opj_skip = opj_stream_read_skip;
172 l_stream->m_opj_seek = opj_stream_read_seek;
175 l_stream->m_status |= opj_stream_e_output;
176 l_stream->m_opj_skip = opj_stream_write_skip;
177 l_stream->m_opj_seek = opj_stream_write_seek;
180 l_stream->m_read_fn = opj_stream_default_read;
181 l_stream->m_write_fn = opj_stream_default_write;
182 l_stream->m_skip_fn = opj_stream_default_skip;
183 l_stream->m_seek_fn = opj_stream_default_seek;
185 return (opj_stream_t *) l_stream;
188 opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL l_is_input)
190 return opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,l_is_input);
193 void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream)
195 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
198 if (l_stream->m_free_user_data_fn) {
199 l_stream->m_free_user_data_fn(l_stream->m_user_data);
201 opj_free(l_stream->m_stored_data);
202 l_stream->m_stored_data = 00;
207 void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream)
209 opj_stream_destroy(p_stream);
212 void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function)
214 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
216 if ((!l_stream) || (! (l_stream->m_status & opj_stream_e_input))) {
220 l_stream->m_read_fn = p_function;
223 void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function)
225 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
230 l_stream->m_seek_fn = p_function;
233 void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function)
235 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
237 if ((!l_stream )|| (! (l_stream->m_status & opj_stream_e_output))) {
241 l_stream->m_write_fn = p_function;
244 void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function)
246 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
252 l_stream->m_skip_fn = p_function;
255 void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream, void * p_data)
257 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
260 l_stream->m_user_data = p_data;
263 void OPJ_CALLCONV opj_stream_set_user_data_v3(opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function)
265 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
268 l_stream->m_user_data = p_data;
269 l_stream->m_free_user_data_fn = p_function;
272 void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length)
274 opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
277 l_stream->m_user_data_length = data_length;
280 OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)
282 OPJ_SIZE_T l_read_nb_bytes = 0;
283 if (p_stream->m_bytes_in_buffer >= p_size) {
284 memcpy(p_buffer,p_stream->m_current_data,p_size);
285 p_stream->m_current_data += p_size;
286 p_stream->m_bytes_in_buffer -= p_size;
287 l_read_nb_bytes += p_size;
288 p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
289 return l_read_nb_bytes;
292 /* we are now in the case when the remaining data if not sufficient */
293 if (p_stream->m_status & opj_stream_e_end) {
294 l_read_nb_bytes += p_stream->m_bytes_in_buffer;
295 memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
296 p_stream->m_current_data += p_stream->m_bytes_in_buffer;
297 p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
298 p_stream->m_bytes_in_buffer = 0;
299 return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
302 /* the flag is not set, we copy data and then do an actual read on the stream */
303 if (p_stream->m_bytes_in_buffer) {
304 l_read_nb_bytes += p_stream->m_bytes_in_buffer;
305 memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
306 p_stream->m_current_data = p_stream->m_stored_data;
307 p_buffer += p_stream->m_bytes_in_buffer;
308 p_size -= p_stream->m_bytes_in_buffer;
309 p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
310 p_stream->m_bytes_in_buffer = 0;
313 /* case where we are already at the end of the buffer
314 so reset the m_current_data to point to the start of the
315 stored buffer to get ready to read from disk*/
316 p_stream->m_current_data = p_stream->m_stored_data;
320 /* we should read less than a chunk -> read a chunk */
321 if (p_size < p_stream->m_buffer_size) {
322 /* we should do an actual read on the media */
323 p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,p_stream->m_buffer_size,p_stream->m_user_data);
325 if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
327 opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
329 p_stream->m_bytes_in_buffer = 0;
330 p_stream->m_status |= opj_stream_e_end;
332 return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
334 else if (p_stream->m_bytes_in_buffer < p_size) {
335 /* not enough data */
336 l_read_nb_bytes += p_stream->m_bytes_in_buffer;
337 memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
338 p_stream->m_current_data = p_stream->m_stored_data;
339 p_buffer += p_stream->m_bytes_in_buffer;
340 p_size -= p_stream->m_bytes_in_buffer;
341 p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
342 p_stream->m_bytes_in_buffer = 0;
345 l_read_nb_bytes += p_size;
346 memcpy(p_buffer,p_stream->m_current_data,p_size);
347 p_stream->m_current_data += p_size;
348 p_stream->m_bytes_in_buffer -= p_size;
349 p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
350 return l_read_nb_bytes;
354 /* direct read on the dest buffer */
355 p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer,p_size,p_stream->m_user_data);
357 if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
359 opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
361 p_stream->m_bytes_in_buffer = 0;
362 p_stream->m_status |= opj_stream_e_end;
364 return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
366 else if (p_stream->m_bytes_in_buffer < p_size) {
367 /* not enough data */
368 l_read_nb_bytes += p_stream->m_bytes_in_buffer;
369 p_stream->m_current_data = p_stream->m_stored_data;
370 p_buffer += p_stream->m_bytes_in_buffer;
371 p_size -= p_stream->m_bytes_in_buffer;
372 p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
373 p_stream->m_bytes_in_buffer = 0;
376 /* we have read the exact size */
377 l_read_nb_bytes += p_stream->m_bytes_in_buffer;
378 p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
379 p_stream->m_current_data = p_stream->m_stored_data;
380 p_stream->m_bytes_in_buffer = 0;
381 return l_read_nb_bytes;
387 OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,
388 const OPJ_BYTE * p_buffer,
390 opj_event_mgr_t * p_event_mgr)
392 OPJ_SIZE_T l_remaining_bytes = 0;
393 OPJ_SIZE_T l_write_nb_bytes = 0;
395 if (p_stream->m_status & opj_stream_e_error) {
396 return (OPJ_SIZE_T)-1;
400 l_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;
402 /* we have more memory than required */
403 if (l_remaining_bytes >= p_size) {
404 memcpy(p_stream->m_current_data, p_buffer, p_size);
406 p_stream->m_current_data += p_size;
407 p_stream->m_bytes_in_buffer += p_size;
408 l_write_nb_bytes += p_size;
409 p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
411 return l_write_nb_bytes;
414 /* we copy data and then do an actual read on the stream */
415 if (l_remaining_bytes) {
416 l_write_nb_bytes += l_remaining_bytes;
418 memcpy(p_stream->m_current_data,p_buffer,l_remaining_bytes);
420 p_stream->m_current_data = p_stream->m_stored_data;
422 p_buffer += l_remaining_bytes;
423 p_size -= l_remaining_bytes;
424 p_stream->m_bytes_in_buffer += l_remaining_bytes;
425 p_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;
428 if (! opj_stream_flush(p_stream, p_event_mgr)) {
429 return (OPJ_SIZE_T)-1;
435 OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, opj_event_mgr_t * p_event_mgr)
437 /* the number of bytes written on the media. */
438 OPJ_SIZE_T l_current_write_nb_bytes = 0;
440 p_stream->m_current_data = p_stream->m_stored_data;
442 while (p_stream->m_bytes_in_buffer) {
443 /* we should do an actual write on the media */
444 l_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,
445 p_stream->m_bytes_in_buffer,
446 p_stream->m_user_data);
448 if (l_current_write_nb_bytes == (OPJ_SIZE_T)-1) {
449 p_stream->m_status |= opj_stream_e_error;
450 opj_event_msg(p_event_mgr, EVT_INFO, "Error on writing stream!\n");
455 p_stream->m_current_data += l_current_write_nb_bytes;
456 p_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;
459 p_stream->m_current_data = p_stream->m_stored_data;
464 OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
466 OPJ_OFF_T l_skip_nb_bytes = 0;
467 OPJ_OFF_T l_current_skip_nb_bytes = 0;
469 assert( p_size >= 0 );
471 if (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {
472 p_stream->m_current_data += p_size;
473 /* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer
474 which is of type OPJ_SIZE_T */
475 p_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;
476 l_skip_nb_bytes += p_size;
477 p_stream->m_byte_offset += l_skip_nb_bytes;
478 return l_skip_nb_bytes;
481 /* we are now in the case when the remaining data if not sufficient */
482 if (p_stream->m_status & opj_stream_e_end) {
483 l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
484 p_stream->m_current_data += p_stream->m_bytes_in_buffer;
485 p_stream->m_bytes_in_buffer = 0;
486 p_stream->m_byte_offset += l_skip_nb_bytes;
487 return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
490 /* the flag is not set, we copy data and then do an actual skip on the stream */
491 if (p_stream->m_bytes_in_buffer) {
492 l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
493 p_stream->m_current_data = p_stream->m_stored_data;
494 p_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
495 p_stream->m_bytes_in_buffer = 0;
499 /* we should do an actual skip on the media */
500 l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
501 if (l_current_skip_nb_bytes == (OPJ_OFF_T) -1) {
502 opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
504 p_stream->m_status |= opj_stream_e_end;
505 p_stream->m_byte_offset += l_skip_nb_bytes;
507 return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
509 p_size -= l_current_skip_nb_bytes;
510 l_skip_nb_bytes += l_current_skip_nb_bytes;
513 p_stream->m_byte_offset += l_skip_nb_bytes;
515 return l_skip_nb_bytes;
518 OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
520 OPJ_BOOL l_is_written = 0;
521 OPJ_OFF_T l_current_skip_nb_bytes = 0;
522 OPJ_OFF_T l_skip_nb_bytes = 0;
524 if (p_stream->m_status & opj_stream_e_error) {
525 return (OPJ_OFF_T) -1;
528 /* we should flush data */
529 l_is_written = opj_stream_flush (p_stream, p_event_mgr);
530 if (! l_is_written) {
531 p_stream->m_status |= opj_stream_e_error;
532 p_stream->m_bytes_in_buffer = 0;
533 return (OPJ_OFF_T) -1;
538 /* we should do an actual skip on the media */
539 l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
541 if (l_current_skip_nb_bytes == (OPJ_OFF_T)-1) {
542 opj_event_msg(p_event_mgr, EVT_INFO, "Stream error!\n");
544 p_stream->m_status |= opj_stream_e_error;
545 p_stream->m_byte_offset += l_skip_nb_bytes;
547 return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T)-1;
549 p_size -= l_current_skip_nb_bytes;
550 l_skip_nb_bytes += l_current_skip_nb_bytes;
553 p_stream->m_byte_offset += l_skip_nb_bytes;
555 return l_skip_nb_bytes;
558 OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream)
560 return p_stream->m_byte_offset;
563 OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream)
565 assert( p_stream->m_byte_offset >= 0 );
566 assert( p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);
567 return p_stream->m_user_data_length ?
568 (OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :
572 OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
575 return p_stream->m_opj_skip(p_stream,p_size,p_event_mgr);
578 OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
580 OPJ_ARG_NOT_USED(p_event_mgr);
581 p_stream->m_current_data = p_stream->m_stored_data;
582 p_stream->m_bytes_in_buffer = 0;
584 if( !(p_stream->m_seek_fn(p_size,p_stream->m_user_data)) ) {
585 p_stream->m_status |= opj_stream_e_end;
589 /* reset stream status */
590 p_stream->m_status &= (~opj_stream_e_end);
591 p_stream->m_byte_offset = p_size;
598 OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
600 if (! opj_stream_flush(p_stream,p_event_mgr)) {
601 p_stream->m_status |= opj_stream_e_error;
605 p_stream->m_current_data = p_stream->m_stored_data;
606 p_stream->m_bytes_in_buffer = 0;
608 if (! p_stream->m_seek_fn(p_size,p_stream->m_user_data)) {
609 p_stream->m_status |= opj_stream_e_error;
613 p_stream->m_byte_offset = p_size;
619 OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr)
622 return p_stream->m_opj_seek(p_stream,p_size,p_event_mgr);
625 OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream)
627 return p_stream->m_seek_fn != opj_stream_default_seek;
630 OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
632 OPJ_ARG_NOT_USED(p_buffer);
633 OPJ_ARG_NOT_USED(p_nb_bytes);
634 OPJ_ARG_NOT_USED(p_user_data);
635 return (OPJ_SIZE_T) -1;
638 OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
640 OPJ_ARG_NOT_USED(p_buffer);
641 OPJ_ARG_NOT_USED(p_nb_bytes);
642 OPJ_ARG_NOT_USED(p_user_data);
643 return (OPJ_SIZE_T) -1;
646 OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data)
648 OPJ_ARG_NOT_USED(p_nb_bytes);
649 OPJ_ARG_NOT_USED(p_user_data);
650 return (OPJ_OFF_T) -1;
653 OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data)
655 OPJ_ARG_NOT_USED(p_nb_bytes);
656 OPJ_ARG_NOT_USED(p_user_data);