| Index: talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
|
| diff --git a/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java b/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
|
| index a7b88ba939c9523e4fc08227166e2ba5c1ddaec0..afda84897cbe43b98548f219dfe6e8694a937ed0 100644
|
| --- a/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
|
| +++ b/talk/app/webrtc/java/src/org/webrtc/VideoRenderer.java
|
| @@ -37,7 +37,7 @@ import java.nio.ByteBuffer;
|
| */
|
| public class VideoRenderer {
|
|
|
| - /** Java version of cricket::VideoFrame. */
|
| + /** Java version of cricket::VideoFrame. Frames are only constructed from native code. */
|
| public static class I420Frame {
|
| public final int width;
|
| public final int height;
|
| @@ -46,7 +46,7 @@ public class VideoRenderer {
|
| public final boolean yuvFrame;
|
| public Object textureObject;
|
| public int textureId;
|
| - // If |nativeFramePointer| is non-zero, the memory is allocated on the C++ side.
|
| + // Frame pointer in C++.
|
| private long nativeFramePointer;
|
|
|
| // rotationDegree is the degree that the frame must be rotated clockwisely
|
| @@ -54,22 +54,14 @@ public class VideoRenderer {
|
| public int rotationDegree;
|
|
|
| /**
|
| - * Construct a frame of the given dimensions with the specified planar
|
| - * data. If |yuvPlanes| is null, new planes of the appropriate sizes are
|
| - * allocated.
|
| + * Construct a frame of the given dimensions with the specified planar data.
|
| */
|
| - public I420Frame(
|
| + private I420Frame(
|
| int width, int height, int rotationDegree,
|
| int[] yuvStrides, ByteBuffer[] yuvPlanes, long nativeFramePointer) {
|
| this.width = width;
|
| this.height = height;
|
| this.yuvStrides = yuvStrides;
|
| - if (yuvPlanes == null) {
|
| - yuvPlanes = new ByteBuffer[3];
|
| - yuvPlanes[0] = ByteBuffer.allocateDirect(yuvStrides[0] * height);
|
| - yuvPlanes[1] = ByteBuffer.allocateDirect(yuvStrides[1] * height / 2);
|
| - yuvPlanes[2] = ByteBuffer.allocateDirect(yuvStrides[2] * height / 2);
|
| - }
|
| this.yuvPlanes = yuvPlanes;
|
| this.yuvFrame = true;
|
| this.rotationDegree = rotationDegree;
|
| @@ -82,7 +74,7 @@ public class VideoRenderer {
|
| /**
|
| * Construct a texture frame of the given dimensions with data in SurfaceTexture
|
| */
|
| - public I420Frame(
|
| + private I420Frame(
|
| int width, int height, int rotationDegree,
|
| Object textureObject, int textureId, long nativeFramePointer) {
|
| this.width = width;
|
| @@ -107,66 +99,6 @@ public class VideoRenderer {
|
| return (rotationDegree % 180 == 0) ? height : width;
|
| }
|
|
|
| - /**
|
| - * Copy the planes out of |source| into |this| and return |this|. Calling
|
| - * this with mismatched frame dimensions or frame type is a programming
|
| - * error and will likely crash.
|
| - */
|
| - public I420Frame copyFrom(I420Frame source) {
|
| - // |nativeFramePointer| is not copied from |source|, because resources in this object are
|
| - // still allocated in Java. After copyFrom() is done, this object should not hold any
|
| - // references to |source|. This is violated for texture frames however, because |textureId|
|
| - // is copied without making a deep copy.
|
| - if (this.nativeFramePointer != 0) {
|
| - throw new RuntimeException("Trying to overwrite a frame allocated in C++");
|
| - }
|
| - if (source.yuvFrame && yuvFrame) {
|
| - if (width != source.width || height != source.height) {
|
| - throw new RuntimeException("Mismatched dimensions! Source: " +
|
| - source.toString() + ", destination: " + toString());
|
| - }
|
| - nativeCopyPlane(source.yuvPlanes[0], width, height,
|
| - source.yuvStrides[0], yuvPlanes[0], yuvStrides[0]);
|
| - nativeCopyPlane(source.yuvPlanes[1], width / 2, height / 2,
|
| - source.yuvStrides[1], yuvPlanes[1], yuvStrides[1]);
|
| - nativeCopyPlane(source.yuvPlanes[2], width / 2, height / 2,
|
| - source.yuvStrides[2], yuvPlanes[2], yuvStrides[2]);
|
| - rotationDegree = source.rotationDegree;
|
| - return this;
|
| - } else if (!source.yuvFrame && !yuvFrame) {
|
| - textureObject = source.textureObject;
|
| - textureId = source.textureId;
|
| - rotationDegree = source.rotationDegree;
|
| - return this;
|
| - } else {
|
| - throw new RuntimeException("Mismatched frame types! Source: " +
|
| - source.toString() + ", destination: " + toString());
|
| - }
|
| - }
|
| -
|
| - public I420Frame copyFrom(byte[] yuvData, int rotationDegree) {
|
| - if (yuvData.length < width * height * 3 / 2) {
|
| - throw new RuntimeException("Wrong arrays size: " + yuvData.length);
|
| - }
|
| - if (!yuvFrame) {
|
| - throw new RuntimeException("Can not feed yuv data to texture frame");
|
| - }
|
| - int planeSize = width * height;
|
| - ByteBuffer[] planes = new ByteBuffer[3];
|
| - planes[0] = ByteBuffer.wrap(yuvData, 0, planeSize);
|
| - planes[1] = ByteBuffer.wrap(yuvData, planeSize, planeSize / 4);
|
| - planes[2] = ByteBuffer.wrap(yuvData, planeSize + planeSize / 4,
|
| - planeSize / 4);
|
| - for (int i = 0; i < 3; i++) {
|
| - yuvPlanes[i].position(0);
|
| - yuvPlanes[i].put(planes[i]);
|
| - yuvPlanes[i].position(0);
|
| - yuvPlanes[i].limit(yuvPlanes[i].capacity());
|
| - }
|
| - this.rotationDegree = rotationDegree;
|
| - return this;
|
| - }
|
| -
|
| @Override
|
| public String toString() {
|
| return width + "x" + height + ":" + yuvStrides[0] + ":" + yuvStrides[1] +
|
| @@ -175,7 +107,7 @@ public class VideoRenderer {
|
| }
|
|
|
| // Helper native function to do a video frame plane copying.
|
| - private static native void nativeCopyPlane(ByteBuffer src, int width,
|
| + public static native void nativeCopyPlane(ByteBuffer src, int width,
|
| int height, int srcStride, ByteBuffer dst, int dstStride);
|
|
|
| /** The real meat of VideoRendererInterface. */
|
|
|