You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_mat_pixel_rotate.cpp 6.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // Tencent is pleased to support the open source community by making ncnn available.
  2. //
  3. // Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
  4. //
  5. // Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  6. // in compliance with the License. You may obtain a copy of the License at
  7. //
  8. // https://opensource.org/licenses/BSD-3-Clause
  9. //
  10. // Unless required by applicable law or agreed to in writing, software distributed
  11. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  12. // CONDITIONS OF ANY KIND, either express or implied. See the License for the
  13. // specific language governing permissions and limitations under the License.
  14. #include "mat.h"
  15. #include "prng.h"
  16. #include <string.h>
  17. static struct prng_rand_t g_prng_rand_state;
  18. #define SRAND(seed) prng_srand(seed, &g_prng_rand_state)
  19. #define RAND() prng_rand(&g_prng_rand_state)
  20. static ncnn::Mat RandomMat(int w, int h, int elempack)
  21. {
  22. ncnn::Mat m(w, h, (size_t)elempack, elempack);
  23. unsigned char* p = m;
  24. for (int i = 0; i < w * h * elempack; i++)
  25. {
  26. p[i] = RAND() % 256;
  27. }
  28. return m;
  29. }
  30. static int test_mat_pixel_rotate_c1(int w, int h)
  31. {
  32. ncnn::Mat a0 = RandomMat(w, h, 1);
  33. ncnn::Mat a1(w, h, 1u, 1);
  34. ncnn::Mat a2(w, h, 1u, 1);
  35. ncnn::Mat a3(w, h, 1u, 1);
  36. ncnn::Mat a4(w, h, 1u, 1);
  37. ncnn::Mat a5(h, w, 1u, 1);
  38. ncnn::Mat a6(w, h, 1u, 1);
  39. ncnn::Mat a7(h, w, 1u, 1);
  40. ncnn::Mat a8(w, h, 1u, 1);
  41. ncnn::kanna_rotate_c1(a0, w, h, a1, w, h, 1);
  42. ncnn::kanna_rotate_c1(a1, w, h, a2, w, h, 2);
  43. ncnn::kanna_rotate_c1(a2, w, h, a3, w, h, 3);
  44. ncnn::kanna_rotate_c1(a3, w, h, a4, w, h, 4);
  45. ncnn::kanna_rotate_c1(a4, w, h, a5, h, w, 5);
  46. ncnn::kanna_rotate_c1(a5, h, w, a6, w, h, 6);
  47. ncnn::kanna_rotate_c1(a6, w, h, a7, h, w, 7);
  48. ncnn::kanna_rotate_c1(a7, h, w, a8, w, h, 8);
  49. if (memcmp(a0, a8, w * h * 1) != 0)
  50. {
  51. fprintf(stderr, "test_mat_pixel_rotate_c1 failed w=%d h=%d\n", w, h);
  52. return -1;
  53. }
  54. return 0;
  55. }
  56. static int test_mat_pixel_rotate_c2(int w, int h)
  57. {
  58. ncnn::Mat a0 = RandomMat(w, h, 2);
  59. ncnn::Mat a1(w, h, 2u, 2);
  60. ncnn::Mat a2(w, h, 2u, 2);
  61. ncnn::Mat a3(w, h, 2u, 2);
  62. ncnn::Mat a4(w, h, 2u, 2);
  63. ncnn::Mat a5(h, w, 2u, 2);
  64. ncnn::Mat a6(w, h, 2u, 2);
  65. ncnn::Mat a7(h, w, 2u, 2);
  66. ncnn::Mat a8(w, h, 2u, 2);
  67. ncnn::kanna_rotate_c2(a0, w, h, a1, w, h, 1);
  68. ncnn::kanna_rotate_c2(a1, w, h, a2, w, h, 2);
  69. ncnn::kanna_rotate_c2(a2, w, h, a3, w, h, 3);
  70. ncnn::kanna_rotate_c2(a3, w, h, a4, w, h, 4);
  71. ncnn::kanna_rotate_c2(a4, w, h, a5, h, w, 5);
  72. ncnn::kanna_rotate_c2(a5, h, w, a6, w, h, 6);
  73. ncnn::kanna_rotate_c2(a6, w, h, a7, h, w, 7);
  74. ncnn::kanna_rotate_c2(a7, h, w, a8, w, h, 8);
  75. if (memcmp(a0, a8, w * h * 2) != 0)
  76. {
  77. fprintf(stderr, "test_mat_pixel_rotate_c2 failed w=%d h=%d\n", w, h);
  78. return -1;
  79. }
  80. return 0;
  81. }
  82. static int test_mat_pixel_rotate_c3(int w, int h)
  83. {
  84. ncnn::Mat a0 = RandomMat(w, h, 3);
  85. ncnn::Mat a1(w, h, 3u, 3);
  86. ncnn::Mat a2(w, h, 3u, 3);
  87. ncnn::Mat a3(w, h, 3u, 3);
  88. ncnn::Mat a4(w, h, 3u, 3);
  89. ncnn::Mat a5(h, w, 3u, 3);
  90. ncnn::Mat a6(w, h, 3u, 3);
  91. ncnn::Mat a7(h, w, 3u, 3);
  92. ncnn::Mat a8(w, h, 3u, 3);
  93. ncnn::kanna_rotate_c3(a0, w, h, a1, w, h, 1);
  94. ncnn::kanna_rotate_c3(a1, w, h, a2, w, h, 2);
  95. ncnn::kanna_rotate_c3(a2, w, h, a3, w, h, 3);
  96. ncnn::kanna_rotate_c3(a3, w, h, a4, w, h, 4);
  97. ncnn::kanna_rotate_c3(a4, w, h, a5, h, w, 5);
  98. ncnn::kanna_rotate_c3(a5, h, w, a6, w, h, 6);
  99. ncnn::kanna_rotate_c3(a6, w, h, a7, h, w, 7);
  100. ncnn::kanna_rotate_c3(a7, h, w, a8, w, h, 8);
  101. if (memcmp(a0, a8, w * h * 3) != 0)
  102. {
  103. fprintf(stderr, "test_mat_pixel_rotate_c3 failed w=%d h=%d\n", w, h);
  104. return -1;
  105. }
  106. return 0;
  107. }
  108. static int test_mat_pixel_rotate_c4(int w, int h)
  109. {
  110. ncnn::Mat a0 = RandomMat(w, h, 4);
  111. ncnn::Mat a1(w, h, 4u, 4);
  112. ncnn::Mat a2(w, h, 4u, 4);
  113. ncnn::Mat a3(w, h, 4u, 4);
  114. ncnn::Mat a4(w, h, 4u, 4);
  115. ncnn::Mat a5(h, w, 4u, 4);
  116. ncnn::Mat a6(w, h, 4u, 4);
  117. ncnn::Mat a7(h, w, 4u, 4);
  118. ncnn::Mat a8(w, h, 4u, 4);
  119. ncnn::kanna_rotate_c4(a0, w, h, a1, w, h, 1);
  120. ncnn::kanna_rotate_c4(a1, w, h, a2, w, h, 2);
  121. ncnn::kanna_rotate_c4(a2, w, h, a3, w, h, 3);
  122. ncnn::kanna_rotate_c4(a3, w, h, a4, w, h, 4);
  123. ncnn::kanna_rotate_c4(a4, w, h, a5, h, w, 5);
  124. ncnn::kanna_rotate_c4(a5, h, w, a6, w, h, 6);
  125. ncnn::kanna_rotate_c4(a6, w, h, a7, h, w, 7);
  126. ncnn::kanna_rotate_c4(a7, h, w, a8, w, h, 8);
  127. if (memcmp(a0, a8, w * h * 4) != 0)
  128. {
  129. fprintf(stderr, "test_mat_pixel_rotate_c4 failed w=%d h=%d\n", w, h);
  130. return -1;
  131. }
  132. return 0;
  133. }
  134. static int test_mat_pixel_rotate_0()
  135. {
  136. return 0
  137. || test_mat_pixel_rotate_c1(6, 7)
  138. || test_mat_pixel_rotate_c2(6, 7)
  139. || test_mat_pixel_rotate_c3(6, 7)
  140. || test_mat_pixel_rotate_c4(6, 7)
  141. || test_mat_pixel_rotate_c1(12, 16)
  142. || test_mat_pixel_rotate_c2(12, 16)
  143. || test_mat_pixel_rotate_c3(12, 16)
  144. || test_mat_pixel_rotate_c4(12, 16)
  145. || test_mat_pixel_rotate_c1(22, 33)
  146. || test_mat_pixel_rotate_c2(22, 33)
  147. || test_mat_pixel_rotate_c3(22, 33)
  148. || test_mat_pixel_rotate_c4(22, 33);
  149. }
  150. static int test_mat_pixel_rotate_yuv420sp(int w, int h)
  151. {
  152. ncnn::Mat a0 = RandomMat(w, h * 3 / 2, 1);
  153. ncnn::Mat a1(w, h * 3 / 2, 1u, 1);
  154. ncnn::Mat a2(w, h * 3 / 2, 1u, 1);
  155. ncnn::Mat a3(w, h * 3 / 2, 1u, 1);
  156. ncnn::Mat a4(w, h * 3 / 2, 1u, 1);
  157. ncnn::Mat a5(h, w * 3 / 2, 1u, 1);
  158. ncnn::Mat a6(w, h * 3 / 2, 1u, 1);
  159. ncnn::Mat a7(h, w * 3 / 2, 1u, 1);
  160. ncnn::Mat a8(w, h * 3 / 2, 1u, 1);
  161. ncnn::kanna_rotate_yuv420sp(a0, w, h, a1, w, h, 1);
  162. ncnn::kanna_rotate_yuv420sp(a1, w, h, a2, w, h, 2);
  163. ncnn::kanna_rotate_yuv420sp(a2, w, h, a3, w, h, 3);
  164. ncnn::kanna_rotate_yuv420sp(a3, w, h, a4, w, h, 4);
  165. ncnn::kanna_rotate_yuv420sp(a4, w, h, a5, h, w, 5);
  166. ncnn::kanna_rotate_yuv420sp(a5, h, w, a6, w, h, 6);
  167. ncnn::kanna_rotate_yuv420sp(a6, w, h, a7, h, w, 7);
  168. ncnn::kanna_rotate_yuv420sp(a7, h, w, a8, w, h, 8);
  169. if (memcmp(a0, a8, w * h * 3 / 2) != 0)
  170. {
  171. fprintf(stderr, "test_mat_pixel_rotate_yuv420sp failed w=%d h=%d\n", w, h);
  172. return -1;
  173. }
  174. return 0;
  175. }
  176. static int test_mat_pixel_rotate_1()
  177. {
  178. return 0
  179. || test_mat_pixel_rotate_yuv420sp(6, 4)
  180. || test_mat_pixel_rotate_yuv420sp(12, 16)
  181. || test_mat_pixel_rotate_yuv420sp(22, 34);
  182. }
  183. int main()
  184. {
  185. SRAND(7767517);
  186. return 0
  187. || test_mat_pixel_rotate_0()
  188. || test_mat_pixel_rotate_1();
  189. }