본문 바로가기

프로그램

DXVA와 NV12에 관한 의문

* 이 글에 잘못된 정보가 포함되어 있기도하고, 글을 작성한 의도와 다르게 오해를 일으킬 소지가 있어 글을 수정합니다. 글에 쓰인 내용 중 일부는 "파코즈"의 "**선진"님과 "**세진"님의 글을 참고했습니다.
(두분 모두 실명을 사용하셨지만 제가 여기서 실명을 언급하는 것은 마치 두분의 개인정보를 퍼트리는 것 같아서..)


DXVA란 무엇인가?


예전에 제가 작성했던 글을 참고하여, PDVD10을 이용해 영상을 감상하고 계시다면 위와 같이 Output에 DVXA가 표시되는 것을 보실 수 있을 겁니다. 이전 글에서는 간단히 "하드웨어 가속"의 일종이라고 말씀드렸습니다.

정확히 말하자면 DXVA는 'DirectX Video Acceleration'의 약자로, 마이크로소프트사에서 Windows, XBOX 360용으로 제작한 비디오 디코딩의 하드웨어 가속을 지원하는 API입니다. DXVA는 iDCT, 색보정, 디인터레이스 같은 CPU집중 명령을 GPU로 옮겨주는 역할을 합니다. 요약하자면 '하드웨어 가속'이라는 결과를 실현하는 여러가지 방법 중 하나입니다.
또 DXVA는 1.0버전과 2.0버전으로 나뉘는데 1.0버전은 Windows 98이후 버전에서 사용가능하며 VMR, Overlay Renderer 중 하나의 비디오 렌더링 방식을 취하는 반면, 2.0버전은 Windows Vista이후 버전에서만 사용가능하며 EVR 방식만을 취할 수 있습니다.


DXVA에 관한 의문


제가 상당히 많이 받는 질문 중 하나는 CoreAVC 코덱을 사용하면서 하드웨어 가속을 사용하는 방법이었습니다. 그래서 그런 방법을 찾아보던 중 Output에 NV12가 표시되면 DXVA 2.0이 적용된 것이란 글을 읽었습니다. 하지만 NV12가 왜 DXVA 2.0을 뜻하는 것인지에 관해서는 언급되어 있지 않아 NV12에 대해 알아보고자 합니다.


NV12는 무엇인가?

이것은 FOURCC로 불리우는 식별자입니다. FOURCC는 Four Charactor Code의 약자로, 미디어 파일에 사용되는 비디오코덱, 압축형식, 픽셀형식 또는 색상을 표시하는 방법입니다.
그 중에서도 NV12는 색상을 표시하는 방법의 일종인 "YUV"의 FOURCC입니다.
(FOURCC에 관한 자세한 사항은 www.fourcc.org 를 방문해 확인하시기 바랍니다.)

YUV는 RGB와 마찬가지로 색을 표현하는 하나의 표준이며, RGB와의 차이점은 "사람의 눈이 색상보다 밝기에 더욱 민감하다"는 사실에 기반해 "밝기(Y)"와 "색상(U, V)"로 표현하는 방식입니다. - 더 자세한 부분을 설명하자면 글이 상당히 길어지기도 하고, 저역시 그리 깊은 수준까지 YUV에 대해 알지 못하니 이 정도만 언급하겠습니다. YUV에 관한 사항은 검색으로 쉽사리 찾을 수 있지만, 내용도 검색만큼 쉽지는 않습니다.



그 중에서도 YUY2는 보편적인 4:2:2의 값을 가지는 색상표현 방식이고, NV12는 4:2:0의 값을 가집니다. 이 사실은 CoreAVC의 설정창에서 Help탭을 확인하더라도 발견할 수 있는 내용입니다.


과연 NV12는 DXVA 2.0인가

이에 관해 파코즈의 글에서 제 나름대로 추려보겠습니다. 혹시라도 잘못 옮겨쓴 내용이 있다면 지적바랍니다.

