다음을 통해 공유


비디오 렌더링에 권장되는 8비트 YUV 형식

게리 설리번과 스티븐 에스트롭

Microsoft Corporation

2002년 4월, 2008년 11월 업데이트

이 항목에서는 Windows 운영 체제에서 비디오 렌더링에 권장되는 8비트 YUV 색 형식에 대해 설명합니다. 이 문서에서는 YUV 형식과 RGB 형식 간을 변환하는 기술을 제공하고 YUV 형식을 업샘플링하는 기술도 제공합니다. 이 문서는 Windows에서 YUV 비디오 디코딩 또는 렌더링을 사용하는 모든 사용자를 위한 것입니다.

소개

비디오 산업 전반에 걸쳐 수많은 YUV 형식이 정의됩니다. 이 문서에서는 Windows에서 비디오 렌더링에 권장되는 8비트 YUV 형식을 식별합니다. 디코더 공급업체 및 디스플레이 공급업체는 이 문서에 설명된 형식을 지원하는 것이 좋습니다. 이 문서에서는 스틸 사진과 같은 YUV 색의 다른 용도를 다루지 않습니다.

이 문서에 설명된 모든 형식은 픽셀 위치마다 Y 채널(루마 채널이라고도 함)을 인코딩하는 데 8비트를 사용하고, 각 샘플마다 U 또는 V 크로마 샘플을 인코딩하는 데 8비트를 사용합니다. 그러나 대부분의 YUV 형식은 Y보다 사용자 및 V의 샘플이 적기 때문에 평균 픽셀당 24비트 미만을 사용합니다. 이 문서에서는 10비트 이상의 Y 채널이 있는 YUV 형식을 다루지 않습니다.

메모

이 문서의 목적을 위해 U라는 용어는 Cb와 동일하며 V라는 용어는 Cr과 동일합니다.

 

이 문서에서는 다음 항목을 다룹니다.

  • YUV 샘플링. 가장 일반적인 YUV 샘플링 기술을 설명합니다.
  • 표면 정의. 권장되는 YUV 형식에 대해 설명합니다.
  • 색 공간 및 크로마 샘플링 비율 변환 . YUV와 RGB 형식 간을 변환하고 다른 YUV 형식 간에 변환하기 위한 몇 가지 지침을 제공합니다.
  • Media Foundation에서 YUV 형식을 식별하기. Media Foundation에서 YUV 형식 형식을 설명하는 방법을 설명합니다.

YUV 표본 추출

크로마 채널은 지각 품질의 극적인 손실없이, 루마 채널보다 낮은 샘플링 속도를 가질 수있다. "A:B:C" 표기법은 Y를 기준으로 U와 V가 얼마나 자주 샘플링되는지를 설명하는 데 사용됩니다.

  • 4:4:4는 크로마 채널의 다운샘플링이 없음을 의미합니다.
  • 4:2:2는 수직 다운샘플링 없이 2:1 가로 다운샘플링을 의미합니다. 모든 검사 줄에는 2개의 U 또는 V 샘플마다 4개의 Y 샘플이 포함되어 있습니다.
  • 4:2:0은 2:1 수직 다운샘플링을 사용하여 2:1 가로 다운샘플링을 의미합니다.
  • 4:1:1은 수직 다운샘플링 없이 4:1 가로 다운샘플링을 의미합니다. 각 주사 라인은 U 및 V 샘플 각각에 대해 4개의 Y 샘플을 포함하고 있습니다. 4:1:1 샘플링은 다른 형식보다 덜 일반적이며 이 문서에서 자세히 설명하지 않습니다.

다음 다이어그램에서는 각 다운샘플링 속도에 대해 크로마를 샘플링하는 방법을 보여 줍니다. 루마 샘플은 십자가로 표현되고, 크로마 샘플은 원으로 표현됩니다.

그림 1. 크로마 샘플링

4:2:2 샘플링의 지배적 형태는 ITU-R 권장 사항 BT.601에 정의됩니다. 4:2:0 샘플링의 두 가지 일반적인 변형이 있습니다. 이 중 하나는 MPEG-2 비디오에서 사용되고 다른 하나는 MPEG-1 및 ITU-T Recommendations H.261 및 H.263에서 사용됩니다.

