OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 The WebRTC 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 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 ASSERT_TRUE(ms.get() != NULL); | 761 ASSERT_TRUE(ms.get() != NULL); |
762 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_RAW, | 762 std::unique_ptr<T> frame1 = ConvertRgb(ms.get(), cricket::FOURCC_RAW, |
763 kWidth, kHeight); | 763 kWidth, kHeight); |
764 ASSERT_TRUE(frame1); | 764 ASSERT_TRUE(frame1); |
765 T frame2; | 765 T frame2; |
766 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_RAW, | 766 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_RAW, |
767 kWidth, kHeight, &frame2)); | 767 kWidth, kHeight, &frame2)); |
768 EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); | 768 EXPECT_TRUE(IsEqual(*frame1, frame2, 2)); |
769 } | 769 } |
770 | 770 |
771 // Test constructing an image from a RGB565 buffer | |
772 void ConstructRGB565() { | |
773 T frame1, frame2; | |
774 size_t out_size = kWidth * kHeight * 2; | |
775 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); | |
776 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); | |
777 T frame; | |
778 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | |
779 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_RGBP, | |
780 out, | |
781 out_size, kWidth * 2)); | |
782 EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_RGBP, | |
783 kWidth, kHeight, &frame2)); | |
784 EXPECT_TRUE(IsEqual(frame1, frame2, 20)); | |
785 } | |
786 | |
787 // Test constructing an image from a ARGB1555 buffer | |
788 void ConstructARGB1555() { | |
789 T frame1, frame2; | |
790 size_t out_size = kWidth * kHeight * 2; | |
791 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); | |
792 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); | |
793 T frame; | |
794 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | |
795 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_RGBO, | |
796 out, | |
797 out_size, kWidth * 2)); | |
798 EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_RGBO, | |
799 kWidth, kHeight, &frame2)); | |
800 EXPECT_TRUE(IsEqual(frame1, frame2, 20)); | |
801 } | |
802 | |
803 // Test constructing an image from a ARGB4444 buffer | |
804 void ConstructARGB4444() { | |
805 T frame1, frame2; | |
806 size_t out_size = kWidth * kHeight * 2; | |
807 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); | |
808 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); | |
809 T frame; | |
810 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | |
811 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(cricket::FOURCC_R444, | |
812 out, | |
813 out_size, kWidth * 2)); | |
814 EXPECT_TRUE(LoadFrame(out, out_size, cricket::FOURCC_R444, | |
815 kWidth, kHeight, &frame2)); | |
816 EXPECT_TRUE(IsEqual(frame1, frame2, 20)); | |
817 } | |
818 | |
819 // Macro to help test different rotations | 771 // Macro to help test different rotations |
820 #define TEST_MIRROR(FOURCC, BPP) \ | 772 #define TEST_MIRROR(FOURCC, BPP) \ |
821 void Construct##FOURCC##Mirror() { \ | 773 void Construct##FOURCC##Mirror() { \ |
822 T frame1, frame2, frame3; \ | 774 T frame1, frame2, frame3; \ |
823 std::unique_ptr<rtc::MemoryStream> ms( \ | 775 std::unique_ptr<rtc::MemoryStream> ms( \ |
824 CreateYuvSample(kWidth, kHeight, BPP)); \ | 776 CreateYuvSample(kWidth, kHeight, BPP)); \ |
825 ASSERT_TRUE(ms.get() != NULL); \ | 777 ASSERT_TRUE(ms.get() != NULL); \ |
826 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, \ | 778 EXPECT_TRUE(LoadFrame(ms.get(), cricket::FOURCC_##FOURCC, kWidth, \ |
827 -kHeight, kWidth, kHeight, \ | 779 -kHeight, kWidth, kHeight, \ |
828 webrtc::kVideoRotation_180, &frame1)); \ | 780 webrtc::kVideoRotation_180, &frame1)); \ |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 sizeof(pixels5x5), 0, | 956 sizeof(pixels5x5), 0, |
1005 webrtc::kVideoRotation_0)); | 957 webrtc::kVideoRotation_0)); |
1006 } | 958 } |
1007 EXPECT_EQ(5, frame.width()); | 959 EXPECT_EQ(5, frame.width()); |
1008 EXPECT_EQ(5, frame.height()); | 960 EXPECT_EQ(5, frame.height()); |
1009 EXPECT_EQ(5, frame.video_frame_buffer()->StrideY()); | 961 EXPECT_EQ(5, frame.video_frame_buffer()->StrideY()); |
1010 EXPECT_EQ(3, frame.video_frame_buffer()->StrideU()); | 962 EXPECT_EQ(3, frame.video_frame_buffer()->StrideU()); |
1011 EXPECT_EQ(3, frame.video_frame_buffer()->StrideV()); | 963 EXPECT_EQ(3, frame.video_frame_buffer()->StrideV()); |
1012 } | 964 } |
1013 | 965 |
1014 // Test 1 pixel edge case image ARGB buffer. | |
1015 void ConstructARGB1Pixel() { | |
1016 T frame; | |
1017 uint8_t pixel[4] = {64, 128, 192, 255}; | |
1018 for (int i = 0; i < repeat_; ++i) { | |
1019 EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 1, 1, 1, 1, pixel, | |
1020 sizeof(pixel), 0, | |
1021 webrtc::kVideoRotation_0)); | |
1022 } | |
1023 // Convert back to ARGB. | |
1024 size_t out_size = 4; | |
1025 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); | |
1026 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); | |
1027 | |
1028 EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, | |
1029 out, | |
1030 out_size, // buffer size | |
1031 out_size)); // stride | |
1032 #ifdef USE_LMI_CONVERT | |
1033 // TODO(fbarchard): Expected to fail, but not crash. | |
1034 EXPECT_FALSE(IsPlaneEqual("argb", pixel, 4, out, 4, 3, 1, 2)); | |
1035 #else | |
1036 // TODO(fbarchard): Check for overwrite. | |
1037 EXPECT_TRUE(IsPlaneEqual("argb", pixel, 4, out, 4, 3, 1, 2)); | |
1038 #endif | |
1039 } | |
1040 | |
1041 // Test Black, White and Grey pixels. | |
1042 void ConstructARGBBlackWhitePixel() { | |
1043 T frame; | |
1044 uint8_t pixel[10 * 4] = {0, 0, 0, 255, // Black. | |
1045 0, 0, 0, 255, // Black. | |
1046 64, 64, 64, 255, // Dark Grey. | |
1047 64, 64, 64, 255, // Dark Grey. | |
1048 128, 128, 128, 255, // Grey. | |
1049 128, 128, 128, 255, // Grey. | |
1050 196, 196, 196, 255, // Light Grey. | |
1051 196, 196, 196, 255, // Light Grey. | |
1052 255, 255, 255, 255, // White. | |
1053 255, 255, 255, 255}; // White. | |
1054 | |
1055 for (int i = 0; i < repeat_; ++i) { | |
1056 EXPECT_TRUE(frame.Init(cricket::FOURCC_ARGB, 10, 1, 10, 1, pixel, | |
1057 sizeof(pixel), 1, 1, 0, | |
1058 webrtc::kVideoRotation_0)); | |
1059 } | |
1060 // Convert back to ARGB | |
1061 size_t out_size = 10 * 4; | |
1062 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment]); | |
1063 uint8_t* out = ALIGNP(outbuf.get(), kAlignment); | |
1064 | |
1065 EXPECT_EQ(out_size, frame.ConvertToRgbBuffer(cricket::FOURCC_ARGB, | |
1066 out, | |
1067 out_size, // buffer size. | |
1068 out_size)); // stride. | |
1069 EXPECT_TRUE(IsPlaneEqual("argb", pixel, out_size, | |
1070 out, out_size, | |
1071 out_size, 1, 2)); | |
1072 } | |
1073 | |
1074 // Test constructing an image from an I420 buffer with horizontal cropping. | 966 // Test constructing an image from an I420 buffer with horizontal cropping. |
1075 void ConstructI420CropHorizontal() { | 967 void ConstructI420CropHorizontal() { |
1076 T frame1, frame2; | 968 T frame1, frame2; |
1077 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | 969 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); |
1078 ASSERT_TRUE(LoadFrame(kImageFilename, kYuvExtension, | 970 ASSERT_TRUE(LoadFrame(kImageFilename, kYuvExtension, |
1079 cricket::FOURCC_I420, kWidth, kHeight, | 971 cricket::FOURCC_I420, kWidth, kHeight, |
1080 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0, | 972 kWidth * 3 / 4, kHeight, webrtc::kVideoRotation_0, |
1081 &frame2)); | 973 &frame2)); |
1082 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 0)); | 974 EXPECT_TRUE(IsEqualWithCrop(frame2, frame1, kWidth / 8, 0, 0)); |
1083 } | 975 } |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1432 kOddWidth + i, kOddHeight + j, &frame2)); | 1324 kOddWidth + i, kOddHeight + j, &frame2)); |
1433 EXPECT_TRUE(IsEqual(*frame1, frame2, 64)); | 1325 EXPECT_TRUE(IsEqual(*frame1, frame2, 64)); |
1434 } | 1326 } |
1435 } | 1327 } |
1436 } | 1328 } |
1437 | 1329 |
1438 ////////////////////// | 1330 ////////////////////// |
1439 // Conversion tests // | 1331 // Conversion tests // |
1440 ////////////////////// | 1332 ////////////////////// |
1441 | 1333 |
1442 enum ToFrom { TO, FROM }; | |
1443 | |
1444 // Helper function for test converting from I420 to packed formats. | |
1445 inline void ConvertToBuffer(int bpp, | |
1446 int rowpad, | |
1447 bool invert, | |
1448 ToFrom to_from, | |
1449 int error, | |
1450 uint32_t fourcc, | |
1451 int (*RGBToI420)(const uint8_t* src_frame, | |
1452 int src_stride_frame, | |
1453 uint8_t* dst_y, | |
1454 int dst_stride_y, | |
1455 uint8_t* dst_u, | |
1456 int dst_stride_u, | |
1457 uint8_t* dst_v, | |
1458 int dst_stride_v, | |
1459 int width, | |
1460 int height)) { | |
1461 T frame1, frame2; | |
1462 int repeat_to = (to_from == TO) ? repeat_ : 1; | |
1463 int repeat_from = (to_from == FROM) ? repeat_ : 1; | |
1464 | |
1465 int astride = kWidth * bpp + rowpad; | |
1466 size_t out_size = astride * kHeight; | |
1467 std::unique_ptr<uint8_t[]> outbuf(new uint8_t[out_size + kAlignment + 1]); | |
1468 memset(outbuf.get(), 0, out_size + kAlignment + 1); | |
1469 uint8_t* outtop = ALIGNP(outbuf.get(), kAlignment); | |
1470 uint8_t* out = outtop; | |
1471 int stride = astride; | |
1472 if (invert) { | |
1473 out += (kHeight - 1) * stride; // Point to last row. | |
1474 stride = -stride; | |
1475 } | |
1476 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | |
1477 | |
1478 for (int i = 0; i < repeat_to; ++i) { | |
1479 EXPECT_EQ(out_size, frame1.ConvertToRgbBuffer(fourcc, | |
1480 out, | |
1481 out_size, stride)); | |
1482 } | |
1483 frame2.InitToEmptyBuffer(kWidth, kHeight); | |
1484 for (int i = 0; i < repeat_from; ++i) { | |
1485 EXPECT_EQ(0, RGBToI420(out, stride, | |
1486 frame2.video_frame_buffer()->MutableDataY(), | |
1487 frame2.video_frame_buffer()->StrideY(), | |
1488 frame2.video_frame_buffer()->MutableDataU(), | |
1489 frame2.video_frame_buffer()->StrideU(), | |
1490 frame2.video_frame_buffer()->MutableDataV(), | |
1491 frame2.video_frame_buffer()->StrideV(), | |
1492 kWidth, kHeight)); | |
1493 } | |
1494 if (rowpad) { | |
1495 EXPECT_EQ(0, outtop[kWidth * bpp]); // Ensure stride skipped end of row. | |
1496 EXPECT_NE(0, outtop[astride]); // Ensure pixel at start of 2nd row. | |
1497 } else { | |
1498 EXPECT_NE(0, outtop[kWidth * bpp]); // Expect something to be here. | |
1499 } | |
1500 EXPECT_EQ(0, outtop[out_size]); // Ensure no overrun. | |
1501 EXPECT_TRUE(IsEqual(frame1, frame2, error)); | |
1502 } | |
1503 | |
1504 static const int kError = 20; | |
1505 static const int kErrorHigh = 40; | |
1506 static const int kOddStride = 23; | |
1507 | |
1508 // Tests ConvertToRGBBuffer formats. | |
1509 void ConvertToARGBBuffer() { | |
1510 ConvertToBuffer(4, 0, false, TO, kError, | |
1511 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1512 } | |
1513 void ConvertToBGRABuffer() { | |
1514 ConvertToBuffer(4, 0, false, TO, kError, | |
1515 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1516 } | |
1517 void ConvertToABGRBuffer() { | |
1518 ConvertToBuffer(4, 0, false, TO, kError, | |
1519 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1520 } | |
1521 void ConvertToRGB24Buffer() { | |
1522 ConvertToBuffer(3, 0, false, TO, kError, | |
1523 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1524 } | |
1525 void ConvertToRAWBuffer() { | |
1526 ConvertToBuffer(3, 0, false, TO, kError, | |
1527 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1528 } | |
1529 void ConvertToRGB565Buffer() { | |
1530 ConvertToBuffer(2, 0, false, TO, kError, | |
1531 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1532 } | |
1533 void ConvertToARGB1555Buffer() { | |
1534 ConvertToBuffer(2, 0, false, TO, kError, | |
1535 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1536 } | |
1537 void ConvertToARGB4444Buffer() { | |
1538 ConvertToBuffer(2, 0, false, TO, kError, | |
1539 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1540 } | |
1541 void ConvertToI400Buffer() { | |
1542 ConvertToBuffer(1, 0, false, TO, 128, | |
1543 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1544 } | |
1545 void ConvertToYUY2Buffer() { | |
1546 ConvertToBuffer(2, 0, false, TO, kError, | |
1547 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1548 } | |
1549 void ConvertToUYVYBuffer() { | |
1550 ConvertToBuffer(2, 0, false, TO, kError, | |
1551 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1552 } | |
1553 | |
1554 // Tests ConvertToRGBBuffer formats with odd stride. | |
1555 void ConvertToARGBBufferStride() { | |
1556 ConvertToBuffer(4, kOddStride, false, TO, kError, | |
1557 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1558 } | |
1559 void ConvertToBGRABufferStride() { | |
1560 ConvertToBuffer(4, kOddStride, false, TO, kError, | |
1561 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1562 } | |
1563 void ConvertToABGRBufferStride() { | |
1564 ConvertToBuffer(4, kOddStride, false, TO, kError, | |
1565 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1566 } | |
1567 void ConvertToRGB24BufferStride() { | |
1568 ConvertToBuffer(3, kOddStride, false, TO, kError, | |
1569 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1570 } | |
1571 void ConvertToRAWBufferStride() { | |
1572 ConvertToBuffer(3, kOddStride, false, TO, kError, | |
1573 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1574 } | |
1575 void ConvertToRGB565BufferStride() { | |
1576 ConvertToBuffer(2, kOddStride, false, TO, kError, | |
1577 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1578 } | |
1579 void ConvertToARGB1555BufferStride() { | |
1580 ConvertToBuffer(2, kOddStride, false, TO, kError, | |
1581 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1582 } | |
1583 void ConvertToARGB4444BufferStride() { | |
1584 ConvertToBuffer(2, kOddStride, false, TO, kError, | |
1585 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1586 } | |
1587 void ConvertToI400BufferStride() { | |
1588 ConvertToBuffer(1, kOddStride, false, TO, 128, | |
1589 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1590 } | |
1591 void ConvertToYUY2BufferStride() { | |
1592 ConvertToBuffer(2, kOddStride, false, TO, kError, | |
1593 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1594 } | |
1595 void ConvertToUYVYBufferStride() { | |
1596 ConvertToBuffer(2, kOddStride, false, TO, kError, | |
1597 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1598 } | |
1599 | |
1600 // Tests ConvertToRGBBuffer formats with negative stride to invert image. | |
1601 void ConvertToARGBBufferInverted() { | |
1602 ConvertToBuffer(4, 0, true, TO, kError, | |
1603 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1604 } | |
1605 void ConvertToBGRABufferInverted() { | |
1606 ConvertToBuffer(4, 0, true, TO, kError, | |
1607 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1608 } | |
1609 void ConvertToABGRBufferInverted() { | |
1610 ConvertToBuffer(4, 0, true, TO, kError, | |
1611 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1612 } | |
1613 void ConvertToRGB24BufferInverted() { | |
1614 ConvertToBuffer(3, 0, true, TO, kError, | |
1615 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1616 } | |
1617 void ConvertToRAWBufferInverted() { | |
1618 ConvertToBuffer(3, 0, true, TO, kError, | |
1619 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1620 } | |
1621 void ConvertToRGB565BufferInverted() { | |
1622 ConvertToBuffer(2, 0, true, TO, kError, | |
1623 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1624 } | |
1625 void ConvertToARGB1555BufferInverted() { | |
1626 ConvertToBuffer(2, 0, true, TO, kError, | |
1627 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1628 } | |
1629 void ConvertToARGB4444BufferInverted() { | |
1630 ConvertToBuffer(2, 0, true, TO, kError, | |
1631 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1632 } | |
1633 void ConvertToI400BufferInverted() { | |
1634 ConvertToBuffer(1, 0, true, TO, 128, | |
1635 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1636 } | |
1637 void ConvertToYUY2BufferInverted() { | |
1638 ConvertToBuffer(2, 0, true, TO, kError, | |
1639 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1640 } | |
1641 void ConvertToUYVYBufferInverted() { | |
1642 ConvertToBuffer(2, 0, true, TO, kError, | |
1643 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1644 } | |
1645 | |
1646 // Tests ConvertFrom formats. | |
1647 void ConvertFromARGBBuffer() { | |
1648 ConvertToBuffer(4, 0, false, FROM, kError, | |
1649 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1650 } | |
1651 void ConvertFromBGRABuffer() { | |
1652 ConvertToBuffer(4, 0, false, FROM, kError, | |
1653 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1654 } | |
1655 void ConvertFromABGRBuffer() { | |
1656 ConvertToBuffer(4, 0, false, FROM, kError, | |
1657 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1658 } | |
1659 void ConvertFromRGB24Buffer() { | |
1660 ConvertToBuffer(3, 0, false, FROM, kError, | |
1661 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1662 } | |
1663 void ConvertFromRAWBuffer() { | |
1664 ConvertToBuffer(3, 0, false, FROM, kError, | |
1665 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1666 } | |
1667 void ConvertFromRGB565Buffer() { | |
1668 ConvertToBuffer(2, 0, false, FROM, kError, | |
1669 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1670 } | |
1671 void ConvertFromARGB1555Buffer() { | |
1672 ConvertToBuffer(2, 0, false, FROM, kError, | |
1673 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1674 } | |
1675 void ConvertFromARGB4444Buffer() { | |
1676 ConvertToBuffer(2, 0, false, FROM, kError, | |
1677 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1678 } | |
1679 void ConvertFromI400Buffer() { | |
1680 ConvertToBuffer(1, 0, false, FROM, 128, | |
1681 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1682 } | |
1683 void ConvertFromYUY2Buffer() { | |
1684 ConvertToBuffer(2, 0, false, FROM, kError, | |
1685 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1686 } | |
1687 void ConvertFromUYVYBuffer() { | |
1688 ConvertToBuffer(2, 0, false, FROM, kError, | |
1689 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1690 } | |
1691 | |
1692 // Tests ConvertFrom formats with odd stride. | |
1693 void ConvertFromARGBBufferStride() { | |
1694 ConvertToBuffer(4, kOddStride, false, FROM, kError, | |
1695 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1696 } | |
1697 void ConvertFromBGRABufferStride() { | |
1698 ConvertToBuffer(4, kOddStride, false, FROM, kError, | |
1699 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1700 } | |
1701 void ConvertFromABGRBufferStride() { | |
1702 ConvertToBuffer(4, kOddStride, false, FROM, kError, | |
1703 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1704 } | |
1705 void ConvertFromRGB24BufferStride() { | |
1706 ConvertToBuffer(3, kOddStride, false, FROM, kError, | |
1707 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1708 } | |
1709 void ConvertFromRAWBufferStride() { | |
1710 ConvertToBuffer(3, kOddStride, false, FROM, kError, | |
1711 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1712 } | |
1713 void ConvertFromRGB565BufferStride() { | |
1714 ConvertToBuffer(2, kOddStride, false, FROM, kError, | |
1715 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1716 } | |
1717 void ConvertFromARGB1555BufferStride() { | |
1718 ConvertToBuffer(2, kOddStride, false, FROM, kError, | |
1719 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1720 } | |
1721 void ConvertFromARGB4444BufferStride() { | |
1722 ConvertToBuffer(2, kOddStride, false, FROM, kError, | |
1723 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1724 } | |
1725 void ConvertFromI400BufferStride() { | |
1726 ConvertToBuffer(1, kOddStride, false, FROM, 128, | |
1727 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1728 } | |
1729 void ConvertFromYUY2BufferStride() { | |
1730 ConvertToBuffer(2, kOddStride, false, FROM, kError, | |
1731 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1732 } | |
1733 void ConvertFromUYVYBufferStride() { | |
1734 ConvertToBuffer(2, kOddStride, false, FROM, kError, | |
1735 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1736 } | |
1737 | |
1738 // Tests ConvertFrom formats with negative stride to invert image. | |
1739 void ConvertFromARGBBufferInverted() { | |
1740 ConvertToBuffer(4, 0, true, FROM, kError, | |
1741 cricket::FOURCC_ARGB, libyuv::ARGBToI420); | |
1742 } | |
1743 void ConvertFromBGRABufferInverted() { | |
1744 ConvertToBuffer(4, 0, true, FROM, kError, | |
1745 cricket::FOURCC_BGRA, libyuv::BGRAToI420); | |
1746 } | |
1747 void ConvertFromABGRBufferInverted() { | |
1748 ConvertToBuffer(4, 0, true, FROM, kError, | |
1749 cricket::FOURCC_ABGR, libyuv::ABGRToI420); | |
1750 } | |
1751 void ConvertFromRGB24BufferInverted() { | |
1752 ConvertToBuffer(3, 0, true, FROM, kError, | |
1753 cricket::FOURCC_24BG, libyuv::RGB24ToI420); | |
1754 } | |
1755 void ConvertFromRAWBufferInverted() { | |
1756 ConvertToBuffer(3, 0, true, FROM, kError, | |
1757 cricket::FOURCC_RAW, libyuv::RAWToI420); | |
1758 } | |
1759 void ConvertFromRGB565BufferInverted() { | |
1760 ConvertToBuffer(2, 0, true, FROM, kError, | |
1761 cricket::FOURCC_RGBP, libyuv::RGB565ToI420); | |
1762 } | |
1763 void ConvertFromARGB1555BufferInverted() { | |
1764 ConvertToBuffer(2, 0, true, FROM, kError, | |
1765 cricket::FOURCC_RGBO, libyuv::ARGB1555ToI420); | |
1766 } | |
1767 void ConvertFromARGB4444BufferInverted() { | |
1768 ConvertToBuffer(2, 0, true, FROM, kError, | |
1769 cricket::FOURCC_R444, libyuv::ARGB4444ToI420); | |
1770 } | |
1771 void ConvertFromI400BufferInverted() { | |
1772 ConvertToBuffer(1, 0, true, FROM, 128, | |
1773 cricket::FOURCC_I400, libyuv::I400ToI420); | |
1774 } | |
1775 void ConvertFromYUY2BufferInverted() { | |
1776 ConvertToBuffer(2, 0, true, FROM, kError, | |
1777 cricket::FOURCC_YUY2, libyuv::YUY2ToI420); | |
1778 } | |
1779 void ConvertFromUYVYBufferInverted() { | |
1780 ConvertToBuffer(2, 0, true, FROM, kError, | |
1781 cricket::FOURCC_UYVY, libyuv::UYVYToI420); | |
1782 } | |
1783 | |
1784 // Test converting from I420 to I422. | 1334 // Test converting from I420 to I422. |
1785 void ConvertToI422Buffer() { | 1335 void ConvertToI422Buffer() { |
1786 T frame1, frame2; | 1336 T frame1, frame2; |
1787 size_t out_size = kWidth * kHeight * 2; | 1337 size_t out_size = kWidth * kHeight * 2; |
1788 std::unique_ptr<uint8_t[]> buf(new uint8_t[out_size + kAlignment]); | 1338 std::unique_ptr<uint8_t[]> buf(new uint8_t[out_size + kAlignment]); |
1789 uint8_t* y = ALIGNP(buf.get(), kAlignment); | 1339 uint8_t* y = ALIGNP(buf.get(), kAlignment); |
1790 uint8_t* u = y + kWidth * kHeight; | 1340 uint8_t* u = y + kWidth * kHeight; |
1791 uint8_t* v = u + (kWidth / 2) * kHeight; | 1341 uint8_t* v = u + (kWidth / 2) * kHeight; |
1792 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); | 1342 ASSERT_TRUE(LoadFrameNoRepeat(&frame1)); |
1793 for (int i = 0; i < repeat_; ++i) { | 1343 for (int i = 0; i < repeat_; ++i) { |
(...skipping 11 matching lines...) Expand all Loading... |
1805 EXPECT_TRUE(frame2.Init(cricket::FOURCC_I422, kWidth, kHeight, kWidth, | 1355 EXPECT_TRUE(frame2.Init(cricket::FOURCC_I422, kWidth, kHeight, kWidth, |
1806 kHeight, y, out_size, 1, 1, 0, | 1356 kHeight, y, out_size, 1, 1, 0, |
1807 webrtc::kVideoRotation_0)); | 1357 webrtc::kVideoRotation_0)); |
1808 EXPECT_TRUE(IsEqual(frame1, frame2, 1)); | 1358 EXPECT_TRUE(IsEqual(frame1, frame2, 1)); |
1809 } | 1359 } |
1810 | 1360 |
1811 int repeat_; | 1361 int repeat_; |
1812 }; | 1362 }; |
1813 | 1363 |
1814 #endif // WEBRTC_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_ | 1364 #endif // WEBRTC_MEDIA_BASE_VIDEOFRAME_UNITTEST_H_ |
OLD | NEW |