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.

974 lines
45 KiB

2 years ago
#ifndef __ZMF_EXT_H__
#define __ZMF_EXT_H__
#include "zmf_utils.h"
#if defined(ANDROID)
#include <jni.h>
#endif
#ifdef __GNUC__
#pragma GCC visibility push(default)
#endif
/**
* @file zmf_ext.h
* @brief ZMF音视频模块扩展接口
* @details zmf音视频模块扩展接口涉及的枚举
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup ZmfVideoExt
* @brief
* @{
*/
/**
* ZMF视频文件格式:\n
* [HEAD][LAYER]*\n
* HEAD -> uint16_t<WIDHT>, uint16_t <HEIGHT>, uint8_t <FPS>\n
* LAYER-> ZmfFileVideoLayer, [Fragment]*\n
* Fragment -> uint32_t<LENGTH>, [DATA]
*
* - WIDHT, HEIGHT, LENGTH is big endian
* - DATA is byte buffer
*/
typedef struct {
/** 一个layer中片段数量 */
unsigned char numFragments;
/** fragment level = fragPriority << 8 | fragSvcLevel\n
* 0x80 frame里最后一个layer ZmfVideoCaptureEncoder.bLastFrag\n
* 0x70 layer序号 ZmfVideoCaptureEncoder.simulcastIdx
*/
unsigned char fragPriority;
/** 0x40 表示关键帧 */
unsigned char fragSvcLevel;
} ZmfFileVideoLayer;
/**
*
*/
typedef struct {
/** [in] 编码器名字 */
const char* plName;
/** [in] 视频帧时间戳,单位ms; 如果设置为0,那么将使用调用接口的时间作为时间戳 */
unsigned timestamp : 32;
/** [in] 编码后数据长度 */
unsigned bufLength : 32;
/** [in] fragment 等级 */
unsigned fragLevel : 16;
/** [in] 当前fragment是否是一个layer里最后一个片段 */
unsigned bLastFrag : 1;
/** [in] 当前layer是否是一个帧里最后一层 */
unsigned bLastLayer: 1;
/** [in] layer 编号 */
unsigned simulcastIdx : 6;
/** [in] 当前layer是否为关键帧 */
unsigned bKeyFrame : 1;
/** [out] 标记下一次输出关键帧 */
unsigned nextKeyFrame : 1;
/** [out] 设置帧率,范围[0-64] */
unsigned newFrameRate : 6;
/** [out] 提示当前丢包率,范围[0-100] */
unsigned packetLoss : 16;
/** [out] 设置码率,单位kbps */
unsigned newBitRate : 16;
/** [out] 提示当前rtt,单位ms */
unsigned rtt : 16;
} ZmfVideoCaptureEncoder;
/**
* @}
*/
#if defined(ANDROID)
/**
* ZMF模块初始化时 ZmfPLuginLibPrefix
*/
#define ZmfPLuginLibPrefix "libspm-"
/**
* @brief SDK初始化
* @details ZMF回调函数 @ref Zmf_VideoCaptureAddCallback, @ref Zmf_VideoRenderAddCallback, @ref Zmf_AudioOutputAddCallback, @ref Zmf_AudioInputAddCallback
* @param env C++便JNI调用
* @return int
* @retval 0
* @retval
* @see unloadZmfPlugin
*/
int loadZmfPlugin(JNIEnv *env);
/**
* @brief SDK销毁
* @details @ref loadZmfPlugin Zmf @ref unloadZmfPlugin
* @param NULL
* @return NULL
* @see loadZmfPlugin
*/
void unloadZmfPlugin();
#endif
/**
* @defgroup ZmfVideoExt
* @{
*/
/**
* @brief
* @param pUser @ref Zmf_VideoCaptureAddCallback
* @param captureId ID
* @param iFace @ref ZmfVideoFaceType
* @param iImgAngle ()
* @param iCaptureOrient
* @param iWidth
* @param iHeight
* @param iPaddingWidth 32 @ref Zmf_DesktopCapturePadding
* @param iPaddingHeight 32 @ref Zmf_DesktopCapturePadding
* @param buf I420数据
* @param encoder @ref ZmfVideoCaptureEncoder
* @return NULL
* @warning encoder是NULL @ref ZmfPixelFormatI420
* @see ZmfVideoRenderCallback, Zmf_VideoCaptureAddCallback, Zmf_VideoCaptureRemoveCallback
*/
typedef void (*ZmfVideoCaptureCallback)(void* pUser, const char* captureId, int iFace,
int iImgAngle, int iCaptureOrient, int* iWidth, int* iHeight,
int iPaddingWidth, int iPaddingHeight,
unsigned char *buf, ZmfVideoCaptureEncoder* encoder);
/**
* @brief
* @param pUser @ref Zmf_VideoRenderAddCallback
* @param captureId ID
* @param sourceType @see ZmfVideoSourceType
* @param iAngle
* @param iMirror @ref ZmfMirrorType
* @param iWidth
* @param iHeight
* @param buf I420数据
* @return int
* 0:
* >0:
* @warning buf或iWidth或iHeight等于0 @ref Zmf_OnVideoRenderRequestRemove
* @see ZmfVideoCaptureCallback
*/
typedef int (*ZmfVideoRenderCallback)(void* pUser, const char* renderId, int sourceType, int iAngle,
int iMirror, int* iWidth, int* iHeight, unsigned char *buf,
unsigned long timeStamp);
/**
* @}
*/
/**
* @defgroup ZmfAudioExt
* @brief ZMF音频模块的扩展接口
* @{
*/
/**
* @brief zmf注入要播放的音频输出数据
* @details @ref Zmf_OnAudioOutput
* @param[in] pUser @ref Zmf_AudioOutputAddCallback
* @param[in] outputId Id
* @param[in] iSampleRateHz Hz为单位
* @param[in] iChannels
* @param[out] buf zmf的音频输出数据的首地址
* @param[in] len zmf要求的音频输出数据的长度
* @return zmf的音频输出数据的长度
* @see @ref Zmf_AudioOutputRemoveCallback
*/
typedef int (*ZmfAudioOutputCallback)(void* pUser, const char* outputId, int iSampleRateHz, int iChannels,
unsigned char *buf, int len);
/**
* @brief
* @details @ref Zmf_OnAudioOutput
* @param[in] outputId Id
* @param[in] iSampleRateHz Hz为单位
* @param[in] iChannels
* @param[in,out] buf
* @param[in] len
*/
typedef void (*ZmfAudioOutputFilter)(const char* outputId, int iSampleRateHz, int iChannels,
unsigned char *buf, int len);
/**
* @brief zmf音频模块获取音频输入数据
* @details @ref Zmf_OnAudioInput
* @param[in] pUser @ref Zmf_AudioInputAddCallback
* @param[in] inputId Id
* @param[in] iSampleRateHz Hz
* @param[in] iChannels
* @param[in] buf
* @param[in] len
* @param[in,out] micLevel [0,100]
* @param[in] playDelayMS ms
* @param[in] recDelayMS ms
* @param[in] clockDrift ms
* @see @ref Zmf_AudioInputRemoveCallback
*/
typedef void (*ZmfAudioInputCallback)(void* pUser, const char* inputId, int iSampleRateHz, int iChannels,
unsigned char *buf, int len, int *micLevel,
int playDelayMS, int recDelayMS, int clockDrift);
/**
* @brief zmf发送的事件
* @details zmf模块产生事件时被调用
* @param[in] iEventType @ref ZmfVideoEventType , @ref ZmfAudioEventType
* @param[in] json json字符串指针
* @param[in] len JSON参数的长度
* @return NULL
*/
typedef void (*ZmfEventListenCallback) (int iEventType, const char *json, int len);
/**
* @}
*/
/**
* @brief zmf模块获取外部传感器数据的接口zmf传递外部传感器的数据
* @param[in] sensor zmf的外部传感器数据, @ref ZmfSensorData
* @note @ref ZmfEventListenCallback @ref ZmfAudioErrorOccurred
* \n
* @see Zmf_SensorAddCallback, Zmf_SensorRemoveCallback
*/
void Zmf_OnSensorData (const ZmfSensorData *sensor);
/**
* @defgroup ZmfVideoExt
* @{
*/
/**
* @brief ZMF视频模块获取外部视频采集数据的接口
* @details 使YUV数据传入zmf
* @ref ZmfVideoCaptureDidStart @ref Zmf_OnVideoCaptureDidStop .
*
* @param captureId ID
* @param iFace @see ZmfVideoFaceType
* @param iImgAngle
* @param iCamAngle
* @param iWidth 0
* @param iHeight 0
* @param bufI420 (W*H*3/2)访
* @param encoder 使NULL
* @note @ref ZmfEventListenCallback @ref ZmfVideoErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @warning encoder是NULL @ref ZmfPixelFormatI420
* @see Zmf_OnH264AnnexBCapture
*/
void Zmf_OnVideoCapture (const char *captureId, int iFace, int iImgAngle, int iCamAngle,
int *iWidth, int *iHeight, unsigned char *bufI420,
ZmfVideoCaptureEncoder* encoder);
/**
* @brief ZMF模块的H264AnnexB数据
* @param captureId ID
* @param iFace @see ZmfVideoFaceType
* @param iImgAngle
* @param iCamAngle
* @param iWidth
* @param iHeight
* @param bufI420
* @param encoder
* @note @ref ZmfEventListenCallback @ref ZmfVideoErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see Zmf_OnVideoCapture
*/
void Zmf_OnH264AnnexBCapture (const char *captureId, int iFace, int iImgAngle, int iCamAngle,
int *iWidth, int *iHeight, unsigned char *bufI420,
ZmfVideoCaptureEncoder* encoder);
/**
* @brief ZMF模块的渲染数据
* @details 使zmf获取待渲染的YUV数据
* @param renderId ID
* @param sourceType @ref ZmfVideoSourceType
* @param iAngle
* @param iMirror @ref ZmfMirrorType
* @param iWidth
* @param iHeight
* @param bufI420
* @param timeStamp
* @note @ref ZmfEventListenCallback @ref ZmfVideoErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* -ZMF_ERROR_OUT_OF_MEMORY: \n
* @see Zmf_OnVideoRenderDidStarted
*/
void Zmf_OnVideoRender (const char *renderId, int sourceType, int iAngle, int iMirror,
int *iWidth, int *iHeight, unsigned char *bufI420, unsigned long timeStamp);
/**
* @brief
* @param pUser
* @param pfnCb
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see ZmfVideoCaptureCallback, Zmf_VideoCaptureRemoveCallback
*/
int Zmf_VideoCaptureAddCallback (void *pUser, ZmfVideoCaptureCallback pfnCb);
/**
* @brief
* @param pUser
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see ZmfVideoCaptureCallback, Zmf_VideoCaptureAddCallback
*/
int Zmf_VideoCaptureRemoveCallback (void *pUser);
/**
* @brief
* @param pUser
* @param pfnCb
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see ZmfVideoRenderCallback, Zmf_VideoRenderRemoveCallback
*/
int Zmf_VideoRenderAddCallback (void *pUser, ZmfVideoRenderCallback pfnCb);
/**
* @brief
* @param pUser
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see ZmfVideoRenderCallback, Zmf_VideoRenderAddCallback
*/
int Zmf_VideoRenderRemoveCallback (void *pUser);
/**
* @}
*/
/**
* @addtogroup ZmfAudioExt
* @{
*/
/**
* @brief zmf
* @param[in] pUser 使
* @param[in] pfnCb @ref ZmfAudioOutputCallback
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioOutputRemoveCallback
*/
int Zmf_AudioOutputAddCallback (void *pUser, ZmfAudioOutputCallback pfnCb);
/**
* @brief zmf
* @param[in] pUser 使Zmf只会将用户数据指针和输入参数pUser相同的回调函数注销
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioOutputAddCallback
*/
int Zmf_AudioOutputRemoveCallback (void *pUser);
/**
* @brief
* @param[in] callback @ref ZmfAudioOutputFilter
*/
void Zmf_AudioOutputSetFilter (ZmfAudioOutputFilter callback);
/**
* @brief ZMF音频输入设备的自听功能
* @details ZMF音频模块的自听通过音频输入数据回调函数实现
* @param[in] inputId ZMF音频输入设备的captureID使
* @return int\n
* 0: ZMF音频输入设备启动自听成功\n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* -ZMF_ERROR_OUT_OF_MEMORY: \n
* @see @ref Zmf_AudioLoopBackSetWeight, @ref Zmf_AudioLoopBackGetWeight, @ref Zmf_AudioloopbackStop
*/
int Zmf_AudioloopbackStart(char* inputId);
/**
* @brief ZMF音频输入设备的自听功能
* @details ZMF音频模块的自听通过音频输入数据回调函数实现
* @param[in] inputId ZMF音频输入设备的ID使
* @return int\n
* 0: ZMF音频输入设备关闭自听成功\n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioLoopBackSetWeight, @ref Zmf_AudioLoopBackGetWeight, @ref Zmf_AudioloopbackStart
*/
int Zmf_AudioloopbackStop(char* inputId);
/**
* @brief ZMF音频自听的音量
* @param[in] micVolumeWeight , [0,1]
* @return int\n
* 0: ZMF音频模块的自听音量成功\n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioLoopBackSetWeight, @ref Zmf_AudioloopbackStart, @ref Zmf_AudioloopbackStop
*/
int Zmf_AudioLoopBackSetWeight(double micVolumeWeight);
/**
* @brief ZMF音频自听的音量
* @return [0,1]
* @see @ref Zmf_AudioLoopBackSetWeight, @ref Zmf_AudioloopbackStart, @ref Zmf_AudioloopbackStop
*/
double Zmf_AudioLoopBackGetWeight();
/**
* @brief
* @param[in] pUser 使NULL
* @param[in] pfnCb @ref ZmfAudioInputCallback NULL
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioInputRemoveCallback, @ref Zmf_AudioOutputAddCallback
*/
int Zmf_AudioInputAddCallback (void *pUser, ZmfAudioInputCallback pfnCb);
/**
* @brief
* @param[in] pUser 使Zmf只会将用户数据指针和输入参数pUser相同的回调函数注销NULL
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_AudioInputAddCallback, @ref Zmf_AudioOutputRemoveCallback
*/
int Zmf_AudioInputRemoveCallback (void *pUser);
/**
* @}
*/
/**
* @defgroup ZmfVideoExt
* @{
*/
/**
* @brief @ref ZmfVideoRenderDidReceive
* @param renderId ID
* @param hWnd
* @param iWidth
* @param iHeight
* @param iImgAngle
* @note
* @see Zmf_OnVideoRenderDidResized, Zmf_OnVideoRenderDidStarted, Zmf_OnVideoRenderRequestRemove, Zmf_OnVideoRenderDidMatch, Zmf_OnVideoCaptureDidStop
*/
void Zmf_OnVideoRenderDidReceived (const char *renderId, void* hWnd, int iWidth, int iHeight, int iImgAngle);
/**
* @brief @ref ZmfVideoRenderDidResize
* @param renderId ID
* @param hWnd
* @param iWidth
* @param iHeight
* @param iImgAngle
* @note
* @see Zmf_OnVideoRenderDidReceived, Zmf_OnVideoRenderDidStarted, Zmf_OnVideoRenderRequestRemove, Zmf_OnVideoRenderDidMatch, Zmf_OnVideoCaptureDidStop
*/
void Zmf_OnVideoRenderDidResized (const char *renderId, void* hWnd, int iWidth, int iHeight, int iImgAngle);
/**
* @brief @ref ZmfVideoRenderDidStart
* @param renderId ID
* @param hWnd
* @param iWidth
* @param iHeight
* @param iImgAngle
* @note
* @see Zmf_OnVideoRenderDidReceived, Zmf_OnVideoRenderDidResized, Zmf_OnVideoRenderRequestRemove, Zmf_OnVideoRenderDidMatch, Zmf_OnVideoCaptureDidStop
*/
void Zmf_OnVideoRenderDidStarted (const char *renderId, void* hWnd, int iWidth, int iHeight, int iImgAngle);
/**
* @brief @ref ZmfVideoRenderRequestRemove
* @param renderId ID
* @param hWnd
* @note
* @see Zmf_OnVideoRenderDidReceived, Zmf_OnVideoRenderDidResized, Zmf_OnVideoRenderDidStarted, Zmf_OnVideoRenderDidMatch, Zmf_OnVideoCaptureDidStop
*/
void Zmf_OnVideoRenderRequestRemove(const char *renderId, void* hWnd);
/**
* @brief @ref ZmfVideoRenderDidMatch
* @param renderId ID
* @param hWnd
* @param matching [0,100]
* @note
* @see Zmf_OnVideoRenderDidReceived, Zmf_OnVideoRenderDidResized, Zmf_OnVideoRenderDidStarted, Zmf_OnVideoRenderRequestRemove, Zmf_OnVideoCaptureDidStop
*/
void Zmf_OnVideoRenderDidMatch (const char *renderId, void* hWnd, int matching);
/**
* @brief zmf
* @details 使zmf视频模块需要执行相应的操作
* @param captureId Id
* @note @ref ZmfEventListenCallback @ref ZmfVideoErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see Zmf_OnVideoRenderDidReceived, Zmf_OnVideoRenderDidResized, Zmf_OnVideoRenderDidStarted, Zmf_OnVideoRenderRequestRemove, Zmf_OnVideoRenderDidMatch
*/
void Zmf_OnVideoCaptureDidStop (const char *captureId);
/**
* @brief zmf
* @details 使zmf
* zmf会触发事件 @ref ZmfVideoCaptureStatus
*
* @param captureId ID
* @param bExposure 0
* @param brightness [0, 255]
* @param bBacklot 10
* @note @ref ZmfEventListenCallback @ref ZmfVideoErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
*/
void Zmf_OnVideoCaptureStatus (const char *captureId, int bExposure, int brightness, int bBacklot);
/**
* @brief zmf
* @details 使zmf
* zmf会触发事件 @ref ZmfVideoErrorOccurred
* @param errorNumber zmf的错误编号 @ref ZmfErrorNumber
* @param format zmf的错误信息
* @note
*/
void Zmf_OnVideoErrorOccurred (int errorNumber, const char* format, ...);
/**
* @brief ZMF视频模块回调函数
* @param pfnVideoListen NULL
* @return int
* 0:
*/
int Zmf_VideoSetListener (ZmfEventListenCallback pfnVideoListen);
/**
* @brief ZMF美颜模块初始化失败
* @param format
*/
void Zmf_BeautyInitError (const char* format);
/**
* @brief
* @param constant 0-100
* @param hue 0-100
* @param sat 0-100
* @param smooth 0-100
* @param filter 0-100
* @param whiten 0-100
* @param red 0-100
* @return int, \n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @pre @ref Zmf_BeautyEffect
*/
int Zmf_BeautyStrength(int constant, int hue, int sat, int smooth, int filter, int whiten, int red);
/**
* @brief
* @param FilterType
* @return int, \n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @pre @ref Zmf_BeautyEffect
*/
int Zmf_BeautyFilterSelect(int FilterType);
/**
* @}
*/
/**
* @addtogroup ZmfAudioExt
* @{
*/
/**
* @brief zmf音频模块获取音频输入数据的接口
* @details 使PCM音频数据传入zmf
* @ref ZmfAudioInputDidStart @ref Zmf_OnAudioInputDidStop .
*
* @param[in] inputId Id
* @param[in] sampleRateHz Hz
* @param[in] iChannels
* @param[in] buf
* @param[in] len
* @param[in,out] micLevel [0,100]
* @param[in] playDelayMS ms
* @param[in] recDelayMS ms
* @param[in] clockDrift ms
* @note @ref ZmfEventListenCallback @ref ZmfAudioErrorOccurred
* \n
* @see @ref Zmf_OnAudioInputDidStop, @ref Zmf_OnAudioOutput
*/
void Zmf_OnAudioInput (const char *inputId, int sampleRateHz, int iChannels, unsigned char *buf, int len,
int *micLevel, int playDelayMS, int recDelayMS, int clockDrift);
/**
* @brief zmf
* @details 使zmf音频模块需要执行相应的操作
* @param[in] inputId Id
* @note @ref ZmfEventListenCallback @ref ZmfAudioErrorOccurred
* \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_OnAudioOutputDidStop, @ref Zmf_OnAudioInput
*/
void Zmf_OnAudioInputDidStop (const char *inputId);
/**
* @brief zmf音频模块输出音频输出数据的接口
* @details 使zmf获取要播放的的PCM音频数据
* @ref ZmfAudioOutputDidStart @ref Zmf_OnAudioOutputDidStop .
*
* @param[in] outputId Id
* @param[in] sampleRateHz Hz
* @param[in] iChannels
* @param[in] buf
* @param[in] len
* @note @ref ZmfEventListenCallback @ref ZmfAudioErrorOccurred
* \n
* @see @ref Zmf_OnAudioInput, @ref Zmf_OnAudioOutputDidStop
*/
void Zmf_OnAudioOutput (const char *outputId, int sampleRateHz, int iChannels, unsigned char *buf, int len);
/**
* @brief zmf
* @details 使zmf音频模块需要执行相应的操作
* @param[in] outputId Id
* @see @ref Zmf_OnAudioInputDidStop, @ref Zmf_OnAudioOutput
*/
void Zmf_OnAudioOutputDidStop (const char *outputId);
/**
* @brief
* @details zmf会调用音频监听回调函数来发送事件通知 @ref ZmfAudioEventType
* @param[in] pfnAudioListen @ref ZmfEventListenCallback
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
* @see @ref Zmf_VideoSetListener
*/
int Zmf_AudioSetListener (ZmfEventListenCallback pfnAudioListen);
/**
* Set Audio data dump
*/
/**
* @brief
* @details windows系统支持ZMF启动音频输入后
* @param bEnable dumper
* @param dumpMode dumper的工作模式使
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
*/
int Zmf_AudioSetDataDump(int bEnable, int dumpMode);
/**
* @}
*/
/**
* @defgroup ZmfLog
* @{
*/
/**
* @brief
* @param iLogLevel @ref ZmfLogLevel
* @param str
* @see Zmf_LogSetCallback, Zmf_LogGetCallback
*/
typedef void(*PFN_LOG_CALLBACK) (int iLogLevel, const char *str);
/**
* @brief zmf的日志回调函数
* @details
* @param pfnCb , @ref PFN_LOG_CALLBACK
* @see Zmf_LogGetCallback
* @return int
* 0:
*/
int Zmf_LogSetCallback(void* pfnCb);
/**
* @brief zmf内部当前使用的日志回调函数
* @details
* @see Zmf_LogSetCallback
* @return zmf内部的日志回调函数, @ref PFN_LOG_CALLBACK
*/
PFN_LOG_CALLBACK Zmf_LogGetCallback();
/**
* @brief
* @param iLogLevel @ref ZmfLogLevel
*/
void Zmf_LogSetLevel (int iLogLevel);
/**
* @}
*/
/** 字体设置 */
typedef struct {
unsigned shadowRGBA;
float shadowBlurRadius;
float shadowOffsetX, shadowOffsetY;
unsigned outlineRGBA;
float outlineWidth;
unsigned fontRGBA;
float fontSize;
unsigned boundingWidth;
float scale;
char fontName[1024];
} ZmfFontLayout;
/** I420 Buffer */
typedef struct _ZmfI420Stencil {
unsigned char *bufI420;
unsigned width, height;
} ZmfI420Stencil;
/**
* @brief I420数据
* @param str
* @param info
* @return @ref ZmfI420Stencil I420数据指针
* @note I420数据 @ref Zmf_GetLastError \n
* \n
* ZMF_ERROR_ARGUMENT_INVALID: \n
* ZMF_ERROR_OUT_OF_MEMORY: \n
* ZMF_ERROR_IOS_CG_CREATE_CONTEXT: C接口iOS平台CG接口创建context失败 \n
* ZMF_ERROR_API_NOT_SUPPORTED: 使 \n
* ZMF_ERROR_YUV_LIB_ERROR: yuv处理相关的函数时libyuv返回错误 \n
*/
ZmfI420Stencil* Zmf_I420StencilFromString(const char*str, ZmfFontLayout* info);
/**
* @brief I420数据
* @details ZmfI420Stencil指针有效I420数据
* @param stencil
* @note void函数无返回值
*/
void Zmf_I420StencilDelete(ZmfI420Stencil *stencil);
/**
* @brief I420数据
* @param stencil @ref ZmfI420Stencil stencil->width <= dstW, stencil->height <= dstH
* @param dstX X坐标[0, dstW-1]
* @param dstY Y坐标[0, dstH-1]
* @param dstI420
* @param dstW
* @param dstH
* @return int\n
* 0: \n
* -ZMF_ERROR_ARGUMENT_INVALID: \n
*/
int Zmf_I420StencilBlend(const ZmfI420Stencil*stencil, unsigned dstX, unsigned dstY, unsigned char *dstI420, unsigned dstW, unsigned dstH);
/**
* @brief lib目录便
* @param NULL
* @return char*
* @retval lib目录
*/
char* Zmf_GetLibPath();
/**
* @brief
*
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] dir_path
*
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -99 - ffmpeg动态库失败
*/
int Zmf_WatermarkInit(const char *dir_path);
/**
* @brief
*/
void Zmf_WatermarkRelease();
/**
* @brief
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] state 1 - start, 2 - stop
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -ZMF_ERROR_WATERMARK_LOAD_LIBFFMPEG - ffmpeg动态库失败
*/
int Zmf_SetWatermarkState(int state);
/**
* @brief
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] font_file Windows系统上只能用相对路径
* @param[in] font_size 6-50
* @param[in] font_color RGB值 0xFFFFFF
* @param[in] back_color RGB值 0x000000
* @param[in] is_bold 0 - 1 -
* @param[in] is_italic 0 - 1 -
* @param[in] is_underline 线 0 - 1 -
* @param[in] alignment 1=Left, 2=Centered, 3=Right
* @param[in] borderstyle 1=Outline + drop shadow, 3=Opaque box
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_FONT_FILE -
* -ZMF_ERROR_WATERMARK_READ_FONT_NAME -
* -ZMF_ERROR_WATERMARK_GET_FONT_PATH -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -ZMF_ERROR_WATERMARK_LOAD_LIBFFMPEG - ffmpeg动态库失败
*/
int Zmf_SetTextWatermarkStyle(const char *font_file, int font_size,
int font_color, int back_color, int is_bold,
int is_italic, int is_underline, int alignment, int borderstyle);
/**
* @brief 使
* event字符串必须是utf-8
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] index index of event
*
* @param[in] state 1 - valid
* 2 - invalid
* @param[in] text_event ASS字幕的一条Event,
* "Dialogue: 0,0:00:07.92,0:00:09.72,Default,,0,0,0,,菊风软件."
*
* "Dialogue: 0,0:00:07.92,0:00:09.72,Default,,0,0,0,,{\pos(10, 100)}菊风软件."
*
* ASS格式规范可以从以下地址下载:
* http://www.perlfu.co.uk/projects/asa/ass-specs.doc
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -ZMF_ERROR_WATERMARK_LOAD_LIBFFMPEG - ffmpeg动态库失败
*/
int Zmf_SetTextWatermarkEvent(int index, int state, const char *text_event);
/**
* @brief
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] state 1 - valid
* 2 - invalid
* @param[in] font_file Windows系统上只能用相对路径
* @param[in] ts_font_size 6-50
* @param[in] ts_color_type 0 - red,
* 1 - yellow,
* 2 - green,
* 3 - cyan,
* 4 - blue,
* 5 - magenta,
* 6 - white,
* 7 - black
*
* @param[in] ts_border_width 0-5
* @param[in] ts_pos_type 0 - top left,
* 1 - bottom left,
* 2 - top right,
* 3 - bottom right,
* 4 - center
*
* @param[in] ts_pos_x
* @param[in] ts_pos_y
* @param[in] ts_is_ms 0 - false
* 1 - true
* @param[in] ts_base_time ,
* 1970-01-01 00:00:00 UTC
*
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_FONT_FILE -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -ZMF_ERROR_WATERMARK_LOAD_LIBFFMPEG - ffmpeg动态库失败
*/
int Zmf_SetTimestampWatermark(int state, const char *font_file, int ts_font_size, int ts_color_type,
int ts_border_width, int ts_pos_type, int ts_pos_x, int ts_pos_y, int ts_is_ms, int ts_base_time);
/**
* @brief
* png格式
*
* @remarks
* 使访
* https://juphoon.yuque.com/dptof9/ngzoi5/gbq46y
*
* @param[in] index
* @param[in] state 1 - valid
* 2 - invalid
*
* @param[in] url
* @param[in] pic_time_start
* @param[in] pic_time_end
* @param[in] pic_pos_x
* @param[in] pic_pos_y
*
* @retval
* 0 -
* -ZMF_ERROR_WATERMARK_INTERNAL_ERROR -
* -ZMF_ERROR_WATERMARK_LOAD_PICTURE_FILE -
* -ZMF_ERROR_WATERMARK_PICTURE_RESOLUTION -
* -ZMF_ERROR_WATERMARK_LOAD_LIBWATERMARK - watermark动态库失败
* -ZMF_ERROR_WATERMARK_LOAD_LIBFFMPEG - ffmpeg动态库失败
*/
int Zmf_SetOnePictureWatermark(int index, int state, const char *url, int pic_time_start,
int pic_time_end, int pic_pos_x, int pic_pos_y);
/* platform realize */
typedef enum {
EN_ZMF_LOCK_WRITABLE = 0,
EN_ZMF_LOCK_READING,
} EN_ZMF_LOCK_MODE;
void*Zmf_LockNew();
int Zmf_Lock(void* mutex, EN_ZMF_LOCK_MODE reading);
int Zmf_Unlock(void* mutex, EN_ZMF_LOCK_MODE reading);
int Zmf_LockDelete(void* mutex);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#ifdef __GNUC__
#pragma GCC visibility pop
#endif
#endif