제목: C++ builder 환경에서 IJL(Intel JPEG Library) 사용 방법
IJL(Intel JPEG Library)는 Intel에서 만든 JPEG 용 라이브러리입니다.
Intel CPU architecture 에 최적화되어 디자인되고 구현되어 Intel
CPU에서 최적의 성능을 나타냅니다. JPEG 이미지를 처리해야하는 응용에
서는 유용하게 쓸 수 있는 라이브러입니다. 게다가 공짜이니까..
현재는 Intel에서 IJL에 대한 공식적인 지원은 하지 않습니다. IIPP로
흡수됬고, 상용으로 판매하고 있기 때문입니다. 그러나, JPEG용 처리만을
한다면 비용을 들이지 않고 해결할 수 있는 좋은 방법이 될 수 있을 것입니다.
* 아래는 Intel의 공식 문서의 일부분입니다. IJL이 어떤 것인 지 참고
하시길 바랍니다.
The Intel® JPEG Library (IJL) is a software library for application
developers that provides high performance JPEG encoding and decoding
of full color and grayscale still images.
The IJL was designed for use on Intel® architecture platforms and
has been tuned for speed and efficient memory usage. Additionally,
the IJL was developed to take advantage of MMX™, Streaming SIMD
Extensions (SSE), and SSE-2 technology if present.
현재(2003.10) IJL은 1.51버젼까지 나왔으며(이것도 상당히 오래된 듯)
이후 버젼은 IIPP(Intel Integrated Performance Primitives)로 통합되
었습니다.
[IJL URL]
http://www.intel.com/support/performancetools/libraries/ijl/
[IIPP URL]
http://www.intel.com/software/products/ipp/ipp30/
IJL 1.5 버젼까지 공개용이나 IIPP로 가면서 상용으로 바뀌었습니다.
IIPP는 인텔에서 제공하는 여러 라이브러리(IPL, IJL, SPL,..)등을
하나로 통합한 것입니다. 그러나 JPEG 이미지의 encoding/decoding용으로는
IJL1.5버젼에서도 충분히 그 효과적인 성능을 얻을 수 있습니다.
* 비교해 본 결과 VCL에서 제공되는 TJPEG class에 비해 월등한 성능을
보였습니다.
저의 경우, 스트리밍 서버에서 소켓을 통해 JPEG이미지를 전달하면
이를 디코딩하여 화면에 뿌리는 다소 간략한 영상 Play 기능이 필요하여
이것을 이용하게 되었습니다. ( MJPEG - Motion JPEG 방식임)
다음은 IJL을 C++ Builder 에서 사용하기 위해서 거쳐야 하는 작업들을
기술해 봅니다. IJL은 기본적으로 MFC 환경을 기준으로 만들어졌기 때문에
몇 가지 변환작업을 거쳐야 합니다.
1. Test 환경
C++ Builder 6.0 Enterprise Edition
IJL 1.51
2. 설치
ijl151.exe를 실행하면 알아서 설치해 줍니다.
별도의 설명을 생략합니다. 다만
C:\Program Files\Intel\IJL\ .... 이곳에 설치됩니다.
[Install시 해야 할 작업]
- Include the file "ijl.h" in your program.
- Call the IJL interface.
- Link to the file ijl.lib in the lib directory.
- Put the DLL ijl15.dll in your path before executing your program.
3. C++ Builder에서 환경 구성하기
31. C++ Builder용 lib 파일 만들기
- ijl15.lib 파일은 Visual C++에서 사용하는 형식으로 되어 있습니다.
- 이 파일을 그대로 link해서 complie할 경우 다음과 같은 링크 에러가
발생합니다
[Linker Error] IJL15.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
이것은 Lib 파일이 MFC에서 사용하는 COFF 형식을 따르고 있기 때문입니다.
이것을 OMF방식으로 바꾸어 주고 이 파일을 link 하여야 합니다.
아래의 사이트를 참고하여 lib 파일을 생성할 수 있습니다.
http://www.bcbdev.com/faqs/faq92.htm
http://www.intel.com/support/performancetools/libraries/ijl/borlandijl.htm
저두 초보라 잘 모르지만 다른 상황에서도 이렇게 많이 사용하고 있는
것으로 보입니다. IMPLIB 유틸리티를 이용하여 lib 파일을 변환합니다.
아래와 같은 형식으로 생성하면 됩니다.
C:\Program Files\Borland\CBuilder\bin\implib ijl15imp.lib ijl15.dll
ijl15imp.lib가 새로 생성됩니다. 이것을 IJL의 Lib 디렉토리에 갔다
놓아도 되고, 프로젝트가 있는 곳에 놓아도 됩니다. 단지 프로젝트에
링크되기만 하면 됩니다.
저의 경우 프로젝트가 있는 디렉토리에 갔다 놓고 링크 시켰습니다.
* 당연한 것이겠지만 적습니다. 다들 알고 있을 거라 생각되는데..
메뉴의 Project->Option에서 Directories/Conditionals에서 Include,
Library에 ijl을 등록시켜주어야 합니다. 아래에서 만들 ijl.hpp를
그냥 프로젝트가 있는 디렉토리에 넣어주면 상관없지만요..
좌우당간, header file과 lib 파일을 찾을 수 있도록 환경을 설정해주면
됩니다. 너무 기본적인 것을 주저리 적는 것은 아닌 지.....
3.2 ijl.hpp 파일 만들기
기본적으로 ijl.h 파일이 제공되는데 이것을 사용하면 저의 경우 프로그램
실행 후 종료 시 Access Violation 등의 문제가 발생하였습니다. 그래서,
IJL에 있는 ijl.pas 파일을 컴파일 하여 ijl.hpp파일을 얻어서 이것을
이용하였습니다. 이문제로 고생하던 중에 저와 같은 상황을 맞은 분이
있었는데..이렇게 해결했다고 하더군요.. 이것이 최선의 방책인 지는
모르겠지만 아뭏튼 이렇게 해결했습니다. 다른 방법이 있으신 분은
저에게 연락 주시면 감사하겠습니다.
먼저 C:\Program Files\Intel\IJL\Delphi\include\ijl.pas을
C++ Builder에서 컴파일 합니다. 그러면 ijl.hpp파일이 생성되는데
이 파일을 가져와서 헤더 파일로 사용하였습니다.
C++ buider 초보라서 ijl.pas 만 열어서 컴파일하니 아무 파일도
안생겨서 고생했는데, 더미 프로젝트 만들어서 거기서 열어서 컴파일
하시면 됩니다.
이렇게 ijl.hpp 파일이 생성되면 프로젝트로 가져와서 ijl 루틴을
사용할 클래스에 include해서 사용하면 됩니다.
3.3 IJL 사용하기
IJL 라이브러리를 사용하기 위해서는 사용하기 전에 반드시
ijlInit()를 해주어하고 해제 시 ijlFree()를 하여 자원을
해제시켜 주어야 합니다.
그리고, 파일에서 jpeg 파일을 직접 읽어들이는 경우는 이러한
버그가 발생하는 경우를 보지 못했는데.. 메모리에서 읽어서 하는 경우
다음과 같은 에러가 발생하는 경우가 있습니다. 저도 이 에러를 경험했고,
다른 분도 이런 에러로 Q/A에 올린 것을 보았습니다. 아마 소켓에서
읽어서 버퍼에서 ijl로 넘기는 경우라면 이런 에러를 만날 듯 싶습니다.
(제가 그랬듯이..)
[에러 상황]
Error Code: IJL_INVALID_JPEG_PROPERTIES
[대응책]
http://www.intel.com/support/performancetools/libraries/ijl/jpegbuff.htm
위 사이트를 참조하시면 됩니다. 요지는 JPEG_CORE_PROPERTIES의 JPGFile을 NULL
로 셋팅하라는 내용입니다. 저두 이렇게 해서 에러를 해결했습니다. 이렇게
한줄로 에러를 해결했다고 적으니 좀 억울한 느낌이 드네요. 이거 해결하려고
며칠을 머리 쥐어뜯으면서 고생한 거 생각하면 ... .. ^^;;
그리고 그 이외에 발생할 수 있는 에러 상황에 대해서는 인텔에서 몇가지
많이 발생하는 상황에 대해서는 해결책을 제시하고 있으니 참고하시기
바랍니다.
http://www.intel.com/support/performancetools/libraries/ijl/
* 참고로 적습니다.
IJL로 Decoding 결과는 bitmap으로 나옵니다. 결과로 나온 BitMap 스트림을
StretchDIBits()등을 이용하여 화면에 출력하면 됩니다. 다른 방법도 있겠지만
출력만큼은 Windows API를 이용하였습니다. 속도 문제도 있고..해서요..
IJL이 C++ Builder에 죽어라 안붙어서 TJPEG Class로 만들어 보았는데.. ijl보다
성능은 상당히 떨어졌습니다. 초당30장 정도의 이미지가 들어오는데 이것을 전부
처리하기가 버거워서 결국은 다운되는 현상을 맞이하였습니다.
4. 후기
처음에는 C++ Builder에 죽어라 붙지 않아서 많이 고생했는데 막상 적어보니 별로
많지 않은 내용이네요...
위 글에서 오류도 많이 있을 것으로 생각되는데, 이 글을 읽으시는 분들에게 작으나마
도움이 되었으면 합니다.
이 작업을 하면서 볼란드 포럼에서 많은 도움을 얻었기 때문에 저두 조금의 보탬이
되기 위해 이렇게 정리하여 올립니다. 앞으로도 보다 좋은 사이트로 거듭나기를
바랍니다.
오류나 정정사항이 있으면 아래의 주소로 연락 주시기 바랍니다.
e-mail: heaven2@hanmir.com
감사합니다.