X2编码器设计方案
Nal输出格式相关设计:
Raw视频捕捉线程 X2配置块 X2编码线程 initEncoder 网络传输线程 初始 注册回调 nalOutPutCallback 调用回调 Raw视频块 单帧输入 Encode close  X2编码设计概图
编码器nal传输方案设计实现分为三个功能线程:
1) Raw视频捕捉线程 由外部提供,实现初始化编码器功能,并将捕捉到的视频数据转
换为指定格式与大小,再调用编码帧函数进行编码操作.
2) X2编码线程 由编码器实现.内部导出三个功能函数如下所示.并且在nal数据单元生成后调用网络传输回调函数来执行传输功能
3) 网络传输线程 由外部提供.实现针对不同网络介质的网络传输功能,其中具体实现nal网络传输回调函数.
此外,对于整个编码过程要进行单独操作,对于不同的帧来源(比如同时编码多个视频捕捉设备产生的视频数据),即使是同样大小与格式的视频数据,使用单独的编码器dll实例执行操作.
/*网络传输线程回调函数类型,由pNalBuf所指数据为nal单元,其大小为nBufSize字节.具体函数由网络传输功能提供,注:此函数实现应为c语言函数*/
typedef void (*gsta_nalOutPutCallback)(const char * pNalBuf, int nBufSize) ; /*进行参数字串初始,并保存nal网络传输回调 * @ pszInit : 配置初始字符串
*  x2.exe --preset superfast --ratetol 4.0  --vbv-init 1.0 --vbv-maxrate 40 --vbv-bufsize 60 --fps 10 --profile baseline --level 1.3 --frames 10 --input-res 176x144 -o capDev.nalout capDev.cap
* 其中输入文件名称的.cap代表视频捕捉输入,输出文件名称中的.nalout代表nal格式输出
* @ fnTransp: 当有任何nal生成后,编码器调用此过程来进行nal的网络传输,不能为空
* retval: >0则成功,表示编码器句柄值,否则不能再调用其它编码器函数
*/
GSTA_DLL_API HANDLE gsta_init(const char * pszInit, gsta_nalOutPutCallback fnTransp ) ;
/*将指定格式的单帧数据进行编码,只能在初始化过后调用
* @pRawPic: 格式与采样.yuv文件相同,代表单幅图像yuv420编码数据块(格式可调整)
* @nPicSize: 上述数据块大小值,>0.
* @hEncoder: 编码器句柄, gsta_init返回值 * retval: =0则成功
*/
GSTA_DLL_API int gsta_encode(HANDLE hEncoder, char * pRawPic, int nPicSize) ; /*所有单帧编码完后,关闭本编码器,之后用户可卸载编码器dll, * 且不能再调用编码器相关的导出函数 * @hEncoder: 编码器句柄,gsta_init返回值
*/
GSTA_DLL_API void gsta_close(HANDLE hEncoder);
具体使用方法演示
参见项目文件夹中的TestUnits文件夹中演示项目.
调用顺序参照演示所示,注意使用后关闭.每个编码器句柄均对应单一编码线程.
编码参数设置
在函数HANDLE gsta_init(const char * pszInit, gsta_nalOutPutCallback fnTransp ) ;中指定的初始化参数字符串,其格式可参照原来x2编码器命令行文件-x2.exe-中的命令行格式,其内容可自行调整.注:命令行参数可在x2.exe执行可运行性测试.
其中的输出/输入文件内容可参照gsta_init注释
输出数据格式设置
当前输出格式为nal,其中编码器编码每一帧会生成多个nal格式数据包,并将全部数据包存储在相连的一块缓冲中,其数据相关信息于x2_nal_t保存,且每一帧中全部nal对应的x2_nal_t保存于x2_nal_t*数组nal中.具体实现可参见如下定义:
static int  Encode_frame( x2_t *h, hnd_t hout, x2_picture_t *pic, int_t *last_dts ) 当实现全帧输出时,可将nal[0]中数据指针和整个数据缓冲大小作为输入调用输出操作.也可取反函数中的宏GSTA
此外,x2的输出格式可自行定制.主要方法是自定义cli_output_t类型全局量(定义参见output/output.h),重写其中的函数指针,该类型具体实现可参见output/raw.c文件.输出格式控制关键在其中的write_frame函数中,该过程的具体调用处为上述Encode_frame函数.在该函数中可作进一步的输出调整.