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.

401 lines
10KB

  1. /*
  2. * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. /**
  21. * @file
  22. * bitstream writer API
  23. */
  24. #ifndef AVCODEC_PUT_BITS_H
  25. #define AVCODEC_PUT_BITS_H
  26. #include <stdint.h>
  27. #include <stddef.h>
  28. #include "config.h"
  29. #include "libavutil/intreadwrite.h"
  30. #include "libavutil/avassert.h"
  31. #include "version.h"
  32. #if ARCH_X86_64
  33. // TODO: Benchmark and optionally enable on other 64-bit architectures.
  34. typedef uint64_t BitBuf;
  35. #define AV_WBBUF AV_WB64
  36. #define AV_WLBUF AV_WL64
  37. #else
  38. typedef uint32_t BitBuf;
  39. #define AV_WBBUF AV_WB32
  40. #define AV_WLBUF AV_WL32
  41. #endif
  42. static const int BUF_BITS = 8 * sizeof(BitBuf);
  43. typedef struct PutBitContext {
  44. BitBuf bit_buf;
  45. int bit_left;
  46. uint8_t *buf, *buf_ptr, *buf_end;
  47. int size_in_bits;
  48. } PutBitContext;
  49. /**
  50. * Initialize the PutBitContext s.
  51. *
  52. * @param buffer the buffer where to put bits
  53. * @param buffer_size the size in bytes of buffer
  54. */
  55. static inline void init_put_bits(PutBitContext *s, uint8_t *buffer,
  56. int buffer_size)
  57. {
  58. if (buffer_size < 0) {
  59. buffer_size = 0;
  60. buffer = NULL;
  61. }
  62. s->size_in_bits = 8 * buffer_size;
  63. s->buf = buffer;
  64. s->buf_end = s->buf + buffer_size;
  65. s->buf_ptr = s->buf;
  66. s->bit_left = BUF_BITS;
  67. s->bit_buf = 0;
  68. }
  69. /**
  70. * @return the total number of bits written to the bitstream.
  71. */
  72. static inline int put_bits_count(PutBitContext *s)
  73. {
  74. return (s->buf_ptr - s->buf) * 8 + BUF_BITS - s->bit_left;
  75. }
  76. /**
  77. * Rebase the bit writer onto a reallocated buffer.
  78. *
  79. * @param buffer the buffer where to put bits
  80. * @param buffer_size the size in bytes of buffer,
  81. * must be large enough to hold everything written so far
  82. */
  83. static inline void rebase_put_bits(PutBitContext *s, uint8_t *buffer,
  84. int buffer_size)
  85. {
  86. av_assert0(8*buffer_size >= put_bits_count(s));
  87. s->buf_end = buffer + buffer_size;
  88. s->buf_ptr = buffer + (s->buf_ptr - s->buf);
  89. s->buf = buffer;
  90. s->size_in_bits = 8 * buffer_size;
  91. }
  92. /**
  93. * @return the number of bits available in the bitstream.
  94. */
  95. static inline int put_bits_left(PutBitContext* s)
  96. {
  97. return (s->buf_end - s->buf_ptr) * 8 - BUF_BITS + s->bit_left;
  98. }
  99. /**
  100. * Pad the end of the output stream with zeros.
  101. */
  102. static inline void flush_put_bits(PutBitContext *s)
  103. {
  104. #ifndef BITSTREAM_WRITER_LE
  105. if (s->bit_left < BUF_BITS)
  106. s->bit_buf <<= s->bit_left;
  107. #endif
  108. while (s->bit_left < BUF_BITS) {
  109. av_assert0(s->buf_ptr < s->buf_end);
  110. #ifdef BITSTREAM_WRITER_LE
  111. *s->buf_ptr++ = s->bit_buf;
  112. s->bit_buf >>= 8;
  113. #else
  114. *s->buf_ptr++ = s->bit_buf >> (BUF_BITS - 8);
  115. s->bit_buf <<= 8;
  116. #endif
  117. s->bit_left += 8;
  118. }
  119. s->bit_left = BUF_BITS;
  120. s->bit_buf = 0;
  121. }
  122. static inline void flush_put_bits_le(PutBitContext *s)
  123. {
  124. while (s->bit_left < BUF_BITS) {
  125. av_assert0(s->buf_ptr < s->buf_end);
  126. *s->buf_ptr++ = s->bit_buf;
  127. s->bit_buf >>= 8;
  128. s->bit_left += 8;
  129. }
  130. s->bit_left = BUF_BITS;
  131. s->bit_buf = 0;
  132. }
  133. #if FF_API_AVPRIV_PUT_BITS
  134. void avpriv_align_put_bits(PutBitContext *s);
  135. #endif
  136. #ifdef BITSTREAM_WRITER_LE
  137. #define ff_put_string ff_put_string_unsupported_here
  138. #define avpriv_copy_bits avpriv_copy_bits_unsupported_here
  139. #else
  140. /**
  141. * Put the string string in the bitstream.
  142. *
  143. * @param terminate_string 0-terminates the written string if value is 1
  144. */
  145. void ff_put_string(PutBitContext *pb, const char *string,
  146. int terminate_string);
  147. /**
  148. * Copy the content of src to the bitstream.
  149. *
  150. * @param length the number of bits of src to copy
  151. */
  152. void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
  153. #endif
  154. static inline void put_bits_no_assert(PutBitContext *s, int n, BitBuf value)
  155. {
  156. BitBuf bit_buf;
  157. int bit_left;
  158. bit_buf = s->bit_buf;
  159. bit_left = s->bit_left;
  160. /* XXX: optimize */
  161. #ifdef BITSTREAM_WRITER_LE
  162. bit_buf |= value << (BUF_BITS - bit_left);
  163. if (n >= bit_left) {
  164. if (s->buf_end - s->buf_ptr >= sizeof(BitBuf)) {
  165. AV_WLBUF(s->buf_ptr, bit_buf);
  166. s->buf_ptr += sizeof(BitBuf);
  167. } else {
  168. av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
  169. av_assert2(0);
  170. }
  171. bit_buf = value >> bit_left;
  172. bit_left += BUF_BITS;
  173. }
  174. bit_left -= n;
  175. #else
  176. if (n < bit_left) {
  177. bit_buf = (bit_buf << n) | value;
  178. bit_left -= n;
  179. } else {
  180. bit_buf <<= bit_left;
  181. bit_buf |= value >> (n - bit_left);
  182. if (s->buf_end - s->buf_ptr >= sizeof(BitBuf)) {
  183. AV_WBBUF(s->buf_ptr, bit_buf);
  184. s->buf_ptr += sizeof(BitBuf);
  185. } else {
  186. av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
  187. av_assert2(0);
  188. }
  189. bit_left += BUF_BITS - n;
  190. bit_buf = value;
  191. }
  192. #endif
  193. s->bit_buf = bit_buf;
  194. s->bit_left = bit_left;
  195. }
  196. /**
  197. * Write up to 31 bits into a bitstream.
  198. * Use put_bits32 to write 32 bits.
  199. */
  200. static inline void put_bits(PutBitContext *s, int n, BitBuf value)
  201. {
  202. av_assert2(n <= 31 && value < (1UL << n));
  203. put_bits_no_assert(s, n, value);
  204. }
  205. static inline void put_bits_le(PutBitContext *s, int n, BitBuf value)
  206. {
  207. BitBuf bit_buf;
  208. int bit_left;
  209. av_assert2(n <= 31 && value < (1UL << n));
  210. bit_buf = s->bit_buf;
  211. bit_left = s->bit_left;
  212. bit_buf |= value << (BUF_BITS - bit_left);
  213. if (n >= bit_left) {
  214. if (s->buf_end - s->buf_ptr >= sizeof(BitBuf)) {
  215. AV_WLBUF(s->buf_ptr, bit_buf);
  216. s->buf_ptr += sizeof(BitBuf);
  217. } else {
  218. av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
  219. av_assert2(0);
  220. }
  221. bit_buf = value >> bit_left;
  222. bit_left += BUF_BITS;
  223. }
  224. bit_left -= n;
  225. s->bit_buf = bit_buf;
  226. s->bit_left = bit_left;
  227. }
  228. static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
  229. {
  230. av_assert2(n >= 0 && n <= 31);
  231. put_bits(pb, n, av_mod_uintp2(value, n));
  232. }
  233. /**
  234. * Write exactly 32 bits into a bitstream.
  235. */
  236. static void av_unused put_bits32(PutBitContext *s, uint32_t value)
  237. {
  238. BitBuf bit_buf;
  239. int bit_left;
  240. if (BUF_BITS > 32) {
  241. put_bits_no_assert(s, 32, value);
  242. return;
  243. }
  244. bit_buf = s->bit_buf;
  245. bit_left = s->bit_left;
  246. #ifdef BITSTREAM_WRITER_LE
  247. bit_buf |= (BitBuf)value << (BUF_BITS - bit_left);
  248. if (s->buf_end - s->buf_ptr >= sizeof(BitBuf)) {
  249. AV_WLBUF(s->buf_ptr, bit_buf);
  250. s->buf_ptr += sizeof(BitBuf);
  251. } else {
  252. av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
  253. av_assert2(0);
  254. }
  255. bit_buf = (uint64_t)value >> bit_left;
  256. #else
  257. bit_buf = (uint64_t)bit_buf << bit_left;
  258. bit_buf |= (BitBuf)value >> (BUF_BITS - bit_left);
  259. if (s->buf_end - s->buf_ptr >= sizeof(BitBuf)) {
  260. AV_WBBUF(s->buf_ptr, bit_buf);
  261. s->buf_ptr += sizeof(BitBuf);
  262. } else {
  263. av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
  264. av_assert2(0);
  265. }
  266. bit_buf = value;
  267. #endif
  268. s->bit_buf = bit_buf;
  269. s->bit_left = bit_left;
  270. }
  271. /**
  272. * Write up to 64 bits into a bitstream.
  273. */
  274. static inline void put_bits64(PutBitContext *s, int n, uint64_t value)
  275. {
  276. av_assert2((n == 64) || (n < 64 && value < (UINT64_C(1) << n)));
  277. if (n < 32)
  278. put_bits(s, n, value);
  279. else if (n == 32)
  280. put_bits32(s, value);
  281. else if (n < 64) {
  282. uint32_t lo = value & 0xffffffff;
  283. uint32_t hi = value >> 32;
  284. #ifdef BITSTREAM_WRITER_LE
  285. put_bits32(s, lo);
  286. put_bits(s, n - 32, hi);
  287. #else
  288. put_bits(s, n - 32, hi);
  289. put_bits32(s, lo);
  290. #endif
  291. } else {
  292. uint32_t lo = value & 0xffffffff;
  293. uint32_t hi = value >> 32;
  294. #ifdef BITSTREAM_WRITER_LE
  295. put_bits32(s, lo);
  296. put_bits32(s, hi);
  297. #else
  298. put_bits32(s, hi);
  299. put_bits32(s, lo);
  300. #endif
  301. }
  302. }
  303. /**
  304. * Return the pointer to the byte where the bitstream writer will put
  305. * the next bit.
  306. */
  307. static inline uint8_t *put_bits_ptr(PutBitContext *s)
  308. {
  309. return s->buf_ptr;
  310. }
  311. /**
  312. * Skip the given number of bytes.
  313. * PutBitContext must be flushed & aligned to a byte boundary before calling this.
  314. */
  315. static inline void skip_put_bytes(PutBitContext *s, int n)
  316. {
  317. av_assert2((put_bits_count(s) & 7) == 0);
  318. av_assert2(s->bit_left == BUF_BITS);
  319. av_assert0(n <= s->buf_end - s->buf_ptr);
  320. s->buf_ptr += n;
  321. }
  322. /**
  323. * Skip the given number of bits.
  324. * Must only be used if the actual values in the bitstream do not matter.
  325. * If n is < 0 the behavior is undefined.
  326. */
  327. static inline void skip_put_bits(PutBitContext *s, int n)
  328. {
  329. unsigned bits = BUF_BITS - s->bit_left + n;
  330. s->buf_ptr += sizeof(BitBuf) * (bits / BUF_BITS);
  331. s->bit_left = BUF_BITS - (bits & (BUF_BITS - 1));
  332. }
  333. /**
  334. * Change the end of the buffer.
  335. *
  336. * @param size the new size in bytes of the buffer where to put bits
  337. */
  338. static inline void set_put_bits_buffer_size(PutBitContext *s, int size)
  339. {
  340. av_assert0(size <= INT_MAX/8 - BUF_BITS);
  341. s->buf_end = s->buf + size;
  342. s->size_in_bits = 8*size;
  343. }
  344. /**
  345. * Pad the bitstream with zeros up to the next byte boundary.
  346. */
  347. static inline void align_put_bits(PutBitContext *s)
  348. {
  349. put_bits(s, s->bit_left & 7, 0);
  350. }
  351. #undef AV_WBBUF
  352. #undef AV_WLBUF
  353. #endif /* AVCODEC_PUT_BITS_H */