1 /* 2 * Copyright 2017 The WebRTC 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 11 package org.webrtc; 12 13 import static org.junit.Assert.assertEquals; 14 import static org.junit.Assert.assertTrue; 15 16 import androidx.test.filters.SmallTest; 17 import java.nio.ByteBuffer; 18 import org.junit.Before; 19 import org.junit.Test; 20 21 public class YuvHelperTest { 22 private static final int TEST_WIDTH = 3; 23 private static final int TEST_HEIGHT = 3; 24 private static final int TEST_CHROMA_WIDTH = 2; 25 private static final int TEST_CHROMA_HEIGHT = 2; 26 27 private static final int TEST_I420_STRIDE_Y = 3; 28 private static final int TEST_I420_STRIDE_V = 2; 29 private static final int TEST_I420_STRIDE_U = 4; 30 31 private static final ByteBuffer TEST_I420_Y = getTestY(); 32 private static final ByteBuffer TEST_I420_U = getTestU(); 33 private static final ByteBuffer TEST_I420_V = getTestV(); 34 getTestY()35 private static ByteBuffer getTestY() { 36 final ByteBuffer testY = ByteBuffer.allocateDirect(TEST_HEIGHT * TEST_I420_STRIDE_Y); 37 testY.put(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}); 38 return testY; 39 } 40 getTestU()41 private static ByteBuffer getTestU() { 42 final ByteBuffer testU = ByteBuffer.allocateDirect(TEST_CHROMA_HEIGHT * TEST_I420_STRIDE_V); 43 testU.put(new byte[] {51, 52, 53, 54}); 44 return testU; 45 } 46 getTestV()47 private static ByteBuffer getTestV() { 48 final ByteBuffer testV = ByteBuffer.allocateDirect(TEST_CHROMA_HEIGHT * TEST_I420_STRIDE_U); 49 testV.put(new byte[] {101, 102, 103, 104, 105, 106, 107, 108}); 50 return testV; 51 } 52 53 @Before setUp()54 public void setUp() { 55 NativeLibrary.initialize(new NativeLibrary.DefaultLoader(), TestConstants.NATIVE_LIBRARY); 56 } 57 58 @SmallTest 59 @Test testCopyPlane()60 public void testCopyPlane() { 61 final int dstStride = TEST_WIDTH; 62 final ByteBuffer dst = ByteBuffer.allocateDirect(TEST_HEIGHT * dstStride); 63 64 YuvHelper.copyPlane(TEST_I420_Y, TEST_I420_STRIDE_Y, dst, dstStride, TEST_WIDTH, TEST_HEIGHT); 65 66 assertByteBufferContentEquals(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, dst); 67 } 68 69 @SmallTest 70 @Test testI420Copy()71 public void testI420Copy() { 72 final int dstStrideY = TEST_WIDTH; 73 final int dstStrideU = TEST_CHROMA_WIDTH; 74 final int dstStrideV = TEST_CHROMA_WIDTH; 75 final ByteBuffer dstY = ByteBuffer.allocateDirect(TEST_HEIGHT * dstStrideY); 76 final ByteBuffer dstU = ByteBuffer.allocateDirect(TEST_CHROMA_HEIGHT * dstStrideU); 77 final ByteBuffer dstV = ByteBuffer.allocateDirect(TEST_CHROMA_HEIGHT * dstStrideV); 78 79 YuvHelper.I420Copy(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 80 TEST_I420_V, TEST_I420_STRIDE_U, dstY, dstStrideY, dstU, dstStrideU, dstV, dstStrideV, 81 TEST_WIDTH, TEST_HEIGHT); 82 83 assertByteBufferContentEquals(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, dstY); 84 assertByteBufferContentEquals(new byte[] {51, 52, 53, 54}, dstU); 85 assertByteBufferContentEquals(new byte[] {101, 102, 105, 106}, dstV); 86 } 87 88 @SmallTest 89 @Test testI420CopyTight()90 public void testI420CopyTight() { 91 final ByteBuffer dst = ByteBuffer.allocateDirect( 92 TEST_WIDTH * TEST_HEIGHT + TEST_CHROMA_WIDTH * TEST_CHROMA_HEIGHT * 2); 93 94 YuvHelper.I420Copy(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 95 TEST_I420_V, TEST_I420_STRIDE_U, dst, TEST_WIDTH, TEST_HEIGHT); 96 97 assertByteBufferContentEquals( 98 new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 51, 52, 53, 54, 101, 102, 105, 106}, dst); 99 } 100 101 @SmallTest 102 @Test testI420CopyStride()103 public void testI420CopyStride() { 104 final int dstStrideY = 4; 105 final int dstSliceHeightY = 4; 106 final int dstStrideU = dstStrideY / 2; 107 final int dstSliceHeightU = dstSliceHeightY / 2; 108 final int dstSize = dstStrideY * dstStrideY * 3 / 2; 109 110 final ByteBuffer dst = ByteBuffer.allocateDirect(dstSize); 111 YuvHelper.I420Copy(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 112 TEST_I420_V, TEST_I420_STRIDE_U, dst, TEST_WIDTH, TEST_HEIGHT, dstStrideY, dstSliceHeightY, 113 dstStrideU, dstSliceHeightU); 114 115 assertByteBufferContentEquals(new byte[] {1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 0, 51, 116 52, 53, 54, 101, 102, 105, 106}, 117 dst); 118 } 119 120 @SmallTest 121 @Test testI420ToNV12()122 public void testI420ToNV12() { 123 final int dstStrideY = TEST_WIDTH; 124 final int dstStrideUV = TEST_CHROMA_WIDTH * 2; 125 final ByteBuffer dstY = ByteBuffer.allocateDirect(TEST_HEIGHT * dstStrideY); 126 final ByteBuffer dstUV = ByteBuffer.allocateDirect(2 * TEST_CHROMA_HEIGHT * dstStrideUV); 127 128 YuvHelper.I420ToNV12(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 129 TEST_I420_V, TEST_I420_STRIDE_U, dstY, dstStrideY, dstUV, dstStrideUV, TEST_WIDTH, 130 TEST_HEIGHT); 131 132 assertByteBufferContentEquals(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, dstY); 133 assertByteBufferContentEquals(new byte[] {51, 101, 52, 102, 53, 105, 54, 106}, dstUV); 134 } 135 136 @SmallTest 137 @Test testI420ToNV12Tight()138 public void testI420ToNV12Tight() { 139 final int dstStrideY = TEST_WIDTH; 140 final int dstStrideUV = TEST_CHROMA_WIDTH * 2; 141 final ByteBuffer dst = ByteBuffer.allocateDirect( 142 TEST_WIDTH * TEST_HEIGHT + TEST_CHROMA_WIDTH * TEST_CHROMA_HEIGHT * 2); 143 144 YuvHelper.I420ToNV12(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 145 TEST_I420_V, TEST_I420_STRIDE_U, dst, TEST_WIDTH, TEST_HEIGHT); 146 147 assertByteBufferContentEquals( 148 new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 51, 101, 52, 102, 53, 105, 54, 106}, dst); 149 } 150 151 @SmallTest 152 @Test testI420ToNV12Stride()153 public void testI420ToNV12Stride() { 154 final int dstStrideY = 4; 155 final int dstSliceHeightY = 4; 156 final int dstSize = dstStrideY * dstStrideY * 3 / 2; 157 158 final ByteBuffer dst = ByteBuffer.allocateDirect(dstSize); 159 YuvHelper.I420ToNV12(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 160 TEST_I420_V, TEST_I420_STRIDE_U, dst, TEST_WIDTH, TEST_HEIGHT, dstStrideY, dstSliceHeightY); 161 162 assertByteBufferContentEquals(new byte[] {1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 0, 51, 163 101, 52, 102, 53, 105, 54, 106}, 164 dst); 165 } 166 assertByteBufferContentEquals(byte[] expected, ByteBuffer test)167 private static void assertByteBufferContentEquals(byte[] expected, ByteBuffer test) { 168 assertTrue( 169 "ByteBuffer is too small. Expected " + expected.length + " but was " + test.capacity(), 170 test.capacity() >= expected.length); 171 for (int i = 0; i < expected.length; i++) { 172 assertEquals("Unexpected ByteBuffer contents at index: " + i, expected[i], test.get(i)); 173 } 174 } 175 176 @SmallTest 177 @Test testI420Rotate90()178 public void testI420Rotate90() { 179 final int dstStrideY = TEST_HEIGHT; 180 final int dstStrideU = TEST_CHROMA_HEIGHT; 181 final int dstStrideV = TEST_CHROMA_HEIGHT; 182 final ByteBuffer dstY = ByteBuffer.allocateDirect(TEST_WIDTH * dstStrideY); 183 final ByteBuffer dstU = ByteBuffer.allocateDirect(TEST_CHROMA_WIDTH * dstStrideU); 184 final ByteBuffer dstV = ByteBuffer.allocateDirect(TEST_CHROMA_WIDTH * dstStrideV); 185 186 YuvHelper.I420Rotate(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 187 TEST_I420_V, TEST_I420_STRIDE_U, dstY, dstStrideY, dstU, dstStrideU, dstV, dstStrideV, 188 TEST_WIDTH, TEST_HEIGHT, 90); 189 190 assertByteBufferContentEquals(new byte[] {7, 4, 1, 8, 5, 2, 9, 6, 3}, dstY); 191 assertByteBufferContentEquals(new byte[] {53, 51, 54, 52}, dstU); 192 assertByteBufferContentEquals(new byte[] {105, 101, 106, 102}, dstV); 193 } 194 195 @SmallTest 196 @Test testI420Rotate90Tight()197 public void testI420Rotate90Tight() { 198 final ByteBuffer dst = ByteBuffer.allocateDirect( 199 TEST_WIDTH * TEST_HEIGHT + TEST_CHROMA_WIDTH * TEST_CHROMA_HEIGHT * 2); 200 201 YuvHelper.I420Rotate(TEST_I420_Y, TEST_I420_STRIDE_Y, TEST_I420_U, TEST_I420_STRIDE_V, 202 TEST_I420_V, TEST_I420_STRIDE_U, dst, TEST_WIDTH, TEST_HEIGHT, 90); 203 204 assertByteBufferContentEquals( 205 new byte[] {7, 4, 1, 8, 5, 2, 9, 6, 3, 53, 51, 54, 52, 105, 101, 106, 102}, dst); 206 } 207 } 208