MPEG-1 체계와 비교하여 MPEG-2 체계와 4:2:2 및 4:4:4 형식에 대해 정의된 샘플링 그리드 간에 변환하는 것이 더 간단합니다. 따라서 MPEG-2 체계는 Windows에서 선호되며 4:2:0 형식의 기본 해석으로 간주되어야 합니다.

표면 정의

이 섹션에서는 비디오 렌더링에 권장되는 8비트 YUV 형식에 대해 설명합니다. 이러한 범주는 다음과 같은 여러 범주로 분류됩니다.

먼저 다음 개념을 이해하려면 다음 개념을 알고 있어야 합니다.

  • 표면 원본. 이 문서에 설명된 YUV 형식의 경우 원점(0,0)은 항상 표면의 왼쪽 위 모서리입니다.
  • Stride. 표면의 스트라이드(때때로 피치라고도 함)는 바이트 단위로 표면의 너비를 나타냅니다. 왼쪽 위 모서리에 표면 기준점이 있는 경우 보폭은 항상 양수입니다.
  • ** 맞춤 설정. 표면의 맞춤은 그래픽 디스플레이 드라이버의 재량에 따라 결정됩니다. 표면은 항상 DWORD에 맞춰야 합니다. 즉, 표면 내의 개별 선은 32비트(DWORD) 경계에서 시작되도록 보장됩니다. 그러나 하드웨어의 요구 사항에 따라 맞춤이 32비트보다 클 수 있습니다.
  • 압축된 형식과 평면 형식 YUV 형식은 압축된 형식과 평면 형식으로 나뉩니다. 압축된 형식으로 Y, U 및 V 구성 요소는 단일 배열에 저장됩니다. 픽셀은 매크로픽셀 그룹으로 구성되며 레이아웃은 형식에 따라 달라집니다. 평면 형식으로 Y, U 및 V 구성 요소는 세 개의 별도 평면으로 저장됩니다.

이 문서에 설명된 각 YUV 형식에는 할당된 FOURCC 코드가 있습니다. FOURCC 코드는 4개의 ASCII 문자를 연결하여 만든 32비트 부호 없는 정수입니다.

4:4:4 형식, 픽셀당 32비트

AYUV

FOURCC 코드 AYUV를 사용하여 단일 4:4:4 형식을 사용하는 것이 좋습니다. 이 형식은 다음 그림과 같이 각 픽셀이 4바이트 연속으로 인코딩되어 시퀀스로 정렬되는 압축된 형식입니다.

그림 2. ayuv 메모리 레이아웃

A로 표시된 바이트는 알파에 대한 값을 포함합니다.

4:2:2 형식, 픽셀당 16비트

다음 FOURCC 코드와 함께 두 개의 4:2:2 형식을 사용하는 것이 좋습니다.

  • YUY2
  • UYVY

둘 다 압축된 형식이며, 각 매크로픽셀은 4바이트 연속으로 인코딩된 2픽셀입니다. 크로마가 수평으로 2배 다운샘플링되는 결과를 낳습니다.

YUY2

YUY2 형식에서 데이터는 부호 없는 char 값의 배열로 처리될 수 있습니다. 여기서 첫 번째 바이트는 첫 번째 Y 샘플을 포함하고, 두 번째 바이트는 첫 번째 U(Cb) 샘플을 포함하고, 세 번째 바이트는 두 번째 Y 샘플을 포함하며, 네 번째 바이트는 다음 다이어그램에 표시된 것처럼 첫 번째 V(Cr) 샘플을 포함합니다.

그림 3. yuy2 메모리 레이아웃

이미지가 little-endian WORD 값의 배열로 다루어질 때, 첫 번째 WORD는 최하위 비트(LSB)의 첫 번째 Y 샘플과 최고 중요한 비트(MSB)의 첫 번째 U(Cb) 샘플을 포함합니다. 두 번째 WORD LSB의 두 번째 Y 샘플과 MSB의 첫 번째 V(Cr) 샘플을 포함합니다.

YUY2는 Microsoft DirectX VA(DirectX Video Acceleration)의 기본 설정 4:2:2 픽셀 형식입니다. 4:2:2 비디오를 지원하는 DirectX VA 가속기에 대한 중간 기간 요구 사항이 될 것으로 예상됩니다.

UYVY

