6.7 Video Processing Unit (VPU)
6.7.1 Introduction
VPU 하드웨어는 모든 코덱 계산과 대부분의 비트스트림 구문 분석과 패킹을 수행한다. 따라서, 복잡하고 효율적인 멀티미디어 코덱 시스템을 구현하기 위해, 소프트웨어는 더 적은 컨트롤과 노력의 이점을 갖는다.
i.MX 6과 i.MX 8 SoC에서 서로 다른 VPU가 지원되고 있다. 아래 테이블에는 다양한 VPU가 나열되어 있다.
Table 74. VPU
SoC | VPU Provider | 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 | Amphion | No library |
참고 :
Malone은 디코더이고 Windsor는 인코더이다. 둘 다 Amphion에서 나온다.
Hantro는 아래 공급자를 나타낸다:
- hantro/ (8mq/8mp decoder)
- hantro_845/ (8mini decoder)
- hantro_845_h1/ (8mini encoder)
- hantro_vc8000e (8mp encoder)
6.7.2 Software Operation
VPU 소프트웨어는 커널 드라이버와 사용자 공간 애플리케이션뿐 아니라 사용자 공간 라이브러리의 두 부분으로 나눌 수 있다. 커널 드라이버는 시스템 컨트롤과 리소스(메모리/IRQ) 예약을 담당한다. 시스템 리소스에 액세스하기 위한 경로로 사용자 공간의 애플리케이션 레이어에 대한 IOCTL 인터페이스를 제공한다. 사용자 공간 애플리케이션은 복잡한 코덱 시스템을 구현하기 위해 관련 IOCTL과 코덱 라이브러리 함수를 호출한다.
VPU 커널 드라이버에는 아래 기능이 포함되어 있다:
- 디바이스별 구조체로 모듈을 초기화하는 모듈 초기화
- VPU 클럭과 하드웨어를 초기화하고 IRQ를 요청하는 디바이스 초기화
- 한 프레임이 완료된 이벤트를 지원하는 인터럽트 서비스 루틴
- 사용자 공간에서 아래 인터페이스를 제공하는 파일 작업 루틴:
- 파일 오픈
- 파일 릴리스
- 메모리 할당과 해제를 위한 인터페이스를 제공하는 파일 IOCTL
- 사용자 공간에서 레지스터와 메모리 액세스를 위한 메모리 맵
VPU 사용자 공간 드라이버에는 아래 기능이 있다:
- Codec lib
- 코덱 시스템 초기화
- 코덱 시스템 구성 설정
- 커맨드로 코덱 시스템 컨트롤
- 코덱 상태와 결과 리포트
- 시스템 I/O 작업
- 메모리 요청과 해제
- 메모리/레지스터를 사용자 공간에 매핑과 언맵핑
- 디바이스 관리
간단한 검증을 위한 사용자 공간 애플리케이션:
- 비디오 로우 데이터 읽기
- YUV 파일 덤프
- 코덱 동작을 구성하는 일반 옵션
아래 그림은 H.264 예제에서 볼 수 있는 간단한 워크플로우를 보여준다.
VPU 모듈을 위한 사용자 공간 프로그래밍 인터페이스만 있다. 애플리케이션 레이어의 사용자는 커널 드라이버 인터페이스에 직접 액세스할 수 없다. VPU 라이브러리는 사용자를 위해 커널 드라이버 인터페이스에 액세스한다.
다양한 비디오 형식을 모두 래핑할 수 있는 하나의 통합된 인터페이스가 있다. 아래에는 관련 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에서 사용가능한 커널 공간 소스 파일이 나열되어 있다.
Table 75. VPU Driver Files
File | Description |
---|---|
drivers/mxc/vpu/mxc_vpu.c | Chips and Media VPU Driver |
include/linux/mxc_vpu.h | Chips and Media VPU Header |
drivers/media/platform/amphion/* | Amphion malone 디코더와 windsor 인코더의 모든 소스 코드 |
drivers/mxc/hantro/hantrodec.c | Hantro 8M Quad VPU 디코더 드라이버 |
include/linux/hantrodec.h | Hantro 디코더 커널 헤더 |
include/uapi/linux/hantrodec.h | Hantro 디코더 사용자 공간 헤더 |
drivers/mxc/hantro_845/hantrodec_845s.c | Hantro 8M Mini VPU 디코더 드라이버 |
drivers/mxc/hantro_845_h1/hx280enc.c | Hantro 8M Mini HL 인코더 드라이버 |
drivers/mxc/hantro_845_h1/hx280enc.h | Hantro 8M Mini HL 인코더 헤더 |
drivers/mxc/hantro_vc8000e/hx280enc_vc8000e.c | Hantro 8M Plus VC8000E 인코더 드라이버 |
drivers/mxc/hantro_v4l2/* | 디코더와 인코더를 위한 Hantro V4L2 래퍼 드라이버 |
아래 테이블에는 i.MX 6에서 사용할 수 있는 사용자 공간 라이브러리 소스 파일이 나열되어 있다.
디렉토리:
imx-vpu-(version)/vpu
Table 76. MX6 VPU Library Files
File | Description |
---|---|
vpu_io.c | VPU 디바이스를 열고 메모리를 할당하기 위한 커널 드라이버와 인터페이스 |
vpu_io.h | IOCTL를 위한 헤더 파일 |
vpu_lib.c | 사용자 공간의 코어 코덱 구현 |
vpu_lib.h | 코덱 헤더 파일 |
vpu_reg.h | VPU 레지스터 정의 |
vpu_util.c | 일반적인 유틸리티를 구현하는 파일 |
vpu_util.h | 헤더 파일 |
아래 테이블에는 아래 디렉토리에서 사용할 수 있는 펌웨어 파일이 나열되어 있다:
firmware-imx-(version)/lib/firmware/vpu/ directory
Table 77. 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 드라이버에 대해 아래 모듈을 활성화한다:
- VPU가 있는 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 -> Multimedia support -> Media drivers -> V4L platform devices -> Amphion VPU (Video Processing Unit) Codec IP