libjpeg-turbo 에 대해서 알아 보자
개발 2013. 6. 14. 11:57
1. jpeg[1]란 무엇인가?
간단히 누구나 알고 있듯이 이미지 압축 형식중 하나인 것이다. 그런데 약자의 뜻도 모르고 있어서 한번 찾아 봤다.
Jpeg = joint photographic coding experts group
JPEG는 컬러 순간 동작(steal) 이미지를 위한 국제적인 압축표준으로 CCITT(Consultatve Committee International Telegraphand Telehpone)와 ISO에서 정의하고있다. JPEG는 이미지를 작은 블록으로 나누어 많은 양의 이미지 정보를 줄이는 DCT(Discrete Cosine Transformer) 알고리즘에 기초를 두고 있다. 압축률을 늘이기 위해서는 보다 많은 양의 이미지 정보를 지우고, 이에 따라 세세한 부분의 이미지가 줄어들기 때문에 이미지의 질은 낮아진다. 또한 이미지의 질이 낮아진 것을 느끼지 못할 정도까지만 압축시켰을 때 약 25:1의 압축률을 얻는다. 즉 25MB의 이미지를 1MB로 줄일 수 있는 것이다. 비디오를 압축시키는데 사용되기도 한다. 각각의 프레임을 분리된 이미지로서 인트라프레임코딩(Intraframe Coding)이라 불리는 과정을 통해 각 프레임을 따로따로 압축시킨다. 이것은 다시 말해, 사용자가 비디오가 압축된 채로 독립적인 각 프레임을 랜덤 액세스할 수 있음을 나타낸다.
한글로는 “정지영상 압축 포맷” 정도로 부를수 있다.
2. libjpeg-turbo[2]는 무엇인가?
Libjpeg-turbo는 SIMD 명령( MMX, SSE2, NEON)을 사용해서 빠르게 인코딩/디코딩하는 JPEG 이미지 코덱이다. SIMD는 Single Instruction, Multiple Data 로 하나의 명령으로 여러 개의 데이터를 처리하는 명령어 집합이다. 즉 하나의 명령어를 실행하는 동안 같은 오퍼레이션이 병렬로 데이터를 처리하여 속도가 빠른 것이다. 참고로 SSE2[3]는 2001년 인텔의 펜티엄 4에 처음 포함되었다. 그리고 NEON[4]은 ARM 프로세서에서 사용하는 SIMD 명령 지원체라고 보면 된다.
즉, libjpeg-turbo는 intel 프로세서와 arm 프로세서에서 모두 동작가능한 빠른 jpeg 코덱인 것이다. 안드로이드에서 주로 사용하는 프로세서가 arm 아키텍쳐 기반이므로 흥미를 가질만 하다. 또한 최근 intel 에서도 모바일 프로세서를 삼성전자에 납품하여 갤럭시 탭 10인치에 시범적으로 사용된다고 하니, 앞으로 intel과 arm이 양분하는 모바일 프로세서 환경에서 딱 어울리는 녀석이다.
3. “libjpeg-turbo” != “TurboJPEG”
이름이 비슷해서 두개를 햇갈려 할 수 있는데 각각 어떻게 탄생하게 되었는지 알아보자
libjpeg-turbo은 기원은 libjpeg에서 속도를빠르게 하기 위한 libjpeg/SIMD 프로젝트서 시작되었다. ( libjpeg v6b, 2009년) 현재는 독립된 프로젝트로 진행되면서 산업 표준으로 인정 받고 있다.
TurboJPEG은 “VirtualGL and TurboVNC” 그룹이 사용하려고 만든 API 이다.
4. 속도는 jpeg에 비해서 얼마나 빠를까?
다른 모든 조건이 같은 환경에서 테스트를 했을때, 평균적으로 2~4배 빠르다고 한다.
아래는 libjpeg-turbo 프로젝트 그룹에서 비교한 성능테스트 결과이다. [5]
libjpeg-turbo Speedup Relative to Other Codecs, Non-Grayscale Compression/Decompression (1.0 = equal performance) | ||||
|
libjpeg-turbo x86-64 |
libjpeg-turbo x86 | ||
|
Compression |
Decompression |
Compression |
Decompression |
libjpeg v6b |
3.68 - 5.29 |
2.12 - 3.32 |
3.40 - 4.75 |
2.43 - 4.24 |
libjpeg v8d |
3.66 - 5.79 |
1.95 - 3.85 |
3.19 - 5.22 |
2.29 - 4.96 |
Intel® IPP v7.1 |
0.922 - 1.21 |
0.811 - 1.18 |
0.710 - 1.10 |
0.650 - 1.26 |
Libjpeg 최신판인 v8d와 비교결과를 보면 평균적으로 2~5배 빠르게 나왔다 인텔의 IPP 와 비교했을때는 비슷하거나 오히려 조금 느리기도 하다. 돈있으면 인텔의 IPP를 사서 쓰는 것도 나쁘지 않을 것 같다. 다만 IPP는 인텔 프로세서에서만 실행된다는 점 !!
참고
[1] libjpeg : http://www.ijg.org/
[2] libjpeg-turbo : http://libjpeg-turbo.virtualgl.org/
[3] SSE2 : http://ko.wikipedia.org/wiki/SSE2
[4] Introducing NEON : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/index.html
[5] libjpeg-turbo 성능 : http://www.libjpeg-turbo.org/About/Performance