ㅈㅅㄹ

H.264 헤더 들여다 보다보니 ue(v)라는 타입이 보이길래 대체 뭘까 열심히 고민하다 찾아보니 (Nonnegative) Exponential-Golomb Coding 방식이랜다. 파싱하기는 귀찮긴한데 어쨌든 원리는:


1. 최초 1의 비트값이 나오기 전에 있는 0 값의 비트의 갯수만큼의 뒤쪽 비트를 값의 범위로 잡는다.

2. 해당 값의 범위에 있는 값 - 1을 하여 최종 값을 가져 온다.


뭔가 말로 설명하기 어려운데 예제를 보자.

바이트 값 0x88에 연속되는 ue(v) 타입의 값이 있다고 가정하면:

field A : ue(v)

field B : ue(v)

0x88 => 10001000 => (1) (0001000) => field A : 0, field B : 7

로 계산된다고 할 수 있다. 물론 이건 바이트 alignment 내에서만 연산되는 게 아니며 byte sequence가 있을 경우 전체를 bit sequence로 가정하고 연속적으로 연산을 해 줘야 한다. 귀찮게 왜 이런짓을 하는 지는 잘 이해가 되지 않지만 압축효과가 살림살이 나아지는 데 도움을 주니 이런걸 굳이 귀찮게 하는 거겠지 -_-


뭐 어쨌든 아래는 unsigned의 경우 결과 값에 따른 비트 매핑 테이블이다. 위의 예제로 이해가 안될 경우 이것도 참조하면 이해가 되지 않을까 싶다.

 0 => 1 => 1

 1 => 10 => 010

 2 => 11 => 011

 3 => 100 => 00100

 4 => 101 => 00101

 5 => 110 => 00110

 6 => 111 => 00111

 7 => 1000 => 0001000

 8 => 1001 => 0001001

signed number의 경우는 다른식으로 해석되는데 특별히 따로 설명할 건 없을 것 같고, 아래의 테이블을 보자.

 0 => 1 => 1

 1 => 10 => 010

-1 => 11 => 011

 2 => 100 => 00100

-2 => 101 => 00101

 3 => 110 => 00110

-3 => 111 => 00111

 4 => 1000 => 0001000

-4 => 1001 => 0001001