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.

526 lines
12KB

  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 "bitstream.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(BitstreamContext *bc)
  46. {
  47. unsigned int buf;
  48. buf = bitstream_peek(bc, 32);
  49. if (buf >= (1 << 27)) {
  50. buf >>= 32 - 9;
  51. bitstream_skip(bc, ff_golomb_vlc_len[buf]);
  52. return ff_ue_golomb_vlc_code[buf];
  53. } else {
  54. int log = 2 * av_log2(buf) - 31;
  55. buf >>= log;
  56. buf--;
  57. bitstream_skip(bc, 32 - log);
  58. return buf;
  59. }
  60. }
  61. /**
  62. * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
  63. */
  64. static inline unsigned get_ue_golomb_long(BitstreamContext *bc)
  65. {
  66. unsigned buf, log;
  67. buf = bitstream_peek(bc, 32);
  68. log = 31 - av_log2(buf);
  69. bitstream_skip(bc, log);
  70. return bitstream_read(bc, log + 1) - 1;
  71. }
  72. /**
  73. * read unsigned exp golomb code, constraint to a max of 31.
  74. * the return value is undefined if the stored value exceeds 31.
  75. */
  76. static inline int get_ue_golomb_31(BitstreamContext *bc)
  77. {
  78. unsigned int buf;
  79. buf = bitstream_peek(bc, 32);
  80. buf >>= 32 - 9;
  81. bitstream_skip(bc, ff_golomb_vlc_len[buf]);
  82. return ff_ue_golomb_vlc_code[buf];
  83. }
  84. static inline unsigned get_interleaved_ue_golomb(BitstreamContext *bc)
  85. {
  86. uint32_t buf;
  87. buf = bitstream_peek(bc, 32);
  88. if (buf & 0xAA800000) {
  89. buf >>= 32 - 8;
  90. bitstream_skip(bc, ff_interleaved_golomb_vlc_len[buf]);
  91. return ff_interleaved_ue_golomb_vlc_code[buf];
  92. } else {
  93. unsigned ret = 1;
  94. do {
  95. buf >>= 32 - 8;
  96. bitstream_skip(bc, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
  97. if (ff_interleaved_golomb_vlc_len[buf] != 9) {
  98. ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
  99. ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
  100. break;
  101. }
  102. ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
  103. buf = bitstream_peek(bc, 32);
  104. } while (bitstream_bits_left(bc) > 0);
  105. return ret - 1;
  106. }
  107. }
  108. /**
  109. * read unsigned truncated exp golomb code.
  110. */
  111. static inline int get_te0_golomb(BitstreamContext *bc, int range)
  112. {
  113. assert(range >= 1);
  114. if (range == 1)
  115. return 0;
  116. else if (range == 2)
  117. return bitstream_read_bit(bc) ^ 1;
  118. else
  119. return get_ue_golomb(bc);
  120. }
  121. /**
  122. * read unsigned truncated exp golomb code.
  123. */
  124. static inline int get_te_golomb(BitstreamContext *bc, int range)
  125. {
  126. assert(range >= 1);
  127. if (range == 2)
  128. return bitstream_read_bit(bc) ^ 1;
  129. else
  130. return get_ue_golomb(bc);
  131. }
  132. /**
  133. * read signed exp golomb code.
  134. */
  135. static inline int get_se_golomb(BitstreamContext *bc)
  136. {
  137. unsigned int buf;
  138. buf = bitstream_peek(bc, 32);
  139. if (buf >= (1 << 27)) {
  140. buf >>= 32 - 9;
  141. bitstream_skip(bc, ff_golomb_vlc_len[buf]);
  142. return ff_se_golomb_vlc_code[buf];
  143. } else {
  144. int log = 2 * av_log2(buf) - 31;
  145. buf >>= log;
  146. bitstream_skip(bc, 32 - log);
  147. if (buf & 1)
  148. buf = -(buf >> 1);
  149. else
  150. buf = (buf >> 1);
  151. return buf;
  152. }
  153. }
  154. static inline int get_se_golomb_long(BitstreamContext *bc)
  155. {
  156. unsigned int buf = get_ue_golomb_long(bc);
  157. if (buf & 1)
  158. buf = (buf + 1) >> 1;
  159. else
  160. buf = -(buf >> 1);
  161. return buf;
  162. }
  163. static inline int get_interleaved_se_golomb(BitstreamContext *bc)
  164. {
  165. unsigned int buf;
  166. buf = bitstream_peek(bc, 32);
  167. if (buf & 0xAA800000) {
  168. buf >>= 32 - 8;
  169. bitstream_skip(bc, ff_interleaved_golomb_vlc_len[buf]);
  170. return ff_interleaved_se_golomb_vlc_code[buf];
  171. } else {
  172. int log;
  173. bitstream_skip(bc, 8);
  174. buf |= 1 | bitstream_peek(bc, 24);
  175. if ((buf & 0xAAAAAAAA) == 0)
  176. return INVALID_VLC;
  177. for (log = 31; (buf & 0x80000000) == 0; log--)
  178. buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  179. bitstream_skip(bc, 63 - 2 * log - 8);
  180. return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  181. }
  182. }
  183. static inline int dirac_get_se_golomb(BitstreamContext *bc)
  184. {
  185. uint32_t ret = get_interleaved_ue_golomb(bc);
  186. if (ret) {
  187. uint32_t buf;
  188. buf = bitstream_read_signed(bc, 1);
  189. ret = (ret ^ buf) - buf;
  190. }
  191. return ret;
  192. }
  193. /**
  194. * read unsigned golomb rice code (ffv1).
  195. */
  196. static inline int get_ur_golomb(BitstreamContext *bc, int k, int limit,
  197. int esc_len)
  198. {
  199. unsigned int buf;
  200. int log;
  201. buf = bitstream_peek(bc, 32);
  202. log = av_log2(buf);
  203. if (log > 31 - limit) {
  204. buf >>= log - k;
  205. buf += (30 - log) << k;
  206. bitstream_skip(bc, 32 + k - log);
  207. return buf;
  208. } else {
  209. bitstream_skip(bc, limit);
  210. buf = bitstream_read(bc, esc_len);
  211. return buf + limit - 1;
  212. }
  213. }
  214. /**
  215. * read unsigned golomb rice code (jpegls).
  216. */
  217. static inline int get_ur_golomb_jpegls(BitstreamContext *bc, int k, int limit,
  218. int esc_len)
  219. {
  220. unsigned int buf;
  221. int log;
  222. buf = bitstream_peek(bc, 32);
  223. log = av_log2(buf);
  224. if (log - k >= 1 && 32 - log < limit) {
  225. buf >>= log - k;
  226. buf += (30 - log) << k;
  227. bitstream_skip(bc, 32 + k - log);
  228. return buf;
  229. } else {
  230. int i;
  231. for (i = 0;
  232. i < limit && bitstream_read_bit(bc) == 0 && bitstream_bits_left(bc) > 0;
  233. i++);
  234. if (i < limit - 1) {
  235. buf = bitstream_read(bc, k);
  236. return buf + (i << k);
  237. } else if (i == limit - 1) {
  238. buf = bitstream_read(bc, esc_len);
  239. return buf + 1;
  240. } else
  241. return -1;
  242. }
  243. }
  244. /**
  245. * read signed golomb rice code (ffv1).
  246. */
  247. static inline int get_sr_golomb(BitstreamContext *bc, int k, int limit,
  248. int esc_len)
  249. {
  250. int v = get_ur_golomb(bc, k, limit, esc_len);
  251. v++;
  252. if (v & 1)
  253. return v >> 1;
  254. else
  255. return -(v >> 1);
  256. // return (v>>1) ^ -(v&1);
  257. }
  258. /**
  259. * read signed golomb rice code (flac).
  260. */
  261. static inline int get_sr_golomb_flac(BitstreamContext *bc, int k, int limit,
  262. int esc_len)
  263. {
  264. int v = get_ur_golomb_jpegls(bc, k, limit, esc_len);
  265. return (v >> 1) ^ -(v & 1);
  266. }
  267. /**
  268. * read unsigned golomb rice code (shorten).
  269. */
  270. static inline unsigned int get_ur_golomb_shorten(BitstreamContext *bc, int k)
  271. {
  272. return get_ur_golomb_jpegls(bc, k, INT_MAX, 0);
  273. }
  274. /**
  275. * read signed golomb rice code (shorten).
  276. */
  277. static inline int get_sr_golomb_shorten(BitstreamContext *bc, int k)
  278. {
  279. int uvar = get_ur_golomb_jpegls(bc, k + 1, INT_MAX, 0);
  280. if (uvar & 1)
  281. return ~(uvar >> 1);
  282. else
  283. return uvar >> 1;
  284. }
  285. #ifdef TRACE
  286. static inline int get_ue(BitstreamContext *s, const char *file, const char *func,
  287. int line)
  288. {
  289. int show = bitstream_peek(s, 24);
  290. int pos = bitstream_tell(s);
  291. int i = get_ue_golomb(s);
  292. int len = bitstream_tell(s) - pos;
  293. int bits = show >> (24 - len);
  294. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n",
  295. bits, len, i, pos, file, func, line);
  296. return i;
  297. }
  298. static inline int get_se(BitstreamContext *s, const char *file, const char *func,
  299. int line)
  300. {
  301. int show = bitstream_peek(s, 24);
  302. int pos = bitstream_tell(s);
  303. int i = get_se_golomb(s);
  304. int len = bitstream_tell(s) - pos;
  305. int bits = show >> (24 - len);
  306. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n",
  307. bits, len, i, pos, file, func, line);
  308. return i;
  309. }
  310. static inline int get_te(BitstreamContext *s, int r, char *file, const char *func,
  311. int line)
  312. {
  313. int show = bitstream_peek(s, 24);
  314. int pos = bitstream_tell(s);
  315. int i = get_te0_golomb(s, r);
  316. int len = bitstream_tell(s) - pos;
  317. int bits = show >> (24 - len);
  318. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n",
  319. bits, len, i, pos, file, func, line);
  320. return i;
  321. }
  322. #define get_ue_golomb(a) get_ue(a, __FILE__, __func__, __LINE__)
  323. #define get_se_golomb(a) get_se(a, __FILE__, __func__, __LINE__)
  324. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  325. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  326. #endif /* TRACE */
  327. /**
  328. * write unsigned exp golomb code.
  329. */
  330. static inline void set_ue_golomb(PutBitContext *pb, int i)
  331. {
  332. assert(i >= 0);
  333. if (i < 256)
  334. put_bits(pb, ff_ue_golomb_len[i], i + 1);
  335. else {
  336. int e = av_log2(i + 1);
  337. put_bits(pb, 2 * e + 1, i + 1);
  338. }
  339. }
  340. /**
  341. * write truncated unsigned exp golomb code.
  342. */
  343. static inline void set_te_golomb(PutBitContext *pb, int i, int range)
  344. {
  345. assert(range >= 1);
  346. assert(i <= range);
  347. if (range == 2)
  348. put_bits(pb, 1, i ^ 1);
  349. else
  350. set_ue_golomb(pb, i);
  351. }
  352. /**
  353. * write signed exp golomb code. 16 bits at most.
  354. */
  355. static inline void set_se_golomb(PutBitContext *pb, int i)
  356. {
  357. i = 2 * i - 1;
  358. if (i < 0)
  359. i ^= -1; //FIXME check if gcc does the right thing
  360. set_ue_golomb(pb, i);
  361. }
  362. /**
  363. * write unsigned golomb rice code (ffv1).
  364. */
  365. static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
  366. int esc_len)
  367. {
  368. int e;
  369. assert(i >= 0);
  370. e = i >> k;
  371. if (e < limit)
  372. put_bits(pb, e + k + 1, (1 << k) + (i & ((1 << k) - 1)));
  373. else
  374. put_bits(pb, limit + esc_len, i - limit + 1);
  375. }
  376. /**
  377. * write unsigned golomb rice code (jpegls).
  378. */
  379. static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
  380. int limit, int esc_len)
  381. {
  382. int e;
  383. assert(i >= 0);
  384. e = (i >> k) + 1;
  385. if (e < limit) {
  386. while (e > 31) {
  387. put_bits(pb, 31, 0);
  388. e -= 31;
  389. }
  390. put_bits(pb, e, 1);
  391. if (k)
  392. put_sbits(pb, k, i);
  393. } else {
  394. while (limit > 31) {
  395. put_bits(pb, 31, 0);
  396. limit -= 31;
  397. }
  398. put_bits(pb, limit, 1);
  399. put_bits(pb, esc_len, i - 1);
  400. }
  401. }
  402. /**
  403. * write signed golomb rice code (ffv1).
  404. */
  405. static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
  406. int esc_len)
  407. {
  408. int v;
  409. v = -2 * i - 1;
  410. v ^= (v >> 31);
  411. set_ur_golomb(pb, v, k, limit, esc_len);
  412. }
  413. /**
  414. * write signed golomb rice code (flac).
  415. */
  416. static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
  417. int limit, int esc_len)
  418. {
  419. int v;
  420. v = -2 * i - 1;
  421. v ^= (v >> 31);
  422. set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
  423. }
  424. #endif /* AVCODEC_GOLOMB_H */