이 형식은 바이트 순서가 역방향이라는 점을 제외하고 YUY2 형식과 동일합니다. 즉, 크로마와 루마 바이트가 대칭 이동됩니다(그림 4). 이미지를 두 개의 little-endian WORD 값으로 배열 처리할 경우, 첫 번째 WORD는 LSB에서 U를 포함하고, MSB에서 Y0를 포함합니다. 두 번째 WORD는 LSB에서 V를 포함하고 MSB에서 Y1을 포함합니다.

그림 4. uyvy 메모리 레이아웃

4:2:0 형식, 픽셀당 16비트

다음 FOURCC 코드와 함께 픽셀당 4:2:0 16비트(bpp) 형식을 사용하는 것이 좋습니다.

  • IMC1
  • IMC3

이러한 YUV 형식은 모두 평면 형식입니다. 크로마 채널은 가로 차원과 세로 차원 모두에서 2의 배율로 하위 샘플링됩니다.

IMC1

모든 Y 샘플은 부호 없는 char 값의 배열로 메모리에 먼저 표시됩니다. 그 다음에는 모든 V(Cr) 샘플과 모든 U(Cb) 샘플이 뒤따릅니다. V 및 U 평면은 Y 평면과 동일한 보폭을 가지며, 그림 5와 같이 사용되지 않는 메모리 영역이 생성됩니다. U 및 V 평면은 16줄의 배수인 메모리 경계에서 시작해야 합니다. 그림 5는 352 x 240 비디오 프레임에서 U와 V의 시작점을 보여 줍니다. U 및 V 평면의 시작 주소는 다음과 같이 계산됩니다.

BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);

여기서 pY 다음 다이어그램과 같이 메모리 배열의 시작 부분에 대한 바이트 포인터입니다.

그림 5. imc1 메모리 레이아웃(예)

IMC3

이 형식은 U 평면과 V 평면이 서로 바뀐다는 점을 제외하고, 아래 다이어그램에 나와 있는 것처럼 IMC1과 동일합니다.

그림 6. imc3 메모리 레이아웃

4:2:0 형식, 픽셀당 12비트

4개의 4:2:0 12-bpp 형식이 권장되며, 다음 FOURCC 코드가 포함됩니다.

  • IMC2
  • IMC4
  • YV12
  • NV12

이러한 모든 형식에서 크로마 채널은 가로 및 세로 방향 모두에서 2배로 하위 샘플링됩니다.

IMC2

이 형식은 IMC1과 동일하지만 다음과 같은 차이점이 있습니다: V(Cr) 및 U(Cb) 라인은 반 걸음 경계에서 교차 배치됩니다. 즉, 크로마 영역의 각 전체 보폭 선은 V 샘플 줄로 시작하고 그 다음 반보폭 경계에서 시작되는 U 샘플 줄로 시작합니다(그림 7). 이 레이아웃은 IMC1보다 주소 공간을 더 효율적으로 사용합니다. 크로마 주소 공간을 절반으로 줄여 총 주소 공간을 25% 줄입니다. 4:2:0 형식 중 IMC2는 NV12에 이어 두 번째로 선호하는 형식입니다. 다음 이미지는 이 프로세스를 보여 줍니다.

그림 7. imc2 메모리 레이아웃

IMC4

이 형식은 다음 그림과 같이 U(Cb) 및 V(Cr) 줄이 교환된다는 점을 제외하고 IMC2와 동일합니다.

그림 8. imc4 메모리 레이아웃

YV12

모든 Y 샘플은 부호 없는 char 값의 배열로 메모리에 먼저 표시됩니다. 이 배열은 모든 V(Cr) 샘플 바로 뒤에 옵니다. V 평면의 보폭은 Y 평면의 절반 보폭입니다. V 평면은 Y 평면의 절반만큼 많은 줄을 포함합니다. V 평면은 다음 그림에서와 같이 동일한 보폭 및 줄 수로 모든 U(Cb) 샘플 뒤에 바로 위치합니다.

그림 9. yv12 메모리 레이아웃

NV12

모든 Y 샘플은 메모리에서 부호 없는 char 값의 배열로 먼저 저장되며, 줄이 짝수 개 있습니다. Y 평면은 압축된 U(Cb) 및 V(Cr) 샘플을 포함하는 부호 없는 char 값 배열 바로 뒤에 옵니다. 결합된 U-V 배열이 little-endian WORD 값의 배열로 처리되면 LSB에는 U 값이 포함되고 MSB에는 V 값이 포함됩니다. NV12는 DirectX VA의 기본 설정 4:2:0 픽셀 형식입니다. 4:2:0 비디오를 지원하는 DirectX VA 가속기에 대한 중간 기간 요구 사항이 될 것으로 예상됩니다. 다음 그림에서는 Y 평면과 압축된 U 및 V 샘플이 포함된 배열을 보여 줍니다.

