libjpeg-turbo試用

"libjpeg-turbo"JPEGエンコーダ/デコーダlibjpegの、SIMD指令使用版をWindowsで使ってみる。
libjpeg-turbo | Main / libjpeg-turbo
従来のlibjpegよりも2-6倍速いと言う謳い文句。
Windows用バイナリも提供されていて、実際の速度も割とよさそうだったのでとりあえず試用。

計測例など:
UbuntuでOpenCVをlibjpeg-turboつきでビルドする | さかな前線
libjpeg-turboでjpegの変換が速くなる - かみぽわーる
開発メモ その134 OpenCVにlibjpeg-turboをリンクして性能比較 – A certain engineer "COMPLEX"
libjpeg-turboがいいらしい at softelメモ

比較的当たらしめかと思いきや、2010年のブログにも載っているのでそれなりの歴史もありそう。SIMDに対応のみということで、ガチの人向けにはマルチプロセッサ/マルチコア用最適化などもあるのだろうか・・・・?

超シンプルなCサンプル:

#include <stdio.h>
#include "turbojpeg.h"

int main() {
	unsigned char* jpegBuf = NULL, *imgBuf = NULL;
	FILE* jpegFile;
	long size, jpegSize;
	int width, height;
	int inSubsamp, outSubsamp = -1, inColorspace, pixelFormat = TJPF_UNKNOWN;
	int numScalingFactors = 0, outQual, flags=0;
	tjhandle tjInstance = NULL;

	if ((imgBuf = tjLoadImage("test.bmp", &width, 1, &height, &pixelFormat, 0)) == NULL)
      	printf("loading input image: %s\n", tjGetErrorStr2(tjInstance));
	outSubsamp = TJSAMP_444;
	outQual = 50;

    if ((tjInstance = tjInitCompress()) == NULL)
        printf("initializing compressor: %s\n", tjGetErrorStr2(NULL));

	if (tjCompress2(tjInstance, imgBuf, width, 0, height, pixelFormat,
                  &jpegBuf, &jpegSize, outSubsamp, outQual, flags) < 0)
    	printf("compressing image: %s\n",  tjGetErrorStr2(tjInstance));

  	tjDestroy(tjInstance);
  	tjInstance = NULL;

    if ((jpegFile = fopen("turbotest.jpg", "wb")) == NULL)
        printf("opening output file\n");
    if (fwrite(jpegBuf, jpegSize, 1, jpegFile) < 1)
        printf("writing output file");

    fclose(jpegFile);
    jpegFile = NULL;
    return 0;
}

若干のはまりポイントとしては、APIにポインタを渡して中身を入れてもらう変数については、あらかじめNULLをいれておいてわたさないとSIGSEGVを食らうことがある模様。
まあ当然と言えば当然ですね。