对BPG(Better Portable Graphics)的调研

项目地址:author’s blog

作者介绍:wikipedia 其中最引人注意的是“创建了FFmpeg项目”。

本文所使用的项目版本号是0.9.5。

编码器

  • 其编码器外壳调用x265或者HM的库;由于x265不支持单通道编码,所以x265不支持gray 和 alpha的编码,如果要编这2种图像,只能用HM;
  • 对于x265,需要先make install装到系统里,然后bpg调用libx265.so;bpg在用x265编码时会按照一般的x265进行编码,然后把头信息换成它自己的头信息;这是最大程度的利用已有代码或项目,但是相比直接写入精简的头信息有时间冗余;
  • 对于gif,bpg是按照视频来编的,只有P帧且只参考前一帧;bpg利用现有hevc编码器编码多张图片,并加入一些头信息,主要是每帧之间的停留间隔(gif动画每帧的停留时间),如果间隔全部一样就用fps;
  • 编码器alpha通道的Premultiplied默认不开启;开启后,编好的码流就是经过预乘的,只有YUV三个通道;如果不预乘,则还是有YUVA四个通道;
  • bpg的alpha处理与对luma一样;值得注意的是alpha通道放在yuv通道之前,是为了更高效的渐进解码,在解完一帧的alpha后,再解yuv,解yuv时只需解完一行就可以开始输出;这样的效果比把alpha放在yuv之后要好,因为一般alpha比yuv编码后的码流小很多;
  • 目前bpg编码器外壳的输入只能是jpeg或者png,通过调用libpng和libjpeg库实现;输入多张图片(gif转为png或jpeg)就按照视频编码;
  • 支持 YCbCr 4:2:0, 4:2:2, 4:4:4,RGB, YCgCo and CMYK 颜色空间;RGB的编码处理相当于YCbCr 4:4:4;
  • 支持8-14bit编码;x265和HM原生支持;
  • 支持无损编码;x265和HM原生支持;
  • BPG默认不复制metadata,通过--keepmetadata选项,对于JPEG输入,会拷贝EXIF ICCP XMP,对于PNG输入,会拷贝ICCP;

解码器

  • 目前没有渐进解码,没有缩放;作者说渐进解码会在后续版本加入;
  • makefile中启用 Emscripten 可以编译JavaScript的解码器;bpg编出的javascript解码器有将近200KB,项目页面所说的56KB是打包后的大小;
  • asm.js会加速解码; asm.js是javascript的汇编,是firefox提出的一项技术,目前并没有普及;

图片查看器

  • 调用SDL实现显示,可以查看一般格式的图片和bpg格式的图片。
Loading Disqus comments...
Table of Contents