그림 10. nv12 메모리 레이아웃

색 공간 및 크로마 샘플링 속도 변환

이 섹션에서는 YUV와 RGB 간 변환 및 몇 가지 다른 YUV 형식 간 변환에 대한 지침을 제공합니다. 이 섹션에서는 8비트 컴퓨터 RGB(sRGB 또는 "본격적인" RGB라고도 함) 및 스튜디오 비디오 RGB또는 "헤드룸과 토룸이 있는 RGB"라는 두 가지 RGB 인코딩 체계를 고려합니다. 다음과 같이 정의됩니다.

  • 컴퓨터 RGB는 빨간색, 녹색 및 파란색의 각 샘플에 대해 8비트 사용 검정은 R = G = B = 0으로 표시되고 흰색은 R = G = B = 255로 표시됩니다.
  • Studio 비디오 RGB는 빨강, 녹색 및 파랑의 각 샘플에 대해 몇 가지 비트 N을 사용합니다. 여기서 N은 8개 이상입니다. 스튜디오 RGB는 컴퓨터 RGB와 다른 스케일링 팩터를 사용하며, 오프셋을 가지고 있습니다. 검정은 R = G = B = 16*2^(N-8)로 표시되고 흰색은 R = G = B = 235*2^(N-8)로 표시됩니다. 그러나 실제 값은 이 범위를 벗어날 수 있습니다.

스튜디오 비디오 RGB는 Windows에서 비디오에 대한 기본 RGB 정의이며, 컴퓨터 RGB는 비비디오 애플리케이션에 대한 기본 RGB 정의입니다. RGB 형식 중 하나에서 색 색 좌표는 RGB 색 주체의 정의에 대해 ITU-R BT.709에 지정된 대로 지정됩니다. R, G 및 B의 (x,y) 좌표는 각각 (0.64, 0.33), (0.30, 0.60) 및 (0.15, 0.06)입니다. 기준 백색은 D65이며, 좌표는 (0.3127, 0.3290)입니다. 명목 감마는 1/0.45(약 2.2)이며, 정확한 감마는 ITU-R BT.709에 자세히 정의되어 있습니다.

RGB와 4:4:4 YUV 간의 변환

먼저 RGB와 4:4:4 YUV 간의 변환에 대해 설명합니다. 4:2:0 또는 4:2:2 YUV를 RGB로 변환하려면 YUV 데이터를 4:4:4 YUV로 변환한 다음 4:4:4 YUV에서 RGB로 변환하는 것이 좋습니다. 4:4:4 형식인 AYUV 형식은 Y, U 및 V 샘플에 각각 8비트를 사용합니다. 일부 애플리케이션에 대해 샘플당 8비트 이상을 사용하여 YUV를 정의할 수도 있습니다.

RGB에서 두 가지 주요 YUV 변환이 디지털 비디오에 대해 정의되었습니다. 둘 다 ITU-R 권장 사항 BT.709로 알려진 사양을 기반으로합니다. 첫 번째 변환은 BT.709에서 50Hz 사용을 위해 정의된 이전 YUV 양식입니다. 이전 이름인 CCIR 601이라고도 하는 ITU-R 권장 사항 BT.601에 지정된 관계와 동일합니다. 표준 정의 TV 해상도(720 x 576) 및 저해상도 비디오의 기본 YUV 형식으로 간주되어야 합니다. 두 상수 KrKb의 값으로 특징지어집니다.

Kr = 0.299
Kb = 0.114

두 번째 변환은 BT.709에서 60Hz 사용을 위해 정의된 최신 YUV 양식이며 SDTV 위의 비디오 해상도에 대한 기본 형식으로 간주되어야 합니다. 다음 두 상수에 대해 서로 다른 값이 특징입니다.

Kr = 0.2126
Kb = 0.0722

RGB에서 YUV로의 변환은 다음부터 시작하여 정의됩니다.

L = Kr * R + Kb * B + (1 - Kr - Kb) * G

그런 다음 YUV 값은 다음과 같이 가져옵니다.

