openjpeg/src/lib/openjpip/openjpip.h

313 lines
9.3 KiB
C

/*
* $Id$
*
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2014, Professor Benoit Macq
* Copyright (c) 2010-2011, Kaori Hagihara
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OPENJPIP_H_
# define OPENJPIP_H_
#include "session_manager.h"
#include "target_manager.h"
#include "query_parser.h"
#include "msgqueue_manager.h"
#include "sock_manager.h"
#include "auxtrans_manager.h"
#ifdef SERVER
#include "fcgi_stdio.h"
#define logstream FCGI_stdout
#else
#define FCGI_stdout stdout
#define FCGI_stderr stderr
#define logstream stderr
#include "cache_manager.h"
#include "byte_manager.h"
#include "imgsock_manager.h"
#include "metadata_manager.h"
#include "ihdrbox_manager.h"
#include "index_manager.h"
#endif /*SERVER*/
/*
*==========================================================
* JPIP server API
*==========================================================
*/
#ifdef SERVER
/** Server static records*/
typedef struct server_record {
sessionlist_param_t *sessionlist; /**< list of session records*/
targetlist_param_t *targetlist; /**< list of target records*/
auxtrans_param_t auxtrans;
} server_record_t;
/** Query/response data for each client*/
typedef struct QR {
query_param_t *query; /**< query parameters*/
msgqueue_param_t *msgqueue; /**< message queue*/
channel_param_t *channel; /**< channel, (NULL if stateless)*/
} QR_t;
/**
* Initialize the JPIP server
*
* @param[in] tcp_auxport opening tcp auxiliary port ( 0 not to open, valid No. 49152-65535)
* @param[in] udp_auxport opening udp auxiliary port ( 0 not to open, valid No. 49152-65535)
* @return initialized server record pointer
*/
server_record_t * init_JPIPserver(int tcp_auxport, int udp_auxport);
/**
* Terminate the JPIP server
*
* @param[in] rec address of deleting server static record pointer
*/
void terminate_JPIPserver(server_record_t **rec);
/**
* 1st process per client request; parse query string
*
* @param[in] query_string request query string
* @return initialized query/response data pointer
*/
QR_t * parse_querystring(const char *query_string);
/**
* 2nd process; process JPIP request and construct message queue
*
* @param[in] rec server static record pointer
* @param[in] qr query/response data pointer
* @return true if succeed, otherwise false
*/
OPJ_BOOL process_JPIPrequest(server_record_t *rec, QR_t *qr);
/**
* 3rd process; send response data JPT/JPP-stream
*
* @param[in] rec server static record pointer
* @param[in] qr query/response data pointer
*/
void send_responsedata(server_record_t *rec, QR_t *qr);
/**
* 4th (last) process;
*
* @param[in] rec server static record pinter
* @param[in] qr address of query/response data pointer
*/
void end_QRprocess(server_record_t *rec, QR_t **qr);
/**
* Option for local tests; print out parameter values to logstream (stderr)
*
* @param[in] query true if query parameters are to be printed out
* @param[in] messages true if queue of messages is to be printed out
* @param[in] sessions true if session list is to be printed out
* @param[in] targets true if target list is to be printed out
* @param[in] qr query/response data pointer
* @param[in] rec server static record pinter
*/
void local_log(OPJ_BOOL query, OPJ_BOOL messages, OPJ_BOOL sessions,
OPJ_BOOL targets, QR_t *qr, server_record_t *rec);
#endif /*SERVER*/
/*
*==========================================================
* JPIP decoding server API
*==========================================================
*/
#ifndef SERVER
/** Decoding server static records*/
typedef struct dec_server_record {
cachelist_param_t *cachelist; /**< cache list*/
Byte_t *jpipstream; /**< JPT/JPP stream*/
OPJ_SIZE_T jpipstreamlen; /**< length of jpipstream*/
msgqueue_param_t *msgqueue; /**< parsed message queue of jpipstream*/
SOCKET listening_socket; /**< listenning socket*/
} dec_server_record_t;
/** Client socket identifier*/
typedef SOCKET client_t;
/**
* Initialize the image decoding server
*
* @param[in] port opening tcp port (valid No. 49152-65535)
* @return initialized decoding server record pointer
*/
OPJ_API dec_server_record_t * OPJ_CALLCONV init_dec_server(int port);
/**
* Terminate the image decoding server
*
* @param[in] rec address of deleting decoding server static record pointer
*/
OPJ_API void OPJ_CALLCONV terminate_dec_server(dec_server_record_t **rec);
/**
* Accept client connection
*
* @param[in] rec decoding server static record pointer
* @return client socket ID, -1 if failed
*/
OPJ_API client_t OPJ_CALLCONV accept_connection(dec_server_record_t *rec);
/**
* Handle client request
*
* @param[in] client client socket ID
* @param[in] rec decoding server static record pointer
* @return true if succeed
*/
OPJ_API OPJ_BOOL OPJ_CALLCONV handle_clientreq(client_t client,
dec_server_record_t *rec);
#endif /*SERVER*/
/*
*==========================================================
* JPIP tool API
*==========================================================
*/
#ifndef SERVER
/*
* jpip to JP2 or J2K
*/
/** JPIP decoding parameters*/
typedef struct jpip_dec_param {
Byte_t *jpipstream; /**< JPT/JPP-stream*/
Byte8_t jpiplen; /**< length of jpipstream*/
msgqueue_param_t *msgqueue; /**< message queue*/
metadatalist_param_t *metadatalist; /**< metadata list going into JP2 file*/
ihdrbox_param_t *ihdrbox; /**< ihdr box going into JP2 file*/
Byte_t *jp2kstream; /**< J2K codestream or JP2 file codestream*/
Byte8_t jp2klen; /**< length of j2kstream or JP2 file*/
} jpip_dec_param_t;
/**
* Initialize jpip decoder
*
* @param[in] jp2 true in case of jp2 file encoding, else j2k file encoding
* @return JPIP decoding parameters pointer
*/
OPJ_API jpip_dec_param_t * OPJ_CALLCONV init_jpipdecoder(OPJ_BOOL jp2);
/**
* Destroy jpip decoding parameters
*
* @param[in] dec address of JPIP decoding parameters pointer
*/
OPJ_API void OPJ_CALLCONV destroy_jpipdecoder(jpip_dec_param_t **dec);
/**
* Read jpip codestream from a file
*
* @param[in] fname file name
* @param[in] dec JPIP decoding parameters pointer
* @return true if succeed
*/
OPJ_API OPJ_BOOL OPJ_CALLCONV fread_jpip(const char fname[],
jpip_dec_param_t *dec);
/**
* Decode jpip codestream
*
* @param[in] dec JPIP decoding parameters pointer
*/
OPJ_API void OPJ_CALLCONV decode_jpip(jpip_dec_param_t *dec);
/**
* Write J2K/JP2 codestream to a file
*
* @param[in] fname file name
* @param[in] dec JPIP decoding parameters pointer
* @return true if succeed
*/
OPJ_API OPJ_BOOL OPJ_CALLCONV fwrite_jp2k(const char fname[],
jpip_dec_param_t *dec);
/**
* Option; print out parameter values to stderr
*
* @param[in] messages true if queue of messages is to be printed out
* @param[in] metadata true if metadata is to be printed out
* @param[in] ihdrbox true if image header data is to be printed out
* @param[in] dec JPIP decoding parameters pointer
*/
OPJ_API void OPJ_CALLCONV output_log(OPJ_BOOL messages, OPJ_BOOL metadata,
OPJ_BOOL ihdrbox, jpip_dec_param_t *dec);
/*
* test the format of index (cidx) box in JP2 file
*/
/** Redefinition of index parameters*/
typedef index_param_t index_t;
/**
* Parse JP2 file and get index information from cidx box inside
*
* @param[in] fd file descriptor of the JP2 file
* @return pointer to the generated structure of index parameters
*/
OPJ_API index_t * OPJ_CALLCONV get_index_from_JP2file(int fd);
/**
* Destroy index parameters
*
* @param[in,out] idx addressof the index pointer
*/
OPJ_API void OPJ_CALLCONV destroy_index(index_t **idx);
/**
* print index parameters
*
* @param[in] index index parameters
*/
OPJ_API void OPJ_CALLCONV output_index(index_t *index);
#endif /*SERVER*/
#endif /* !OPENJPIP_H_ */