일반적으로 사용되는 Rate Control(비트레이트 배분)방식은 화면의 복잡성을 기준으로 합니다.

사람의 눈은 움직임이 많거나 복잡한 화면보다 움직임이 적고 단순한 화면에서 더 민감하게 반응하기 때문에

복잡한 화면에서 비트레이트를 낮추고 단순한 화면에서 비트레이트를 높이는 것이 기본적인

 

손실압축의 비트레이트 배분방식입니다.




x264는 여기에 약간 새로운 비트레이트 배분방식을 추가하였는데 바로 MB-Tree Rate Control입니다.

화면의 복잡성을 기준으로 하는 기존의 방식과는 달리 MB-Tree는 블럭들 간의 참조율을 기준으로 비트레이트를

 

재분배합니다.  예를 들어 아래와 같은 두 장의 프레임을 각각 I-프레임과 P-프레임으로 압축한다고 가정하면

┌───────┐    ┌───────┐
│      │    │  ★   │
│  ★   │    │ ★★★  │
│      │    │  ★   │
└───────┘    └───────┘

첫번째 프레임을 Intra코딩한 후, 두번째 프레임은 먼저 압축된 첫번째 프레임을 참조해서 Inter코딩 하게 됩니다.

Inter코딩은 잘 아시다시피 현재 인코딩하려는 블럭과 비슷한 부분이 참조프레임의 어느 부분에 있는지 검색해서

 

찾아내는 방식입니다.  위에 예를 든 두번째 프레임의 맨위에 있는 검은 별은 첫번째 프레임의 중앙에 있는

 

검은 별을 참조해서 Inter코딩 될것이고,

 

중간에 있는 세개의 검은 별과 맨아래에 있는 검은 별도 마찬가지로 첫번째 프레임의 중앙에 있는 검은 별을

 

참조해서 Inter코딩 되겠죠.

여기서 한 가지 알 수 있는건, 첫번째 프레임의 검은 별이 있는 부분이 두번째 프레임에 의해서 여러번 참조 된다는

 

점입니다. (검은 별 하나가 블럭 하나라고 가정하면, 첫번째 프레임의 검은 별은 두번째 프레임을 Inter코딩할 때

5번 참조되겠죠.)

그렇다면 두번째 프레임을 효율적으로 Inter코딩하기 위해서는 첫번째 프레임의 별이 있는 부분이 중요하다고

 

말할 수 있습니다. (자주 참조되는 부분의 화질을 높여주면 이후에 참조할 때마다 예측오류데이터가 줄어들기

때문에 확실히 효율적일 겁니다.)

즉 Inter코딩시 미래의 블럭들에 의해서 여러번 참조된(참조율이 높은) 부분일수록 중요한 부분이라고 할 수 있습니다.

MB-Tree는 이런식으로 블럭간의 참조 관계를 분석해서 참조율이 높은 부분의 QP값을 낮추고(비트레이트를 높이고)

 

참조율이  낮은 부분의 QP값은 높이는(비트레이트를 낮추는)방식으로 비트레이트를 재분배해 줍니다.

위에 예를 든 경우에서는 첫번째 프레임의 검은 별이 있는 부분의 QP값을 낮추는(비트레이트를 높여주는) 쪽으로

 

작동을 하겠죠.  이렇게 함으로써 Inter코딩시 압축효율을 높이고 상대적으로 더 좋은 화질을 보여주게 됩니다.




x264에서 MB-Tree에 관여하는 옵션은 --rc-lookahead 와 --qcomp 옵션이 있습니다.
(처음 패치된 x264 revision 1197 이후로는 MB-Tree가 기본적으로 사용되고 --no-mbtree 옵션을 추가하면 사용하지 않게 됩니다.)

--rc-lookahead 옵션은 위에서 설명드린대로 블럭간의 참조율을 분석할 때, 분석에 사용되는 프레임 수입니다.

--qcomp 옵션은 MB-Tree의 세기를 정하는데 --qcomp 값이 낮을수록 MB-Tree의 세기는 커집니다.

아직은 --b-pyramid 옵션과 함께 사용할 수 없어서 MB-Tree를 사용하면 자동으로 --b-pyramid 옵션은 무시됩니다.
* 추가 : revision 1367 부터는 MB-Tree 사용시에도 --b-pyramid 옵션이 지원됩니다.

그리고 멀티패스 인코딩시 1패스에서 수집된 정보를 기록하는 .stats파일이 만들어지는데 MB-Tree가 수집한 정보를

 

따로 저장하기 위해 .mbtree라는 파일이 추가로 만들어집니다. 기존의 .stats파일보다 용량이 꽤 큰 편입니다.

* 추가로 MB-Tree패치와 함께 기존의 crf 인코딩 방식에도 약간의 수정이 있었습니다. 테스트 영상을 기준으로

동일한 crf 수치에서 비슷한 비트레이트가 나오도록 수정했다고는 하지만 다른 영상들에서는 차이가 있을 수밖에

없습니다. 따라서 동일한 소스를 동일한 crf 수치로 인코딩을 해도 revision 1197 이후의 x264빌드에서는

비트레이트가 달라질 수 있습니다.




