• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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