+/* JPIP specific */
+
+#ifdef USE_JPIP
+static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4, JPIP_IPTR,
+ 4); /* IPTR */
+#if 0
+ opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+ opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+ if (! opj_stream_seek(cio, jp2->jpip_iptr_offset, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4, JPIP_FIDX,
+ 4); /* IPTR */
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+
+ if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4, JPIP_CIDX,
+ 4); /* IPTR */
+#if 0
+ opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+ opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+ if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+#if 0
+static void write_prxy(int offset_jp2c, int length_jp2c, int offset_idx,
+ int length_idx, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_BYTE l_data_header [8];
+ OPJ_OFF_T len, lenp;
+
+ lenp = opj_stream_tell(cio);
+ opj_stream_skip(cio, 4, p_manager); /* L [at the end] */
+ opj_write_bytes(l_data_header, JPIP_PRXY, 4); /* IPTR */
+ opj_stream_write_data(cio, l_data_header, 4, p_manager);
+
+ opj_write_bytes(l_data_header, offset_jp2c, 8); /* OOFF */
+ opj_stream_write_data(cio, l_data_header, 8, p_manager);
+ opj_write_bytes(l_data_header, length_jp2c, 4); /* OBH part 1 */
+ opj_write_bytes(l_data_header + 4, JP2_JP2C, 4); /* OBH part 2 */
+ opj_stream_write_data(cio, l_data_header, 8, p_manager);
+
+ opj_write_bytes(l_data_header, 1, 1); /* NI */
+ opj_stream_write_data(cio, l_data_header, 1, p_manager);
+
+ opj_write_bytes(l_data_header, offset_idx, 8); /* IOFF */
+ opj_stream_write_data(cio, l_data_header, 8, p_manager);
+ opj_write_bytes(l_data_header, length_idx, 4); /* IBH part 1 */
+ opj_write_bytes(l_data_header + 4, JPIP_CIDX, 4); /* IBH part 2 */
+ opj_stream_write_data(cio, l_data_header, 8, p_manager);
+
+ len = opj_stream_tell(cio) - lenp;
+ opj_stream_skip(cio, lenp, p_manager);
+ opj_write_bytes(l_data_header, len, 4); /* L */
+ opj_stream_write_data(cio, l_data_header, 4, p_manager);
+ opj_stream_seek(cio, lenp + len, p_manager);
+}
+#endif
+
+
+#if 0
+static int write_fidx(int offset_jp2c, int length_jp2c, int offset_idx,
+ int length_idx, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_BYTE l_data_header [4];
+ OPJ_OFF_T len, lenp;
+
+ lenp = opj_stream_tell(cio);
+ opj_stream_skip(cio, 4, p_manager);
+ opj_write_bytes(l_data_header, JPIP_FIDX, 4); /* FIDX */
+ opj_stream_write_data(cio, l_data_header, 4, p_manager);
+
+ write_prxy(offset_jp2c, length_jp2c, offset_idx, length_idx, cio, p_manager);
+
+ len = opj_stream_tell(cio) - lenp;
+ opj_stream_skip(cio, lenp, p_manager);
+ opj_write_bytes(l_data_header, len, 4); /* L */
+ opj_stream_write_data(cio, l_data_header, 4, p_manager);
+ opj_stream_seek(cio, lenp + len, p_manager);
+
+ return len;
+}
+#endif
+#endif /* USE_JPIP */