/* $Id$
 *
 */

#ifndef __PJMEDIA_CODEC_H__
#define __PJMEDIA_CODEC_H__


/**
 * @file codec.h
 * @brief Codec framework.
 */

#include <pj/list.h>

PJ_BEGIN_DECL


/**
 * @defgroup PJMED_CODEC Codec framework.
 * @ingroup PJMEDIA
 * @{
 */

/** Top most media type. */
typedef enum pj_media_type
{
    /** No type. */
    PJ_MEDIA_TYPE_NONE = 0,

    /** The media is audio */
    PJ_MEDIA_TYPE_AUDIO = 1,

    /** The media is video. */
    PJ_MEDIA_TYPE_VIDEO = 2,

    /** Unknown media type, in this case the name will be specified in 
     *  encoding_name.
     */
    PJ_MEDIA_TYPE_UNKNOWN = 3,

} pj_media_type;


/** Media direction. */
typedef enum pj_media_dir_t
{
    /** None */
    PJ_MEDIA_DIR_NONE = 0,

    /** Encoding (outgoing to network) stream */
    PJ_MEDIA_DIR_ENCODING = 1,

    /** Decoding (incoming from network) stream. */
    PJ_MEDIA_DIR_DECODING = 2,

    /** Incoming and outgoing stream. */
    PJ_MEDIA_DIR_ENCODING_DECODING = 3,

} pj_media_dir_t;


/** Standard RTP paylist types. */
typedef enum pj_rtp_pt
{
    PJ_RTP_PT_PCMU = 0,		/* audio PCMU */
    PJ_RTP_PT_GSM  = 3,		/* audio GSM */
    PJ_RTP_PT_G723 = 4,		/* audio G723 */
    PJ_RTP_PT_DVI4_8K = 5,	/* audio DVI4 8KHz */
    PJ_RTP_PT_DVI4_16K = 6,	/* audio DVI4 16Khz */
    PJ_RTP_PT_LPC = 7,		/* audio LPC */
    PJ_RTP_PT_PCMA = 8,		/* audio PCMA */
    PJ_RTP_PT_G722 = 9,		/* audio G722 */
    PJ_RTP_PT_L16_2 = 10,	/* audio 16bit linear 44.1KHz stereo */
    PJ_RTP_PT_L16_1 = 11,	/* audio 16bit linear 44.1KHz mono */
    PJ_RTP_PT_QCELP = 12,	/* audio QCELP */
    PJ_RTP_PT_CN = 13,		/* audio Comfort Noise */
    PJ_RTP_PT_MPA = 14,		/* audio MPEG1 or MPEG2 as elementary streams */
    PJ_RTP_PT_G728 = 15,	/* audio G728 */
    PJ_RTP_PT_DVI4_11K = 16,	/* audio DVI4 11.025KHz mono */
    PJ_RTP_PT_DVI4_22K = 17,	/* audio DVI4 22.050KHz mono */
    PJ_RTP_PT_G729 = 18,	/* audio G729 */
    PJ_RTP_PT_CELB = 25,	/* video/comb Cell-B by Sun Microsystems (RFC 2029) */
    PJ_RTP_PT_JPEG = 26,	/* video JPEG */
    PJ_RTP_PT_NV = 28,		/* video NV implemented by nv program by Xerox */
    PJ_RTP_PT_H261 = 31,	/* video H261 */
    PJ_RTP_PT_MPV = 32,		/* video MPEG1 or MPEG2 elementary streams */
    PJ_RTP_PT_MP2T = 33,	/* video MPEG2 transport */
    PJ_RTP_PT_H263 = 34,	/* video H263 */

    PJ_RTP_PT_DYNAMIC = 96,	/* start of dynamic RTP payload */
} pj_rtp_pt;


/** Identification used to search for codec factory that supports specific 
 *  codec specification. 
 */
typedef struct pj_codec_id
{
    /** Media type. */
    pj_media_type   type;

    /** Payload type (can be dynamic). */
    unsigned	    pt;

    /** Encoding name, must be present if the payload type is dynamic. */
    pj_str_t	    encoding_name;

    /** Sampling rate. */
    unsigned	    sample_rate;
} pj_codec_id;


/** Detailed codec attributes used both to configure a codec and to query
 *  the capability of codec factories.
 */
typedef struct pj_codec_attr
{
    pj_uint32_t	sample_rate;	    /* Sampling rate in Hz */
    pj_uint32_t	avg_bps;	    /* Average bandwidth in bits per second */

    pj_uint8_t	pcm_bits_per_sample;/* Bits per sample in the PCM side */
    pj_uint16_t	ptime;		    /* Packet time in miliseconds */

    unsigned	pt:8;		    /* Payload type. */
    unsigned    vad_enabled:1;	    /* Voice Activity Detector. */
    unsigned    cng_enabled:1;	    /* Comfort Noise Generator. */
    unsigned    lpf_enabled:1;	    /* Low pass filter */
    unsigned    hpf_enabled:1;	    /* High pass filter */
    unsigned    penh_enabled:1;	    /* Perceptual Enhancement */
    unsigned    concl_enabled:1;    /* Packet loss concealment */
    unsigned    reserved_bit:1;

} pj_codec_attr;

/** Types of audio frame. */
typedef enum pj_audio_frame_type
{
    /** The frame is a silence audio frame. */
    PJ_AUDIO_FRAME_SILENCE,

    /** The frame is a non-silence audio frame. */
    PJ_AUDIO_FRAME_AUDIO,

} pj_audio_frame_type;

typedef struct pj_codec pj_codec;
typedef struct pj_codec_factory pj_codec_factory;