Y =                   floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))

어디

  • M은 YUV 샘플당 비트 수입니다(M >= 8).
  • Z는 검정 수준 변수입니다. 컴퓨터 RGB의 경우 Z는 0과 같습니다. 스튜디오 비디오 RGB의 경우 Z는 16*2^(N-8)입니다. 여기서 N은 RGB 샘플당 비트 수입니다(N >= 8).
  • S는 크기 조정 변수입니다. 컴퓨터 RGB의 경우 S는 255와 같습니다. 스튜디오 비디오 RGB의 경우 S는 219*2^(N-8)와 같습니다.

함수 floor(x)는 x보다 작거나 같은 가장 큰 정수 값을 반환합니다. 함수 clip3(x, y, z)은 다음과 같이 정의됩니다.

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

메모

clip3은 전처리기 매크로가 아닌 함수로 구현되어야 합니다. 그렇지 않으면 인수에 대한 여러 평가가 발생합니다.

 

Y 샘플은 밝기를 나타내며, 사용자 및 V 샘플은 각각 파란색과 빨간색에 대한 색 편차를 나타냅니다. Y의 명목 범위는 16*2^(M-8)에서 235*2^(M-8)입니다. 검은색은 16*2^(M-8)로 표시되고 흰색은 235*2^(M-8)로 표시됩니다. U와 V의 명목상의 범위는 16*2^(M-8)~240*2^(M-8)이며 중립 크로마를 나타내는 값은 128*2^(M-8)입니다. 그러나 실제 값은 이러한 범위를 벗어날 수 있습니다.

스튜디오 비디오 RGB 형식의 입력 데이터의 경우, U 및 V 값을 0에서 (2^M)-1 범위 내에 유지하기 위해 클립 작업이 필요합니다. 입력이 컴퓨터 RGB인 경우 변환 수식이 이 범위 밖의 값을 생성할 수 없으므로 클립 작업이 필요하지 않습니다.

근사값이 없는 정확한 수식입니다. 이 문서의 뒤에 오는 모든 항목은 이러한 수식에서 파생됩니다. 이 섹션에서는 다음 변환에 대해 설명합니다.

RGB888을 YUV로 변환 4:4:4

컴퓨터 RGB 입력 및 8비트 BT.601 YUV 출력의 경우 이전 섹션에 제공된 수식이 다음과 같이 합리적으로 근사값을 계산할 수 있다고 생각합니다.

Y = ( (  66 * R + 129 * G +  25 * B + 128) >> 8) +  16
U = ( ( -38 * R -  74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R -  94 * G -  18 * B + 128) >> 8) + 128

이러한 수식은 부호 없는 전체 자릿수가 8비트 이하인 계수를 사용하여 8비트 결과를 생성합니다. 중간 결과에는 최대 16비트 정밀도가 필요합니다.

8비트 YUV를 RGB888로 변환

원래 RGB-YUV 수식에서 BT.601에 대해 다음 관계를 파생시킬 수 있습니다.

Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) +  16 
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128

따라서 다음과 같이 지정합니다.

C = Y - 16
D = U - 128
E = V - 128

YUV를 RGB로 변환하는 수식은 다음과 같이 파생될 수 있습니다.

R = clip( round( 1.164383 * C                   + 1.596027 * E  ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C +  2.017232 * D                   ) )

여기서 clip() [0..255] 범위까지의 클리핑을 나타냅니다. 이러한 수식은 다음과 같이 합리적으로 근사값을 계산할 수 있습니다.

R = clip(( 298 * C           + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D           + 128) >> 8)

이러한 수식은 각 8비트 결과를 생성하기 위해 8비트 이상의 정밀도가 필요한 일부 계수를 사용하며 중간 결과에는 16비트 이상의 정밀도가 필요합니다.

4:2:0 또는 4:2:2 YUV를 RGB로 변환하려면 YUV 데이터를 4:4:4 YUV로 변환한 다음 4:4:4 YUV에서 RGB로 변환하는 것이 좋습니다. 다음 섹션에서는 4:2:0 및 4:2:2 형식을 4:4:4로 변환하는 몇 가지 방법을 제공합니다.

4:2:0 YUV를 4:2:2 YUV로 변환

