You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

340 lines
12 KiB

2 years ago
#ifndef __ZMF_CODEC_H__
#define __ZMF_CODEC_H__
#ifdef __GNUC__
#pragma GCC visibility push(default)
#endif
/**
* @file zmf_codec.h
* @brief ZMF编解码器接口
*/
/**
* @defgroup ZmfCodec
* @brief ZMF库提供了注册的方式
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief H264视频编解码器参数结构体
*/
typedef struct {
/* 'Base','Main', 'Extd', 'High' */
char cProfile[4];
/* '10','1b','11','12',...,'51' */
char cLevel[2];
char bErrorConcealOn;
char bSmallNalu;
} ZmfVideoCodecH264;
/**
* @brief VP8视频编解码器特有参数结构体
*/
typedef struct {
char bPictureLossIndicationOn;
char feedbackModeOn;
char bErrorConcealOn;
} ZmfVideoCodecVP8;
/**
* @brief
*/
typedef union {
ZmfVideoCodecH264 H264;
ZmfVideoCodecVP8 VP8;
} ZmfVideoCodecSpecific;
/**
* @brief
*/
typedef struct {
unsigned width;
unsigned height;
/* kbps */
unsigned startBitrate;
unsigned maxBitrate;
unsigned minBitrate;
unsigned maxFramerate;
unsigned int qpMax;
unsigned int qpMin;
ZmfVideoCodecSpecific codecSpecific;
} ZmfVideoCodec;
/**
* @brief AMR音频编解码器特有参数结构体
*/
typedef struct {
unsigned bandMode;
} ZmfAudioCodecAMR;
/**
* @brief
*/
typedef union {
ZmfAudioCodecAMR AMR;
} ZmfAudioCodecSpecific;
/**
* @brief
*/
typedef struct {
unsigned sampleRate;
unsigned bitrate;
unsigned channels;
ZmfAudioCodecSpecific codecSpecific;
} ZmfAudioCodec;
/**
* @brief
*/
typedef union {
ZmfVideoCodec video;
ZmfAudioCodec audio;
} ZmfCodec;
/**
* @brief @ref ZmfCodecClass::codecSet, @ref ZmfCodecClass::codecGet
*/
typedef enum {
/**
* value, size int, sizeof(int) bool \n
* @ref ZmfCodecClass::codecSet \n
* @ref ZmfCodecClass::codecGet ()
*/
ZmfCodecKeyFrame = 0,
/**
* value, size int, sizeof(int) kpbs \n
* @ref ZmfCodecClass::codecSet
*/
ZmfCodecBitrate,
/**
* value, size int, sizeof(int) fps \n
* @ref ZmfCodecClass::codecSet
*/
ZmfCodecFramerate,
/**
* value, size int, sizeof(int) \n
* @ref ZmfCodecClass::codecSet AMR的带宽模式
*/
ZmfAmrBandMode,
/**
* value, size int, sizeof(int) pixel \n
* @ref ZmfCodecClass::codecGet
*/
ZmfCodecWidth,
/**
* value, size int, sizeof(int) pixel \n
* @ref ZmfCodecClass::codecGet
*/
ZmfCodecHeight,
/**
* value, size int, sizeof(int) % \n
* @ref ZmfCodecClass::codecSet ()
*/
ZmfCodecPacketLoss,
/**
* value, size int, sizeof(int) ms \n
* @ref ZmfCodecClass::codecSet ()
*/
ZmfCodecRtt,
/**
* value, size int, sizeof(int) bool \n
* @ref ZmfCodecClass::codecGet
*/
ZmfCodecErrorConceal,
/**
* value, size int, sizeof(int) bool \n
* @ref ZmfCodecClass::codecGet
*/
ZmfCodecStream,
/**
* value, size uint8_t[], \n
* @ref ZmfCodecClass::codecSet H264的SPS NALU
*/
ZmfCodecH264SPS,
/**
* value, size uint8_t[], \n
* @ref ZmfCodecClass::codecSet H265的SPS NALU
*/
ZmfCodecH265SPS = ZmfCodecH264SPS,
/**
* value, size uint8_t[], \n
* @ref ZmfCodecClass::codecSet H264的PPS NALU
*/
ZmfCodecH264PPS,
/**
* value, size uint8_t[], \n
* @ref ZmfCodecClass::codecSet H265的PPS NALU
*/
ZmfCodecH265PPS = ZmfCodecH264PPS,
/**
* value, size uint8_t[], \n
* @ref ZmfCodecClass::codecSet H265的VPS NALU
*/
ZmfCodecH265VPS,
ZmfCodecPitch,
ZmfCodecDtx,
ZmfCodecFixBw,
ZmfOpusMode,
} ZmfCodecKey;
/**
* @brief 使
* @param user_data @ref ZmfCodecClass::codecNew
* @param buf
* @param length
* @param cookie @ref ZmfCodecClass::codecDo
* @param bLastFrag ()
* @return NULL
*/
typedef void (*ZmfCodecOut)(void* user_data, const char* buf, unsigned length,
void* cookie, int bLastFrag);
/**
* @brief ZmfCodecClass结构体
*/
typedef struct {
/**
* @brief Codec实例
* @param codecName com.juphoon.H264.encoder"
* @param callback ()
* @param user_data callback
* @return
*/
void* (*codecNew)(const char* codecName, ZmfCodecOut callback, void* user_data);
/**
* @brief callback()
* @param handle Codec实例指针
* @param in
* @param in_len
* @param timeStampMs
* @param cookie
* @param bLastFrag ()
* @return int
* @retval 0
* @retval
* @pre Codec实例 @ref codecNew
*/
int (*codecDo)(void *handle, void* in, unsigned in_len, unsigned timeStampMs,
void* cookie, int bLastFrag);
/**
* @brief Codec实例
* @param handle Codec实例指针
* @param settings Codec设置参数
* @return int
* @retval 0
* @retval
* @pre Codec实例 @ref codecNew
*/
int (*codecReset)(void *handle, ZmfCodec* settings);
/**
* @brief Codec参数
* @param handle Codec实例指针
* @param key @ref ZmfCodecKey
* @param value
* @param value_size
* @return int
* @retval 0
* @retval
* @pre Codec实例 @ref codecNew
*/
int (*codecSet)(void *handle, ZmfCodecKey key, const void *value, int value_size);
/**
* @brief Codec参数
* @param handle Codec实例指针
* @param key @ref ZmfCodecKey
* @param value
* @param value_size
* @return int
* @retval 0
* @retval
* @pre Codec实例 @ref codecNew
*/
int (*codecGet)(void *handle, ZmfCodecKey key, void *value, int value_size);
/**
* @brief Codec实例
* @param handle Codec实例指针
* @return int
* @retval 0
* @retval
*/
int (*codecDelete)(void *handle);
} ZmfCodecClass;
/** @brief 硬件编码器出错时回退到软件编码 */
#define ZMF_CODEC_FALLBACK_SOFTWARE -13
/** @brief 内置H264解码器 */
#define ZMF_BUILTIN_DECODER_H264 "zmf.builtin.H264.decoder"
/** @brief 内置H264编码器 */
#define ZMF_BUILTIN_ENCODER_H264 "zmf.builtin.H264.encoder"
/** @brief 内置H265解码器 */
#define ZMF_BUILTIN_DECODER_H265 "zmf.builtin.H265.decoder"
/** @brief 内置H265编码器 */
#define ZMF_BUILTIN_ENCODER_H265 "zmf.builtin.H265.encoder"
/** @brief 用H264解码器 */
#define ZMF_DECODER_H264 "H264.decoder"
/** @brief 通用H264编码器 */
#define ZMF_ENCODER_H264 "H264.encoder"
/** @brief 通用H265解码器 */
#define ZMF_DECODER_H265 "H265.decoder"
/** @brief 通用H265编码器 */
#define ZMF_ENCODER_H265 "H265.encoder"
/** @brief 文件录制H264编码器 */
#define ZMF_FILE_ENCODER_H264 "FILE.H264.encoder"
/**
* @brief
* @param[in] codecName "com.juphoon.H264.encoder"
* @param[in] klass @ref ZmfCodecClass
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* -ZMF_ERROR_CODEC_RIGSTER_DUPLICATE: zmf库中已经存在指定名称的编解码器\n
* @warning codecName和klass必须保持全局有效
*/
int Zmf_CodecRegister(const char* codecName, const ZmfCodecClass *klass);
/**
* @brief
* @param[in] codecName "com.juphoon.H264.encoder"
* @return ZmfCodecClass*
* 0: zmf内部的编解码器列表中查找到指定名称的编解码器
* 0
* @pre @ref Zmf_CodecRegister
*/
const ZmfCodecClass* Zmf_CodecGetClass(const char* codecName);
/**
* @brief
* @param[out] codecNames
* @param[in,out] count zmf内部编解码器名称列表的总长度
* zmf内部编解码器名称列表总长度大于给定的数组长度
* @return int
* @warning *count的值在函数调用前后会发生变化zmf内部编解码器列表的总长度
*/
int Zmf_CodecGetList(const char* codecNames[], int *count);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/**
* @}
*/
#ifdef __GNUC__
#pragma GCC visibility pop
#endif
#endif