blob: b9559816d701f65d3f141dd857c8c89dcaa7b70b [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2.video.spherical;
import static com.google.common.truth.Truth.assertThat;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Util;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Tests for {@link ProjectionDecoder}. */
@RunWith(AndroidJUnit4.class)
public final class ProjectionDecoderTest {
private static final byte[] PROJ_DATA =
Util.getBytesFromHexString(
"0000008D70726F6A0000008579746D7000000000ABA158D672617720000000716D65736800000006BF800000"
+ "3F8000003F0000003F2AAAAB000000003EAAAAAB000000100024200104022430010421034020400123"
+ "1020401013020010102222001001003100200010320010000000010000000000240084009066080420"
+ "9020108421002410860214C1200660");
private static final int MSHP_OFFSET = 16;
private static final int VERTEX_COUNT = 36;
private static final float[] FIRST_VERTEX = {-1.0f, -1.0f, 1.0f};
private static final float[] LAST_VERTEX = {1.0f, -1.0f, -1.0f};
private static final float[] FIRST_UV = {0.5f, 1.0f};
private static final float[] LAST_UV = {1.0f, 1.0f};
@Test
public void decodeProj() {
testDecoding(PROJ_DATA);
}
@Test
public void decodeMshp() {
testDecoding(Arrays.copyOfRange(PROJ_DATA, MSHP_OFFSET, PROJ_DATA.length));
}
private static void testDecoding(byte[] data) {
Projection projection = ProjectionDecoder.decode(data, C.STEREO_MODE_MONO);
assertThat(projection).isNotNull();
assertThat(projection.stereoMode).isEqualTo(C.STEREO_MODE_MONO);
assertThat(projection.leftMesh).isNotNull();
assertThat(projection.rightMesh).isNotNull();
assertThat(projection.singleMesh).isTrue();
testSubMesh(projection.leftMesh);
}
/** Tests the that SubMesh (mesh with the video) contains expected data. */
private static void testSubMesh(Projection.Mesh leftMesh) {
assertThat(leftMesh.getSubMeshCount()).isEqualTo(1);
Projection.SubMesh subMesh = leftMesh.getSubMesh(0);
assertThat(subMesh.mode).isEqualTo(Projection.DRAW_MODE_TRIANGLES);
float[] vertices = subMesh.vertices;
float[] uv = subMesh.textureCoords;
assertThat(vertices.length).isEqualTo(VERTEX_COUNT * 3);
assertThat(subMesh.textureCoords.length).isEqualTo(VERTEX_COUNT * 2);
// Test first vertex
testCoordinate(FIRST_VERTEX, vertices, 0, 3);
// Test last vertex
testCoordinate(LAST_VERTEX, vertices, VERTEX_COUNT * 3 - 3, 3);
// Test first uv
testCoordinate(FIRST_UV, uv, 0, 2);
// Test last uv
testCoordinate(LAST_UV, uv, VERTEX_COUNT * 2 - 2, 2);
}
/** Tests that the output coordinates match the expected. */
private static void testCoordinate(float[] expected, float[] output, int offset, int count) {
for (int i = 0; i < count; i++) {
Assert.assertEquals(expected[i], output[i + offset]);
}
}
}