4:2:0 YUV를 4:2:2 YUV로 변환하려면 2단계로 수직 상승이 필요합니다. 이 섹션에서는 컨버전을 수행하기 위한 예제 메서드에 대해 설명합니다. 이 메서드는 비디오 사진이 점진적 검사라고 가정합니다.

메모

4:2:0에서 4:2:2로의 인터레이스 스캔 변환 프로세스는 특이한 문제를 일으키며 구현하기 어렵습니다. 이 문서에서는 인터레이스 스캔을 4:2:0에서 4:2:2로 변환하는 문제를 다루지 않습니다.

 

입력 크로마 샘플의 각 수직선을 0부터 N - 1까지의 범위를 갖는 배열 Cin[]로 간주합니다. 출력 이미지의 해당 세로선은 0에서 2N - 1까지의 배열 Cout[]. 각 세로선을 변환하려면 다음 프로세스를 수행합니다.

Cout[0]     = Cin[0];
Cout[1]     = clip((9 * (Cin[0] + Cin[1]) - (Cin[0] + Cin[2]) + 8) >> 4);
Cout[2]     = Cin[1];
Cout[3]     = clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);
Cout[4]     = Cin[2]
Cout[5]     = clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);
...
Cout[2*i]   = Cin[i]
Cout[2*i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);
...
Cout[2*N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);
Cout[2*N-2] = Cin[N-1];
Cout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);

여기서 clip()은 [0..255] 범위까지의 클리핑을 나타냅니다.

메모

가장자리를 처리하기 위한 수식을 수학적으로 단순화할 수 있습니다. 그림 가장자리의 클램핑 효과를 설명하기 위해 이 형식으로 표시됩니다.

 

실제로 이 메서드는 인접한 4픽셀의 곡선을 보간하여 누락된 각 값을 계산하고 가장 가까운 두 픽셀의 값에 가중치를 적용합니다(그림 11). 이 예제에 사용된 특정 보간 방법은 입방 배선 보간이라고도 하는 Catmull-Rom 보간이라는 잘 알려진 방법을 사용하여 반정수 위치에서 누락된 샘플을 생성합니다.

그림 11. 4:2:0~4:2:2 업샘플링 보여 주는 다이어그램

신호 처리 측면에서 수직 상승은 이상적으로 4:2:0 샘플 선의 위치와 다른 모든 4:2:2 샘플 선의 위치 사이의 반 픽셀 수직 오프셋(출력 4:2:2 샘플링 그리드 기준)을 고려하여 위상 시프트 보정을 포함해야 합니다. 그러나 이 오프셋을 도입하면 샘플을 생성하는 데 필요한 처리 양이 늘어나고, 업샘플링된 4:2:2 이미지에서 원래 4:2:0 샘플을 재구성할 수 없게 됩니다. 또한 비디오를 4:2:2 화면으로 직접 디코딩한 다음 해당 표면을 스트림에서 후속 그림을 디코딩하기 위한 참조 그림으로 사용하는 것이 불가능합니다. 따라서 여기에 제공된 메서드는 샘플의 정확한 세로 맞춤을 고려하지 않습니다. 이렇게 하는 것은 합리적으로 높은 그림 해상도에서 시각적으로 해롭지 않을 수 있습니다.

H.261, H.263, 또는 MPEG-1 비디오에서 정의된 샘플링 그리드를 사용하는 4:2:0 비디오로 시작하는 경우, 출력되는 4:2:2 크로마 샘플의 위상은 루마 샘플링 그리드의 간격에 비해 반 픽셀 수평 오프셋으로 이동됩니다 (4:2:2 크로마 샘플링 그리드의 간격에 비해 4분의 1 픽셀 오프셋). 그러나 4:2:0 비디오의 MPEG-2 형식은 PC에서 더 일반적으로 사용되며 이 문제가 발생하지 않습니다. 또한, 구별은 아마 합리적으로 높은 그림 해상도에서 시각적으로 유해하지 않습니다. 이 문제를 해결하려고 하면 수직 단계 오프셋에 대해 논의된 것과 동일한 종류의 문제가 생성됩니다.

4:2:2 YUV를 4:4:4 YUV로 변환

4:2:2 YUV를 4:4:4 YUV로 변환하려면 수평 방향으로 2배 업컨버전이 필요합니다. 수직 컨버전에 대해 이전에 설명한 메서드는 수평 컨버전에도 적용할 수 있습니다. MPEG-2 및 ITU-R BT.601 비디오의 경우 이 메서드는 올바른 위상 맞춤으로 샘플을 생성합니다.

