encpreprocess.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  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. -- Description : Preprocessor setup
  17. --
  18. ------------------------------------------------------------------------------*/
  19. /*------------------------------------------------------------------------------
  20. 1. Include headers
  21. ------------------------------------------------------------------------------*/
  22. #include "encpreprocess.h"
  23. #include "enccommon.h"
  24. /*------------------------------------------------------------------------------
  25. EncPreProcessCheck
  26. Check image size: Cropped frame _must_ fit inside of source image
  27. Input preProcess Pointer to preProcess_s structure.
  28. Return ENCHW_OK No errors.
  29. ENCHW_NOK Error condition.
  30. ------------------------------------------------------------------------------*/
  31. i32 EncPreProcessCheck(const preProcess_s * preProcess)
  32. {
  33. i32 status = ENCHW_OK;
  34. u32 tmp;
  35. u32 width, height;
  36. #if 0
  37. u32 w_mask;
  38. if(preProcess->inputFormat == 0)
  39. w_mask = 0x0F; /* 16 multiple */
  40. else
  41. w_mask = 0x07; /* 8 multiple */
  42. if(preProcess->lumWidthSrc & w_mask)
  43. {
  44. status = ENCHW_NOK;
  45. }
  46. #endif
  47. if(preProcess->lumHeightSrc & 0x01)
  48. {
  49. status = ENCHW_NOK;
  50. }
  51. if(preProcess->lumWidthSrc > MAX_INPUT_IMAGE_WIDTH)
  52. {
  53. status = ENCHW_NOK;
  54. }
  55. width = preProcess->lumWidth;
  56. height = preProcess->lumHeight;
  57. if(preProcess->rotation)
  58. {
  59. u32 tmp;
  60. tmp = width;
  61. width = height;
  62. height = tmp;
  63. }
  64. /* Bottom right corner */
  65. tmp = preProcess->horOffsetSrc + width;
  66. if(tmp > preProcess->lumWidthSrc)
  67. {
  68. status = ENCHW_NOK;
  69. }
  70. tmp = preProcess->verOffsetSrc + height;
  71. if(tmp > preProcess->lumHeightSrc)
  72. {
  73. status = ENCHW_NOK;
  74. }
  75. return status;
  76. }
  77. /*------------------------------------------------------------------------------
  78. EncPreProcess
  79. Preform cropping
  80. Input asic Pointer to asicData_s structure
  81. preProcess Pointer to preProcess_s structure.
  82. ------------------------------------------------------------------------------*/
  83. void EncPreProcess(asicData_s * asic, const preProcess_s * preProcess)
  84. {
  85. u32 tmp;
  86. u32 width, height;
  87. regValues_s *regs;
  88. u32 stride;
  89. ASSERT(asic != NULL && preProcess != NULL);
  90. regs = &asic->regs;
  91. stride = (preProcess->lumWidthSrc + 15) & (~15); /* 16 pixel multiple stride */
  92. /* cropping */
  93. if(preProcess->inputFormat <= 1) /* YUV 420 */
  94. {
  95. /* Input image position after crop and stabilization */
  96. tmp = preProcess->verOffsetSrc;
  97. tmp *= stride;
  98. tmp += preProcess->horOffsetSrc;
  99. regs->inputLumBase += (tmp & (~7));
  100. regs->inputLumaBaseOffset = tmp & 7;
  101. if(preProcess->videoStab)
  102. regs->vsNextLumaBase += (tmp & (~7));
  103. /* Chroma */
  104. if(preProcess->inputFormat == 0)
  105. {
  106. tmp = preProcess->verOffsetSrc / 2;
  107. tmp *= stride / 2;
  108. tmp += preProcess->horOffsetSrc / 2;
  109. regs->inputCbBase += (tmp & (~7));
  110. regs->inputCrBase += (tmp & (~7));
  111. regs->inputChromaBaseOffset = tmp & 7;
  112. }
  113. else
  114. {
  115. tmp = preProcess->verOffsetSrc / 2;
  116. tmp *= stride / 2;
  117. tmp += preProcess->horOffsetSrc / 2;
  118. tmp *= 2;
  119. regs->inputCbBase += (tmp & (~7));
  120. regs->inputChromaBaseOffset = tmp & 7;
  121. }
  122. }
  123. else if(preProcess->inputFormat <= 9) /* YUV 422 / RGB 16bpp */
  124. {
  125. /* Input image position after crop and stabilization */
  126. tmp = preProcess->verOffsetSrc;
  127. tmp *= stride;
  128. tmp += preProcess->horOffsetSrc;
  129. tmp *= 2;
  130. regs->inputLumBase += (tmp & (~7));
  131. regs->inputLumaBaseOffset = tmp & 7;
  132. regs->inputChromaBaseOffset = (regs->inputLumaBaseOffset / 4) * 4;
  133. if(preProcess->videoStab)
  134. regs->vsNextLumaBase += (tmp & (~7));
  135. }
  136. else /* RGB 32bpp */
  137. {
  138. /* Input image position after crop and stabilization */
  139. tmp = preProcess->verOffsetSrc;
  140. tmp *= stride;
  141. tmp += preProcess->horOffsetSrc;
  142. tmp *= 4;
  143. regs->inputLumBase += (tmp & (~7));
  144. /* Note: HW does the cropping AFTER RGB to YUYV conversion
  145. * so the offset is calculated using 16bpp */
  146. regs->inputLumaBaseOffset = (tmp & 7)/2;
  147. if(preProcess->videoStab)
  148. regs->vsNextLumaBase += (tmp & (~7));
  149. }
  150. /* YUV subsampling and rotation */
  151. if (preProcess->inputFormat <= 3)
  152. regs->inputImageFormat = preProcess->inputFormat; /* YUV */
  153. else if (preProcess->inputFormat <= 5)
  154. regs->inputImageFormat = ASIC_INPUT_RGB565; /* 16-bit RGB */
  155. else if (preProcess->inputFormat <= 7)
  156. regs->inputImageFormat = ASIC_INPUT_RGB555; /* 15-bit RGB */
  157. else if (preProcess->inputFormat <= 9)
  158. regs->inputImageFormat = ASIC_INPUT_RGB444; /* 12-bit RGB */
  159. else if (preProcess->inputFormat <= 11)
  160. regs->inputImageFormat = ASIC_INPUT_RGB888; /* 24-bit RGB */
  161. else
  162. regs->inputImageFormat = ASIC_INPUT_RGB101010; /* 30-bit RGB */
  163. regs->inputImageRotation = preProcess->rotation;
  164. /* source image setup, size and fill */
  165. width = preProcess->lumWidth;
  166. height = preProcess->lumHeight;
  167. if(preProcess->rotation)
  168. {
  169. u32 tmp;
  170. tmp = width;
  171. width = height;
  172. height = tmp;
  173. }
  174. /* Set mandatory input parameters in asic structure */
  175. regs->mbsInRow = (width + 15) / 16;
  176. regs->mbsInCol = (height + 15) / 16;
  177. regs->pixelsOnRow = stride;
  178. /* Set the overfill values */
  179. if(width & 0x0F)
  180. regs->xFill = (16 - (width & 0x0F)) / 4;
  181. else
  182. regs->xFill = 0;
  183. if(height & 0x0F)
  184. regs->yFill = 16 - (height & 0x0F);
  185. else
  186. regs->yFill = 0;
  187. /* video stabilization */
  188. if(regs->codingType != ASIC_JPEG && preProcess->videoStab != 0)
  189. regs->vsMode = 2;
  190. else
  191. regs->vsMode = 0;
  192. #ifdef TRACE_PREPROCESS
  193. EncTracePreProcess(preProcess);
  194. #endif
  195. return;
  196. }
  197. /*------------------------------------------------------------------------------
  198. EncSetColorConversion
  199. Set color conversion coefficients and RGB input mask
  200. Input asic Pointer to asicData_s structure
  201. preProcess Pointer to preProcess_s structure.
  202. ------------------------------------------------------------------------------*/
  203. void EncSetColorConversion(preProcess_s * preProcess, asicData_s * asic)
  204. {
  205. regValues_s *regs;
  206. ASSERT(asic != NULL && preProcess != NULL);
  207. regs = &asic->regs;
  208. switch (preProcess->colorConversionType)
  209. {
  210. case 0: /* BT.601 */
  211. default:
  212. /* Y = 0.2989 R + 0.5866 G + 0.1145 B
  213. * Cb = 0.5647 (B - Y) + 128
  214. * Cr = 0.7132 (R - Y) + 128
  215. */
  216. preProcess->colorConversionType = 0;
  217. regs->colorConversionCoeffA = preProcess->colorConversionCoeffA = 19589;
  218. regs->colorConversionCoeffB = preProcess->colorConversionCoeffB = 38443;
  219. regs->colorConversionCoeffC = preProcess->colorConversionCoeffC = 7504;
  220. regs->colorConversionCoeffE = preProcess->colorConversionCoeffE = 37008;
  221. regs->colorConversionCoeffF = preProcess->colorConversionCoeffF = 46740;
  222. break;
  223. case 1: /* BT.709 */
  224. /* Y = 0.2126 R + 0.7152 G + 0.0722 B
  225. * Cb = 0.5389 (B - Y) + 128
  226. * Cr = 0.6350 (R - Y) + 128
  227. */
  228. regs->colorConversionCoeffA = preProcess->colorConversionCoeffA = 13933;
  229. regs->colorConversionCoeffB = preProcess->colorConversionCoeffB = 46871;
  230. regs->colorConversionCoeffC = preProcess->colorConversionCoeffC = 4732;
  231. regs->colorConversionCoeffE = preProcess->colorConversionCoeffE = 35317;
  232. regs->colorConversionCoeffF = preProcess->colorConversionCoeffF = 41615;
  233. break;
  234. case 2: /* User defined */
  235. /* Limitations for coefficients: A+B+C <= 65536 */
  236. regs->colorConversionCoeffA = preProcess->colorConversionCoeffA;
  237. regs->colorConversionCoeffB = preProcess->colorConversionCoeffB;
  238. regs->colorConversionCoeffC = preProcess->colorConversionCoeffC;
  239. regs->colorConversionCoeffE = preProcess->colorConversionCoeffE;
  240. regs->colorConversionCoeffF = preProcess->colorConversionCoeffF;
  241. }
  242. /* Setup masks to separate R, G and B from RGB */
  243. switch (preProcess->inputFormat)
  244. {
  245. case 4: /* RGB565 */
  246. regs->rMaskMsb = 15;
  247. regs->gMaskMsb = 10;
  248. regs->bMaskMsb = 4;
  249. break;
  250. case 5: /* BGR565 */
  251. regs->bMaskMsb = 15;
  252. regs->gMaskMsb = 10;
  253. regs->rMaskMsb = 4;
  254. break;
  255. case 6: /* RGB555 */
  256. regs->rMaskMsb = 14;
  257. regs->gMaskMsb = 9;
  258. regs->bMaskMsb = 4;
  259. break;
  260. case 7: /* BGR555 */
  261. regs->bMaskMsb = 14;
  262. regs->gMaskMsb = 9;
  263. regs->rMaskMsb = 4;
  264. break;
  265. case 8: /* RGB444 */
  266. regs->rMaskMsb = 11;
  267. regs->gMaskMsb = 7;
  268. regs->bMaskMsb = 3;
  269. break;
  270. case 9: /* BGR444 */
  271. regs->bMaskMsb = 11;
  272. regs->gMaskMsb = 7;
  273. regs->rMaskMsb = 3;
  274. break;
  275. case 10: /* RGB888 */
  276. regs->rMaskMsb = 23;
  277. regs->gMaskMsb = 15;
  278. regs->bMaskMsb = 7;
  279. break;
  280. case 11: /* BGR888 */
  281. regs->bMaskMsb = 23;
  282. regs->gMaskMsb = 15;
  283. regs->rMaskMsb = 7;
  284. break;
  285. case 12: /* RGB101010 */
  286. regs->rMaskMsb = 29;
  287. regs->gMaskMsb = 19;
  288. regs->bMaskMsb = 9;
  289. break;
  290. case 13: /* BGR101010 */
  291. regs->bMaskMsb = 29;
  292. regs->gMaskMsb = 19;
  293. regs->rMaskMsb = 9;
  294. break;
  295. default:
  296. /* No masks needed for YUV format */
  297. regs->rMaskMsb = regs->gMaskMsb = regs->bMaskMsb = 0;
  298. }
  299. }