/*
 * SpanDSP - a series of DSP components for telephony
 *
 * v42bis.h
 *
 * Written by Steve Underwood <steveu@coppice.org>
 *
 * Copyright (C) 2005, 2011 Steve Underwood
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 2.1,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*! \page v42bis_page V.42bis modem data compression
\section v42bis_page_sec_1 What does it do?
The v.42bis specification defines a data compression scheme, to work in
conjunction with the error correction scheme defined in V.42.

\section v42bis_page_sec_2 How does it work?
*/

#include <stdint.h>

#if !defined(_SPANDSP_V42BIS_H_)
#define _SPANDSP_V42BIS_H_

#define SPAN_DECLARE(x) x

#define V42BIS_MIN_STRING_SIZE      6
#define V42BIS_MAX_STRING_SIZE      250
#define V42BIS_MIN_DICTIONARY_SIZE  512
#define V42BIS_MAX_BITS             12
#define V42BIS_MAX_CODEWORDS        4096    /* 2^V42BIS_MAX_BITS */
#define V42BIS_MAX_OUTPUT_LENGTH    1024

enum
{
    V42BIS_P0_NEITHER_DIRECTION = 0,
    V42BIS_P0_INITIATOR_RESPONDER,
    V42BIS_P0_RESPONDER_INITIATOR,
    V42BIS_P0_BOTH_DIRECTIONS
};

enum
{
    V42BIS_COMPRESSION_MODE_DYNAMIC = 0,
    V42BIS_COMPRESSION_MODE_ALWAYS,
    V42BIS_COMPRESSION_MODE_NEVER
};

typedef void (*put_msg_func_t)(void *user_data, const uint8_t *msg, int len);

/*!
    V.42bis compression/decompression descriptor. This defines the working state for a
    single instance of V.42bis compress/decompression.
*/
typedef struct v42bis_state_s v42bis_state_t;

#if defined(__cplusplus)
extern "C"
{
#endif

/*! Compress a block of octets.
    \param s The V.42bis context.
    \param buf The data to be compressed.
    \param len The length of the data buffer.
    \return 0 */
SPAN_DECLARE(int) v42bis_compress(v42bis_state_t *s, const uint8_t buf[], int len);

/*! Flush out any data remaining in a compression buffer.
    \param s The V.42bis context.
    \return 0 */
SPAN_DECLARE(int) v42bis_compress_flush(v42bis_state_t *s);

/*! Decompress a block of octets.
    \param s The V.42bis context.
    \param buf The data to be decompressed.
    \param len The length of the data buffer.
    \return 0 */
SPAN_DECLARE(int) v42bis_decompress(v42bis_state_t *s, const uint8_t buf[], int len);
    
/*! Flush out any data remaining in the decompression buffer.
    \param s The V.42bis context.
    \return 0 */
SPAN_DECLARE(int) v42bis_decompress_flush(v42bis_state_t *s);

/*! Set the compression mode.
    \param s The V.42bis context.
    \param mode One of the V.42bis compression modes -
            V42BIS_COMPRESSION_MODE_DYNAMIC,
            V42BIS_COMPRESSION_MODE_ALWAYS,
            V42BIS_COMPRESSION_MODE_NEVER */
SPAN_DECLARE(void) v42bis_compression_control(v42bis_state_t *s, int mode);

/*! Initialise a V.42bis context.
    \param s The V.42bis context.
    \param negotiated_p0 The negotiated P0 parameter, from the V.42bis spec.
    \param negotiated_p1 The negotiated P1 parameter, from the V.42bis spec.
    \param negotiated_p2 The negotiated P2 parameter, from the V.42bis spec.
    \param encode_handler Encode callback handler.
    \param encode_user_data An opaque pointer passed to the encode callback handler.
    \param max_encode_len The maximum length that should be passed to the encode handler.
    \param decode_handler Decode callback handler.
    \param decode_user_data An opaque pointer passed to the decode callback handler.
    \param max_decode_len The maximum length that should be passed to the decode handler.
    \return The V.42bis context. */
SPAN_DECLARE(v42bis_state_t *) v42bis_init(const void *ctx,
                                           v42bis_state_t *s,
                                           int negotiated_p0,
                                           int negotiated_p1,
                                           int negotiated_p2,
                                           put_msg_func_t encode_handler,
                                           void *encode_user_data,
                                           int max_encode_len,
                                           put_msg_func_t decode_handler,
                                           void *decode_user_data,
                                           int max_decode_len);

/*! Release a V.42bis context.
    \param s The V.42bis context.
    \return 0 if OK */
SPAN_DECLARE(int) v42bis_release(v42bis_state_t *s);

/*! Free a V.42bis context.
    \param s The V.42bis context.
    \return 0 if OK */
SPAN_DECLARE(int) v42bis_free(v42bis_state_t *s);

#if defined(__cplusplus)
}
#endif

#endif
/*- End of file ------------------------------------------------------------*/