MS가 VGA의 VPU드라이버와 DXVA간의 인터페이스를 공간효율적인 NV12로 규격화했고, 이후 해당 규격에 맞춰 그래픽카드와 드라이버가 제작됐다. 즉, DXVA 2.0은 NV12라는 컬러스페이스를 통해 그래픽카드의 VPU 드라이버와 DXVA 커널이 연결되도록 규정되어 있다는 것이다.
또, nVidia와 ATi의 Video Accelerator가 DXVA 2.0 으로부터 Media Type을 iDirectXVideoDecoder 방식을 사용할때 받을 수 있는 Sub Type은 NV12뿐이다. 즉, Input이 어떤 것이든 GPU가속을 사용한다면 컬러스페이스 변환을 거쳐 Output는 NV12로 출력된다.
**선진

컬러스페이스는 동영상 플레이어에서 출력시 변경할 수 있지 않은가? 사실 DXVA를 사용하지 않으면서 NV12 컬러스페이스를 사용할 수 있으므로, 컬러스페이스의 종류로 DXVA 사용유무를 판단하는 것은 어렵다. DXVA표시가 안 될때 DXVA 적용여부를 판단하는 가장 정확한 방법은 CPU와 GPU 점유율을 보는 것이다.
**세진

H/W GUID의 디코더와 VPU로 핀이 연결되면 동영상 플레이어는 컬러스페이스를 변경할 수 없다. 왜냐하면 이 경우 동영상 플레이어의 역할은 핀연결을 셋업하는 것에 불과하기 때문이다.
**선진

제가 이해한 것이 올바르다면 Output에 NV12가 표시되지 않고 있더라도 DXVA 2.0적용시 컬러스페이스는 NV12이며, 반대로 하드웨어 가속을 사용할때 컬러스페이스를 동영상 플레이어에서 임의로 변경하더라도 적용되지 않는다는 이야기 입니다.
하지만 제 생각에는 여전히 최초의 의문은 남아있습니다. Output에 NV12가 표시된다면 그것이 현재 DXVA 2.0이 적용되고 있다는 의미로 받아들여야 하는가 입니다.

제가 애초에 이 글을 작성한 이유는 CoreAVC코덱을 사용하는 경우 때문이었습니다. CoreAVC는 DXVA 2.0뿐만 아니라 Cuda Acceleration 기능을 사용체크를 하지 않는다면 하드웨어 가속은 적용되지 않는다고 알고 있습니다. 이것은 CPU와 GPU점유율 차이를 봐도 드러납니다. CoreAVC를 사용하는 경우와 내장코덱의 DXVA 2.0을 적용한 경우는 CPU/GPU 점유율에 있어서 상당한 차이를 보였습니다.
그런데 이 경우 Output에 NV12가 표시되는 경우도 위 글에 근거해 하드웨어 가속이 이루어지고 있는가에 관해 생각해 보면 결론은 "아니다"입니다.

"DXVA 2.0 을 사용하면 컬러스페이스는 NV12로 고정된다. 동영상 플레이어에서 임의로 컬러스페이스를 변경해도 적용되지 않는다" 라는 말을 다시 생각하면 DXVA 2.0을 사용하지 않고 있다면 컬러스페이스의 변경이 가능하다는 뜻도 됩니다.
따라서 CoreAVC코덱을 사용하는 등, DXVA 2.0이 적용되지 않은 경우에도 Output에 NV12가 표시될 수 있습니다.


결론

DXVA 2.0을 사용하면 화면에 표시되지 않더라도 컬러스페이스는 NV12를 사용중입니다. 다만, 화면에 NV12가 표시된다고 하더라도 반드시 DXVA 2.0이 적용되고 있는 것은 아닙니다. 단순히 특정 코덱이 컬러스페이스를 변경하여 Output에 NV12가 출력될 가능성도 있다고 생각합니다. "**세진"님의 말씀처럼 화면에 DXVA가 표시 되지 않는 경우 DXVA의 적용여부는 CPU와 GPU 점유율을 보고 판단하시는 것이 좋을 듯 합니다. 그리고 NV12가 표시되는 경우도 DXVA라고 쉽사리 결론 내리기 보다는 CPU와 GPU 점유율을 보고 판단하시는 것이 좋을 것 같습니다.


좋은 정보 주신 파코즈의 두분께 감사드립니다. 혹시 제가 또 잘못알고 있는 부분이 있다면 지적 부탁드립니다.