6.8 JPEG Encoder and Decoder
6.8.1 Introduction
JPEG Encoder는 JPEG-E-X 코어와 JPEG Encoder Wrapper(JPGENCWRP)로 구성된다. 마찬가지로, JPEG Decoder는 JPEG 디코더 코어(JPEGD-X)와 해당 래퍼로 구성된다.
JPEG 코어는 산업 표준 Baseline과 Extended ISO/IEC 10918-1 JPEG를 준수하고, 일부 제한 사항이 i.MX 8DualXPlus Applications Processor Reference Manual(IMX8DQXPRM)에 문서화되어 있다.
JPEG 인코더 래퍼(JPGENCWRP)는 Cast JPEG Encoder Core와 함께 작동하는 데 사용된다. 구성 모드와 인코딩 모드가 있다.
- 구성 모드에서는, 시스템 메모리에서 구성 비트스트림을 가져와 인코더에 공급할 수 있다.
- 인코더 모드에서는, AXI 버스 인터페이스를 통해 이미지 픽셀 데이터를 가져오고 인코딩을 위해 Encoder Core에 공급할 수 있다.
마찬가지로, JPEG Decoder Wrapper는 Cast JPEG Decoder 코어에 대한 인터페이스를 제공한다.
JPEG 래퍼는 인코딩 디스크립터에 의한 컨텍스트 전환으로 다중 이미지 인코딩을 지원한다. 4개의 비트스트림 슬롯이 있다. 연결된 디스크립터에 의해 각각 독립적으로 활성화될 수 있다.
JPEG 인코더와 디코더는 최대 8K(0x2000) 픽셀의 수평 해상도를 지원한다. 수평 해상도는 8의 정수배가 되어야 한다. 수직 해상도에 대해서도 동일하다. YUV422와 YUV420의 경우, 해상도는 16의 배수여야 한다. 이미지 크기는 최대 64K x 64K 이다.
6.8.2 Overview of the JPEG Encoder and Decoder Driver
드라이버는 V4L2 프레임워크에 의존한다.
JPEG 인코더와 디코더 드라이버는 V4L2 프레임워크에 의해 노출된 IOCTL의 하위 집합, 즉 다음 v4l2_ioctl_ops를 구현한다:
- VIDIOC_QUERYCAP
- VIDIOC_ENUM_FMT_VID_CAP
- VIDIOC_ENUM_FMT_VID_OUT
- VIDIOC_TRY_FMT_VID_CAP
- VIDIOC_TRY_FMT_VID_OUT
- VIDIOC_S_FMT_VID_CAP
- VIDIOC_S_FMT_VID_OUT
- VIDIOC_G_FMT_VID_CAP
- VIDIOC_G_FMT_VID_OUT
- VIDIOC_QBUF
- VIDIOC_DQBUF
- VIDIOC_CREATE_BUFS
- VIDIOC_PREPARE_BUF
- VIDIOC_REQBUFS
- VIDIOC_QUERYBUF
- VIDIOC_STREAMON
- VIDIOC_STREAMOFF
사용자 애플리케이션은 지원되는 V4L2 IOCTL을 통해 드라이버와 상호 작용할 수 있다.
JPEG 드라이버는 메모리 매핑을 통해 스트리밍 I/O를 지원한다. VIDIOC_QUERYCAP가 사용될 때, 이 기능은 V4L2_CAP_STREAMING 플래그를 통해 노출된다. 스트리밍은 버퍼에 대한 포인터만 애플리케이션과 드라이버 사이에 교환되지만, 데이터 자체는 복사되지 않는 I/O 방법이다. 메모리 매핑은 주로 디바이스 메모리의 버퍼를 애플리케이션의 주소 공간에 매핑하기 위한 것이다.
JPEG 드라이버는 단일 평면(single-planar) API를 통해 버퍼 메모리 매핑을 지원한다.
스트리밍 I/O에 대한 자세한 내용은 Streaming I/O(Memory Mapping)를 참조한다.
6.8.3 Limitations of the JPEG Encoder/Decoder Driver
하드웨어, 즉 JPEG 래퍼는 컨텍스트 전환으로 다중 이미지 인코딩을 지원한다. 드라이버는 컨텍스트 전환을 사용하지 않으며, 사용 가능한 4개의 슬롯 중 하나만 사용된다. 하드웨어는 비트스트림 버퍼 half/full을 지원하고 비트스트림 버퍼 관리를 위한 기능을 반환하지만, 드라이버는 이를 사용하지 않는다.
하드웨어는 YUV444, YUV420, YUV422, RGB, ARGB, 그리고 Gray 형식을 지원한다.
드라이버는 YUV444, YUV420(NV12와 동일), YUV422 (YUYV나 YUY2와 동일), RGB(일부 제한 있음), 그리고 Gray 형식을 지원한다. ARGB 형식은 지원되지 않는다.
드라이버는 gstreamer를 통한 JPEG 이미지 인코딩과 디코딩을 지원하지만, 아직 MJPEG 비디오는 지원하지 않는다.
하드웨어에는 디코딩 이미지 해상도가 64x64보다 커야 한다는 제한이 있다.
하드웨어에는 디코딩된 이미지에 최소한 기본 Huffman 테이블(DHT 마커 섹션은 jpeg 입력 스트림에 있어야 함)이 있어야 한다는 제한이 있다.