지금까지 말씀드린대로 MB-Tree는 분명히 아주 효율적인 Rate Control이라고 생각합니다.

처음 패치된 이후로 많은 버그 수정도 이루어졌고 대부분의 이용자들도 화질향상이 있다고 하는걸 봐서 어느정도

 

입증되기도 했죠.  하지만 (페이딩되는 장면처럼)블럭 간의 참조율이 낮아지는 부분에서는 필요이상으로

 

화질이 저하되는 경우도 있을 수 있습니다.

꼭 페이딩되는 장면이 아니더라도 참조율이 낮아지는 부분에서는 MB-Tree의 작동으로 이런 현상은 얼마든지

 

있을 수 있을 겁니다.

페이딩 장면을 보는 '사람'의 입장에서는 단순히 조금씩 밝아지거나 어두워지는 아주 비슷한 화면으로 보이겠지만

모든 값을 비트화해서 판단하는 인코딩 프로그램 입장에서는 완전히 다른 화면으로 인식하게 되는데

 

이렇게 다른 화면으로 인식하게 되면  인코더는 대부분의 블럭을 Intra코딩하게 되고 따라서 블럭간의 참조율이

 

낮아지기 때문에 MB-Tree의 작동으로  QP값이 높아지면서(비트레이트가 낮아지면서) 결국 화질이 저하되는

 

경우가 발생할 수 있게 되는거죠.

MB-Tree의 이런 '의도된 부작용?'을 보완하기 위해서 필요한 기능이 바로 h.264/AVC표준에 포함된

 

Weighted Prediction 입니다.
(꼭 MB-Tree를 보완하기 위한 기능이라기보다는 일반적으로 페이딩 장면에서 압축률을 높여주기 위한 기능입니다.)

Weighted Prediction은 페이딩 장면을 역으로 이용하는 방법이라고 할 수 있습니다.

서서히 밝아지거나 어두워지는 일련의 프레임들 간의 유사성을 높이기 위해 어두워진 프레임은 어두워진만큼,

 

밝아진 프레임은  밝아진만큼 각각 반대 방향으로 가중치(Weight)를 줌으로써 Inter코딩시 효율을 높이는 것입니다.

Weighted Prediction에는 두가지 방식이 있는데

 

Implicit weighted prediction과 Explicit weighted prediction입니다.

전자는 B프레임에서만 사용 가능한 방식으로 x264에서 기존에 사용하던 weighted prediction for B-frame옵션에

 

해당하는 방식이고,

후자는 B 또는 P프레임에서도 사용 가능한 방식으로 얼마 전에 패치된 weighted P-frame prediction옵션에

 

해당하는 방식입니다.




이번 weighted P-frame prediction패치(revision 1327)로 x264의 Weighted Prediction에 관련된 옵션도

 

두 가지로 늘었습니다.  기존의 weighted prediction for B-frame은 기본적으로 사용되며 사용하지 않을 때는

 

--no-weightb 옵션을 추가하면 됩니다.  새로운 weighted P-frame prediction은 --weightp 옵션으로 사용하는데

 

기본값이 2이고 사용하지 않을때는 0으로 설정하면 됩니다.

weighted P-frame prediction은 baseline프로파일에서는 사용할 수 없으며 아직은 인터레이스 인코딩시에도

 

사용할 수 없습니다.

그리고 weighted P-frame prediction에는 기본적으로 weighting을 하기 전에 페이딩 장면을 검출하는 과정이

 

포함되는데  --interlaced 옵션을 사용하지 않는 상태에서(일반적인 progressive 인코딩)

 

--psy-rd, --mbtree 옵션이 사용되면 --weightp 옵션을 사용하지 않는  경우에도 페이딩 장면의 검출과정은

 

수행되기 때문에 실제 weighting은 하지 않더라도 페이딩 장면에서 어느정도의 화질향상을 가져올 수 있습니다.

따라서 --weightp 옵션을 사용할 수 없는 baseline프로파일에서도 페이딩 장면을 압축할 때 약간의 화질 향상이

 

있을 수 있습니다.




마지막으로... 요즘 h.264/avc 디코더로 가장 많이 사용되는 디코더가 아마 CoreAVC 디코더가 아닐까 합니다.

그런데 이 CoreAVC 디코더가 아직은 x264의 이번 weighted P-frame prediction패치를 지원하지 못하는 부분이

 

있어서  --weightp 2 옵션을 사용한 영상은 재생시 깨지는 부분이 보입니다.
(전체적으로 나타나는 것은 아니고 WP가 작동한 장면에서만 나타나는 현상입니다.)

그래서 곧 있을 CoreAVC 2.0 업데이트에는 이 부분도 보완을 해서 발표될 거라고 합니다.

weighted P-frame prediction패치가 추가된 지 얼마 되지 않았고, MeGUI업데이트도 정체된 상황이라서

 

--weightp 2 옵션을  사용한 영상이 아직은 많지 않기 때문에 별 문제는 없겠지만

 

앞으로 --weightp 2 옵션을 사용한 영상은 점점 더 많아질테니

CoreAVC 디코더를 사용하시는 분이라면 다음 업데이트는 꼭 하시는게 좋겠습니다.