EncJpegCodeFrame.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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 : JPEG Code Frame control
  17. --
  18. ------------------------------------------------------------------------------*/
  19. /*------------------------------------------------------------------------------
  20. 1. Include headers
  21. ------------------------------------------------------------------------------*/
  22. #include "enccommon.h"
  23. #include "ewl.h"
  24. #include "encdebug.h"
  25. #include "EncJpegCodeFrame.h"
  26. /*------------------------------------------------------------------------------
  27. 2. External compiler flags
  28. --------------------------------------------------------------------------------
  29. --------------------------------------------------------------------------------
  30. 3. Module defines
  31. ------------------------------------------------------------------------------*/
  32. /*------------------------------------------------------------------------------
  33. 4. Local function prototypes
  34. ------------------------------------------------------------------------------*/
  35. static void NextHeader(stream_s * stream, jpegData_s * jpeg);
  36. static void EndRi(stream_s * stream, jpegData_s * jpeg);
  37. static void jpegSetNewFrame(jpegInstance_s * inst);
  38. /*------------------------------------------------------------------------------
  39. EncJpegCodeFrame
  40. ------------------------------------------------------------------------------*/
  41. jpegEncodeFrame_e EncJpegCodeFrame(jpegInstance_s * inst)
  42. {
  43. jpegEncodeFrame_e ret;
  44. asicData_s *asic = &inst->asic;
  45. /* set output stream start point in case of whole encoding mode
  46. * and no rst used */
  47. if(inst->stream.byteCnt == 0)
  48. {
  49. inst->jpeg.streamStartAddress = inst->stream.stream;
  50. }
  51. /* set new frame encoding parameters */
  52. jpegSetNewFrame(inst);
  53. /* start hw encoding */
  54. EncAsicFrameStart(inst->asic.ewl, &inst->asic.regs);
  55. {
  56. /* Encode one frame */
  57. i32 ewl_ret;
  58. #ifndef JPEG_SIMULATION
  59. /* Wait for IRQ */
  60. ewl_ret = EWLWaitHwRdy(asic->ewl, NULL);
  61. #else
  62. return JPEGENCODE_OK;
  63. #endif
  64. if(ewl_ret != EWL_OK)
  65. {
  66. if(ewl_ret == EWL_ERROR)
  67. {
  68. /* IRQ error => Stop and release HW */
  69. ret = JPEGENCODE_SYSTEM_ERROR;
  70. }
  71. else /*if(ewl_ret == EWL_HW_WAIT_TIMEOUT) */
  72. {
  73. /* IRQ Timeout => Stop and release HW */
  74. ret = JPEGENCODE_TIMEOUT;
  75. }
  76. EncAsicStop(asic->ewl);
  77. /* Release HW so that it can be used by other codecs */
  78. EWLReleaseHw(asic->ewl);
  79. }
  80. else
  81. {
  82. i32 status = EncAsicCheckStatus_V2(asic);
  83. switch (status)
  84. {
  85. case ASIC_STATUS_ERROR:
  86. ret = JPEGENCODE_HW_ERROR;
  87. break;
  88. case ASIC_STATUS_BUFF_FULL:
  89. ret = JPEGENCODE_OK;
  90. inst->stream.overflow = ENCHW_YES;
  91. break;
  92. case ASIC_STATUS_HW_RESET:
  93. ret = JPEGENCODE_HW_RESET;
  94. break;
  95. case ASIC_STATUS_FRAME_READY:
  96. inst->stream.byteCnt &= (~0x07); /* last not full 64-bit counted in HW data */
  97. inst->stream.byteCnt += asic->regs.outputStrmSize;
  98. ret = JPEGENCODE_OK;
  99. break;
  100. default:
  101. /* should never get here */
  102. ASSERT(0);
  103. ret = JPEGENCODE_HW_ERROR;
  104. }
  105. }
  106. }
  107. /* Handle EOI */
  108. if(ret == JPEGENCODE_OK)
  109. {
  110. /* update mcu count */
  111. if(inst->jpeg.codingType == ENC_PARTIAL_FRAME)
  112. {
  113. if((inst->jpeg.mbNum + inst->jpeg.restart.Ri) <
  114. ((u32) inst->jpeg.mbPerFrame))
  115. {
  116. inst->jpeg.mbNum += inst->jpeg.restart.Ri;
  117. inst->jpeg.row += inst->jpeg.sliceRows;
  118. }
  119. else
  120. {
  121. inst->jpeg.mbNum += (inst->jpeg.mbPerFrame - inst->jpeg.mbNum);
  122. }
  123. }
  124. else
  125. {
  126. inst->jpeg.mbNum += inst->jpeg.mbPerFrame;
  127. }
  128. EndRi(&inst->stream, &inst->jpeg);
  129. }
  130. return ret;
  131. }
  132. /*------------------------------------------------------------------------------
  133. Write the header data (frame header or restart marker) to the stream.
  134. ------------------------------------------------------------------------------*/
  135. void NextHeader(stream_s * stream, jpegData_s * jpeg)
  136. {
  137. if(jpeg->mbNum == 0)
  138. {
  139. (void) EncJpegHdr(stream, jpeg);
  140. }
  141. }
  142. /*------------------------------------------------------------------------------
  143. Write the end of current coding unit (RI / FRAME) into stream.
  144. ------------------------------------------------------------------------------*/
  145. void EndRi(stream_s * stream, jpegData_s * jpeg)
  146. {
  147. /* not needed anymore, ASIC generates EOI marker */
  148. }
  149. /*------------------------------------------------------------------------------
  150. Set encoding parameters at the beginning of a new frame.
  151. ------------------------------------------------------------------------------*/
  152. void jpegSetNewFrame(jpegInstance_s * inst)
  153. {
  154. regValues_s *regs = &inst->asic.regs;
  155. /* Write next header if needed */
  156. NextHeader(&inst->stream, &inst->jpeg);
  157. /* calculate output start point for hw */
  158. regs->outputStrmSize -= inst->stream.byteCnt;
  159. regs->outputStrmSize /= 8; /* 64-bit addresses */
  160. regs->outputStrmSize &= (~0x07); /* 8 multiple size */
  161. /* 64-bit aligned stream base address */
  162. regs->outputStrmBase += (inst->stream.byteCnt & (~0x07));
  163. /* bit offset in the last 64-bit word */
  164. regs->firstFreeBit = (inst->stream.byteCnt & 0x07) * 8;
  165. /* header remainder is byte aligned, max 7 bytes = 56 bits */
  166. if(regs->firstFreeBit != 0)
  167. {
  168. /* 64-bit aligned stream pointer */
  169. u8 *pTmp = (u8 *) ((size_t) (inst->stream.stream) & (~0x07));
  170. u32 val;
  171. /* Clear remaining bits */
  172. for (val = 6; val >= regs->firstFreeBit/8; val--)
  173. pTmp[val] = 0;
  174. val = pTmp[0] << 24;
  175. val |= pTmp[1] << 16;
  176. val |= pTmp[2] << 8;
  177. val |= pTmp[3];
  178. regs->strmStartMSB = val; /* 32 bits to MSB */
  179. if(regs->firstFreeBit > 32)
  180. {
  181. val = pTmp[4] << 24;
  182. val |= pTmp[5] << 16;
  183. val |= pTmp[6] << 8;
  184. regs->strmStartLSB = val;
  185. }
  186. else
  187. regs->strmStartLSB = 0;
  188. }
  189. else
  190. {
  191. regs->strmStartMSB = regs->strmStartLSB = 0;
  192. }
  193. }