x264

psycho 2013. 1. 4. 11:29

 H.264 표준에는 In-loop deblocking이라는 과정이 있다. Deblocking이라고 하면 보통 16x16등의 블럭 단위로 압축을 수행하는 동영상 압축 알고리즘에서, 특히 low-bitrate에서 발생하기 쉬운 DCT Block(이하 '깍두기 현상')1을 줄일 목적으로 해당 현상이 발생하는 소스에 대해 적용하는 것인데, 이것이 압축 과정에 들어가 있다는 말이 된다. 물론, 앞으로 서술할 내용을 보면 알겠지만 동작 방식은 좀 다르다고 말할 수 있다.


  소스 수준에서 Deblocking을 적용하는 경우, 인코딩을 위해 참조하게 되는 원본 프레임의 화질 향상을 기대할 수 있으므로 I-frame의 화질은 향상된다고 할 수 있다. 그런데, 블럭의 예측을 수행해야 하는 P-frame이나 B-frame의 경우에는 이야기가 다르다. 이 때도 참조하게 되는 "해당 프레임의 원본"의 경우엔 화질 향상을 기대할 수 있지만, 움직임 예측에는 해당 프레임과 더불어 이전 프레임의 "원본"이 아닌 "이미 인코딩된" 데이터를 사용하기 때문에2 Deblocking의 효과가 매우 떨어지게 된다.


 In-loop deblocking은 이러한 단점을 극복하기 위해서 나온 아이디어인 듯하다. 이는 인코딩 과정 중에 Deblocking filter를 조합한 것으로, 블럭의 예측을 수행할 때 이전 프레임의 인코딩된 데이터에 Deblocking 처리를 한 다음 참조하도록 만든 것이다. 이는 디코딩시에도 똑같이 적용되므로, 실질적으로는 "인코딩 후 Deblocking 처리된 데이터가 저장된다"라고 생각하면 된다3. 당연히 예측시 실제로 사용하는 데이터에 영향을 주게 되므로, 상당한 화질 향상을 기대할 수 있게 된다. H.264로 인코딩된 저용량 동영상4을 아무거나 하나 구해서, Decoder 설정에서 skip deblocking을 활성화한 후 재생한 화면과 활성화 전에 재생한 화면을 비교해보면 그 효과가 어느 정도인지 실감할 수 있다. 필자가 보기엔, 이것이야말로 (적어도 low-bitrate 영역에서) 이전 표준인 H.263에 비해 2배의 압축 효율을 가져다준 주된 요소인 듯하다.




 ※아래 부분은 x264를 기준으로 한 것으로, 인코더에 따라 달라질 수 있는 부분이다.


 H.264 영상 인코딩용으로 많이 쓰이는 x264의 경우, --deblock 옵션으로 이를 지원하고 있다, 여기에는 α:β의 형태로 2개의 인자가 들어가는데, α는 강도(strength)를, β는 임계치(threshold)를 설정한다. (※아래 내용은 실질적으로 Doom9 forum에 게재된 글5의 해석 수준이다.)

 α값을 높이면 전체적인 Deblocking 강도가 높아지는데, Deblocking의 기본 아이디어가 Blurring인지라 그만큼 세부 묘사가 손실되고 꼭 뭉개진 것처럼 보이게 된다. 반대로 값을 낮추면 상대적으로 세부가 보존되고 날카롭게 되긴 하지만6, 그만큼 Deblocking의 강도가 떨어져 '깍두기 현상'의 발생 가능성을 높이게 된다. 물론 전용 Blur filter만큼의 강도는 아니지만, 기본값인 0도 상당한 강도라고 한다. 보통 -3에서 3 사이의 값을 쓰며 이 범위를 초과하는 값은 권장하지 않는다.

 β값은 "세부 묘사가 많은 부분과 그렇지 않은 부분에서의 실질적인 처리 강도"를 판단하는 기준으로 작용한다. 값을 높이면 세부 묘사가 많은 부분의 Deblocking 강도가 낮아지고7 상대적으로 세부 묘사가 적은 부분의 Deblocking 강도가 높아진다. 반대로 값을 낮추면 세부 묘사가 많은 부분의 Deblocking 강도가 높아지고8 세부 묘사가 적은 부분은 Deblocking 강도가 낮아진다. 기본값은 0으로, 특별한 이유가 없다면 건드리지 말 것을 권장하고 있다. 물론 α,β값 모두 영상이 어떤 것이냐에 따라(실사, 애니메이션 등) 권장값은 따로 있다.


 앞에서 Deblocking의 효과를 눈으로 체험하고 싶으면 적당히 저용량 동영상을 구해야 한다는 이야기를 했을 것이다. 왜 그런가 하면, Quantizer 값이 낮을수록(화질이 좋을수록) Deblocking filter가 적용되는 강도가 낮아지기 때문이다. α,β의 설정값에 따라 기준이 조금씩 달라지기는 하나, 특정 기준 이하의 Quantizer 값에서는 아예 무시된다. 그러므로 고화질 인코딩시에는 딱히 건드릴 필요가 없는 부분이며9, 건드린다 해도 눈에 띄는 수준의 차이를 기대하기는 힘들다. 필자같이 비슷한 화질에서의 저용량화를 목적으로 인코딩을 하는 게 아니라면 이것을 가지고 시간낭비를 하지는 않았으면 한다.


