영상을 인코딩할 때 x264 등의 블럭 기반 인코더들은 하나의 픽쳐(프레임 또는 필드)를 여러개의 작은 블럭으로 나누어서 압축을 합니다.

나누어진 각각의 블럭을 매크로블럭(macroblock)이라고 하는데 이 매크로블럭의 크기는 표준마다 다르긴 하지만 16x16이 널리 쓰이고 있습니다.

H.264/AVC(x264) 또한 16x16 크기의 매크로블럭을 사용하기 때문에 16배수가 아닌 해상도의 영상은 압축을 할 수가 없습니다.

만약 입력된 영상의 해상도가 16배수가 아닌 경우에는 인코더 내부적으로 16배수가 되도록 수정한 후 압축을 하게됩니다.

(16배수가 아닌 영상은 아예 입력받지 않는 인코더도 있다고 합니다)

해상도가 16배수가 아닌 영상을 내부적으로 수정하는 방법도 여러가지가 있습니다. 단순히 검은색 라인을 추가하는 방법, 거울을 댄 것처럼

좌우 대칭이 되도록 라인을 추가하는 방법 등이 있는데 x264는 영상의 마지막 라인을 복사해서 붙여넣는 방법(padding)을 사용합니다.

이 방법이 inter코딩시 움직임 예측에 가장 효율적이라고 하네요.

예를 들어, 가로해상도가 16배수가 아닌 해상도의 영상을 x264로 인코딩 하는 경우를 생각해보면

아래와 같이 영상의 맨 오른쪽 한 줄을 복사해서 16배수가 될 때까지 붙여넣는 것입니다.


이런식으로 16배수를 맞춘 후에 인코딩을 하게 되는데 16배수를 맞추기 위해 추가된 라인들은 원본 영상에는 없던 부분들입니다.

따라서 인코딩된 영상의 어느 부분이 인코더에 의해서 추가된(패딩된) 부분인지를 말해주는 crop flag가 영상에 함께 입력됩니다.

위의 경우에는 "이 영상의 오른쪽 X 라인은 무시해라"라는 crop flag가 같이 입력되겠죠.


영상의 해상도가 16배수가 아닌 대표적인 경우가 1920x1080 영상입니다.

1080에 가장 가까운 16배수는 1088이니까 이 영상이 저장하고 있는 내부해상도는 1920x1088이라고 할 수 있겠죠.

하지만 이런 내부적인 해상도는 별 의미가 없습니다. 그저 인코딩에서 16배수가 어떤 의미인지 설명하기 위해 말씀드린 것 뿐이고

1920x1080 영상의 해상도는 1920x1080 이라고 하는 것이 맞습니다.




'인코딩 일반' 카테고리의 다른 글

x264 QP 값의 범위  (6) 2012.12.13
H.264/AVC 인코딩과 레벨  (2) 2012.12.13
영상의 해상도와 16배수  (0) 2012.12.12
x264 CRF 인코딩과 프레임 레이트  (0) 2012.12.10
MeGUI 2460 버전의 x264 옵션 정리  (29) 2012.12.09
인터레이스와 프로그레시브  (20) 2012.12.05
Posted by 김코덱