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を食らうことがある模様。
まあ当然と言えば当然ですね。