각주 1

DCT는 Discrete Cosine Transform의 약자. 이 변환 자체는 수학적으로 손실이 없는 가역 변환이지만, 컴퓨터상에서는 사실상 무한정밀도 연산이 불가능하기 때문에 데이터 손실이 발생하게 된다. 거기에 bitrate를 줄이는 결정적인 역할을 하는 Quantization(양자화) 처리까지 더해지면 보통 정사각형 모양의 계단 비슷한 형상이 나타..

각주 2

그래야 디코딩시 인코딩 때 고려했던 것과 같은 영상이 나온다는 것을 보장할 수 있다. 디코딩시에는 원본 참조가 불가능하기 때문이다.

각주 3

당연히 진짜로 Deblocking 처리가 된 데이터가 저장되는 건 아니므로 디코더 입장에서는 사용 여부를 결정할 수 있으며 사용할 경우 디코딩 속도는 느려진다.

각주 4

QP 기준 25~30 정도. 해상도나 기타 요인에 의해 bitrate는 달라질 수 있다.

각주 5

http://forum.doom9.org/showthread.php?t=109747

각주 6

Sharpen filter와는 다르다. 어디까지나 Blurring 강도가 줄어들어 상대적으로 날카롭게 보인다는 것뿐이지 원래 영상보다 날카롭게 만들어주지는 않는다.

각주 7

세부가 잘 보존되지만 이런 부분은 높은 bitrate를 요구하므로 bitrate 부족에 의한 '깍두기 현상'이 발생할 가능성이 높아진다.

각주 8

높은 bitrate를 요구하는 부분을 뭉개서 '깍두기 현상'을 줄여줄 수 있지만 그만큼 세부 묘사가 손실된다.

각주 9

심지어는 특별한 이유가 없다면 In-loop deblocking을 끄는 --no-deblock 옵션을 줄 필요도 없다!

  1. DCT는 Discrete Cosine Transform의 약자. 이 변환 자체는 수학적으로 손실이 없는 가역 변환이지만, 컴퓨터상에서는 사실상 무한정밀도 연산이 불가능하기 때문에 데이터 손실이 발생하게 된다. 거기에 bitrate를 줄이는 결정적인 역할을 하는 Quantization(양자화) 처리까지 더해지면 보통 정사각형 모양의 계단 비슷한 형상이 나타나며, 그 형상 덕분에 일명 '깍두기 현상'이라고도 한다. [본문으로]
  2. 그래야 디코딩시 인코딩 때 고려했던 것과 같은 영상이 나온다는 것을 보장할 수 있다. 디코딩시에는 원본 참조가 불가능하기 때문이다. [본문으로]
  3. 당연히 진짜로 Deblocking 처리가 된 데이터가 저장되는 건 아니므로 디코더 입장에서는 사용 여부를 결정할 수 있으며 사용할 경우 디코딩 속도는 느려진다. [본문으로]
  4. QP 기준 25~30 정도. 해상도나 기타 요인에 의해 bitrate는 달라질 수 있다. [본문으로]
  5. http://forum.doom9.org/showthread.php?t=109747 [본문으로]
  6. Sharpen filter와는 다르다. 어디까지나 Blurring 강도가 줄어들어 상대적으로 날카롭게 보인다는 것뿐이지 원래 영상보다 날카롭게 만들어주지는 않는다. [본문으로]
  7. 세부가 잘 보존되지만 이런 부분은 높은 bitrate를 요구하므로 bitrate 부족에 의한 '깍두기 현상'이 발생할 가능성이 높아진다. [본문으로]
  8. 높은 bitrate를 요구하는 부분을 뭉개서 '깍두기 현상'을 줄여줄 수 있지만 그만큼 세부 묘사가 손실된다. [본문으로]
  9. 심지어는 특별한 이유가 없다면 In-loop deblocking을 끄는 --no-deblock 옵션을 줄 필요도 없다! [본문으로]