scale_row.h 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  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_
  11. #define INCLUDE_LIBYUV_SCALE_ROW_H_
  12. #include "libyuv/basic_types.h"
  13. #include "libyuv/scale.h"
  14. #ifdef __cplusplus
  15. namespace libyuv {
  16. extern "C" {
  17. #endif
  18. #if defined(__pnacl__) || defined(__CLR_VER) || \
  19. (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
  20. #define LIBYUV_DISABLE_X86
  21. #endif
  22. // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
  23. #if defined(__has_feature)
  24. #if __has_feature(memory_sanitizer)
  25. #define LIBYUV_DISABLE_X86
  26. #endif
  27. #endif
  28. // GCC >= 4.7.0 required for AVX2.
  29. #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
  30. #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7))
  31. #define GCC_HAS_AVX2 1
  32. #endif // GNUC >= 4.7
  33. #endif // __GNUC__
  34. // clang >= 3.4.0 required for AVX2.
  35. #if defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
  36. #if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4))
  37. #define CLANG_HAS_AVX2 1
  38. #endif // clang >= 3.4
  39. #endif // __clang__
  40. // Visual C 2012 required for AVX2.
  41. #if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \
  42. _MSC_VER >= 1700
  43. #define VISUALC_HAS_AVX2 1
  44. #endif // VisualStudio >= 2012
  45. // The following are available on all x86 platforms:
  46. #if !defined(LIBYUV_DISABLE_X86) && \
  47. (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
  48. #define HAS_FIXEDDIV1_X86
  49. #define HAS_FIXEDDIV_X86
  50. #define HAS_SCALEARGBCOLS_SSE2
  51. #define HAS_SCALEARGBCOLSUP2_SSE2
  52. #define HAS_SCALEARGBFILTERCOLS_SSSE3
  53. #define HAS_SCALEARGBROWDOWN2_SSE2
  54. #define HAS_SCALEARGBROWDOWNEVEN_SSE2
  55. #define HAS_SCALECOLSUP2_SSE2
  56. #define HAS_SCALEFILTERCOLS_SSSE3
  57. #define HAS_SCALEROWDOWN2_SSSE3
  58. #define HAS_SCALEROWDOWN34_SSSE3
  59. #define HAS_SCALEROWDOWN38_SSSE3
  60. #define HAS_SCALEROWDOWN4_SSSE3
  61. #define HAS_SCALEADDROW_SSE2
  62. #endif
  63. // The following are available on all x86 platforms, but
  64. // require VS2012, clang 3.4 or gcc 4.7.
  65. // The code supports NaCL but requires a new compiler and validator.
  66. #if !defined(LIBYUV_DISABLE_X86) && \
  67. (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
  68. defined(GCC_HAS_AVX2))
  69. #define HAS_SCALEADDROW_AVX2
  70. #define HAS_SCALEROWDOWN2_AVX2
  71. #define HAS_SCALEROWDOWN4_AVX2
  72. #endif
  73. // The following are available on Neon platforms:
  74. #if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \
  75. (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__))
  76. #define HAS_SCALEARGBCOLS_NEON
  77. #define HAS_SCALEARGBROWDOWN2_NEON
  78. #define HAS_SCALEARGBROWDOWNEVEN_NEON
  79. #define HAS_SCALEFILTERCOLS_NEON
  80. #define HAS_SCALEROWDOWN2_NEON
  81. #define HAS_SCALEROWDOWN34_NEON
  82. #define HAS_SCALEROWDOWN38_NEON
  83. #define HAS_SCALEROWDOWN4_NEON
  84. #define HAS_SCALEARGBFILTERCOLS_NEON
  85. #endif
  86. // The following are available on Mips platforms:
  87. #if !defined(LIBYUV_DISABLE_DSPR2) && !defined(__native_client__) && \
  88. defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2)
  89. #define HAS_SCALEROWDOWN2_DSPR2
  90. #define HAS_SCALEROWDOWN4_DSPR2
  91. #define HAS_SCALEROWDOWN34_DSPR2
  92. #define HAS_SCALEROWDOWN38_DSPR2
  93. #define HAS_SCALEADDROW_DSPR2
  94. #endif
  95. #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)
  96. #define HAS_SCALEADDROW_MSA
  97. #define HAS_SCALEARGBCOLS_MSA
  98. #define HAS_SCALEARGBFILTERCOLS_MSA
  99. #define HAS_SCALEARGBROWDOWN2_MSA
  100. #define HAS_SCALEARGBROWDOWNEVEN_MSA
  101. #define HAS_SCALEFILTERCOLS_MSA
  102. #define HAS_SCALEROWDOWN2_MSA
  103. #define HAS_SCALEROWDOWN34_MSA
  104. #define HAS_SCALEROWDOWN38_MSA
  105. #define HAS_SCALEROWDOWN4_MSA
  106. #endif
  107. // Scale ARGB vertically with bilinear interpolation.
  108. void ScalePlaneVertical(int src_height,
  109. int dst_width,
  110. int dst_height,
  111. int src_stride,
  112. int dst_stride,
  113. const uint8* src_argb,
  114. uint8* dst_argb,
  115. int x,
  116. int y,
  117. int dy,
  118. int bpp,
  119. enum FilterMode filtering);
  120. void ScalePlaneVertical_16(int src_height,
  121. int dst_width,
  122. int dst_height,
  123. int src_stride,
  124. int dst_stride,
  125. const uint16* src_argb,
  126. uint16* dst_argb,
  127. int x,
  128. int y,
  129. int dy,
  130. int wpp,
  131. enum FilterMode filtering);
  132. // Simplify the filtering based on scale factors.
  133. enum FilterMode ScaleFilterReduce(int src_width,
  134. int src_height,
  135. int dst_width,
  136. int dst_height,
  137. enum FilterMode filtering);
  138. // Divide num by div and return as 16.16 fixed point result.
  139. int FixedDiv_C(int num, int div);
  140. int FixedDiv_X86(int num, int div);
  141. // Divide num - 1 by div - 1 and return as 16.16 fixed point result.
  142. int FixedDiv1_C(int num, int div);
  143. int FixedDiv1_X86(int num, int div);
  144. #ifdef HAS_FIXEDDIV_X86
  145. #define FixedDiv FixedDiv_X86
  146. #define FixedDiv1 FixedDiv1_X86
  147. #else
  148. #define FixedDiv FixedDiv_C
  149. #define FixedDiv1 FixedDiv1_C
  150. #endif
  151. // Compute slope values for stepping.
  152. void ScaleSlope(int src_width,
  153. int src_height,
  154. int dst_width,
  155. int dst_height,
  156. enum FilterMode filtering,
  157. int* x,
  158. int* y,
  159. int* dx,
  160. int* dy);
  161. void ScaleRowDown2_C(const uint8* src_ptr,
  162. ptrdiff_t src_stride,
  163. uint8* dst,
  164. int dst_width);
  165. void ScaleRowDown2_16_C(const uint16* src_ptr,
  166. ptrdiff_t src_stride,
  167. uint16* dst,
  168. int dst_width);
  169. void ScaleRowDown2Linear_C(const uint8* src_ptr,
  170. ptrdiff_t src_stride,
  171. uint8* dst,
  172. int dst_width);
  173. void ScaleRowDown2Linear_16_C(const uint16* src_ptr,
  174. ptrdiff_t src_stride,
  175. uint16* dst,
  176. int dst_width);
  177. void ScaleRowDown2Box_C(const uint8* src_ptr,
  178. ptrdiff_t src_stride,
  179. uint8* dst,
  180. int dst_width);
  181. void ScaleRowDown2Box_Odd_C(const uint8* src_ptr,
  182. ptrdiff_t src_stride,
  183. uint8* dst,
  184. int dst_width);
  185. void ScaleRowDown2Box_16_C(const uint16* src_ptr,
  186. ptrdiff_t src_stride,
  187. uint16* dst,
  188. int dst_width);
  189. void ScaleRowDown4_C(const uint8* src_ptr,
  190. ptrdiff_t src_stride,
  191. uint8* dst,
  192. int dst_width);
  193. void ScaleRowDown4_16_C(const uint16* src_ptr,
  194. ptrdiff_t src_stride,
  195. uint16* dst,
  196. int dst_width);
  197. void ScaleRowDown4Box_C(const uint8* src_ptr,
  198. ptrdiff_t src_stride,
  199. uint8* dst,
  200. int dst_width);
  201. void ScaleRowDown4Box_16_C(const uint16* src_ptr,
  202. ptrdiff_t src_stride,
  203. uint16* dst,
  204. int dst_width);
  205. void ScaleRowDown34_C(const uint8* src_ptr,
  206. ptrdiff_t src_stride,
  207. uint8* dst,
  208. int dst_width);
  209. void ScaleRowDown34_16_C(const uint16* src_ptr,
  210. ptrdiff_t src_stride,
  211. uint16* dst,
  212. int dst_width);
  213. void ScaleRowDown34_0_Box_C(const uint8* src_ptr,
  214. ptrdiff_t src_stride,
  215. uint8* d,
  216. int dst_width);
  217. void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr,
  218. ptrdiff_t src_stride,
  219. uint16* d,
  220. int dst_width);
  221. void ScaleRowDown34_1_Box_C(const uint8* src_ptr,
  222. ptrdiff_t src_stride,
  223. uint8* d,
  224. int dst_width);
  225. void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr,
  226. ptrdiff_t src_stride,
  227. uint16* d,
  228. int dst_width);
  229. void ScaleCols_C(uint8* dst_ptr,
  230. const uint8* src_ptr,
  231. int dst_width,
  232. int x,
  233. int dx);
  234. void ScaleCols_16_C(uint16* dst_ptr,
  235. const uint16* src_ptr,
  236. int dst_width,
  237. int x,
  238. int dx);
  239. void ScaleColsUp2_C(uint8* dst_ptr,
  240. const uint8* src_ptr,
  241. int dst_width,
  242. int,
  243. int);
  244. void ScaleColsUp2_16_C(uint16* dst_ptr,
  245. const uint16* src_ptr,
  246. int dst_width,
  247. int,
  248. int);
  249. void ScaleFilterCols_C(uint8* dst_ptr,
  250. const uint8* src_ptr,
  251. int dst_width,
  252. int x,
  253. int dx);
  254. void ScaleFilterCols_16_C(uint16* dst_ptr,
  255. const uint16* src_ptr,
  256. int dst_width,
  257. int x,
  258. int dx);
  259. void ScaleFilterCols64_C(uint8* dst_ptr,
  260. const uint8* src_ptr,
  261. int dst_width,
  262. int x,
  263. int dx);
  264. void ScaleFilterCols64_16_C(uint16* dst_ptr,
  265. const uint16* src_ptr,
  266. int dst_width,
  267. int x,
  268. int dx);
  269. void ScaleRowDown38_C(const uint8* src_ptr,
  270. ptrdiff_t src_stride,
  271. uint8* dst,
  272. int dst_width);
  273. void ScaleRowDown38_16_C(const uint16* src_ptr,
  274. ptrdiff_t src_stride,
  275. uint16* dst,
  276. int dst_width);
  277. void ScaleRowDown38_3_Box_C(const uint8* src_ptr,
  278. ptrdiff_t src_stride,
  279. uint8* dst_ptr,
  280. int dst_width);
  281. void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr,
  282. ptrdiff_t src_stride,
  283. uint16* dst_ptr,
  284. int dst_width);
  285. void ScaleRowDown38_2_Box_C(const uint8* src_ptr,
  286. ptrdiff_t src_stride,
  287. uint8* dst_ptr,
  288. int dst_width);
  289. void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr,
  290. ptrdiff_t src_stride,
  291. uint16* dst_ptr,
  292. int dst_width);
  293. void ScaleAddRow_C(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  294. void ScaleAddRow_16_C(const uint16* src_ptr, uint32* dst_ptr, int src_width);
  295. void ScaleARGBRowDown2_C(const uint8* src_argb,
  296. ptrdiff_t src_stride,
  297. uint8* dst_argb,
  298. int dst_width);
  299. void ScaleARGBRowDown2Linear_C(const uint8* src_argb,
  300. ptrdiff_t src_stride,
  301. uint8* dst_argb,
  302. int dst_width);
  303. void ScaleARGBRowDown2Box_C(const uint8* src_argb,
  304. ptrdiff_t src_stride,
  305. uint8* dst_argb,
  306. int dst_width);
  307. void ScaleARGBRowDownEven_C(const uint8* src_argb,
  308. ptrdiff_t src_stride,
  309. int src_stepx,
  310. uint8* dst_argb,
  311. int dst_width);
  312. void ScaleARGBRowDownEvenBox_C(const uint8* src_argb,
  313. ptrdiff_t src_stride,
  314. int src_stepx,
  315. uint8* dst_argb,
  316. int dst_width);
  317. void ScaleARGBCols_C(uint8* dst_argb,
  318. const uint8* src_argb,
  319. int dst_width,
  320. int x,
  321. int dx);
  322. void ScaleARGBCols64_C(uint8* dst_argb,
  323. const uint8* src_argb,
  324. int dst_width,
  325. int x,
  326. int dx);
  327. void ScaleARGBColsUp2_C(uint8* dst_argb,
  328. const uint8* src_argb,
  329. int dst_width,
  330. int,
  331. int);
  332. void ScaleARGBFilterCols_C(uint8* dst_argb,
  333. const uint8* src_argb,
  334. int dst_width,
  335. int x,
  336. int dx);
  337. void ScaleARGBFilterCols64_C(uint8* dst_argb,
  338. const uint8* src_argb,
  339. int dst_width,
  340. int x,
  341. int dx);
  342. // Specialized scalers for x86.
  343. void ScaleRowDown2_SSSE3(const uint8* src_ptr,
  344. ptrdiff_t src_stride,
  345. uint8* dst_ptr,
  346. int dst_width);
  347. void ScaleRowDown2Linear_SSSE3(const uint8* src_ptr,
  348. ptrdiff_t src_stride,
  349. uint8* dst_ptr,
  350. int dst_width);
  351. void ScaleRowDown2Box_SSSE3(const uint8* src_ptr,
  352. ptrdiff_t src_stride,
  353. uint8* dst_ptr,
  354. int dst_width);
  355. void ScaleRowDown2_AVX2(const uint8* src_ptr,
  356. ptrdiff_t src_stride,
  357. uint8* dst_ptr,
  358. int dst_width);
  359. void ScaleRowDown2Linear_AVX2(const uint8* src_ptr,
  360. ptrdiff_t src_stride,
  361. uint8* dst_ptr,
  362. int dst_width);
  363. void ScaleRowDown2Box_AVX2(const uint8* src_ptr,
  364. ptrdiff_t src_stride,
  365. uint8* dst_ptr,
  366. int dst_width);
  367. void ScaleRowDown4_SSSE3(const uint8* src_ptr,
  368. ptrdiff_t src_stride,
  369. uint8* dst_ptr,
  370. int dst_width);
  371. void ScaleRowDown4Box_SSSE3(const uint8* src_ptr,
  372. ptrdiff_t src_stride,
  373. uint8* dst_ptr,
  374. int dst_width);
  375. void ScaleRowDown4_AVX2(const uint8* src_ptr,
  376. ptrdiff_t src_stride,
  377. uint8* dst_ptr,
  378. int dst_width);
  379. void ScaleRowDown4Box_AVX2(const uint8* src_ptr,
  380. ptrdiff_t src_stride,
  381. uint8* dst_ptr,
  382. int dst_width);
  383. void ScaleRowDown34_SSSE3(const uint8* src_ptr,
  384. ptrdiff_t src_stride,
  385. uint8* dst_ptr,
  386. int dst_width);
  387. void ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr,
  388. ptrdiff_t src_stride,
  389. uint8* dst_ptr,
  390. int dst_width);
  391. void ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr,
  392. ptrdiff_t src_stride,
  393. uint8* dst_ptr,
  394. int dst_width);
  395. void ScaleRowDown38_SSSE3(const uint8* src_ptr,
  396. ptrdiff_t src_stride,
  397. uint8* dst_ptr,
  398. int dst_width);
  399. void ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr,
  400. ptrdiff_t src_stride,
  401. uint8* dst_ptr,
  402. int dst_width);
  403. void ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr,
  404. ptrdiff_t src_stride,
  405. uint8* dst_ptr,
  406. int dst_width);
  407. void ScaleRowDown2_Any_SSSE3(const uint8* src_ptr,
  408. ptrdiff_t src_stride,
  409. uint8* dst_ptr,
  410. int dst_width);
  411. void ScaleRowDown2Linear_Any_SSSE3(const uint8* src_ptr,
  412. ptrdiff_t src_stride,
  413. uint8* dst_ptr,
  414. int dst_width);
  415. void ScaleRowDown2Box_Any_SSSE3(const uint8* src_ptr,
  416. ptrdiff_t src_stride,
  417. uint8* dst_ptr,
  418. int dst_width);
  419. void ScaleRowDown2Box_Odd_SSSE3(const uint8* src_ptr,
  420. ptrdiff_t src_stride,
  421. uint8* dst_ptr,
  422. int dst_width);
  423. void ScaleRowDown2_Any_AVX2(const uint8* src_ptr,
  424. ptrdiff_t src_stride,
  425. uint8* dst_ptr,
  426. int dst_width);
  427. void ScaleRowDown2Linear_Any_AVX2(const uint8* src_ptr,
  428. ptrdiff_t src_stride,
  429. uint8* dst_ptr,
  430. int dst_width);
  431. void ScaleRowDown2Box_Any_AVX2(const uint8* src_ptr,
  432. ptrdiff_t src_stride,
  433. uint8* dst_ptr,
  434. int dst_width);
  435. void ScaleRowDown2Box_Odd_AVX2(const uint8* src_ptr,
  436. ptrdiff_t src_stride,
  437. uint8* dst_ptr,
  438. int dst_width);
  439. void ScaleRowDown4_Any_SSSE3(const uint8* src_ptr,
  440. ptrdiff_t src_stride,
  441. uint8* dst_ptr,
  442. int dst_width);
  443. void ScaleRowDown4Box_Any_SSSE3(const uint8* src_ptr,
  444. ptrdiff_t src_stride,
  445. uint8* dst_ptr,
  446. int dst_width);
  447. void ScaleRowDown4_Any_AVX2(const uint8* src_ptr,
  448. ptrdiff_t src_stride,
  449. uint8* dst_ptr,
  450. int dst_width);
  451. void ScaleRowDown4Box_Any_AVX2(const uint8* src_ptr,
  452. ptrdiff_t src_stride,
  453. uint8* dst_ptr,
  454. int dst_width);
  455. void ScaleRowDown34_Any_SSSE3(const uint8* src_ptr,
  456. ptrdiff_t src_stride,
  457. uint8* dst_ptr,
  458. int dst_width);
  459. void ScaleRowDown34_1_Box_Any_SSSE3(const uint8* src_ptr,
  460. ptrdiff_t src_stride,
  461. uint8* dst_ptr,
  462. int dst_width);
  463. void ScaleRowDown34_0_Box_Any_SSSE3(const uint8* src_ptr,
  464. ptrdiff_t src_stride,
  465. uint8* dst_ptr,
  466. int dst_width);
  467. void ScaleRowDown38_Any_SSSE3(const uint8* src_ptr,
  468. ptrdiff_t src_stride,
  469. uint8* dst_ptr,
  470. int dst_width);
  471. void ScaleRowDown38_3_Box_Any_SSSE3(const uint8* src_ptr,
  472. ptrdiff_t src_stride,
  473. uint8* dst_ptr,
  474. int dst_width);
  475. void ScaleRowDown38_2_Box_Any_SSSE3(const uint8* src_ptr,
  476. ptrdiff_t src_stride,
  477. uint8* dst_ptr,
  478. int dst_width);
  479. void ScaleAddRow_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  480. void ScaleAddRow_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  481. void ScaleAddRow_Any_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  482. void ScaleAddRow_Any_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  483. void ScaleFilterCols_SSSE3(uint8* dst_ptr,
  484. const uint8* src_ptr,
  485. int dst_width,
  486. int x,
  487. int dx);
  488. void ScaleColsUp2_SSE2(uint8* dst_ptr,
  489. const uint8* src_ptr,
  490. int dst_width,
  491. int x,
  492. int dx);
  493. // ARGB Column functions
  494. void ScaleARGBCols_SSE2(uint8* dst_argb,
  495. const uint8* src_argb,
  496. int dst_width,
  497. int x,
  498. int dx);
  499. void ScaleARGBFilterCols_SSSE3(uint8* dst_argb,
  500. const uint8* src_argb,
  501. int dst_width,
  502. int x,
  503. int dx);
  504. void ScaleARGBColsUp2_SSE2(uint8* dst_argb,
  505. const uint8* src_argb,
  506. int dst_width,
  507. int x,
  508. int dx);
  509. void ScaleARGBFilterCols_NEON(uint8* dst_argb,
  510. const uint8* src_argb,
  511. int dst_width,
  512. int x,
  513. int dx);
  514. void ScaleARGBCols_NEON(uint8* dst_argb,
  515. const uint8* src_argb,
  516. int dst_width,
  517. int x,
  518. int dx);
  519. void ScaleARGBFilterCols_Any_NEON(uint8* dst_argb,
  520. const uint8* src_argb,
  521. int dst_width,
  522. int x,
  523. int dx);
  524. void ScaleARGBCols_Any_NEON(uint8* dst_argb,
  525. const uint8* src_argb,
  526. int dst_width,
  527. int x,
  528. int dx);
  529. void ScaleARGBFilterCols_MSA(uint8* dst_argb,
  530. const uint8* src_argb,
  531. int dst_width,
  532. int x,
  533. int dx);
  534. void ScaleARGBCols_MSA(uint8* dst_argb,
  535. const uint8* src_argb,
  536. int dst_width,
  537. int x,
  538. int dx);
  539. void ScaleARGBFilterCols_Any_MSA(uint8* dst_argb,
  540. const uint8* src_argb,
  541. int dst_width,
  542. int x,
  543. int dx);
  544. void ScaleARGBCols_Any_MSA(uint8* dst_argb,
  545. const uint8* src_argb,
  546. int dst_width,
  547. int x,
  548. int dx);
  549. // ARGB Row functions
  550. void ScaleARGBRowDown2_SSE2(const uint8* src_argb,
  551. ptrdiff_t src_stride,
  552. uint8* dst_argb,
  553. int dst_width);
  554. void ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb,
  555. ptrdiff_t src_stride,
  556. uint8* dst_argb,
  557. int dst_width);
  558. void ScaleARGBRowDown2Box_SSE2(const uint8* src_argb,
  559. ptrdiff_t src_stride,
  560. uint8* dst_argb,
  561. int dst_width);
  562. void ScaleARGBRowDown2_NEON(const uint8* src_ptr,
  563. ptrdiff_t src_stride,
  564. uint8* dst,
  565. int dst_width);
  566. void ScaleARGBRowDown2Linear_NEON(const uint8* src_argb,
  567. ptrdiff_t src_stride,
  568. uint8* dst_argb,
  569. int dst_width);
  570. void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr,
  571. ptrdiff_t src_stride,
  572. uint8* dst,
  573. int dst_width);
  574. void ScaleARGBRowDown2_MSA(const uint8_t* src_argb,
  575. ptrdiff_t src_stride,
  576. uint8_t* dst_argb,
  577. int dst_width);
  578. void ScaleARGBRowDown2Linear_MSA(const uint8_t* src_argb,
  579. ptrdiff_t src_stride,
  580. uint8_t* dst_argb,
  581. int dst_width);
  582. void ScaleARGBRowDown2Box_MSA(const uint8_t* src_argb,
  583. ptrdiff_t src_stride,
  584. uint8_t* dst_argb,
  585. int dst_width);
  586. void ScaleARGBRowDown2_Any_SSE2(const uint8* src_argb,
  587. ptrdiff_t src_stride,
  588. uint8* dst_argb,
  589. int dst_width);
  590. void ScaleARGBRowDown2Linear_Any_SSE2(const uint8* src_argb,
  591. ptrdiff_t src_stride,
  592. uint8* dst_argb,
  593. int dst_width);
  594. void ScaleARGBRowDown2Box_Any_SSE2(const uint8* src_argb,
  595. ptrdiff_t src_stride,
  596. uint8* dst_argb,
  597. int dst_width);
  598. void ScaleARGBRowDown2_Any_NEON(const uint8* src_ptr,
  599. ptrdiff_t src_stride,
  600. uint8* dst,
  601. int dst_width);
  602. void ScaleARGBRowDown2Linear_Any_NEON(const uint8* src_argb,
  603. ptrdiff_t src_stride,
  604. uint8* dst_argb,
  605. int dst_width);
  606. void ScaleARGBRowDown2Box_Any_NEON(const uint8* src_ptr,
  607. ptrdiff_t src_stride,
  608. uint8* dst,
  609. int dst_width);
  610. void ScaleARGBRowDown2_Any_MSA(const uint8_t* src_argb,
  611. ptrdiff_t src_stride,
  612. uint8_t* dst_argb,
  613. int dst_width);
  614. void ScaleARGBRowDown2Linear_Any_MSA(const uint8_t* src_argb,
  615. ptrdiff_t src_stride,
  616. uint8_t* dst_argb,
  617. int dst_width);
  618. void ScaleARGBRowDown2Box_Any_MSA(const uint8_t* src_argb,
  619. ptrdiff_t src_stride,
  620. uint8_t* dst_argb,
  621. int dst_width);
  622. void ScaleARGBRowDownEven_SSE2(const uint8* src_argb,
  623. ptrdiff_t src_stride,
  624. int src_stepx,
  625. uint8* dst_argb,
  626. int dst_width);
  627. void ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb,
  628. ptrdiff_t src_stride,
  629. int src_stepx,
  630. uint8* dst_argb,
  631. int dst_width);
  632. void ScaleARGBRowDownEven_NEON(const uint8* src_argb,
  633. ptrdiff_t src_stride,
  634. int src_stepx,
  635. uint8* dst_argb,
  636. int dst_width);
  637. void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb,
  638. ptrdiff_t src_stride,
  639. int src_stepx,
  640. uint8* dst_argb,
  641. int dst_width);
  642. void ScaleARGBRowDownEven_MSA(const uint8_t* src_argb,
  643. ptrdiff_t src_stride,
  644. int32_t src_stepx,
  645. uint8_t* dst_argb,
  646. int dst_width);
  647. void ScaleARGBRowDownEvenBox_MSA(const uint8* src_argb,
  648. ptrdiff_t src_stride,
  649. int src_stepx,
  650. uint8* dst_argb,
  651. int dst_width);
  652. void ScaleARGBRowDownEven_Any_SSE2(const uint8* src_argb,
  653. ptrdiff_t src_stride,
  654. int src_stepx,
  655. uint8* dst_argb,
  656. int dst_width);
  657. void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8* src_argb,
  658. ptrdiff_t src_stride,
  659. int src_stepx,
  660. uint8* dst_argb,
  661. int dst_width);
  662. void ScaleARGBRowDownEven_Any_NEON(const uint8* src_argb,
  663. ptrdiff_t src_stride,
  664. int src_stepx,
  665. uint8* dst_argb,
  666. int dst_width);
  667. void ScaleARGBRowDownEvenBox_Any_NEON(const uint8* src_argb,
  668. ptrdiff_t src_stride,
  669. int src_stepx,
  670. uint8* dst_argb,
  671. int dst_width);
  672. void ScaleARGBRowDownEven_Any_MSA(const uint8_t* src_argb,
  673. ptrdiff_t src_stride,
  674. int32_t src_stepx,
  675. uint8_t* dst_argb,
  676. int dst_width);
  677. void ScaleARGBRowDownEvenBox_Any_MSA(const uint8* src_argb,
  678. ptrdiff_t src_stride,
  679. int src_stepx,
  680. uint8* dst_argb,
  681. int dst_width);
  682. // ScaleRowDown2Box also used by planar functions
  683. // NEON downscalers with interpolation.
  684. // Note - not static due to reuse in convert for 444 to 420.
  685. void ScaleRowDown2_NEON(const uint8* src_ptr,
  686. ptrdiff_t src_stride,
  687. uint8* dst,
  688. int dst_width);
  689. void ScaleRowDown2Linear_NEON(const uint8* src_ptr,
  690. ptrdiff_t src_stride,
  691. uint8* dst,
  692. int dst_width);
  693. void ScaleRowDown2Box_NEON(const uint8* src_ptr,
  694. ptrdiff_t src_stride,
  695. uint8* dst,
  696. int dst_width);
  697. void ScaleRowDown4_NEON(const uint8* src_ptr,
  698. ptrdiff_t src_stride,
  699. uint8* dst_ptr,
  700. int dst_width);
  701. void ScaleRowDown4Box_NEON(const uint8* src_ptr,
  702. ptrdiff_t src_stride,
  703. uint8* dst_ptr,
  704. int dst_width);
  705. // Down scale from 4 to 3 pixels. Use the neon multilane read/write
  706. // to load up the every 4th pixel into a 4 different registers.
  707. // Point samples 32 pixels to 24 pixels.
  708. void ScaleRowDown34_NEON(const uint8* src_ptr,
  709. ptrdiff_t src_stride,
  710. uint8* dst_ptr,
  711. int dst_width);
  712. void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr,
  713. ptrdiff_t src_stride,
  714. uint8* dst_ptr,
  715. int dst_width);
  716. void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
  717. ptrdiff_t src_stride,
  718. uint8* dst_ptr,
  719. int dst_width);
  720. // 32 -> 12
  721. void ScaleRowDown38_NEON(const uint8* src_ptr,
  722. ptrdiff_t src_stride,
  723. uint8* dst_ptr,
  724. int dst_width);
  725. // 32x3 -> 12x1
  726. void ScaleRowDown38_3_Box_NEON(const uint8* src_ptr,
  727. ptrdiff_t src_stride,
  728. uint8* dst_ptr,
  729. int dst_width);
  730. // 32x2 -> 12x1
  731. void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr,
  732. ptrdiff_t src_stride,
  733. uint8* dst_ptr,
  734. int dst_width);
  735. void ScaleRowDown2_Any_NEON(const uint8* src_ptr,
  736. ptrdiff_t src_stride,
  737. uint8* dst,
  738. int dst_width);
  739. void ScaleRowDown2Linear_Any_NEON(const uint8* src_ptr,
  740. ptrdiff_t src_stride,
  741. uint8* dst,
  742. int dst_width);
  743. void ScaleRowDown2Box_Any_NEON(const uint8* src_ptr,
  744. ptrdiff_t src_stride,
  745. uint8* dst,
  746. int dst_width);
  747. void ScaleRowDown2Box_Odd_NEON(const uint8* src_ptr,
  748. ptrdiff_t src_stride,
  749. uint8* dst,
  750. int dst_width);
  751. void ScaleRowDown4_Any_NEON(const uint8* src_ptr,
  752. ptrdiff_t src_stride,
  753. uint8* dst_ptr,
  754. int dst_width);
  755. void ScaleRowDown4Box_Any_NEON(const uint8* src_ptr,
  756. ptrdiff_t src_stride,
  757. uint8* dst_ptr,
  758. int dst_width);
  759. void ScaleRowDown34_Any_NEON(const uint8* src_ptr,
  760. ptrdiff_t src_stride,
  761. uint8* dst_ptr,
  762. int dst_width);
  763. void ScaleRowDown34_0_Box_Any_NEON(const uint8* src_ptr,
  764. ptrdiff_t src_stride,
  765. uint8* dst_ptr,
  766. int dst_width);
  767. void ScaleRowDown34_1_Box_Any_NEON(const uint8* src_ptr,
  768. ptrdiff_t src_stride,
  769. uint8* dst_ptr,
  770. int dst_width);
  771. // 32 -> 12
  772. void ScaleRowDown38_Any_NEON(const uint8* src_ptr,
  773. ptrdiff_t src_stride,
  774. uint8* dst_ptr,
  775. int dst_width);
  776. // 32x3 -> 12x1
  777. void ScaleRowDown38_3_Box_Any_NEON(const uint8* src_ptr,
  778. ptrdiff_t src_stride,
  779. uint8* dst_ptr,
  780. int dst_width);
  781. // 32x2 -> 12x1
  782. void ScaleRowDown38_2_Box_Any_NEON(const uint8* src_ptr,
  783. ptrdiff_t src_stride,
  784. uint8* dst_ptr,
  785. int dst_width);
  786. void ScaleAddRow_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  787. void ScaleAddRow_Any_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  788. void ScaleFilterCols_NEON(uint8* dst_ptr,
  789. const uint8* src_ptr,
  790. int dst_width,
  791. int x,
  792. int dx);
  793. void ScaleFilterCols_Any_NEON(uint8* dst_ptr,
  794. const uint8* src_ptr,
  795. int dst_width,
  796. int x,
  797. int dx);
  798. void ScaleRowDown2_DSPR2(const uint8* src_ptr,
  799. ptrdiff_t src_stride,
  800. uint8* dst,
  801. int dst_width);
  802. void ScaleRowDown2Box_DSPR2(const uint8* src_ptr,
  803. ptrdiff_t src_stride,
  804. uint8* dst,
  805. int dst_width);
  806. void ScaleRowDown4_DSPR2(const uint8* src_ptr,
  807. ptrdiff_t src_stride,
  808. uint8* dst,
  809. int dst_width);
  810. void ScaleRowDown4Box_DSPR2(const uint8* src_ptr,
  811. ptrdiff_t src_stride,
  812. uint8* dst,
  813. int dst_width);
  814. void ScaleRowDown34_DSPR2(const uint8* src_ptr,
  815. ptrdiff_t src_stride,
  816. uint8* dst,
  817. int dst_width);
  818. void ScaleRowDown34_0_Box_DSPR2(const uint8* src_ptr,
  819. ptrdiff_t src_stride,
  820. uint8* d,
  821. int dst_width);
  822. void ScaleRowDown34_1_Box_DSPR2(const uint8* src_ptr,
  823. ptrdiff_t src_stride,
  824. uint8* d,
  825. int dst_width);
  826. void ScaleRowDown38_DSPR2(const uint8* src_ptr,
  827. ptrdiff_t src_stride,
  828. uint8* dst,
  829. int dst_width);
  830. void ScaleRowDown38_2_Box_DSPR2(const uint8* src_ptr,
  831. ptrdiff_t src_stride,
  832. uint8* dst_ptr,
  833. int dst_width);
  834. void ScaleRowDown38_3_Box_DSPR2(const uint8* src_ptr,
  835. ptrdiff_t src_stride,
  836. uint8* dst_ptr,
  837. int dst_width);
  838. void ScaleAddRow_DSPR2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
  839. void ScaleAddRow_Any_DSPR2(const uint8* src_ptr,
  840. uint16* dst_ptr,
  841. int src_width);
  842. void ScaleRowDown2_MSA(const uint8_t* src_ptr,
  843. ptrdiff_t src_stride,
  844. uint8_t* dst,
  845. int dst_width);
  846. void ScaleRowDown2Linear_MSA(const uint8_t* src_ptr,
  847. ptrdiff_t src_stride,
  848. uint8_t* dst,
  849. int dst_width);
  850. void ScaleRowDown2Box_MSA(const uint8_t* src_ptr,
  851. ptrdiff_t src_stride,
  852. uint8_t* dst,
  853. int dst_width);
  854. void ScaleRowDown4_MSA(const uint8_t* src_ptr,
  855. ptrdiff_t src_stride,
  856. uint8_t* dst,
  857. int dst_width);
  858. void ScaleRowDown4Box_MSA(const uint8_t* src_ptr,
  859. ptrdiff_t src_stride,
  860. uint8_t* dst,
  861. int dst_width);
  862. void ScaleRowDown38_MSA(const uint8_t* src_ptr,
  863. ptrdiff_t src_stride,
  864. uint8_t* dst,
  865. int dst_width);
  866. void ScaleRowDown38_2_Box_MSA(const uint8_t* src_ptr,
  867. ptrdiff_t src_stride,
  868. uint8_t* dst_ptr,
  869. int dst_width);
  870. void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr,
  871. ptrdiff_t src_stride,
  872. uint8_t* dst_ptr,
  873. int dst_width);
  874. void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
  875. void ScaleFilterCols_MSA(uint8* dst_ptr,
  876. const uint8* src_ptr,
  877. int dst_width,
  878. int x,
  879. int dx);
  880. void ScaleRowDown34_MSA(const uint8* src_ptr,
  881. ptrdiff_t src_stride,
  882. uint8* dst_ptr,
  883. int dst_width);
  884. void ScaleRowDown34_0_Box_MSA(const uint8* src_ptr,
  885. ptrdiff_t src_stride,
  886. uint8* dst_ptr,
  887. int dst_width);
  888. void ScaleRowDown34_1_Box_MSA(const uint8* src_ptr,
  889. ptrdiff_t src_stride,
  890. uint8* dst_ptr,
  891. int dst_width);
  892. void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr,
  893. ptrdiff_t src_stride,
  894. uint8_t* dst,
  895. int dst_width);
  896. void ScaleRowDown2Linear_Any_MSA(const uint8_t* src_ptr,
  897. ptrdiff_t src_stride,
  898. uint8_t* dst,
  899. int dst_width);
  900. void ScaleRowDown2Box_Any_MSA(const uint8_t* src_ptr,
  901. ptrdiff_t src_stride,
  902. uint8_t* dst,
  903. int dst_width);
  904. void ScaleRowDown4_Any_MSA(const uint8_t* src_ptr,
  905. ptrdiff_t src_stride,
  906. uint8_t* dst,
  907. int dst_width);
  908. void ScaleRowDown4Box_Any_MSA(const uint8_t* src_ptr,
  909. ptrdiff_t src_stride,
  910. uint8_t* dst,
  911. int dst_width);
  912. void ScaleRowDown38_Any_MSA(const uint8_t* src_ptr,
  913. ptrdiff_t src_stride,
  914. uint8_t* dst,
  915. int dst_width);
  916. void ScaleRowDown38_2_Box_Any_MSA(const uint8_t* src_ptr,
  917. ptrdiff_t src_stride,
  918. uint8_t* dst_ptr,
  919. int dst_width);
  920. void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr,
  921. ptrdiff_t src_stride,
  922. uint8_t* dst_ptr,
  923. int dst_width);
  924. void ScaleAddRow_Any_MSA(const uint8_t* src_ptr,
  925. uint16_t* dst_ptr,
  926. int src_width);
  927. void ScaleFilterCols_Any_MSA(uint8* dst_ptr,
  928. const uint8* src_ptr,
  929. int dst_width,
  930. int x,
  931. int dx);
  932. void ScaleRowDown34_Any_MSA(const uint8* src_ptr,
  933. ptrdiff_t src_stride,
  934. uint8* dst_ptr,
  935. int dst_width);
  936. void ScaleRowDown34_0_Box_Any_MSA(const uint8* src_ptr,
  937. ptrdiff_t src_stride,
  938. uint8* dst_ptr,
  939. int dst_width);
  940. void ScaleRowDown34_1_Box_Any_MSA(const uint8* src_ptr,
  941. ptrdiff_t src_stride,
  942. uint8* dst_ptr,
  943. int dst_width);
  944. #ifdef __cplusplus
  945. } // extern "C"
  946. } // namespace libyuv
  947. #endif
  948. #endif // INCLUDE_LIBYUV_SCALE_ROW_H_