EncJpegPutBits.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*------------------------------------------------------------------------------
  2. -- --
  3. -- This software is confidential and proprietary and may be used --
  4. -- only as expressly authorized by a licensing agreement from --
  5. -- --
  6. -- Hantro Products Oy. --
  7. -- --
  8. -- (C) COPYRIGHT 2006 HANTRO PRODUCTS OY --
  9. -- ALL RIGHTS RESERVED --
  10. -- --
  11. -- The entire notice above must be reproduced --
  12. -- on all copies and should not be removed. --
  13. -- --
  14. --------------------------------------------------------------------------------
  15. --
  16. -- Abstract :
  17. --
  18. ------------------------------------------------------------------------------*/
  19. /*------------------------------------------------------------------------------
  20. Table of contents
  21. 1. Include headers
  22. 2. External compiler flags
  23. 3. Module defines
  24. 4. Local function prototypes
  25. 5. Functions
  26. ------------------------------------------------------------------------------*/
  27. /*------------------------------------------------------------------------------
  28. 1. Include headers
  29. ------------------------------------------------------------------------------*/
  30. #include "EncJpegPutBits.h"
  31. /*------------------------------------------------------------------------------
  32. 2. External compiler flags
  33. --------------------------------------------------------------------------------
  34. --------------------------------------------------------------------------------
  35. 3. Module defines
  36. ------------------------------------------------------------------------------*/
  37. /*------------------------------------------------------------------------------
  38. 4. Local function prototypes
  39. ------------------------------------------------------------------------------*/
  40. /*------------------------------------------------------------------------------
  41. EncJpegHeaderPutBits
  42. Write bits to stream. For example (value=2, number=4) write 0010 to the
  43. stream. Number of bits must be < 25, otherwise overflow occur. Four
  44. bytes is maximum number of bytes to put stream and there should be at
  45. least 5 byte free space available because of byte buffer.
  46. stream[1] bits in byte buffer
  47. stream[0] byte buffer
  48. Input stream Pointer to the stream stucture
  49. value Bit pattern
  50. number Number of bits
  51. ------------------------------------------------------------------------------*/
  52. void EncJpegHeaderPutBits(stream_s * buffer, u32 value, u32 number)
  53. {
  54. u32 bits;
  55. u32 byteBuffer = buffer->byteBuffer;
  56. u8 *stream = buffer->stream;
  57. if(EncJpegBufferStatus(buffer) != ENCHW_OK)
  58. {
  59. return;
  60. }
  61. /* Debug: value is too big */
  62. ASSERT(value < ((u32) 1 << number));
  63. ASSERT(number < 25);
  64. TRACE_BIT_STREAM(value, number);
  65. bits = number + stream[1];
  66. value <<= (32 - bits);
  67. byteBuffer = (((u32) stream[0]) << 24) | value;
  68. while(bits > 7)
  69. {
  70. *stream = (u8) (byteBuffer >> 24);
  71. bits -= 8;
  72. byteBuffer <<= 8;
  73. stream++;
  74. buffer->byteCnt++;
  75. }
  76. stream[0] = (u8) (byteBuffer >> 24);
  77. stream[1] = (u8) bits;
  78. buffer->stream = stream;
  79. buffer->bitCnt += number;
  80. buffer->byteBuffer = byteBuffer;
  81. buffer->bufferedBits = (u8) bits;
  82. return;
  83. }
  84. /*------------------------------------------------------------------------------
  85. EncJpegNextByteAligned
  86. Function add zero stuffing until next byte aligned if needed. Note that
  87. stream->stream[1] is bits in byte bufer.
  88. Input stream Pointer to the stream structure.
  89. ------------------------------------------------------------------------------*/
  90. void EncJpegNextByteAligned(stream_s * stream)
  91. {
  92. if(stream->stream[1] > 0)
  93. {
  94. EncJpegHeaderPutBits(stream, 0, 8 - stream->stream[1]);
  95. COMMENT("Stuffing");
  96. }
  97. return;
  98. }
  99. /*------------------------------------------------------------------------------
  100. EncJpegBufferStatus
  101. Check fullness of stream buffer.
  102. Input stream Pointer to the stream stucture.
  103. Return ENCHW_OK Buffer status is OK.
  104. ENCHW_NOK Buffer overflow.
  105. ------------------------------------------------------------------------------*/
  106. bool_e EncJpegBufferStatus(stream_s * stream)
  107. {
  108. if(stream->byteCnt + 5 > stream->size)
  109. {
  110. stream->overflow = ENCHW_YES;
  111. COMMENT("\nStream buffer is full ");
  112. return ENCHW_NOK;
  113. }
  114. return ENCHW_OK;
  115. }
  116. /*------------------------------------------------------------------------------
  117. EncJpegSetBuffer
  118. Set stream buffer.
  119. Input buffer Pointer to the stream_s structure.
  120. stream Pointer to stream buffer.
  121. size Size of stream buffer.
  122. ------------------------------------------------------------------------------*/
  123. bool_e EncJpegSetBuffer(stream_s * buffer, u8 * stream, u32 size)
  124. {
  125. buffer->stream = stream;
  126. buffer->size = size;
  127. buffer->byteCnt = 0;
  128. buffer->overflow = ENCHW_NO;
  129. buffer->zeroBytes = 0;
  130. buffer->byteBuffer = 0;
  131. buffer->bufferedBits = 0;
  132. if(EncJpegBufferStatus(buffer) != ENCHW_OK)
  133. {
  134. return ENCHW_NOK;
  135. }
  136. buffer->stream[0] = 0;
  137. buffer->stream[1] = 0;
  138. return ENCHW_OK;
  139. }