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.

574 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 get_interleaved_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 (BITS_AVAILABLE(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 get_se_golomb_long(GetBitContext *gb)
  172. {
  173. unsigned int buf = get_ue_golomb_long(gb);
  174. if (buf & 1)
  175. buf = (buf + 1) >> 1;
  176. else
  177. buf = -(buf >> 1);
  178. return buf;
  179. }
  180. static inline int get_interleaved_se_golomb(GetBitContext *gb)
  181. {
  182. unsigned int buf;
  183. OPEN_READER(re, gb);
  184. UPDATE_CACHE(re, gb);
  185. buf = GET_CACHE(re, gb);
  186. if (buf & 0xAA800000) {
  187. buf >>= 32 - 8;
  188. LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  189. CLOSE_READER(re, gb);
  190. return ff_interleaved_se_golomb_vlc_code[buf];
  191. } else {
  192. int log;
  193. LAST_SKIP_BITS(re, gb, 8);
  194. UPDATE_CACHE(re, gb);
  195. buf |= 1 | (GET_CACHE(re, gb) >> 8);
  196. if ((buf & 0xAAAAAAAA) == 0)
  197. return INVALID_VLC;
  198. for (log = 31; (buf & 0x80000000) == 0; log--)
  199. buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  200. LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
  201. CLOSE_READER(re, gb);
  202. return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  203. }
  204. }
  205. static inline int dirac_get_se_golomb(GetBitContext *gb)
  206. {
  207. uint32_t ret = get_interleaved_ue_golomb(gb);
  208. if (ret) {
  209. uint32_t buf;
  210. OPEN_READER(re, gb);
  211. UPDATE_CACHE(re, gb);
  212. buf = SHOW_SBITS(re, gb, 1);
  213. LAST_SKIP_BITS(re, gb, 1);
  214. ret = (ret ^ buf) - buf;
  215. CLOSE_READER(re, gb);
  216. }
  217. return ret;
  218. }
  219. /**
  220. * read unsigned golomb rice code (ffv1).
  221. */
  222. static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
  223. int esc_len)
  224. {
  225. unsigned int buf;
  226. int log;
  227. OPEN_READER(re, gb);
  228. UPDATE_CACHE(re, gb);
  229. buf = GET_CACHE(re, gb);
  230. log = av_log2(buf);
  231. if (log > 31 - limit) {
  232. buf >>= log - k;
  233. buf += (30 - log) << k;
  234. LAST_SKIP_BITS(re, gb, 32 + k - log);
  235. CLOSE_READER(re, gb);
  236. return buf;
  237. } else {
  238. LAST_SKIP_BITS(re, gb, limit);
  239. UPDATE_CACHE(re, gb);
  240. buf = SHOW_UBITS(re, gb, esc_len);
  241. LAST_SKIP_BITS(re, gb, esc_len);
  242. CLOSE_READER(re, gb);
  243. return buf + limit - 1;
  244. }
  245. }
  246. /**
  247. * read unsigned golomb rice code (jpegls).
  248. */
  249. static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
  250. int esc_len)
  251. {
  252. unsigned int buf;
  253. int log;
  254. OPEN_READER(re, gb);
  255. UPDATE_CACHE(re, gb);
  256. buf = GET_CACHE(re, gb);
  257. log = av_log2(buf);
  258. if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
  259. 32 - log < limit) {
  260. buf >>= log - k;
  261. buf += (30 - log) << k;
  262. LAST_SKIP_BITS(re, gb, 32 + k - log);
  263. CLOSE_READER(re, gb);
  264. return buf;
  265. } else {
  266. int i;
  267. for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0 && BITS_AVAILABLE(re, gb); i++) {
  268. LAST_SKIP_BITS(re, gb, 1);
  269. UPDATE_CACHE(re, gb);
  270. }
  271. SKIP_BITS(re, gb, 1);
  272. if (i < limit - 1) {
  273. if (k) {
  274. buf = SHOW_UBITS(re, gb, k);
  275. LAST_SKIP_BITS(re, gb, k);
  276. } else {
  277. buf = 0;
  278. }
  279. CLOSE_READER(re, gb);
  280. return buf + (i << k);
  281. } else if (i == limit - 1) {
  282. buf = SHOW_UBITS(re, gb, esc_len);
  283. LAST_SKIP_BITS(re, gb, esc_len);
  284. CLOSE_READER(re, gb);
  285. return buf + 1;
  286. } else
  287. return -1;
  288. }
  289. }
  290. /**
  291. * read signed golomb rice code (ffv1).
  292. */
  293. static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
  294. int esc_len)
  295. {
  296. int v = get_ur_golomb(gb, k, limit, esc_len);
  297. v++;
  298. if (v & 1)
  299. return v >> 1;
  300. else
  301. return -(v >> 1);
  302. // return (v>>1) ^ -(v&1);
  303. }
  304. /**
  305. * read signed golomb rice code (flac).
  306. */
  307. static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
  308. int esc_len)
  309. {
  310. int v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
  311. return (v >> 1) ^ -(v & 1);
  312. }
  313. /**
  314. * read unsigned golomb rice code (shorten).
  315. */
  316. static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
  317. {
  318. return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
  319. }
  320. /**
  321. * read signed golomb rice code (shorten).
  322. */
  323. static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
  324. {
  325. int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
  326. if (uvar & 1)
  327. return ~(uvar >> 1);
  328. else
  329. return uvar >> 1;
  330. }
  331. #ifdef TRACE
  332. static inline int get_ue(GetBitContext *s, const char *file, const char *func,
  333. int line)
  334. {
  335. int show = show_bits(s, 24);
  336. int pos = get_bits_count(s);
  337. int i = get_ue_golomb(s);
  338. int len = get_bits_count(s) - pos;
  339. int bits = show >> (24 - len);
  340. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n",
  341. bits, len, i, pos, file, func, line);
  342. return i;
  343. }
  344. static inline int get_se(GetBitContext *s, const char *file, const char *func,
  345. int line)
  346. {
  347. int show = show_bits(s, 24);
  348. int pos = get_bits_count(s);
  349. int i = get_se_golomb(s);
  350. int len = get_bits_count(s) - pos;
  351. int bits = show >> (24 - len);
  352. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n",
  353. bits, len, i, pos, file, func, line);
  354. return i;
  355. }
  356. static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
  357. int line)
  358. {
  359. int show = show_bits(s, 24);
  360. int pos = get_bits_count(s);
  361. int i = get_te0_golomb(s, r);
  362. int len = get_bits_count(s) - pos;
  363. int bits = show >> (24 - len);
  364. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n",
  365. bits, len, i, pos, file, func, line);
  366. return i;
  367. }
  368. #define get_ue_golomb(a) get_ue(a, __FILE__, __func__, __LINE__)
  369. #define get_se_golomb(a) get_se(a, __FILE__, __func__, __LINE__)
  370. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  371. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  372. #endif /* TRACE */
  373. /**
  374. * write unsigned exp golomb code.
  375. */
  376. static inline void set_ue_golomb(PutBitContext *pb, int i)
  377. {
  378. assert(i >= 0);
  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. i = 2 * i - 1;
  404. if (i < 0)
  405. i ^= -1; //FIXME check if gcc does the right thing
  406. set_ue_golomb(pb, i);
  407. }
  408. /**
  409. * write unsigned golomb rice code (ffv1).
  410. */
  411. static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
  412. int esc_len)
  413. {
  414. int e;
  415. assert(i >= 0);
  416. e = i >> k;
  417. if (e < limit)
  418. put_bits(pb, e + k + 1, (1 << k) + (i & ((1 << k) - 1)));
  419. else
  420. put_bits(pb, limit + esc_len, i - limit + 1);
  421. }
  422. /**
  423. * write unsigned golomb rice code (jpegls).
  424. */
  425. static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
  426. int limit, int esc_len)
  427. {
  428. int e;
  429. assert(i >= 0);
  430. e = (i >> k) + 1;
  431. if (e < limit) {
  432. while (e > 31) {
  433. put_bits(pb, 31, 0);
  434. e -= 31;
  435. }
  436. put_bits(pb, e, 1);
  437. if (k)
  438. put_sbits(pb, k, i);
  439. } else {
  440. while (limit > 31) {
  441. put_bits(pb, 31, 0);
  442. limit -= 31;
  443. }
  444. put_bits(pb, limit, 1);
  445. put_bits(pb, esc_len, i - 1);
  446. }
  447. }
  448. /**
  449. * write signed golomb rice code (ffv1).
  450. */
  451. static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
  452. int esc_len)
  453. {
  454. int v;
  455. v = -2 * i - 1;
  456. v ^= (v >> 31);
  457. set_ur_golomb(pb, v, k, limit, esc_len);
  458. }
  459. /**
  460. * write signed golomb rice code (flac).
  461. */
  462. static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
  463. int limit, int esc_len)
  464. {
  465. int v;
  466. v = -2 * i - 1;
  467. v ^= (v >> 31);
  468. set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
  469. }
  470. #endif /* AVCODEC_GOLOMB_H */