/** This structure describes an audio frame. */
struct pj_audio_frame
{
    /** Type: silence or non-silence. */
    pj_audio_frame_type type;

    /** Pointer to buffer. */
    void	*buf;

    /** Frame size in bytes. */
    unsigned	 size;
};

/**
 * Operations that must be supported by the codec.
 */
typedef struct pj_codec_op
{
    /** Get default attributes. */
    pj_status_t (*default_attr) (pj_codec *codec, pj_codec_attr *attr);

    /** Open and initialize codec using the specified attribute.
     *  @return zero on success.
     */
    pj_status_t	(*init)( pj_codec *codec, pj_pool_t *pool );

    /** Close and shutdown codec.
     */
    pj_status_t	(*open)( pj_codec *codec, pj_codec_attr *attr );

    /** Close and shutdown codec.
     */
    pj_status_t (*close)( pj_codec *codec );

    /** Encode frame.
     */
    pj_status_t (*encode)( pj_codec *codec, const struct pj_audio_frame *input,
			   unsigned output_buf_len, struct pj_audio_frame *output);

    /** Decode frame.
     */
    pj_status_t (*decode)( pj_codec *codec, const struct pj_audio_frame *input,
			   unsigned output_buf_len, struct pj_audio_frame *output);

} pj_codec_op;

/**
 * A codec describes an instance to encode or decode media frames. 
 */
struct pj_codec
{
    /** Entries to put this codec instance in codec factory's list. */
    PJ_DECL_LIST_MEMBER(struct pj_codec)

    /** Codec's private data. */
    void	*codec_data;

    /** Codec factory where this codec was allocated. */
    pj_codec_factory *factory;

    /** Operations to codec. */
    pj_codec_op	*op;
};

/**
 * This structure describes operations that must be supported by codec factories.
 */
typedef struct pj_codec_factory_op
{
    /** Check whether the factory can create codec with the specified ID.
     *  @param factory The codec factory.
     *  @param id  The codec ID.
     *  @return zero it matches.
     */
    pj_status_t	(*match_id)( pj_codec_factory *factory, const pj_codec_id *id );

    /** Create default attributes for the specified codec ID. This function can
     *  be called by application to get the capability of the codec.
     *  @param factory The codec factory.
     *  @param id  The codec ID.
     *  @param attr The attribute to be initialized.
     *  @return zero if success.
     */
    pj_status_t (*default_attr)( pj_codec_factory *factory, const pj_codec_id *id,
				 pj_codec_attr *attr );

    /** Enumerate supported codecs.
     *  @param factory The codec factory.
     *  @param count Number of entries in the array.
     *  @param codecs The codec array.
     *  @return the total number of supported codecs, which can be less or 
     *          greater than requested.
     */
    unsigned (*enum_codecs) (pj_codec_factory *factory, unsigned count, pj_codec_id codecs[]);

    /** This function is called by codec manager to instantiate one codec
     *  instance.
     *  @param factory The codec factory.
     *  @param id  The codec ID.
     *  @return the instance of the codec, or NULL if codec can not be created.
     */
    pj_codec* (*alloc_codec)( pj_codec_factory *factory, const pj_codec_id *id);

    /** This function is called by codec manager to return a particular instance
     *  of codec back to the codec factory.
     *  @param factory The codec factory.
     *  @param codec The codec instance to be returned.
     */
    void (*dealloc_codec)( pj_codec_factory *factory, pj_codec *codec );

} pj_codec_factory_op;

/**
 * Codec factory describes a module that is able to create codec with specific
 * capabilities. These capabilities can be queried by codec manager to create
 * instances of codec.
 */
struct pj_codec_factory
{
    /** Entries to put this structure in the codec manager list. */
    PJ_DECL_LIST_MEMBER(struct pj_codec_factory)

    /** The factory's private data. */
    void		*factory_data;

    /** Operations to the factory. */
    pj_codec_factory_op *op;

};

/**
 * Declare maximum codecs
 */
#define PJ_CODEC_MGR_MAX_CODECS	    32

/**
 * Codec manager maintains codec factory etc.
 */
typedef struct pj_codec_mgr
{
    pj_codec_factory factory_list;
    unsigned	     codec_cnt;
    pj_codec_id	     codecs[PJ_CODEC_MGR_MAX_CODECS];
} pj_codec_mgr;

/**
 * Init codec manager.
 */
PJ_DECL(pj_status_t) 
pj_codec_mgr_init (pj_codec_mgr *mgr);

/** 
 * Register codec to codec manager. 
 */
PJ_DECL(pj_status_t) 
pj_codec_mgr_register_factory (pj_codec_mgr *mgr, pj_codec_factory *factory);

/**
 * Unregister codec.
 */
PJ_DECL(void) 
pj_codec_mgr_unregister_factory (pj_codec_mgr *mgr, pj_codec_factory *factory);

/**
 * Enumerate codecs.
 */
PJ_DECL(unsigned)
pj_codec_mgr_enum_codecs (pj_codec_mgr *mgr, unsigned count, const pj_codec_id *codecs[]);

/**
 * Open codec.
 */
PJ_DECL(pj_codec*) 
pj_codec_mgr_alloc_codec (pj_codec_mgr *mgr, const struct pj_codec_id *id);

/**
 * Close codec.
 */
PJ_DECL(void) 
pj_codec_mgr_dealloc_codec (pj_codec_mgr *mgr, pj_codec *codec);

/**
 * @}
 */

PJ_END_DECL


#endif	/* __PJMEDIA_CODEC_H__ */
