* ISVCEncoder : 编码器的封装。提供以下 api:
* int ISVCEncoder::GetDefaultParams (SEncParamExt* pParam) : 获得默认的命令行参数。
* int ISVCEncoder::Initialize (const SEncParamBase* pParam) : 以编码参数初始化编码器。
* int ISVCEncoder::InitializeExt (const SEncParamExt* pParam) : 以扩展参数初始化编码器。
* int ISVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) : 编码一帧。
其中,kpSrcPic 用于存储输入的帧数据,其组织形式为
typedef struct Source_Picture_s {
int iColorFormat;
int iStride[4];
unsigned char* pData[4];
int iPicWidth;
int iPicHeight;
long long uiTimeStamp;
} SSourcePicture;
pBsInfo 用于返回编码码流,其组织形式为
typedef struct {
int iLayerNum;
SLayerBSInfo sLayerInfo[MAX_LAYER_NUM_OF_FRAME];
EVideoFrameType eFrameType;
int iFrameSizeInBytes;
long long uiTimeStamp;
}
iLayerNum 为输出的空域层数,
iFrameSizeInBytes 为输出据的总长度,
uiTimeStamp 当前帧的时间戳,即 pts。
eFrameType 为输出的帧类型。
EVideoFrameType 的枚举包括:
videoFrameTypeInvalid(0) 无效类型,videoFrameTypeIDR(1) IDR(即刻刷新)帧,videoFrameTypeI(2) 普通I帧,videoFrameTypeP(3) P帧,videoFrameTypeSkip(4),被编码器跳过的帧,videoFrameTypeIPMixed I\P 条带混合的帧,类似于x264的渐进刷新模式输出,现在不支持。(注意:openh264 并没有预留 B 帧类型)
sLayerInfo 用于实际封装输出的二进制流,其结构 SLayerBSInfo 定义为:
typedef struct {
unsigned char uiTemporalId;
unsigned char uiSpatialId;
unsigned char uiQualityId;
EVideoFrameType eFrameType;
unsigned char uiLayerType;
int iSubSeqId;
int iNalCount;
int* pNalLengthInByte;
unsigned char* pBsBuf;
}
uiTemporalId 为时域层级,uiSpatialId 为空域层级,
uiQualityId 为质量层级,uiLayerType 为子层类型,iSubSeqId 为所属子序列,iNalCount 包含 NALU 的数目,pNalLengthInByte 各个 NALU 的长度,pBsBuf 实际输出的二进制流。
* int ISVCEncoder::EncodeParameterSets (SFrameBSInfo* pBsInfo) : 编码编码参数集。
* int ISVCEncoder::ForceIntraFrame (bool bIDR, int iLayerId = -1) : 强制编码 IDR 帧。bIDR 设置为 true 后,下一次编码器输出的帧类型将为 IDR。
* int ISVCEncoder::SetOption (ENCODER_OPTION eOptionId, void* pOption) : 设置编码选项,可以在编码器处于任意状态执行,编码器运行时某些设置有可能不生效。
* int ISVCEncoder::GetOption (ENCODER_OPTION eOptionId, void* pOption) : 获取编码选项,可以在编码器处于任意状态执行。
* int ISVCEncoder::Uninitialize() : 反初始化编码器。