You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

584 lines
13KB

  1. /*
  2. * exp golomb vlc stuff
  3. * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4. * Copyright (c) 2004 Alex Beregszaszi
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * Libav is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. /**
  23. * @file
  24. * @brief
  25. * exp golomb vlc stuff
  26. * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
  27. */
  28. #ifndef AVCODEC_GOLOMB_H
  29. #define AVCODEC_GOLOMB_H
  30. #include <stdint.h>
  31. #include "get_bits.h"
  32. #include "put_bits.h"
  33. #define INVALID_VLC 0x80000000
  34. extern const uint8_t ff_golomb_vlc_len[512];
  35. extern const uint8_t ff_ue_golomb_vlc_code[512];
  36. extern const int8_t ff_se_golomb_vlc_code[512];
  37. extern const uint8_t ff_ue_golomb_len[256];
  38. extern const uint8_t ff_interleaved_golomb_vlc_len[256];
  39. extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
  40. extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
  41. extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
  42. /**
  43. * read unsigned exp golomb code.
  44. */
  45. static inline int get_ue_golomb(GetBitContext *gb)
  46. {
  47. unsigned int buf;
  48. OPEN_READER(re, gb);
  49. UPDATE_CACHE(re, gb);
  50. buf = GET_CACHE(re, gb);
  51. if (buf >= (1 << 27)) {
  52. buf >>= 32 - 9;
  53. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  54. CLOSE_READER(re, gb);
  55. return ff_ue_golomb_vlc_code[buf];
  56. } else {
  57. int log = 2 * av_log2(buf) - 31;
  58. buf >>= log;
  59. buf--;
  60. LAST_SKIP_BITS(re, gb, 32 - log);
  61. CLOSE_READER(re, gb);
  62. return buf;
  63. }
  64. }
  65. /**
  66. * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
  67. */
  68. static inline unsigned get_ue_golomb_long(GetBitContext *gb)
  69. {
  70. unsigned buf, log;
  71. buf = show_bits_long(gb, 32);
  72. log = 31 - av_log2(buf);
  73. skip_bits_long(gb, log);
  74. return get_bits_long(gb, log + 1) - 1;
  75. }
  76. /**
  77. * read unsigned exp golomb code, constraint to a max of 31.
  78. * the return value is undefined if the stored value exceeds 31.
  79. */
  80. static inline int get_ue_golomb_31(GetBitContext *gb)
  81. {
  82. unsigned int buf;
  83. OPEN_READER(re, gb);
  84. UPDATE_CACHE(re, gb);
  85. buf = GET_CACHE(re, gb);
  86. buf >>= 32 - 9;
  87. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  88. CLOSE_READER(re, gb);
  89. return ff_ue_golomb_vlc_code[buf];
  90. }
  91. static inline unsigned svq3_get_ue_golomb(GetBitContext *gb)
  92. {
  93. uint32_t buf;
  94. OPEN_READER(re, gb);
  95. UPDATE_CACHE(re, gb);
  96. buf = GET_CACHE(re, gb);
  97. if (buf & 0xAA800000) {
  98. buf >>= 32 - 8;
  99. LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  100. CLOSE_READER(re, gb);
  101. return ff_interleaved_ue_golomb_vlc_code[buf];
  102. } else {
  103. unsigned ret = 1;
  104. do {
  105. buf >>= 32 - 8;
  106. LAST_SKIP_BITS(re, gb,
  107. FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
  108. if (ff_interleaved_golomb_vlc_len[buf] != 9) {
  109. ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
  110. ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
  111. break;
  112. }
  113. ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
  114. UPDATE_CACHE(re, gb);
  115. buf = GET_CACHE(re, gb);
  116. } while (HAVE_BITS_REMAINING(re, gb));
  117. CLOSE_READER(re, gb);
  118. return ret - 1;
  119. }
  120. }
  121. /**
  122. * read unsigned truncated exp golomb code.
  123. */
  124. static inline int get_te0_golomb(GetBitContext *gb, int range)
  125. {
  126. assert(range >= 1);
  127. if (range == 1)
  128. return 0;
  129. else if (range == 2)
  130. return get_bits1(gb) ^ 1;
  131. else
  132. return get_ue_golomb(gb);
  133. }
  134. /**
  135. * read unsigned truncated exp golomb code.
  136. */
  137. static inline int get_te_golomb(GetBitContext *gb, int range)
  138. {
  139. assert(range >= 1);
  140. if (range == 2)
  141. return get_bits1(gb) ^ 1;
  142. else
  143. return get_ue_golomb(gb);
  144. }
  145. /**
  146. * read signed exp golomb code.
  147. */
  148. static inline int get_se_golomb(GetBitContext *gb)
  149. {
  150. unsigned int buf;
  151. OPEN_READER(re, gb);
  152. UPDATE_CACHE(re, gb);
  153. buf = GET_CACHE(re, gb);
  154. if (buf >= (1 << 27)) {
  155. buf >>= 32 - 9;
  156. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  157. CLOSE_READER(re, gb);
  158. return ff_se_golomb_vlc_code[buf];
  159. } else {
  160. int log = 2 * av_log2(buf) - 31;
  161. buf >>= log;
  162. LAST_SKIP_BITS(re, gb, 32 - log);
  163. CLOSE_READER(re, gb);
  164. if (buf & 1)
  165. buf = -(buf >> 1);
  166. else
  167. buf = (buf >> 1);
  168. return buf;
  169. }
  170. }
  171. static inline int svq3_get_se_golomb(GetBitContext *gb)
  172. {
  173. unsigned int buf;
  174. OPEN_READER(re, gb);
  175. UPDATE_CACHE(re, gb);
  176. buf = GET_CACHE(re, gb);
  177. if (buf & 0xAA800000) {
  178. buf >>= 32 - 8;
  179. LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  180. CLOSE_READER(re, gb);
  181. return ff_interleaved_se_golomb_vlc_code[buf];
  182. } else {
  183. int log;
  184. LAST_SKIP_BITS(re, gb, 8);
  185. UPDATE_CACHE(re, gb);
  186. buf |= 1 | (GET_CACHE(re, gb) >> 8);
  187. if ((buf & 0xAAAAAAAA) == 0)
  188. return INVALID_VLC;
  189. for (log = 31; (buf & 0x80000000) == 0; log--)
  190. buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  191. LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
  192. CLOSE_READER(re, gb);
  193. return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  194. }
  195. }
  196. static inline int dirac_get_se_golomb(GetBitContext *gb)
  197. {
  198. uint32_t ret = svq3_get_ue_golomb(gb);
  199. if (ret) {
  200. uint32_t buf;
  201. OPEN_READER(re, gb);
  202. UPDATE_CACHE(re, gb);
  203. buf = SHOW_SBITS(re, gb, 1);
  204. LAST_SKIP_BITS(re, gb, 1);
  205. ret = (ret ^ buf) - buf;
  206. CLOSE_READER(re, gb);
  207. }
  208. return ret;
  209. }
  210. /**
  211. * read unsigned golomb rice code (ffv1).
  212. */
  213. static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
  214. int esc_len)
  215. {
  216. unsigned int buf;
  217. int log;
  218. OPEN_READER(re, gb);
  219. UPDATE_CACHE(re, gb);
  220. buf = GET_CACHE(re, gb);
  221. log = av_log2(buf);
  222. if (log > 31 - limit) {
  223. buf >>= log - k;
  224. buf += (30 - log) << k;
  225. LAST_SKIP_BITS(re, gb, 32 + k - log);
  226. CLOSE_READER(re, gb);
  227. return buf;
  228. } else {
  229. LAST_SKIP_BITS(re, gb, limit);
  230. UPDATE_CACHE(re, gb);
  231. buf = SHOW_UBITS(re, gb, esc_len);
  232. LAST_SKIP_BITS(re, gb, esc_len);
  233. CLOSE_READER(re, gb);
  234. return buf + limit - 1;
  235. }
  236. }
  237. /**
  238. * read unsigned golomb rice code (jpegls).
  239. */
  240. static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
  241. int esc_len)
  242. {
  243. unsigned int buf;
  244. int log;
  245. OPEN_READER(re, gb);
  246. UPDATE_CACHE(re, gb);
  247. buf = GET_CACHE(re, gb);
  248. log = av_log2(buf);
  249. if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
  250. 32 - log < limit) {
  251. buf >>= log - k;
  252. buf += (30 - log) << k;
  253. LAST_SKIP_BITS(re, gb, 32 + k - log);
  254. CLOSE_READER(re, gb);
  255. return buf;
  256. } else {
  257. int i;
  258. for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0 && HAVE_BITS_REMAINING(re, gb); i++) {
  259. LAST_SKIP_BITS(re, gb, 1);
  260. UPDATE_CACHE(re, gb);
  261. }
  262. SKIP_BITS(re, gb, 1);
  263. if (i < limit - 1) {
  264. if (k) {
  265. buf = SHOW_UBITS(re, gb, k);
  266. LAST_SKIP_BITS(re, gb, k);
  267. } else {
  268. buf = 0;
  269. }
  270. CLOSE_READER(re, gb);
  271. return buf + (i << k);
  272. } else if (i == limit - 1) {
  273. buf = SHOW_UBITS(re, gb, esc_len);
  274. LAST_SKIP_BITS(re, gb, esc_len);
  275. CLOSE_READER(re, gb);
  276. return buf + 1;
  277. } else
  278. return -1;
  279. }
  280. }
  281. /**
  282. * read signed golomb rice code (ffv1).
  283. */
  284. static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
  285. int esc_len)
  286. {
  287. int v = get_ur_golomb(gb, k, limit, esc_len);
  288. v++;
  289. if (v & 1)
  290. return v >> 1;
  291. else
  292. return -(v >> 1);
  293. // return (v>>1) ^ -(v&1);
  294. }
  295. /**
  296. * read signed golomb rice code (flac).
  297. */
  298. static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
  299. int esc_len)
  300. {
  301. int v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
  302. return (v >> 1) ^ -(v & 1);
  303. }
  304. /**
  305. * read unsigned golomb rice code (shorten).
  306. */
  307. static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
  308. {
  309. return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
  310. }
  311. /**
  312. * read signed golomb rice code (shorten).
  313. */
  314. static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
  315. {
  316. int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
  317. if (uvar & 1)
  318. return ~(uvar >> 1);
  319. else
  320. return uvar >> 1;
  321. }
  322. #ifdef TRACE
  323. static inline int get_ue(GetBitContext *s, const char *file, const char *func,
  324. int line)
  325. {
  326. int show = show_bits(s, 24);
  327. int pos = get_bits_count(s);
  328. int i = get_ue_golomb(s);
  329. int len = get_bits_count(s) - pos;
  330. int bits = show >> (24 - len);
  331. print_bin(bits, len);
  332. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n",
  333. bits, len, i, pos, file, func, line);
  334. return i;
  335. }
  336. static inline int get_se(GetBitContext *s, const char *file, const char *func,
  337. int line)
  338. {
  339. int show = show_bits(s, 24);
  340. int pos = get_bits_count(s);
  341. int i = get_se_golomb(s);
  342. int len = get_bits_count(s) - pos;
  343. int bits = show >> (24 - len);
  344. print_bin(bits, len);
  345. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n",
  346. bits, len, i, pos, file, func, line);
  347. return i;
  348. }
  349. static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
  350. int line)
  351. {
  352. int show = show_bits(s, 24);
  353. int pos = get_bits_count(s);
  354. int i = get_te0_golomb(s, r);
  355. int len = get_bits_count(s) - pos;
  356. int bits = show >> (24 - len);
  357. print_bin(bits, len);
  358. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n",
  359. bits, len, i, pos, file, func, line);
  360. return i;
  361. }
  362. #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  363. #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  364. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  365. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
  366. #endif /* TRACE */
  367. /**
  368. * write unsigned exp golomb code.
  369. */
  370. static inline void set_ue_golomb(PutBitContext *pb, int i)
  371. {
  372. assert(i >= 0);
  373. #if 0
  374. if (i = 0) {
  375. put_bits(pb, 1, 1);
  376. return;
  377. }
  378. #endif
  379. if (i < 256)
  380. put_bits(pb, ff_ue_golomb_len[i], i + 1);
  381. else {
  382. int e = av_log2(i + 1);
  383. put_bits(pb, 2 * e + 1, i + 1);
  384. }
  385. }
  386. /**
  387. * write truncated unsigned exp golomb code.
  388. */
  389. static inline void set_te_golomb(PutBitContext *pb, int i, int range)
  390. {
  391. assert(range >= 1);
  392. assert(i <= range);
  393. if (range == 2)
  394. put_bits(pb, 1, i ^ 1);
  395. else
  396. set_ue_golomb(pb, i);
  397. }
  398. /**
  399. * write signed exp golomb code. 16 bits at most.
  400. */
  401. static inline void set_se_golomb(PutBitContext *pb, int i)
  402. {
  403. #if 0
  404. if (i <= 0)
  405. i = -2 * i;
  406. else
  407. i = 2 * i - 1;
  408. #elif 1
  409. i = 2 * i - 1;
  410. if (i < 0)
  411. i ^= -1; //FIXME check if gcc does the right thing
  412. #else
  413. i = 2 * i - 1;
  414. i ^= (i >> 31);
  415. #endif
  416. set_ue_golomb(pb, i);
  417. }
  418. /**
  419. * write unsigned golomb rice code (ffv1).
  420. */
  421. static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
  422. int esc_len)
  423. {
  424. int e;
  425. assert(i >= 0);
  426. e = i >> k;
  427. if (e < limit)
  428. put_bits(pb, e + k + 1, (1 << k) + (i & ((1 << k) - 1)));
  429. else
  430. put_bits(pb, limit + esc_len, i - limit + 1);
  431. }
  432. /**
  433. * write unsigned golomb rice code (jpegls).
  434. */
  435. static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
  436. int limit, int esc_len)
  437. {
  438. int e;
  439. assert(i >= 0);
  440. e = (i >> k) + 1;
  441. if (e < limit) {
  442. while (e > 31) {
  443. put_bits(pb, 31, 0);
  444. e -= 31;
  445. }
  446. put_bits(pb, e, 1);
  447. if (k)
  448. put_sbits(pb, k, i);
  449. } else {
  450. while (limit > 31) {
  451. put_bits(pb, 31, 0);
  452. limit -= 31;
  453. }
  454. put_bits(pb, limit, 1);
  455. put_bits(pb, esc_len, i - 1);
  456. }
  457. }
  458. /**
  459. * write signed golomb rice code (ffv1).
  460. */
  461. static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
  462. int esc_len)
  463. {
  464. int v;
  465. v = -2 * i - 1;
  466. v ^= (v >> 31);
  467. set_ur_golomb(pb, v, k, limit, esc_len);
  468. }
  469. /**
  470. * write signed golomb rice code (flac).
  471. */
  472. static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
  473. int limit, int esc_len)
  474. {
  475. int v;
  476. v = -2 * i - 1;
  477. v ^= (v >> 31);
  478. set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
  479. }
  480. #endif /* AVCODEC_GOLOMB_H */