- 영상 관련 프로그래밍을 하다보면 YUV 4:2:2 포맷이나 YUV 4:2:0 포맷을 RGB 로 변환해야 할 경우가 종종 생긴다.
- YUV 4:2:2 포맷은 흔히 접하는 포맷이고, 컨버팅 소스도 여러군데 있기 때문에 별로 어려움이 없다. 하지만 YUV 4:2:0 포맷의 경우는 흔히 접하기 힘든 포맷들이고,
- 또한 컨버팅 소스도 별로 없어서 좀 힘이 든다. 나름대로 여러 사이트들을 돌아다녀보면서 삽질을 해 본 결과 YUV 4:2:0 의 4가지 정도 포맷을 RGB로 변환하는데 무리가 없게 되었다.
- FourCC.org 보다는 MSDN 의 글이 좀 더 이해하기가 쉬웠다.
- 크게 12bit YUV 4:2:0 포맷에는 4가지 종류가 있다. YV12, NV12, IMC2, IMC4 정도이다.
- 24비트 RGB 표현을 12비트로 표현하는데 YUV 중에서 Y 정보가 8비트, U 가 2비트, V 가 2비트, 이렇게 평면상에서 블록단위로 구성된다.
- 이중에서 가장 자주 접할 수 있는 것이 YV12 혹은 NV12 이다. 주로 MPEG2 영상에서 많이 쓴다.

- YV12 메모리 구성도는 그중에서 가장 쉽다. 메모리 순서대로 Y, V, U 로 블럭이 잡혀 있다. 다만 Stride 정보라고 해서 라인당 여분 메모리가 조금씩 붙어있는 경우가 있다.
- 이럴때는 제대로 변환하기 위해서 Stride 정보를 버려줘야 할 경우도 생긴다.

NV12 는 YV12 보다는 좀 복잡한데, 처음 블럭은 Y 만 있고, 그다음에는 U1V1U2V2 이런식으로 한바이트씩 메모리가 배열된다. DXVA 지원을 위해서 권장되는 포맷이라고 한다.

- IMC2 포맷은 거의 경험해 보지 못한 포맷인데, Intel 계열의 그래픽에서 사용되지 않을까 조심스럽게 추측(?) 해본다.
- 일단 Y 블럭은 처음에 독립적으로 존재하고, 다음에 한 라인을 반으로 갈라서 V , U 가 존재한다.
- 예를 들어 한 라인이 480 바이트라면 240 바이트는 V , 나머지 240 바이트는 U 로 구성된다는 말이다. 그렇게 라인이 이미지 Height 만큼 이어진다.

- IMC4 포맷은 IMC2 와 거의 동일하다. 다만 V 와 U 의 위치가 바뀌어있다.
이렇게 Y, U, V 정보를 추출하는데 성공하면, YUV 4:2:0 -> YUV 4:2:2 -> RGB 혹은 YUV 4:2:0 -> RGB 변환 공식을 통하여서 일반 비트맵으로 변환하게 된다.
- 변환 과정에서 floating 연산이 들어가게 되므로 상당한 시간이 소비되는데, 이를 테이블 참조 방식으로 진행하는 방법도 있다고 한다.
출처 : http://praise4.egloos.com/1742236