blob: fcf2384e43fca7a4b7bb7409c8068ebb0e7a9658 [file] [log] [blame]
/* $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__ */