scale_row.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /*
  2. * Copyright 2013 The LibYuv Project Authors. All rights reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef INCLUDE_LIBYUV_SCALE_ROW_H_ // NOLINT
  11. #define INCLUDE_LIBYUV_SCALE_ROW_H_
  12. #include "libyuv/basic_types.h"
  13. #ifdef __cplusplus
  14. namespace libyuv
  15. {
  16. extern "C" {
  17. #endif
  18. #if defined(__pnacl__) || defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \
  19. defined(TARGET_IPHONE_SIMULATOR)
  20. #define LIBYUV_DISABLE_X86
  21. #endif
  22. // The following are available on all x86 platforms:
  23. #if !defined(LIBYUV_DISABLE_X86) && \
  24. (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
  25. #define HAS_SCALEROWDOWN2_SSE2
  26. #define HAS_SCALEROWDOWN4_SSE2
  27. #define HAS_SCALEROWDOWN34_SSSE3
  28. #define HAS_SCALEROWDOWN38_SSSE3
  29. #define HAS_SCALEADDROWS_SSE2
  30. #define HAS_SCALEFILTERCOLS_SSSE3
  31. #define HAS_SCALECOLSUP2_SSE2
  32. #define HAS_SCALEARGBROWDOWN2_SSE2
  33. #define HAS_SCALEARGBROWDOWNEVEN_SSE2
  34. #define HAS_SCALEARGBCOLS_SSE2
  35. #define HAS_SCALEARGBFILTERCOLS_SSSE3
  36. #define HAS_SCALEARGBCOLSUP2_SSE2
  37. #define HAS_FIXEDDIV_X86
  38. #define HAS_FIXEDDIV1_X86
  39. #endif
  40. // The following are available on Neon platforms:
  41. #if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \
  42. (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__))
  43. #define HAS_SCALEROWDOWN2_NEON
  44. #define HAS_SCALEROWDOWN4_NEON
  45. #define HAS_SCALEROWDOWN34_NEON
  46. #define HAS_SCALEROWDOWN38_NEON
  47. #define HAS_SCALEARGBROWDOWNEVEN_NEON
  48. #define HAS_SCALEARGBROWDOWN2_NEON
  49. #endif
  50. // The following are available on Mips platforms:
  51. #if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \
  52. defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2)
  53. #define HAS_SCALEROWDOWN2_MIPS_DSPR2
  54. #define HAS_SCALEROWDOWN4_MIPS_DSPR2
  55. #define HAS_SCALEROWDOWN34_MIPS_DSPR2
  56. #define HAS_SCALEROWDOWN38_MIPS_DSPR2
  57. #endif
  58. // Scale ARGB vertically with bilinear interpolation.
  59. void ScalePlaneVertical(int src_height,
  60. int dst_width, int dst_height,
  61. int src_stride, int dst_stride,
  62. const uint8* src_argb, uint8* dst_argb,
  63. int x, int y, int dy,
  64. int bpp, enum FilterMode filtering);
  65. void ScalePlaneVertical_16(int src_height,
  66. int dst_width, int dst_height,
  67. int src_stride, int dst_stride,
  68. const uint16* src_argb, uint16* dst_argb,
  69. int x, int y, int dy,
  70. int wpp, enum FilterMode filtering);
  71. // Simplify the filtering based on scale factors.
  72. enum FilterMode ScaleFilterReduce(int src_width, int src_height,
  73. int dst_width, int dst_height,
  74. enum FilterMode filtering);
  75. // Divide num by div and return as 16.16 fixed point result.
  76. int FixedDiv_C(int num, int div);
  77. int FixedDiv_X86(int num, int div);
  78. // Divide num - 1 by div - 1 and return as 16.16 fixed point result.
  79. int FixedDiv1_C(int num, int div);
  80. int FixedDiv1_X86(int num, int div);
  81. #ifdef HAS_FIXEDDIV_X86
  82. #define FixedDiv FixedDiv_X86
  83. #define FixedDiv1 FixedDiv1_X86
  84. #else
  85. #define FixedDiv FixedDiv_C
  86. #define FixedDiv1 FixedDiv1_C
  87. #endif
  88. // Compute slope values for stepping.
  89. void ScaleSlope(int src_width, int src_height,
  90. int dst_width, int dst_height,
  91. enum FilterMode filtering,
  92. int* x, int* y, int* dx, int* dy);
  93. void ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride,
  94. uint8* dst, int dst_width);
  95. void ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  96. uint16* dst, int dst_width);
  97. void ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride,
  98. uint8* dst, int dst_width);
  99. void ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  100. uint16* dst, int dst_width);
  101. void ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
  102. uint8* dst, int dst_width);
  103. void ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  104. uint16* dst, int dst_width);
  105. void ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride,
  106. uint8* dst, int dst_width);
  107. void ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  108. uint16* dst, int dst_width);
  109. void ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
  110. uint8* dst, int dst_width);
  111. void ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  112. uint16* dst, int dst_width);
  113. void ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride,
  114. uint8* dst, int dst_width);
  115. void ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  116. uint16* dst, int dst_width);
  117. void ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
  118. uint8* d, int dst_width);
  119. void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  120. uint16* d, int dst_width);
  121. void ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
  122. uint8* d, int dst_width);
  123. void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  124. uint16* d, int dst_width);
  125. void ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr,
  126. int dst_width, int x, int dx);
  127. void ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr,
  128. int dst_width, int x, int dx);
  129. void ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr,
  130. int dst_width, int, int);
  131. void ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr,
  132. int dst_width, int, int);
  133. void ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr,
  134. int dst_width, int x, int dx);
  135. void ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr,
  136. int dst_width, int x, int dx);
  137. void ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr,
  138. int dst_width, int x, int dx);
  139. void ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr,
  140. int dst_width, int x, int dx);
  141. void ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride,
  142. uint8* dst, int dst_width);
  143. void ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  144. uint16* dst, int dst_width);
  145. void ScaleRowDown38_3_Box_C(const uint8* src_ptr,
  146. ptrdiff_t src_stride,
  147. uint8* dst_ptr, int dst_width);
  148. void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr,
  149. ptrdiff_t src_stride,
  150. uint16* dst_ptr, int dst_width);
  151. void ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
  152. uint8* dst_ptr, int dst_width);
  153. void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  154. uint16* dst_ptr, int dst_width);
  155. void ScaleAddRows_C(const uint8* src_ptr, ptrdiff_t src_stride,
  156. uint16* dst_ptr, int src_width, int src_height);
  157. void ScaleAddRows_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
  158. uint32* dst_ptr, int src_width, int src_height);
  159. void ScaleARGBRowDown2_C(const uint8* src_argb,
  160. ptrdiff_t src_stride,
  161. uint8* dst_argb, int dst_width);
  162. void ScaleARGBRowDown2Linear_C(const uint8* src_argb,
  163. ptrdiff_t src_stride,
  164. uint8* dst_argb, int dst_width);
  165. void ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride,
  166. uint8* dst_argb, int dst_width);
  167. void ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride,
  168. int src_stepx,
  169. uint8* dst_argb, int dst_width);
  170. void ScaleARGBRowDownEvenBox_C(const uint8* src_argb,
  171. ptrdiff_t src_stride,
  172. int src_stepx,
  173. uint8* dst_argb, int dst_width);
  174. void ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb,
  175. int dst_width, int x, int dx);
  176. void ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb,
  177. int dst_width, int x, int dx);
  178. void ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb,
  179. int dst_width, int, int);
  180. void ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb,
  181. int dst_width, int x, int dx);
  182. void ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb,
  183. int dst_width, int x, int dx);
  184. void ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  185. uint8* dst_ptr, int dst_width);
  186. void ScaleRowDown2Linear_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  187. uint8* dst_ptr, int dst_width);
  188. void ScaleRowDown2Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  189. uint8* dst_ptr, int dst_width);
  190. void ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  191. uint8* dst_ptr, int dst_width);
  192. void ScaleRowDown4Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  193. uint8* dst_ptr, int dst_width);
  194. void ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
  195. uint8* dst_ptr, int dst_width);
  196. void ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr,
  197. ptrdiff_t src_stride,
  198. uint8* dst_ptr, int dst_width);
  199. void ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr,
  200. ptrdiff_t src_stride,
  201. uint8* dst_ptr, int dst_width);
  202. void ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
  203. uint8* dst_ptr, int dst_width);
  204. void ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr,
  205. ptrdiff_t src_stride,
  206. uint8* dst_ptr, int dst_width);
  207. void ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr,
  208. ptrdiff_t src_stride,
  209. uint8* dst_ptr, int dst_width);
  210. void ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
  211. uint16* dst_ptr, int src_width,
  212. int src_height);
  213. void ScaleFilterCols_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
  214. int dst_width, int x, int dx);
  215. void ScaleColsUp2_SSE2(uint8* dst_ptr, const uint8* src_ptr,
  216. int dst_width, int x, int dx);
  217. void ScaleARGBRowDown2_SSE2(const uint8* src_argb,
  218. ptrdiff_t src_stride,
  219. uint8* dst_argb, int dst_width);
  220. void ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb,
  221. ptrdiff_t src_stride,
  222. uint8* dst_argb, int dst_width);
  223. void ScaleARGBRowDown2Box_SSE2(const uint8* src_argb,
  224. ptrdiff_t src_stride,
  225. uint8* dst_argb, int dst_width);
  226. void ScaleARGBRowDownEven_SSE2(const uint8* src_argb, ptrdiff_t src_stride,
  227. int src_stepx,
  228. uint8* dst_argb, int dst_width);
  229. void ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb,
  230. ptrdiff_t src_stride,
  231. int src_stepx,
  232. uint8* dst_argb, int dst_width);
  233. void ScaleARGBCols_SSE2(uint8* dst_argb, const uint8* src_argb,
  234. int dst_width, int x, int dx);
  235. void ScaleARGBFilterCols_SSSE3(uint8* dst_argb, const uint8* src_argb,
  236. int dst_width, int x, int dx);
  237. void ScaleARGBColsUp2_SSE2(uint8* dst_argb, const uint8* src_argb,
  238. int dst_width, int x, int dx);
  239. // Row functions.
  240. void ScaleARGBRowDownEven_NEON(const uint8* src_argb, ptrdiff_t src_stride,
  241. int src_stepx,
  242. uint8* dst_argb, int dst_width);
  243. void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, ptrdiff_t src_stride,
  244. int src_stepx,
  245. uint8* dst_argb, int dst_width);
  246. void ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  247. uint8* dst, int dst_width);
  248. void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  249. uint8* dst, int dst_width);
  250. // ScaleRowDown2Box also used by planar functions
  251. // NEON downscalers with interpolation.
  252. // Note - not static due to reuse in convert for 444 to 420.
  253. void ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  254. uint8* dst, int dst_width);
  255. void ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  256. uint8* dst, int dst_width);
  257. void ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  258. uint8* dst_ptr, int dst_width);
  259. void ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
  260. uint8* dst_ptr, int dst_width);
  261. // Down scale from 4 to 3 pixels. Use the neon multilane read/write
  262. // to load up the every 4th pixel into a 4 different registers.
  263. // Point samples 32 pixels to 24 pixels.
  264. void ScaleRowDown34_NEON(const uint8* src_ptr,
  265. ptrdiff_t src_stride,
  266. uint8* dst_ptr, int dst_width);
  267. void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr,
  268. ptrdiff_t src_stride,
  269. uint8* dst_ptr, int dst_width);
  270. void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
  271. ptrdiff_t src_stride,
  272. uint8* dst_ptr, int dst_width);
  273. // 32 -> 12
  274. void ScaleRowDown38_NEON(const uint8* src_ptr,
  275. ptrdiff_t src_stride,
  276. uint8* dst_ptr, int dst_width);
  277. // 32x3 -> 12x1
  278. void ScaleRowDown38_3_Box_NEON(const uint8* src_ptr,
  279. ptrdiff_t src_stride,
  280. uint8* dst_ptr, int dst_width);
  281. // 32x2 -> 12x1
  282. void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr,
  283. ptrdiff_t src_stride,
  284. uint8* dst_ptr, int dst_width);
  285. void ScaleRowDown2_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  286. uint8* dst, int dst_width);
  287. void ScaleRowDown2Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  288. uint8* dst, int dst_width);
  289. void ScaleRowDown4_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  290. uint8* dst, int dst_width);
  291. void ScaleRowDown4Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  292. uint8* dst, int dst_width);
  293. void ScaleRowDown34_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  294. uint8* dst, int dst_width);
  295. void ScaleRowDown34_0_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  296. uint8* d, int dst_width);
  297. void ScaleRowDown34_1_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  298. uint8* d, int dst_width);
  299. void ScaleRowDown38_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  300. uint8* dst, int dst_width);
  301. void ScaleRowDown38_2_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
  302. uint8* dst_ptr, int dst_width);
  303. void ScaleRowDown38_3_Box_MIPS_DSPR2(const uint8* src_ptr,
  304. ptrdiff_t src_stride,
  305. uint8* dst_ptr, int dst_width);
  306. #ifdef __cplusplus
  307. } // extern "C"
  308. } // namespace libyuv
  309. #endif
  310. #endif // INCLUDE_LIBYUV_SCALE_ROW_H_ NOLINT