H.264/AVC 표준에서 정하고 있는 8비트 QP값의 범위는 0부터 51까지입니다.

그리고 Bit depth가 1 높아질 때마다 최대값이 6씩 증가해서 10비트에서는 0부터 63까지의 범위를 갖습니다.

그런데 x264의 옵션을 보면 8비트에서 QP의 최대값이 69로 나옵니다. 표준에도 없는 QP값은...말이 안되죠.

51을 넘는 QP값은 특별한 경우에 사용하는 Fake QP입니다.

예를 들어 VBV를 사용해서 인코딩하는 경우 언더플로우가 발생할 것 같으면 x264는 QP값을 높여서 비트레이트를 낮춰야 합니다.

하지만 최대값인 51을 사용해도 원하는 만큼 비트레이트를 낮출 수가 없을 때에는 해당 블럭의 DCT계수들을 지워버립니다.

비교적 덜 중요하다고 판단되는 계수들부터 차례대로 지워나가는데 Fake QP값이 높아질수록 더 많은 계수들이 지워질 수 있습니다.

이처럼 Fake QP는 얼마나 많은 계수들을 없앨지 그 수준을 정해주는 옵션이고 실제로 해당 QP값이 사용되는 것은 아닙니다.

표준에도 없는 QP값을 사용하면 더이상 H.264/AVC 영상이 아닌 것이 돼버릴 테니까요.


정리하면 51을 넘는 QP값으로 인코딩을 해도 실제로 양자화 과정에서 사용되는 QP값은 51이 상한이고 그 이상의 QP값들은

특별한 경우에 비트레이트를 더욱 낮추기 위해서 사용되는 "계수 제거"용 옵션이라고 보시면 되겠습니다.

아래의 패치가 적용되면서 만들어진 옵션인데 VBV 사용시 언더플로우 방지가 주요한 목적이라서 VBV Emergency Mode라고 부르더군요.

http://git.videolan.org/gitweb.cgi?p=x264.git;a=commit;h=cd53fa47afadb563eefb72c137fb30bd06d26c85


앞서 말씀드린대로 극단적으로 낮은 비트레이트 또는 굉장히 타이트한 VBV를 사용하는 것처럼 특별한 경우가 아니면 사용될 일이 없습니다.

말 그대로 "비상시"에 사용되는 옵션이죠.


그렇긴 하지만 어느정도로 비트를 낮출 수 있는지 한번 테스트를 해봤습니다.

순서대로 QP=51, QP=60, QP=69로 인코딩한 영상의 동일 프레임 캡쳐입니다. (비트레이트는 각각 2400, 1100, 300 kbps로 나오네요.)


마지막의 QP=69에서는 거의 대부분의 계수들이 없어지면서 형태도 알아보기 힘들 정도입니다.

대신에 비트레이트는 거의 없다시피한 수준입니다. (1920x1080 60i 영상이니까 300 kbps는 정말 작은 수치죠.)




Posted by 김코덱
,