1. 개요
DXVA는 DirectX를 이용, CPU로 소프트웨어 디코딩을 하는 것이 아니라 GPU를 이용한 하드웨어 디코딩을 위한 인터페이스이다.DXVA의 장점으로는 GPU를 디코딩에 이용하기 때문에 CPU 점유율이 매우 낮아지며 또한 렌더링 속도도 무척 빨라지게 된다.
단점은 소프트웨어 코덱이 CPU만 사용하는것에 비해 DXVA는 VGA를 가속에 참여시키며 DXVA를 이용할 경우 일반적으로 GPU에 내장된 하드웨어 디코더를 통해 재생하지만 하드웨어 디코더가 아닌, DXVA를 단지 인터페이스로 쓸 뿐 실제로는 GPU를 통해서 연산하거나 둘의 하이브리드 방식인 경우도 있기 때문에 소프트웨어 처리보다 총 전력소모가 높을수도 있고 소프트웨어 디코딩과 달리 하드웨어 코덱은 영상 코덱의 스펙을 모두 지원하지 않는 경우가 있다.
셰이더 유닛과 같은 VGA의 범용 프로세서가 아닌 전용 동영상 디코딩칩을 이용하기 때문에 단순히 그래픽카드의 성능과 비례하지 않는다. 오히려 상위 그래픽카드 제품군이 하위 그래픽카드 제품군의 동영상 가속 성능에서 밀리거나 영상 재생시 전성비가 좋지 못한 경우도 있다. 거기에다 이러한 하드웨어 방식의 디코딩은 디코딩에 약간은 엄격한 제한이 붙기 때문에 모든 동영상에서의 호환을 장담할 수 없을 뿐만 아니라 호환되지 않는 부분에서는 가차없이 에러를 뿜어낸다. DXVA를 사용하다 소프트웨어 디코딩에서 보이지 않던 묘한 깍두기 같은 것이 영상에서 보였다면 100%. 따라서 최고의 품질을 위해서는 CPU의 능력이 모자란 경우가 아니면 CPU만을 이용할 것이 권장된다.
기본적으로 비디오 디코더 → 렌더러로 바로 영상이 처리되는 플레이어의 경우 밝기 조절 같은 기타 영상효과는 전혀 주지 못하는 경우가 있으나 요즘은 드라이버 수준에서 모두 지원하고, 디코딩된 이미지에 셰이더 후처리로 효과를 주는 동영상 플레이어의 경우 상관 없이 적용이 가능하다.
VGA에 따라 지원하는 코덱과 영역이 다른데, 이걸 간단히 확인하는 방법으로는 DXVA Checker라는 프로그램을 받아서 실행시켜보면 알 수 있다.
또한, 아무 재생기에서 되는 건 아니고 특정 플레이어와 코덱 VGA를 모두 가리는 제한적인 조건이 필요하다. H.262/WMV가 주요 지원 코덱이며, DXVA2에 들어서 H.264/VC1/AVC 등의 지원이 추가되어 지원코덱의 범위는 커졌지만 그 외에 제한 조건이 더 심해지며 EVR 렌더러를 필수로 이용해야 한다. 원래 Windows Vista부터 사용 가능했으나 나중에 Windows XP에서도 사용 가능하게 제공해줬다. 단, .Net Framework 3.0 이상의 프레임워크를 별도로 설치해야한다.
네이티브와 copy-back모드가 있는데 네이티브는 앞서 말한 대로 비디오 디코더→비디오 렌더러로 바로 연결되지만 copy-back은 중간에 cpu를 한번 거친다. 때문에 성능은 떨어지지만 재생할 GPU를 선택 가능하고 렌더러에 상관없이 동작하므로 호환성이 더 좋다.
DXVA는 여러 수준의 가속이 있으며 가속 수준별 특징 또한 다르다.
- Post Process - 직역하면 후처리이며 DXVA 중 가장 VGA 가속을 덜 받는다. CPU가 완전히 디코딩한 것에 디인터레이싱이나, 블럭 제거 등의 잡티 제거만 돕는 수준. 물론 CPU 점유율이 높다.
- Mocomp - Motion Compensation 직역하면 움직임 보상, 그나마 VGA가 디코딩을 조금씩 담당하는 단계, 동영상 압축원리 중 하나가 움직이는 물체의 움직임만 기록하고, 움직이지 않는 것은 생략하고 전에 있던 정보로 대체하는데, 이때 VGA가 연산을 약간 도와주는 정도. CPU 점유율이 떨어지는 건 눈에 보이긴하나 생각보다 높진 않은 상태. 엔비디아 그래픽카드에서는 지포스 256부터 처음 지원했었는데 지포스 2 ~ 4 Ti 시리즈 동안 해당 기능이 잠시 삭제되었다.
- IDCT - Inverse Discrete Cosine Transform 역 이산 코사인 변환, 이 단계부터 VGA가 적극적으로 디코딩에 참여하고, 현재 대부분의 기존 프로그램들이 IDCT 가속을 이용하며 CPU 점유율도 상당히 내려간다. DXVA1에서 이용가능한 최고 수준의 가속.
- VLD - Variable Length Decoder며 해석하면 가변장 복호화가 된다. 영상압축중 상당부분을 차지하고 있는 엔트로피 코드를 디코딩하는 것이며, 사실상 동영상 복호과정중 가장 많은 프로세스를 점유한다. ( 비트레이트가 높으면 높을수록, 엔트로피 코드의 복호화 부하도 크다. 따라서 비트레이트는 엔트로피 코딩을 사용하는 영상압축포맷을 디코딩할때 CPU점유율을 가늠하는 척도가 된다 ) 따라서 CPU부하가 대부분 줄어들게 되며, MPEG-4 part2 와 같이 가변장 복호를 제외한 나머지 프로세스들의 점유율이 크지 않은 경우에는 사실상 이를 통해 CPU점유율을 0%에 가깝게 끌어내릴수도 있다.
하지만 H.264/AVC처럼 In-loop 디블럭킹 필터[1] 를 사용하는 포맷의 경우는 제외
2. 지원 소프트웨어
- KMPlayer
- PowerDVD
- Media Player Classic
- Windows Media Player 11- MPEG-2, WMV만 가능
- Windows Media Player 12
- 네이버 미디어 플레이어
- 무비스트 - 매킨토시
- 팟플레이어
- ffmpeg와 그에 기반한 대부분의 플레이어들
- Avidemux - 윈도우 버젼 한정으로 디코딩에만 사용한다.
3. 기타
DXVA는 Microsoft 가 DirectX 와 같이 Windows를 위해 만든 것인 만큼 다른 OS에서는 사용이 불가능하다. 물론 다른 OS에도 비슷한 기능을 하는 기술들은 존재한다.또한 하드웨어 제조사들 또한 저런 별도의 레이어를 거치지 않고 Low-Level 로 접근할 수 있는 인터페이스를 제공하기도 한다.
- Intel Media SDK - QuickSync Video
- AMD Advanced Media Framework - AMD AMF, VCE
- Nvidia Video Codec SDK - NVENC, NVDEC
[1] 이름에서 알수 있듯이 동영상의 복호,부호화 과정내에(In-loop) 수행되는 디블럭킹 필터이다. 동영상을 인코딩하기 전에 전처리를 하는 Pre-process 디블럭킹 필터나, 동영상을 디코딩한 후에 적용되는 post-process 디블럭킹 필터와는 엄연히 구분된다. 거기다가 In-loop 디블럭킹 필터자체가 디코딩 과정중 하나이기 때문에 디코딩할때도 디블럭킹 연산을 해야하며 이의 부하가 생각외로 크다. (어느 서적에 따르면 전체 CPU점유율의 대략 30%에서 많으면 50%라고 한다) 따라서 저사양 컴퓨터에 무리를 주기 때문에 어떤 디코더는(대표적으로 CoreAVC) 이 디블럭킹 연산을 해제할수 있도록 한다. 사양은 많이 낮아지지만 최후의 보루다. 해제하면 네모난 블럭이 난무하는 끔찍한 화질을 볼 수 있다.