pull/704/head
Mattia Iavarone 6 years ago
parent a5e9189101
commit 2df7f826eb
  1. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/frame/Frame.java
  2. 10
      cameraview/src/main/java/com/otaliastudios/cameraview/frame/FrameManager.java
  3. 49
      cameraview/src/test/java/com/otaliastudios/cameraview/frame/FrameTest.java

@ -1,7 +1,6 @@
package com.otaliastudios.cameraview.frame; package com.otaliastudios.cameraview.frame;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.media.Image;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Engine;
@ -27,9 +26,9 @@ public class Frame {
private Size mSize = null; private Size mSize = null;
private int mFormat = -1; private int mFormat = -1;
Frame(@NonNull FrameManager manager, @NonNull Class<?> dataClass) { Frame(@NonNull FrameManager manager) {
mManager = manager; mManager = manager;
mDataClass = dataClass; mDataClass = manager.getFrameDataClass();
} }
void setContent(@NonNull Object data, long time, int rotation, @NonNull Size size, int format) { void setContent(@NonNull Object data, long time, int rotation, @NonNull Size size, int format) {
@ -73,7 +72,7 @@ public class Frame {
@NonNull @NonNull
public Frame freeze() { public Frame freeze() {
ensureHasContent(); ensureHasContent();
Frame other = new Frame(mManager, mDataClass); Frame other = new Frame(mManager);
//noinspection unchecked //noinspection unchecked
Object data = mManager.cloneFrameData(getData()); Object data = mManager.cloneFrameData(getData());
other.setContent(data, mTime, mRotation, mSize, mFormat); other.setContent(data, mTime, mRotation, mSize, mFormat);

@ -66,6 +66,14 @@ public abstract class FrameManager<T> {
return mFrameBytes; return mFrameBytes;
} }
/**
* Returns the frame data class.
* @return frame data class
*/
public final Class<T> getFrameDataClass() {
return mFrameDataClass;
}
/** /**
* Allocates a {@link #mPoolSize} number of buffers. Should be called once * Allocates a {@link #mPoolSize} number of buffers. Should be called once
* the preview size and the image format value are known. * the preview size and the image format value are known.
@ -123,7 +131,7 @@ public abstract class FrameManager<T> {
LOG.v("getFrame for time:", time, "RECYCLING."); LOG.v("getFrame for time:", time, "RECYCLING.");
} else { } else {
LOG.v("getFrame for time:", time, "CREATING."); LOG.v("getFrame for time:", time, "CREATING.");
frame = new Frame(this, mFrameDataClass); frame = new Frame(this);
} }
frame.setContent(data, time, rotation, mFrameSize, mFrameFormat); frame.setContent(data, time, rotation, mFrameSize, mFrameFormat);
return frame; return frame;

@ -3,32 +3,37 @@ package com.otaliastudios.cameraview.frame;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.Size;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.spy;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
public class FrameTest { public class FrameTest {
private FrameManager<byte[]> manager; private FrameManager<String> manager;
@Before @Before
public void setUp() { public void setUp() {
//noinspection unchecked manager = spy(new FrameManager<String>(1, String.class) {
manager = mock(FrameManager.class); @Override
protected void onFrameDataReleased(@NonNull String data, boolean recycled) { }
@NonNull
@Override
protected String onCloneFrameData(@NonNull String data) {
return data;
}
});
} }
@After @After
@ -39,23 +44,23 @@ public class FrameTest {
@Test @Test
public void testEquals() { public void testEquals() {
// Only time should count. // Only time should count.
Frame f1 = new Frame(manager, byte[].class); Frame f1 = new Frame(manager);
long time = 1000; long time = 1000;
f1.setContent(new byte[3], time, 90, new Size(5, 5), ImageFormat.NV21); f1.setContent("foo", time, 90, new Size(5, 5), ImageFormat.NV21);
Frame f2 = new Frame(manager, byte[].class); Frame f2 = new Frame(manager);
f2.setContent(new byte[2], time, 0, new Size(10, 10), ImageFormat.NV21); f2.setContent("bar", time, 0, new Size(10, 10), ImageFormat.NV21);
assertEquals(f1, f2); assertEquals(f1, f2);
f2.setContent(new byte[2], time + 1, 0, new Size(10, 10), ImageFormat.NV21); f2.setContent("foo", time + 1, 0, new Size(10, 10), ImageFormat.NV21);
assertNotEquals(f1, f2); assertNotEquals(f1, f2);
} }
@Test @Test
public void testReleaseThrows() { public void testReleaseThrows() {
final Frame frame = new Frame(manager, byte[].class); final Frame frame = new Frame(manager);
frame.setContent(new byte[2], 1000, 90, new Size(10, 10), ImageFormat.NV21); frame.setContent("foo", 1000, 90, new Size(10, 10), ImageFormat.NV21);
frame.release(); frame.release();
verify(manager, times(1)).onFrameReleased(eq(frame), any(byte[].class)); verify(manager, times(1)).onFrameReleased(frame, "foo");
assertThrows(new Runnable() { public void run() { frame.getTime(); }}); assertThrows(new Runnable() { public void run() { frame.getTime(); }});
assertThrows(new Runnable() { public void run() { frame.getFormat(); }}); assertThrows(new Runnable() { public void run() { frame.getFormat(); }});
@ -75,8 +80,8 @@ public class FrameTest {
@Test @Test
public void testFreeze() { public void testFreeze() {
Frame frame = new Frame(manager, byte[].class); Frame frame = new Frame(manager);
byte[] data = new byte[]{0, 1, 5, 0, 7, 3, 4, 5}; String data = "test data";
long time = 1000; long time = 1000;
int rotation = 90; int rotation = 90;
Size size = new Size(10, 10); Size size = new Size(10, 10);
@ -84,14 +89,14 @@ public class FrameTest {
frame.setContent(data, time, rotation, size, format); frame.setContent(data, time, rotation, size, format);
Frame frozen = frame.freeze(); Frame frozen = frame.freeze();
assertArrayEquals(data, (byte[]) frozen.getData()); assertEquals(data, frozen.getData());
assertEquals(time, frozen.getTime()); assertEquals(time, frozen.getTime());
assertEquals(rotation, frozen.getRotation()); assertEquals(rotation, frozen.getRotation());
assertEquals(size, frozen.getSize()); assertEquals(size, frozen.getSize());
// Mutate the first, ensure that frozen is not affected // Mutate the first, ensure that frozen is not affected
frame.setContent(new byte[]{3, 2, 1}, 50, 180, new Size(1, 1), ImageFormat.JPEG); frame.setContent("new data", 50, 180, new Size(1, 1), ImageFormat.JPEG);
assertArrayEquals(data, (byte[]) frozen.getData()); assertEquals(data, frozen.getData());
assertEquals(time, frozen.getTime()); assertEquals(time, frozen.getTime());
assertEquals(rotation, frozen.getRotation()); assertEquals(rotation, frozen.getRotation());
assertEquals(size, frozen.getSize()); assertEquals(size, frozen.getSize());

Loading…
Cancel
Save