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.

175 lines
4.4KB

  1. /*
  2. * Common bit/dsp utils
  3. * Copyright (c) 2000 Gerard Lantau.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <netinet/in.h>
  23. #include <math.h>
  24. #include "common.h"
  25. #define NDEBUG
  26. #include <assert.h>
  27. void init_put_bits(PutBitContext *s,
  28. UINT8 *buffer, int buffer_size,
  29. void *opaque,
  30. void (*write_data)(void *, UINT8 *, int))
  31. {
  32. s->buf = buffer;
  33. s->buf_ptr = s->buf;
  34. s->buf_end = s->buf + buffer_size;
  35. s->bit_cnt=0;
  36. s->bit_buf=0;
  37. s->data_out_size = 0;
  38. s->write_data = write_data;
  39. s->opaque = opaque;
  40. }
  41. static void flush_buffer(PutBitContext *s)
  42. {
  43. int size;
  44. if (s->write_data) {
  45. size = s->buf_ptr - s->buf;
  46. if (size > 0)
  47. s->write_data(s->opaque, s->buf, size);
  48. s->buf_ptr = s->buf;
  49. s->data_out_size += size;
  50. }
  51. }
  52. void put_bits(PutBitContext *s, int n, unsigned int value)
  53. {
  54. unsigned int bit_buf;
  55. int bit_cnt;
  56. assert(n == 32 || value < (1U << n));
  57. bit_buf = s->bit_buf;
  58. bit_cnt = s->bit_cnt;
  59. // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
  60. /* XXX: optimize */
  61. if (n < (32-bit_cnt)) {
  62. bit_buf |= value << (32 - n - bit_cnt);
  63. bit_cnt+=n;
  64. } else {
  65. bit_buf |= value >> (n + bit_cnt - 32);
  66. *(UINT32 *)s->buf_ptr = htonl(bit_buf);
  67. //printf("bitbuf = %08x\n", bit_buf);
  68. s->buf_ptr+=4;
  69. if (s->buf_ptr >= s->buf_end)
  70. flush_buffer(s);
  71. bit_cnt=bit_cnt + n - 32;
  72. if (bit_cnt == 0) {
  73. bit_buf = 0;
  74. } else {
  75. bit_buf = value << (32 - bit_cnt);
  76. }
  77. }
  78. s->bit_buf = bit_buf;
  79. s->bit_cnt = bit_cnt;
  80. }
  81. /* return the number of bits output */
  82. long long get_bit_count(PutBitContext *s)
  83. {
  84. return (s->buf_ptr - s->buf + s->data_out_size) * 8 + (long long)s->bit_cnt;
  85. }
  86. void align_put_bits(PutBitContext *s)
  87. {
  88. put_bits(s,(8 - s->bit_cnt) & 7,0);
  89. }
  90. /* pad the end of the output stream with zeros */
  91. void flush_put_bits(PutBitContext *s)
  92. {
  93. while (s->bit_cnt > 0) {
  94. /* XXX: should test end of buffer */
  95. *s->buf_ptr++=s->bit_buf >> 24;
  96. s->bit_buf<<=8;
  97. s->bit_cnt-=8;
  98. }
  99. flush_buffer(s);
  100. s->bit_cnt=0;
  101. s->bit_buf=0;
  102. }
  103. /* for jpeg : espace 0xff with 0x00 after it */
  104. void jput_bits(PutBitContext *s, int n, unsigned int value)
  105. {
  106. unsigned int bit_buf, b;
  107. int bit_cnt, i;
  108. assert(n == 32 || value < (1U << n));
  109. bit_buf = s->bit_buf;
  110. bit_cnt = s->bit_cnt;
  111. //printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
  112. /* XXX: optimize */
  113. if (n < (32-bit_cnt)) {
  114. bit_buf |= value << (32 - n - bit_cnt);
  115. bit_cnt+=n;
  116. } else {
  117. bit_buf |= value >> (n + bit_cnt - 32);
  118. /* handle escape */
  119. for(i=0;i<4;i++) {
  120. b = (bit_buf >> 24);
  121. *(s->buf_ptr++) = b;
  122. if (b == 0xff)
  123. *(s->buf_ptr++) = 0;
  124. bit_buf <<= 8;
  125. }
  126. /* we flush the buffer sooner to handle worst case */
  127. if (s->buf_ptr >= (s->buf_end - 8))
  128. flush_buffer(s);
  129. bit_cnt=bit_cnt + n - 32;
  130. if (bit_cnt == 0) {
  131. bit_buf = 0;
  132. } else {
  133. bit_buf = value << (32 - bit_cnt);
  134. }
  135. }
  136. s->bit_buf = bit_buf;
  137. s->bit_cnt = bit_cnt;
  138. }
  139. /* pad the end of the output stream with zeros */
  140. void jflush_put_bits(PutBitContext *s)
  141. {
  142. unsigned int b;
  143. while (s->bit_cnt > 0) {
  144. b = s->bit_buf >> 24;
  145. *s->buf_ptr++ = b;
  146. if (b == 0xff)
  147. *s->buf_ptr++ = 0;
  148. s->bit_buf<<=8;
  149. s->bit_cnt-=8;
  150. }
  151. flush_buffer(s);
  152. s->bit_cnt=0;
  153. s->bit_buf=0;
  154. }