4:2:0 YUV를 4:4:4 YUV로 변환

4:2:0 YUV를 4:4:4 YUV로 변환하려면 앞에서 설명한 두 가지 방법을 따르기만 하면 됩니다. 4:2:0 이미지를 4:2:2로 변환한 다음 4:2:2 이미지를 4:4:4로 변환합니다. 작업의 순서가 결과의 시각적 품질에 실제로 중요하지 않기 때문에 두 업컨버전 프로세스의 순서를 전환할 수도 있습니다.

기타 YUV 형식

다른 덜 일반적인 YUV 형식에는 다음이 포함됩니다.

  • AI44는 샘플당 8비트를 사용하는 palettized YUV 형식입니다. 각 샘플에는 MSB(4개의 가장 중요한 비트)의 인덱스와 LSB(최소 유의 비트)의 알파 값이 포함됩니다. 인덱스는 그 형식의 미디어 타입에 정의된 YUV 팔레트 항목의 배열을 나타냅니다. 이 형식은 주로 하위 이미지에 사용됩니다.
  • NV11은 픽셀당 12비트인 4:1:1 평면 형식입니다. Y 샘플은 메모리에 먼저 표시됩니다. Y 평면 뒤에는 압축된 U(Cb) 및 V(Cr) 샘플 배열이 옵니다. 결합된 U-V 배열을 little-endian WORD 값의 배열로 간주할 때, 각 WORD의 LSB에 U 샘플이 포함되고 MSB에 V 샘플이 포함됩니다. (이 메모리 레이아웃은 크로마 샘플링이 다르지만 NV12와 유사합니다.)
  • Y41P는 4:1:1 패킹된 포맷이며, U와 V는 가로로 매 4픽셀마다 샘플링됩니다. 각 매크로픽셀에는 8픽셀(3바이트)이 포함되며, 바이트 레이아웃은 U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T는 Y41P와 동일하며, 각 Y 샘플의 최하위 비트는 크로마 키(0 = 투명, 1 = 불투명)를 지정합니다.
  • Y42T는 UYVY와 동일하며, 각 Y 샘플의 최하위 비트는 크로마 키(0 = 투명, 1 = 불투명)를 지정합니다.
  • YVYU는 U 및 V 샘플이 교환된다는 점을 제외하고 YUYV와 동일합니다.

Media Foundation에서 YUV 형식 식별

이 문서에 설명된 각 YUV 형식에는 할당된 FOURCC 코드가 있습니다. FOURCC 코드는 4개의 ASCII 문자를 연결하여 만든 32비트 부호 없는 정수입니다.

소스 코드에서 FOURCC 값을 더 쉽게 선언할 수 있는 다양한 C/C++ 매크로가 있습니다. 예를 들어 MAKEFOURCC 매크로는 Mmsystem.h에서 선언되고 FCC 매크로는 Aviriff.h에 선언됩니다. 다음과 같이 사용합니다.

DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');

또한 단순히 문자 순서를 반대로 하여 FOURCC 코드를 문자열 리터럴로 직접 선언할 수도 있습니다. 예를 들어:

DWORD fccYUY2 = '2YUY';  // Declares the FOURCC 'YUY2'

Windows 운영 체제에서 little-endian 아키텍처를 사용하므로 순서를 취소해야 합니다. 'Y' = 0x59, 'U' = 0x55 및 '2' = 0x32 있으므로 '2YUY'는 0x32595559.

Media Foundation에서 형식은 주 형식 GUID 및 하위 형식 GUID로 식별됩니다. 컴퓨터 비디오 형식의 주요 유형은 항상 MFMediaType_Video. 다음과 같이 FOURCC 코드를 GUID에 매핑하여 하위 형식을 생성할 수 있습니다.

XXXXXXXX-0000-0010-8000-00AA00389B71 

여기서 XXXXXXXX FOURCC 코드입니다. 따라서 YUY2의 하위 형식 GUID는 다음과 같습니다.

32595559-0000-0010-8000-00AA00389B71 

가장 일반적인 YUV 형식 GUID의 상수는 헤더 파일 mfapi.h에 정의됩니다. 이러한 상수 목록은 Video Subtype GUID참조하세요.

YUV 비디오에 대한

비디오 미디어 형식