Exponential Golomb Coding
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
'밥벌이' 카테고리의 다른 글
간단한 테스트 프로그램을 여러개 짤 때 쓸만한 Makefile template (1) | 2013.06.20 |
---|---|
MSSQL에서 LIMIT 구문 흉내내기 (0) | 2012.06.20 |
안드로이드 GDB 디버깅 ver 2 (2) | 2012.02.22 |
안드로이드의 native stack trace의 활용 (0) | 2011.08.30 |
안드로이드 Asset 사용에 있어 몇가지... (0) | 2011.08.05 |