golomb.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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 FFmpeg.
  7. *
  8. * FFmpeg 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. * FFmpeg 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 FFmpeg; 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 an unsigned Exp-Golomb code in the range 0 to 8190.
  44. *
  45. * @returns the read value or a negative error code.
  46. */
  47. static inline int get_ue_golomb(GetBitContext *gb)
  48. {
  49. unsigned int buf;
  50. #if CACHED_BITSTREAM_READER
  51. buf = show_bits_long(gb, 32);
  52. if (buf >= (1 << 27)) {
  53. buf >>= 32 - 9;
  54. skip_bits_long(gb, ff_golomb_vlc_len[buf]);
  55. return ff_ue_golomb_vlc_code[buf];
  56. } else {
  57. int log = 2 * av_log2(buf) - 31;
  58. buf >>= log;
  59. buf--;
  60. skip_bits_long(gb, 32 - log);
  61. return buf;
  62. }
  63. #else
  64. OPEN_READER(re, gb);
  65. UPDATE_CACHE(re, gb);
  66. buf = GET_CACHE(re, gb);
  67. if (buf >= (1 << 27)) {
  68. buf >>= 32 - 9;
  69. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  70. CLOSE_READER(re, gb);
  71. return ff_ue_golomb_vlc_code[buf];
  72. } else {
  73. int log = 2 * av_log2(buf) - 31;
  74. LAST_SKIP_BITS(re, gb, 32 - log);
  75. CLOSE_READER(re, gb);
  76. if (log < 7) {
  77. av_log(NULL, AV_LOG_ERROR, "Invalid UE golomb code\n");
  78. return AVERROR_INVALIDDATA;
  79. }
  80. buf >>= log;
  81. buf--;
  82. return buf;
  83. }
  84. #endif
  85. }
  86. /**
  87. * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
  88. */
  89. static inline unsigned get_ue_golomb_long(GetBitContext *gb)
  90. {
  91. unsigned buf, log;
  92. buf = show_bits_long(gb, 32);
  93. log = 31 - av_log2(buf);
  94. skip_bits_long(gb, log);
  95. return get_bits_long(gb, log + 1) - 1;
  96. }
  97. /**
  98. * read unsigned exp golomb code, constraint to a max of 31.
  99. * the return value is undefined if the stored value exceeds 31.
  100. */
  101. static inline int get_ue_golomb_31(GetBitContext *gb)
  102. {
  103. unsigned int buf;
  104. #if CACHED_BITSTREAM_READER
  105. buf = show_bits_long(gb, 32);
  106. buf >>= 32 - 9;
  107. skip_bits_long(gb, ff_golomb_vlc_len[buf]);
  108. #else
  109. OPEN_READER(re, gb);
  110. UPDATE_CACHE(re, gb);
  111. buf = GET_CACHE(re, gb);
  112. buf >>= 32 - 9;
  113. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  114. CLOSE_READER(re, gb);
  115. #endif
  116. return ff_ue_golomb_vlc_code[buf];
  117. }
  118. static inline unsigned get_interleaved_ue_golomb(GetBitContext *gb)
  119. {
  120. uint32_t buf;
  121. #if CACHED_BITSTREAM_READER
  122. buf = show_bits_long(gb, 32);
  123. if (buf & 0xAA800000) {
  124. buf >>= 32 - 8;
  125. skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]);
  126. return ff_interleaved_ue_golomb_vlc_code[buf];
  127. } else {
  128. unsigned ret = 1;
  129. do {
  130. buf >>= 32 - 8;
  131. skip_bits_long(gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
  132. if (ff_interleaved_golomb_vlc_len[buf] != 9) {
  133. ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
  134. ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
  135. break;
  136. }
  137. ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
  138. buf = show_bits_long(gb, 32);
  139. } while (get_bits_left(gb) > 0);
  140. return ret - 1;
  141. }
  142. #else
  143. OPEN_READER(re, gb);
  144. UPDATE_CACHE(re, gb);
  145. buf = GET_CACHE(re, gb);
  146. if (buf & 0xAA800000) {
  147. buf >>= 32 - 8;
  148. LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  149. CLOSE_READER(re, gb);
  150. return ff_interleaved_ue_golomb_vlc_code[buf];
  151. } else {
  152. unsigned ret = 1;
  153. do {
  154. buf >>= 32 - 8;
  155. LAST_SKIP_BITS(re, gb,
  156. FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
  157. if (ff_interleaved_golomb_vlc_len[buf] != 9) {
  158. ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
  159. ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
  160. break;
  161. }
  162. ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
  163. UPDATE_CACHE(re, gb);
  164. buf = GET_CACHE(re, gb);
  165. } while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
  166. CLOSE_READER(re, gb);
  167. return ret - 1;
  168. }
  169. #endif
  170. }
  171. /**
  172. * read unsigned truncated exp golomb code.
  173. */
  174. static inline int get_te0_golomb(GetBitContext *gb, int range)
  175. {
  176. av_assert2(range >= 1);
  177. if (range == 1)
  178. return 0;
  179. else if (range == 2)
  180. return get_bits1(gb) ^ 1;
  181. else
  182. return get_ue_golomb(gb);
  183. }
  184. /**
  185. * read unsigned truncated exp golomb code.
  186. */
  187. static inline int get_te_golomb(GetBitContext *gb, int range)
  188. {
  189. av_assert2(range >= 1);
  190. if (range == 2)
  191. return get_bits1(gb) ^ 1;
  192. else
  193. return get_ue_golomb(gb);
  194. }
  195. /**
  196. * read signed exp golomb code.
  197. */
  198. static inline int get_se_golomb(GetBitContext *gb)
  199. {
  200. unsigned int buf;
  201. #if CACHED_BITSTREAM_READER
  202. buf = show_bits_long(gb, 32);
  203. if (buf >= (1 << 27)) {
  204. buf >>= 32 - 9;
  205. skip_bits_long(gb, ff_golomb_vlc_len[buf]);
  206. return ff_se_golomb_vlc_code[buf];
  207. } else {
  208. int log = 2 * av_log2(buf) - 31;
  209. buf >>= log;
  210. skip_bits_long(gb, 32 - log);
  211. if (buf & 1)
  212. buf = -(buf >> 1);
  213. else
  214. buf = (buf >> 1);
  215. return buf;
  216. }
  217. #else
  218. OPEN_READER(re, gb);
  219. UPDATE_CACHE(re, gb);
  220. buf = GET_CACHE(re, gb);
  221. if (buf >= (1 << 27)) {
  222. buf >>= 32 - 9;
  223. LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
  224. CLOSE_READER(re, gb);
  225. return ff_se_golomb_vlc_code[buf];
  226. } else {
  227. int log = av_log2(buf), sign;
  228. LAST_SKIP_BITS(re, gb, 31 - log);
  229. UPDATE_CACHE(re, gb);
  230. buf = GET_CACHE(re, gb);
  231. buf >>= log;
  232. LAST_SKIP_BITS(re, gb, 32 - log);
  233. CLOSE_READER(re, gb);
  234. sign = -(buf & 1);
  235. buf = ((buf >> 1) ^ sign) - sign;
  236. return buf;
  237. }
  238. #endif
  239. }
  240. static inline int get_se_golomb_long(GetBitContext *gb)
  241. {
  242. unsigned int buf = get_ue_golomb_long(gb);
  243. int sign = (buf & 1) - 1;
  244. return ((buf >> 1) ^ sign) + 1;
  245. }
  246. static inline int get_interleaved_se_golomb(GetBitContext *gb)
  247. {
  248. unsigned int buf;
  249. #if CACHED_BITSTREAM_READER
  250. buf = show_bits_long(gb, 32);
  251. if (buf & 0xAA800000) {
  252. buf >>= 32 - 8;
  253. skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]);
  254. return ff_interleaved_se_golomb_vlc_code[buf];
  255. } else {
  256. int log;
  257. skip_bits(gb, 8);
  258. buf |= 1 | show_bits(gb, 24);
  259. if ((buf & 0xAAAAAAAA) == 0)
  260. return INVALID_VLC;
  261. for (log = 31; (buf & 0x80000000) == 0; log--)
  262. buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  263. skip_bits_long(gb, 63 - 2 * log - 8);
  264. return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  265. }
  266. #else
  267. OPEN_READER(re, gb);
  268. UPDATE_CACHE(re, gb);
  269. buf = GET_CACHE(re, gb);
  270. if (buf & 0xAA800000) {
  271. buf >>= 32 - 8;
  272. LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
  273. CLOSE_READER(re, gb);
  274. return ff_interleaved_se_golomb_vlc_code[buf];
  275. } else {
  276. int log;
  277. LAST_SKIP_BITS(re, gb, 8);
  278. UPDATE_CACHE(re, gb);
  279. buf |= 1 | (GET_CACHE(re, gb) >> 8);
  280. if ((buf & 0xAAAAAAAA) == 0)
  281. return INVALID_VLC;
  282. for (log = 31; (buf & 0x80000000) == 0; log--)
  283. buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
  284. LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
  285. CLOSE_READER(re, gb);
  286. return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
  287. }
  288. #endif
  289. }
  290. static inline int dirac_get_se_golomb(GetBitContext *gb)
  291. {
  292. uint32_t ret = get_interleaved_ue_golomb(gb);
  293. if (ret) {
  294. int sign = -get_bits1(gb);
  295. ret = (ret ^ sign) - sign;
  296. }
  297. return ret;
  298. }
  299. /**
  300. * read unsigned golomb rice code (ffv1).
  301. */
  302. static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
  303. int esc_len)
  304. {
  305. unsigned int buf;
  306. int log;
  307. #if CACHED_BITSTREAM_READER
  308. buf = show_bits_long(gb, 32);
  309. log = av_log2(buf);
  310. if (log > 31 - limit) {
  311. buf >>= log - k;
  312. buf += (30 - log) << k;
  313. skip_bits_long(gb, 32 + k - log);
  314. return buf;
  315. } else {
  316. skip_bits_long(gb, limit);
  317. buf = get_bits_long(gb, esc_len);
  318. return buf + limit - 1;
  319. }
  320. #else
  321. OPEN_READER(re, gb);
  322. UPDATE_CACHE(re, gb);
  323. buf = GET_CACHE(re, gb);
  324. log = av_log2(buf);
  325. if (log > 31 - limit) {
  326. buf >>= log - k;
  327. buf += (30U - log) << k;
  328. LAST_SKIP_BITS(re, gb, 32 + k - log);
  329. CLOSE_READER(re, gb);
  330. return buf;
  331. } else {
  332. LAST_SKIP_BITS(re, gb, limit);
  333. UPDATE_CACHE(re, gb);
  334. buf = SHOW_UBITS(re, gb, esc_len);
  335. LAST_SKIP_BITS(re, gb, esc_len);
  336. CLOSE_READER(re, gb);
  337. return buf + limit - 1;
  338. }
  339. #endif
  340. }
  341. /**
  342. * read unsigned golomb rice code (jpegls).
  343. */
  344. static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
  345. int esc_len)
  346. {
  347. unsigned int buf;
  348. int log;
  349. #if CACHED_BITSTREAM_READER
  350. buf = show_bits_long(gb, 32);
  351. log = av_log2(buf);
  352. if (log - k >= 1 && 32 - log < limit) {
  353. buf >>= log - k;
  354. buf += (30 - log) << k;
  355. skip_bits_long(gb, 32 + k - log);
  356. return buf;
  357. } else {
  358. int i;
  359. for (i = 0;
  360. i < limit && get_bits1(gb) == 0 && get_bits_left(gb) > 0;
  361. i++);
  362. if (i < limit - 1) {
  363. buf = get_bits_long(gb, k);
  364. return buf + (i << k);
  365. } else if (i == limit - 1) {
  366. buf = get_bits_long(gb, esc_len);
  367. return buf + 1;
  368. } else
  369. return -1;
  370. }
  371. #else
  372. OPEN_READER(re, gb);
  373. UPDATE_CACHE(re, gb);
  374. buf = GET_CACHE(re, gb);
  375. log = av_log2(buf);
  376. av_assert2(k <= 31);
  377. if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
  378. 32 - log < limit) {
  379. buf >>= log - k;
  380. buf += (30U - log) << k;
  381. LAST_SKIP_BITS(re, gb, 32 + k - log);
  382. CLOSE_READER(re, gb);
  383. return buf;
  384. } else {
  385. int i;
  386. for (i = 0; i + MIN_CACHE_BITS <= limit && SHOW_UBITS(re, gb, MIN_CACHE_BITS) == 0; i += MIN_CACHE_BITS) {
  387. if (gb->size_in_bits <= re_index) {
  388. CLOSE_READER(re, gb);
  389. return -1;
  390. }
  391. LAST_SKIP_BITS(re, gb, MIN_CACHE_BITS);
  392. UPDATE_CACHE(re, gb);
  393. }
  394. for (; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
  395. SKIP_BITS(re, gb, 1);
  396. }
  397. LAST_SKIP_BITS(re, gb, 1);
  398. UPDATE_CACHE(re, gb);
  399. if (i < limit - 1) {
  400. if (k) {
  401. if (k > MIN_CACHE_BITS - 1) {
  402. buf = SHOW_UBITS(re, gb, 16) << (k-16);
  403. LAST_SKIP_BITS(re, gb, 16);
  404. UPDATE_CACHE(re, gb);
  405. buf |= SHOW_UBITS(re, gb, k-16);
  406. LAST_SKIP_BITS(re, gb, k-16);
  407. } else {
  408. buf = SHOW_UBITS(re, gb, k);
  409. LAST_SKIP_BITS(re, gb, k);
  410. }
  411. } else {
  412. buf = 0;
  413. }
  414. buf += ((SUINT)i << k);
  415. } else if (i == limit - 1) {
  416. buf = SHOW_UBITS(re, gb, esc_len);
  417. LAST_SKIP_BITS(re, gb, esc_len);
  418. buf ++;
  419. } else {
  420. buf = -1;
  421. }
  422. CLOSE_READER(re, gb);
  423. return buf;
  424. }
  425. #endif
  426. }
  427. /**
  428. * read signed golomb rice code (ffv1).
  429. */
  430. static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
  431. int esc_len)
  432. {
  433. unsigned v = get_ur_golomb(gb, k, limit, esc_len);
  434. return (v >> 1) ^ -(v & 1);
  435. }
  436. /**
  437. * read signed golomb rice code (flac).
  438. */
  439. static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
  440. int esc_len)
  441. {
  442. unsigned v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
  443. return (v >> 1) ^ -(v & 1);
  444. }
  445. /**
  446. * read unsigned golomb rice code (shorten).
  447. */
  448. static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
  449. {
  450. return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
  451. }
  452. /**
  453. * read signed golomb rice code (shorten).
  454. */
  455. static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
  456. {
  457. int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
  458. return (uvar >> 1) ^ -(uvar & 1);
  459. }
  460. #ifdef TRACE
  461. static inline int get_ue(GetBitContext *s, const char *file, const char *func,
  462. int line)
  463. {
  464. int show = show_bits(s, 24);
  465. int pos = get_bits_count(s);
  466. int i = get_ue_golomb(s);
  467. int len = get_bits_count(s) - pos;
  468. int bits = show >> (24 - len);
  469. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n",
  470. bits, len, i, pos, file, func, line);
  471. return i;
  472. }
  473. static inline int get_se(GetBitContext *s, const char *file, const char *func,
  474. int line)
  475. {
  476. int show = show_bits(s, 24);
  477. int pos = get_bits_count(s);
  478. int i = get_se_golomb(s);
  479. int len = get_bits_count(s) - pos;
  480. int bits = show >> (24 - len);
  481. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n",
  482. bits, len, i, pos, file, func, line);
  483. return i;
  484. }
  485. static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
  486. int line)
  487. {
  488. int show = show_bits(s, 24);
  489. int pos = get_bits_count(s);
  490. int i = get_te0_golomb(s, r);
  491. int len = get_bits_count(s) - pos;
  492. int bits = show >> (24 - len);
  493. av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n",
  494. bits, len, i, pos, file, func, line);
  495. return i;
  496. }
  497. #define get_ue_golomb(a) get_ue(a, __FILE__, __func__, __LINE__)
  498. #define get_se_golomb(a) get_se(a, __FILE__, __func__, __LINE__)
  499. #define get_te_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  500. #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
  501. #endif /* TRACE */
  502. /**
  503. * write unsigned exp golomb code. 2^16 - 2 at most
  504. */
  505. static inline void set_ue_golomb(PutBitContext *pb, int i)
  506. {
  507. av_assert2(i >= 0);
  508. av_assert2(i <= 0xFFFE);
  509. if (i < 256)
  510. put_bits(pb, ff_ue_golomb_len[i], i + 1);
  511. else {
  512. int e = av_log2(i + 1);
  513. put_bits(pb, 2 * e + 1, i + 1);
  514. }
  515. }
  516. /**
  517. * write unsigned exp golomb code. 2^32-2 at most.
  518. */
  519. static inline void set_ue_golomb_long(PutBitContext *pb, uint32_t i)
  520. {
  521. av_assert2(i <= (UINT32_MAX - 1));
  522. if (i < 256)
  523. put_bits(pb, ff_ue_golomb_len[i], i + 1);
  524. else {
  525. int e = av_log2(i + 1);
  526. put_bits64(pb, 2 * e + 1, i + 1);
  527. }
  528. }
  529. /**
  530. * write truncated unsigned exp golomb code.
  531. */
  532. static inline void set_te_golomb(PutBitContext *pb, int i, int range)
  533. {
  534. av_assert2(range >= 1);
  535. av_assert2(i <= range);
  536. if (range == 2)
  537. put_bits(pb, 1, i ^ 1);
  538. else
  539. set_ue_golomb(pb, i);
  540. }
  541. /**
  542. * write signed exp golomb code. 16 bits at most.
  543. */
  544. static inline void set_se_golomb(PutBitContext *pb, int i)
  545. {
  546. i = 2 * i - 1;
  547. if (i < 0)
  548. i ^= -1; //FIXME check if gcc does the right thing
  549. set_ue_golomb(pb, i);
  550. }
  551. /**
  552. * write unsigned golomb rice code (ffv1).
  553. */
  554. static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
  555. int esc_len)
  556. {
  557. int e;
  558. av_assert2(i >= 0);
  559. e = i >> k;
  560. if (e < limit)
  561. put_bits(pb, e + k + 1, (1 << k) + av_mod_uintp2(i, k));
  562. else
  563. put_bits(pb, limit + esc_len, i - limit + 1);
  564. }
  565. /**
  566. * write unsigned golomb rice code (jpegls).
  567. */
  568. static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
  569. int limit, int esc_len)
  570. {
  571. int e;
  572. av_assert2(i >= 0);
  573. e = (i >> k) + 1;
  574. if (e < limit) {
  575. while (e > 31) {
  576. put_bits(pb, 31, 0);
  577. e -= 31;
  578. }
  579. put_bits(pb, e, 1);
  580. if (k)
  581. put_sbits(pb, k, i);
  582. } else {
  583. while (limit > 31) {
  584. put_bits(pb, 31, 0);
  585. limit -= 31;
  586. }
  587. put_bits(pb, limit, 1);
  588. put_bits(pb, esc_len, i - 1);
  589. }
  590. }
  591. /**
  592. * write signed golomb rice code (ffv1).
  593. */
  594. static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
  595. int esc_len)
  596. {
  597. int v;
  598. v = -2 * i - 1;
  599. v ^= (v >> 31);
  600. set_ur_golomb(pb, v, k, limit, esc_len);
  601. }
  602. /**
  603. * write signed golomb rice code (flac).
  604. */
  605. static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
  606. int limit, int esc_len)
  607. {
  608. int v;
  609. v = -2 * i - 1;
  610. v ^= (v >> 31);
  611. set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
  612. }
  613. #endif /* AVCODEC_GOLOMB_H */