前言
vssa提供了dsc压缩的c model,可用作硬件实现的参考模型,生成的数据可作为gloden的数据,但在使用的过程中发现软件解码8k图像压缩后的dsc文件,解码速度较慢,由其是想基于c model开发UI工具的时候,较长的解码过程会阻塞住主线程,导致UI界面卡顿,一般需要起个线程去做解码的工作,避免阻塞住UI界面,所以就想着优化下C MODEL的解码速度。
优化的原理
dsc 的c model设计上是分多个slice的,各个slice解码过程中相互独立,互不影响。协议中介绍如下:
为加速编码的过程,并且减少经过压缩的失真,DSC技术导入截面(Slice),将每一帧的画面加以切割,切割出的截面同时进行编码。DSC可支持的截面数有1、2、4、8个,甚至更多的截面数。需要注意的是单位为slice/line,line是指画面成形时以raster-scan顺序为一行的像素。除不同截面数外,DSC也可以使用不同长宽的截面。示意图如下:
所以,我们可以把dsc中dsc dec的for循环顺序处理切片的逻辑改成多线程,每个线程去单独处理一个切片,一般硬件切片小于等于16,相对于cpu核心,数目也比较适合,所以我们的目标就是优化如下这段逻辑。
环境搭建
本文只介绍如何优化解码。
由于dsc是c语言写的,想将之用c++编译器编译存在一些工作量,部分代码用c++编译器编译会报错,所以就不使用c++标准库的std::thread改写了,引入posix标准写的c语言多线程库pthread,平台用vs,下面介绍如何搭建环境
直接打开C_Model文件夹,点击vs文件
我们需要找到posix线程库windows版本并导入到vs项目中,步骤如下:
pthread的下载网站:https://www.mirrorservice.org/sites/sourceware.org/pub/pthreads-win32/
找个版本下载下