6.7 Video Processing Unit (VPU)
6.7.1 Introduction
VPU 하드웨어는 모든 CODEC 연산과 대부분의 비트스트림 parsing/packeting을 수행한다. 따라서 소프트웨어는 복잡하고 효율적인 멀티미디어 CODEC 시스템을 구현하기 위해 적은 제어와 노력을 들이는 이점이 있다.
i.MX 6와 i.MX 8 SoC에서 다양한 VPU가 지원된다. 다음 테이블에는 다양한 VPU가 나열되어 있다.
Table 75. VPU
SoC | VPU | Library |
i.MX 6 | Chips and Media | imx_vpu.so |
i.MX 8M Quad, 8M Mini, 8M Plus | Hantro | imx_hantro.so |
i.MX 8QuadMax, i.MX 8QuadXPlus | Malone | no library |
6.7.2 Software Operation
VPU 소프트웨어는 두 부분으로 나눌 수 있다. 하나는 Kernel 드라이버와 사용자 영역의 라이브러리이고, 다른 하나는 사용자 영역의 애플리케이션이다. Kernel 드라이버는 시스템 제어와 리소스(memory/IRQ) 예약을 담당한다. 시스템 리소스에 접근하기 위한 경로로 사용자 영역 애플리케이션 레이어에 대한 IOCTL 인터페이스를 제공한다. 사용자 영역 애플리케이션은 관련 IOCTL와 CODEC 라이브러리 기능을 호출하여 복잡한 CODEC 시스템을 구현한다.
VPU Kernel 드라이버는 다음 기능이 포함된다 :
- 디바이스별 구조체 모듈을 초기화하는 모듈 초기화
- VPU 클록와 하드웨어를 초기화하고, IRQ를 요청하는 디바이스 초기화
- 한 프레임의 완료 이벤트를 지원하는 인터럽트 서비스 루틴(ISR)
- 사용자 영역에서 다음 인터페이스를 제공하는 File operation routine :
- File open
- File release
- 메모리 할당과 해제를 위한 인터페이스를 제공하는 File IOCTL
- 사용자 영역에서 레지스터나 메모리 접근을 위한 Memory map
VPU 사용자 영역 드라이버는 다음 기능이 있다 :
- CODEC lib
- CODEC 시스템 초기화
- CODEC 시스템 구성을 설정
- 커맨드로 CODEC 시스템 제어
- CODEC 상태 및 결과 리포트
- 시스템 I/O 작업
- 메모리를 요청하고 해제
- 사용자 영역에서 메모리/레지스터에 대해 매핑과 언매핑
- 디바이스 관리
간단한 확인을 위한 사용자 영역 애플리케이션 :
- 비디오 로우 데이터 읽기
- YUV 파일 덤프
- CODEC 동작을 구성하는 일반 옵션
다음 그림은 간단한 작업 흐름을 보여주는 H.264 예제이다.
VPU 모듈을 위한 사용자 영역 프로그래밍 인터페이스만 있다. 애플리케이션 레이어 사용자는 Kernel 드라이버 인터페이스에 직접 접근할 수 없다. VPU 라이브러리는 사용자를 위해 Kernel 드라이버 인터페이스에 접근한다.
모든 다양한 비디오 형식을 래핑하는 하나의 통합 인터페이스가 있다. 다음은 관련 API이다 :
CODEC_STATE decoder_decode_xxx(CODEC_PROTOTYPE * arg,STREAM_BUFFER * buf, OMX_U32 * consumed,FRAME *
frame);
CODEC_STATE decoder_getinfo_xxx(CODEC_PROTOTYPE * arg,STREAM_INFO * pkg);
CODEC_STATE decoder_setppargs_xxx(CODEC_PROTOTYPE * codec,PP_ARGS * args);
CODEC_STATE decoder_setframebuffer_xxx(CODEC_PROTOTYPE * arg, BUFFER *buff,OMX_U32 available_buffers);
CODEC_STATE decoder_pictureconsumed_xxx(CODEC_PROTOTYPE * arg, BUFFER *buff);
CODEC_STATE decoder_getframe_mpeg4(CODEC_PROTOTYPE * arg, FRAME * frame,OMX_BOOL eos);
FRAME_BUFFER_INFO decoder_getframebufferinfo_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_endofstream_xxx(CODEC_PROTOTYPE * arg)
OMX_S32 decoder_scanframe_xxx(CODEC_PROTOTYPE * arg, STREAM_BUFFER * buf,OMX_U32 * first, OMX_U32 *
last);
CODEC_STATE decoder_abort_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_abortafter_xxx(CODEC_PROTOTYPE * arg);
CODEC_STATE decoder_setnoreorder_xxx(CODEC_PROTOTYPE * arg, OMX_BOOL no_reorder);
static void decoder_destroy_xxx(CODEC_PROTOTYPE * arg)
6.7.3 Source Code Structure
아래 테이블은 drivers/mxc/vpu에서 사용 가능한 Kernel 영역 소스 파일 리스트이다.
Table 76. VPU Driver Files
File | Description |
drivers/mxc/vpu/mxc_vpu.c | Chips 및 Media VPU 드라이버 |
include/linux/mxc_vpu.h | Chips 및 Media VPU 헤더 |
include/linux/mxc_vpu-malone.h | Malone VPU 헤더 |
drivers/mxc/vpu-malone/mxc_vpu-malone.c | Malone VPU 드라이버 |
drivers/mxc/vpu-decoder-b0/vpu_rpc.c | Malone VPU B0 Decoder RPC |
drivers/mxc/vpu-decoder-b0/vpu_rpc.h | Malone VPU B0 RPC Decoder 헤더 |
drivers/mxc/vpu-decoder-b0/vpu_b0.h | Malone VPU B0 Decoder 헤더 |
drivers/mxc/vpu-decoder-b0/vpu_b0.c | Malone VPU B0 Decoder 드라이버 |
drivers/mxc/vpu-encoder-b0/vpu_encoder_rpc.h | Malone VPU B0 Encoder RPC 헤더 |
drivers/mxc/vpu-encoder-b0/vpu_encoder_rpc.c | Malone VPU B0 Encoder RPC 드라이버 |
drivers/mxc/vpu-encoder-b0/vpu_encoder_b0.h | Malone VPU Encoder B0 헤더 |
drivers/mxc/vpu-encoder-b0/vpu_encoder_b0.c | Malone VPU Encoder B0 드라이버 |
drivers/mxc/hantro/hantrodec.c | Hantro 8MQuad VPU Decoder 드라이버 |
include/linux/hantrodec.h | Hantro Decoder kernel 헤더 |
include/uapi/linux/hantrodev.h | Hantro Decoder 사용자 영역 헤더 |
drivers/mxc/hantro_845/hantrodec_845s.c | Hantro 8MMini VPU Deocder 드라이버 |
drivers/mxc/hantro_845_h1/hx280enc.c | Hantro 8MMini HL Encodeer 드라이버 |
drivers/mxc/hantro_845_h1/hx280enc.h | Hantro 8MMini HL Encodeer 헤더 |
아래 테이블은 다음 디렉토리에서 사용할 수 있는 i.MX 6 사용자 영역 라이브러리 파일의 리스트이다.
imx-vpu-(version)/vpu
Table 77. MX6 VPU Library Files
File | Description |
vpu_io.c | VPU 디바이스를 열고 메모리를 할당하기 위한 Kernel 드라이버 인터페이스 |
vpu_io.h | IOCTL 헤더 파일 |
vpu_lib.c | 사용자 영역에서 Core CODEC 구현 |
vpu_lib.h | CODEC 헤더 파일 |
vpu_reg.h | VPU 레지스터 정의 |
vpu_util.c | 기본 유틸리티 구현 파일 |
vpu_util.h | 헤더 파일 |
아래 테이블은 다음 디렉토리에서 사용할 수 있는 펌웨어 파일의 리스트이다.
firmware-imx-(version)/lib/firmware/vpu/ directory
Table 78. VPU firmware Files
File | Description |
vpu_fw_imx6xxx.bin | i.MX 6 VPU 펌웨어 |
vpu_fw_imx8xxx.bin | i.MX 8 VPU 펌웨어 |
6.7.4 Menu Configuration Options
VPU 드라이버를 사용하려면 menu configuration에서 다음 모듈을 활성화한다 :
i.MX 6
Device Drivers > MXC support drivers > Support for MXC VPU(Video Processing Unit)
i.MX 8M
Device Drivers > MXC support drivers > MXC HANTRO (Video Processing Unit) support
i.MX 8QuadMax, i.MX 8QuadXPlus
Device Drivers > MXC support drivers > Support for MXC VPU(Video Processing Unit) DECODER
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - System (0) | 2022.05.25 |
---|---|
i.MX Linux Reference Manual - Video - JPEG Encoder and Decoder (0) | 2022.05.25 |
i.MX Linux Reference Manual - Video - Video Analog-to-Digital Converter (VADC) (0) | 2022.05.23 |
i.MX Linux Reference Manual - Video - Video for Linux 2 (V4L2) (0) | 2022.05.20 |
i.MX Linux Reference Manual - Video - Display Interfaces (0) | 2022.05.09 |