尝试把JPEGD、resize、JPEGE串起来,首先需要提炼每个部分都做了什么事情,然后基于“内存复用”这一提示,准备异步解码、异步缩放、异步编码这三个函数所需要的参数,组织完整的程序
首先,按照文档提供的步骤对开源样例进行整理,添加相应的注释,加深对各自流程的理解
第二,将JPEGD的流程提炼为
“申请device侧解码输入内存”
“申请device侧解码输出内存”
“创建解码输出图片描述信息”
“执行异步解码”
“阻塞程序”
第三,分析JPEGD流程图,这里有两个橘黄色的可选步骤,一个是“下发其他异步任务”,另一个是“获取编码后的结果数据”,回想到JPEGD、resize、JPEGE都是异步任务,这里尝试将resize添加在第一个橘黄色可选步骤的位置,即“执行异步解码”之后,“阻塞程序”之前
第四,resize的执行是靠调用acldvppVpcResizeAsync函数完成的,这里整理其需要的参数,将resize部分代码与JPEGD合并。将resize的流程提炼为
“创建缩放配置数据”
“==申请device侧缩放输入内存==”
“申请device侧缩放输出内存”
“创建缩放输入图片描述信息”
“创建缩放输出图片描述信息”
“执行异步缩放”
其中,“==申请device侧缩放输入内存==”部分可以优化,由于之前的JPEGD解码结果已经保存于device侧的内存中,这里可以尝试内存复用
具体的,异步resize需要的参数如下
1. dvppChannelDesc_,该参数为通道描述符,由于resize与jpegd在同一个channel中,所以可以直接使用jpegd中的通道
2. vpcInputDesc_,该参数为缩放输入图片描述符,需要靠“创建缩放输入图片描述信息”部分代码完成
2.1 缩放输入图片描述信息中,需要指定device侧缩放输入内存,原本用的是“==申请device侧缩放输入内存==”部分代码申请下来的内存,现在使用JPEGD编码输出内存,从“解码输出图片描述信息”里找,decodeOutDevBuffer_
2.2 缩放输入图片描述信息中,需要指定输入图片的宽高,调用AlignmentHelper函数进行对齐,需要合并;原本缩放输入图片的宽高是解析参数得到的,现在要以编码输出图片的宽高作为缩放输入图片的宽高,即decodeOutWidthStride和decodeOutHeightStride
3. vpcOutputDesc_,该参数为缩放输出图片描述符,需要靠“创建缩放输出图片描述信息”部分代码完成
3.1缩放输出图片描述信息中,需要指定device侧缩放输出内存,原本用的是“申请device侧缩放输出内存”,现在不变
3.2申请上述内存时需要计算要申请的内存大小,需要知道缩放输出图片的宽高,这一点之前时通过解析参数得到的,现在也需要在解析参数这部分完成,所以要调整这部分代码
4. resizeConfig_,该参数为编码配置数据,需要靠“创建缩放配置数据”部分代码完成
5. stream_,该参数为Stream,用同一个Stream
第五,分析resize流程图,在执行异步缩放之后,在同步等待之前,可以继续插入其他异步任务,在这里继续插入异步编码JPEGE
第六、JPEGE的执行是靠调用acldvppJpegEncodeAsync函数完成的,这里整理其需要的参数,将JPEGE部分代码合并。将JPEGE的流程提炼为
“==在device侧申请编码输入内存==”
“创建编码输入图片描述信息”
“创建图片编码配置数据”
“在device侧申请编码输出内存”
“执行异步编码”
其中,“==在device侧申请编码输入内存==”部分可以优化,由于之前的resize结果已经保存于device侧的内存中,这里也可以尝试内存复用
具体的,异步JPEGE需要的参数如下
1. dvppChannelDesc_,该参数为通道描述符,由于jpege与resize、jpegd在同一个channel中,所以可以直接使用之前的通道
2. encodeInputDesc_,该参数为编码输入图片描述符,需要靠“创建编码输入图片描述信息”部分代码完成
2.1 编码输入图片描述信息中,需要指定device侧编码输入内存指针,原本用的是“==在device侧申请编码输入内存==”部分代码调用get_picdevbuffer4_jpege函数申请下来的内存,现在使用resize缩放输出内存,从“缩放输出图片描述信息”里找,vpcOutBufferDev_
这里可以通过修改set_input4_jpege函数的第一个参数,完成指定输入缓存的修改
2.2 编码输入图片描述信息中,需要输入图片的宽高,原本是解析参数得到的,现在要以缩放输出图片的宽高作为编码输入图片的宽高,即resizeOutWidthStride和resizeOutHeightStride
这里可以通过修改set_input4_jpege函数,完成指定输入缓存的修改
2.3 编码输入图片描述信息中,需要指定device侧编码输入内存大小,原本用的调用compute_encode_inputsize函数计算出来的,现在同样从“缩放输出图片描述信息”里找,vpcOutBufferSize_
这里可以通过修改set_input4_jpege函数的第二个参数,完成指定输入缓存大小的修改
3. encode_out_buffer_dev_,该参数为编码输出内存地址,原本用的是“在device侧申请编码输出内存”,现在不变
3.1 申请上述内存时需要计算要申请的内存大小,需要知道图片编码配置,原本用的是“创建图片编码配置数据”,现在不变
4. encode_outbuffer_size_,该参数为编码输出内存大小
5. jpegeConfig_,该参数为图片编码配置
6. stream_,该参数为Stream,用同一个Stream
第七、将JPEGE后续代码补齐,检查函数调用、声明、释放各部分资源