OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2016 The LibYuv Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 YUVTORGB(src0, src1, src2, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, | 222 YUVTORGB(src0, src1, src2, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, |
223 vec_br, vec_yg, vec0, vec1, vec2); | 223 vec_br, vec_yg, vec0, vec1, vec2); |
224 STOREARGB(vec0, vec1, vec2, const_255, rgb_buf); | 224 STOREARGB(vec0, vec1, vec2, const_255, rgb_buf); |
225 src_y += 8; | 225 src_y += 8; |
226 src_u += 4; | 226 src_u += 4; |
227 src_v += 4; | 227 src_v += 4; |
228 rgb_buf += 32; | 228 rgb_buf += 32; |
229 } | 229 } |
230 } | 230 } |
231 | 231 |
232 void YUVTORGBARow_MSA(const uint8* src_y, | 232 void I422ToRGBARow_MSA(const uint8* src_y, |
233 const uint8* src_u, | 233 const uint8* src_u, |
234 const uint8* src_v, | 234 const uint8* src_v, |
235 uint8* rgb_buf, | 235 uint8* rgb_buf, |
236 const struct YuvConstants* yuvconstants, | 236 const struct YuvConstants* yuvconstants, |
237 int width) { | 237 int width) { |
238 int x; | 238 int x; |
239 v16u8 src0, src1, src2; | 239 v16u8 src0, src1, src2; |
240 v8i16 vec0, vec1, vec2; | 240 v8i16 vec0, vec1, vec2; |
241 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; | 241 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; |
242 v16u8 const_255 = (v16u8)__msa_ldi_b(255); | 242 v16u8 const_255 = (v16u8)__msa_ldi_b(255); |
243 | 243 |
244 YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, | 244 YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, |
245 vec_br, vec_yg); | 245 vec_br, vec_yg); |
246 | 246 |
247 for (x = 0; x < width; x += 8) { | 247 for (x = 0; x < width; x += 8) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 src3 = (v16u8)__msa_ilvr_b((v16i8)src3, (v16i8)src3); | 282 src3 = (v16u8)__msa_ilvr_b((v16i8)src3, (v16i8)src3); |
283 STOREARGB(vec0, vec1, vec2, src3, rgb_buf); | 283 STOREARGB(vec0, vec1, vec2, src3, rgb_buf); |
284 src_y += 8; | 284 src_y += 8; |
285 src_u += 4; | 285 src_u += 4; |
286 src_v += 4; | 286 src_v += 4; |
287 src_a += 8; | 287 src_a += 8; |
288 rgb_buf += 32; | 288 rgb_buf += 32; |
289 } | 289 } |
290 } | 290 } |
291 | 291 |
292 void YUVTORGB24Row_MSA(const uint8* src_y, | 292 void I422ToRGB24Row_MSA(const uint8* src_y, |
293 const uint8* src_u, | 293 const uint8* src_u, |
294 const uint8* src_v, | 294 const uint8* src_v, |
295 uint8* rgb_buf, | 295 uint8* rgb_buf, |
296 const struct YuvConstants* yuvconstants, | 296 const struct YuvConstants* yuvconstants, |
297 int32 width) { | 297 int32 width) { |
298 int x; | 298 int x; |
299 int64 data_u, data_v; | 299 int64 data_u, data_v; |
300 v16u8 src0, src1, src2, src3, src4, src5, dst0, dst1, dst2; | 300 v16u8 src0, src1, src2, src3, src4, src5, dst0, dst1, dst2; |
301 v8i16 vec0, vec1, vec2, vec3, vec4, vec5; | 301 v8i16 vec0, vec1, vec2, vec3, vec4, vec5; |
302 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; | 302 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; |
303 v16u8 reg0, reg1, reg2, reg3; | 303 v16u8 reg0, reg1, reg2, reg3; |
304 v2i64 zero = {0}; | 304 v2i64 zero = {0}; |
305 v16i8 shuffler0 = {0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, 8, 9, 20, 10}; | 305 v16i8 shuffler0 = {0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, 8, 9, 20, 10}; |
306 v16i8 shuffler1 = {0, 21, 1, 2, 22, 3, 4, 23, 5, 6, 24, 7, 8, 25, 9, 10}; | 306 v16i8 shuffler1 = {0, 21, 1, 2, 22, 3, 4, 23, 5, 6, 24, 7, 8, 25, 9, 10}; |
307 v16i8 shuffler2 = {26, 6, 7, 27, 8, 9, 28, 10, | 307 v16i8 shuffler2 = {26, 6, 7, 27, 8, 9, 28, 10, |
(...skipping 25 matching lines...) Expand all Loading... |
333 ST_UB2(dst0, dst1, rgb_buf, 16); | 333 ST_UB2(dst0, dst1, rgb_buf, 16); |
334 ST_UB(dst2, (rgb_buf + 32)); | 334 ST_UB(dst2, (rgb_buf + 32)); |
335 src_y += 16; | 335 src_y += 16; |
336 src_u += 8; | 336 src_u += 8; |
337 src_v += 8; | 337 src_v += 8; |
338 rgb_buf += 48; | 338 rgb_buf += 48; |
339 } | 339 } |
340 } | 340 } |
341 | 341 |
342 // TODO(fbarchard): Consider AND instead of shift to isolate 5 upper bits of R. | 342 // TODO(fbarchard): Consider AND instead of shift to isolate 5 upper bits of R. |
343 void YUVTORGB565Row_MSA(const uint8* src_y, | 343 void I422ToRGB565Row_MSA(const uint8* src_y, |
344 const uint8* src_u, | 344 const uint8* src_u, |
345 const uint8* src_v, | 345 const uint8* src_v, |
346 uint8* dst_rgb565, | 346 uint8* dst_rgb565, |
347 const struct YuvConstants* yuvconstants, | 347 const struct YuvConstants* yuvconstants, |
348 int width) { | 348 int width) { |
349 int x; | 349 int x; |
350 v16u8 src0, src1, src2, dst0; | 350 v16u8 src0, src1, src2, dst0; |
351 v8i16 vec0, vec1, vec2; | 351 v8i16 vec0, vec1, vec2; |
352 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; | 352 v4i32 vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, vec_br, vec_yg; |
353 | 353 |
354 YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, | 354 YUVTORGB_SETUP(yuvconstants, vec_ub, vec_vr, vec_ug, vec_vg, vec_bb, vec_bg, |
355 vec_br, vec_yg); | 355 vec_br, vec_yg); |
356 | 356 |
357 for (x = 0; x < width; x += 8) { | 357 for (x = 0; x < width; x += 8) { |
358 READYUV422(src_y, src_u, src_v, src0, src1, src2); | 358 READYUV422(src_y, src_u, src_v, src0, src1, src2); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 dst1 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4); | 733 dst1 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4); |
734 ST_UB(dst0, dst_u); | 734 ST_UB(dst0, dst_u); |
735 ST_UB(dst1, dst_v); | 735 ST_UB(dst1, dst_v); |
736 src_argb0 += 128; | 736 src_argb0 += 128; |
737 src_argb0_next += 128; | 737 src_argb0_next += 128; |
738 dst_u += 16; | 738 dst_u += 16; |
739 dst_v += 16; | 739 dst_v += 16; |
740 } | 740 } |
741 } | 741 } |
742 | 742 |
| 743 void ARGBToRGB24Row_MSA(const uint8* src_argb, uint8* dst_rgb, int width) { |
| 744 int x; |
| 745 v16u8 src0, src1, src2, src3, dst0, dst1, dst2; |
| 746 v16i8 shuffler0 = {0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20}; |
| 747 v16i8 shuffler1 = { 5, 6, 8, 9, 10, 12, 13, 14, |
| 748 16, 17, 18, 20, 21, 22, 24, 25}; |
| 749 v16i8 shuffler2 = {10, 12, 13, 14, 16, 17, 18, 20, |
| 750 21, 22, 24, 25, 26, 28, 29, 30}; |
| 751 |
| 752 for (x = 0; x < width; x += 16) { |
| 753 src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0); |
| 754 src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16); |
| 755 src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32); |
| 756 src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48); |
| 757 dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)src1, (v16i8)src0); |
| 758 dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)src2, (v16i8)src1); |
| 759 dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)src3, (v16i8)src2); |
| 760 ST_UB2(dst0, dst1, dst_rgb, 16); |
| 761 ST_UB(dst2, (dst_rgb + 32)); |
| 762 src_argb += 64; |
| 763 dst_rgb += 48; |
| 764 } |
| 765 } |
| 766 |
| 767 void ARGBToRAWRow_MSA(const uint8* src_argb, uint8* dst_rgb, int width) { |
| 768 int x; |
| 769 v16u8 src0, src1, src2, src3, dst0, dst1, dst2; |
| 770 v16i8 shuffler0 = {2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 18, 17, 16, 22}; |
| 771 v16i8 shuffler1 = { 5, 4, 10, 9, 8, 14, 13, 12, |
| 772 18, 17, 16, 22, 21, 20, 26, 25}; |
| 773 v16i8 shuffler2 = { 8, 14, 13, 12, 18, 17, 16, 22, |
| 774 21, 20, 26, 25, 24, 30, 29, 28}; |
| 775 |
| 776 for (x = 0; x < width; x += 16) { |
| 777 src0 = (v16u8)__msa_ld_b((v16i8*)src_argb, 0); |
| 778 src1 = (v16u8)__msa_ld_b((v16i8*)src_argb, 16); |
| 779 src2 = (v16u8)__msa_ld_b((v16i8*)src_argb, 32); |
| 780 src3 = (v16u8)__msa_ld_b((v16i8*)src_argb, 48); |
| 781 dst0 = (v16u8)__msa_vshf_b(shuffler0, (v16i8)src1, (v16i8)src0); |
| 782 dst1 = (v16u8)__msa_vshf_b(shuffler1, (v16i8)src2, (v16i8)src1); |
| 783 dst2 = (v16u8)__msa_vshf_b(shuffler2, (v16i8)src3, (v16i8)src2); |
| 784 ST_UB2(dst0, dst1, dst_rgb, 16); |
| 785 ST_UB(dst2, (dst_rgb + 32)); |
| 786 src_argb += 64; |
| 787 dst_rgb += 48; |
| 788 } |
| 789 } |
| 790 |
743 void ARGB4444ToARGBRow_MSA(const uint8* src_argb4444, | 791 void ARGB4444ToARGBRow_MSA(const uint8* src_argb4444, |
744 uint8* dst_argb, | 792 uint8* dst_argb, |
745 int width) { | 793 int width) { |
746 int x; | 794 int x; |
747 v16u8 src0, src1; | 795 v16u8 src0, src1; |
748 v8u16 vec0, vec1, vec2, vec3; | 796 v8u16 vec0, vec1, vec2, vec3; |
749 v16u8 dst0, dst1, dst2, dst3; | 797 v16u8 dst0, dst1, dst2, dst3; |
750 | 798 |
751 for (x = 0; x < width; x += 16) { | 799 for (x = 0; x < width; x += 16) { |
752 src0 = (v16u8)__msa_ld_b((v16u8*)src_argb4444, 0); | 800 src0 = (v16u8)__msa_ld_b((v16u8*)src_argb4444, 0); |
(...skipping 15 matching lines...) Expand all Loading... |
768 dst_argb += 64; | 816 dst_argb += 64; |
769 } | 817 } |
770 } | 818 } |
771 | 819 |
772 #ifdef __cplusplus | 820 #ifdef __cplusplus |
773 } // extern "C" | 821 } // extern "C" |
774 } // namespace libyuv | 822 } // namespace libyuv |
775 #endif | 823 #endif |
776 | 824 |
777 #endif // !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) | 825 #endif // !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) |
OLD | NEW |