Index: webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java |
diff --git a/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java b/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java |
index 09c07822714a1d4a98b986c67b78819d5f33ea68..62d8f6ea92f8550f5fb5e15eef44191988f6ed07 100644 |
--- a/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java |
+++ b/webrtc/sdk/android/src/java/org/webrtc/I420BufferImpl.java |
@@ -15,32 +15,28 @@ import org.webrtc.VideoFrame.I420Buffer; |
/** Implementation of an I420 VideoFrame buffer. */ |
class I420BufferImpl implements VideoFrame.I420Buffer { |
- private final ByteBuffer buffer; |
private final int width; |
private final int height; |
- private final int chromaHeight; |
- private final int yPos; |
+ private final ByteBuffer dataY; |
+ private final ByteBuffer dataU; |
+ private final ByteBuffer dataV; |
private final int strideY; |
- private final int uPos; |
private final int strideU; |
- private final int vPos; |
private final int strideV; |
- private final ReleaseCallback releaseCallback; |
+ private final Runnable releaseCallback; |
private int refCount; |
- /** Allocates an I420Buffer backed by existing data. */ |
- I420BufferImpl(ByteBuffer buffer, int width, int height, int yPos, int strideY, int uPos, |
- int strideU, int vPos, int strideV, ReleaseCallback releaseCallback) { |
- this.buffer = buffer; |
+ /** Constructs an I420Buffer backed by existing data. */ |
+ I420BufferImpl(int width, int height, ByteBuffer dataY, int strideY, ByteBuffer dataU, |
+ int strideU, ByteBuffer dataV, int strideV, Runnable releaseCallback) { |
this.width = width; |
this.height = height; |
- this.chromaHeight = (height + 1) / 2; |
- this.yPos = yPos; |
+ this.dataY = dataY; |
+ this.dataU = dataU; |
+ this.dataV = dataV; |
this.strideY = strideY; |
- this.uPos = uPos; |
this.strideU = strideU; |
- this.vPos = vPos; |
this.strideV = strideV; |
this.releaseCallback = releaseCallback; |
@@ -54,9 +50,22 @@ class I420BufferImpl implements VideoFrame.I420Buffer { |
int yPos = 0; |
int uPos = yPos + width * height; |
int vPos = uPos + strideUV * chromaHeight; |
+ |
ByteBuffer buffer = ByteBuffer.allocateDirect(width * height + 2 * strideUV * chromaHeight); |
- return new I420BufferImpl( |
- buffer, width, height, yPos, width, uPos, strideUV, vPos, strideUV, null); |
+ |
+ buffer.position(yPos); |
+ buffer.limit(uPos); |
+ ByteBuffer dataY = buffer.slice(); |
+ |
+ buffer.position(uPos); |
+ buffer.limit(vPos); |
+ ByteBuffer dataU = buffer.slice(); |
+ |
+ buffer.position(vPos); |
+ buffer.limit(vPos + strideUV * chromaHeight); |
+ ByteBuffer dataV = buffer.slice(); |
+ |
+ return new I420BufferImpl(width, height, dataY, width, dataU, strideUV, dataV, strideUV, null); |
} |
@Override |
@@ -71,26 +80,17 @@ class I420BufferImpl implements VideoFrame.I420Buffer { |
@Override |
public ByteBuffer getDataY() { |
- ByteBuffer data = buffer.slice(); |
- data.position(yPos); |
- data.limit(yPos + getStrideY() * height); |
- return data; |
+ return dataY; |
} |
@Override |
public ByteBuffer getDataU() { |
- ByteBuffer data = buffer.slice(); |
- data.position(uPos); |
- data.limit(uPos + strideU * chromaHeight); |
- return data; |
+ return dataU; |
} |
@Override |
public ByteBuffer getDataV() { |
- ByteBuffer data = buffer.slice(); |
- data.position(vPos); |
- data.limit(vPos + strideV * chromaHeight); |
- return data; |
+ return dataV; |
} |
@Override |
@@ -121,13 +121,14 @@ class I420BufferImpl implements VideoFrame.I420Buffer { |
@Override |
public void release() { |
if (--refCount == 0 && releaseCallback != null) { |
- releaseCallback.onRelease(); |
+ releaseCallback.run(); |
} |
} |
- // Callback called when the frame is no longer referenced. |
- interface ReleaseCallback { |
- // Called when the frame is no longer referenced. |
- void onRelease(); |
+ @Override |
+ public VideoFrame.Buffer cropAndScale( |
+ int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) { |
+ return VideoFrame.cropAndScaleI420( |
+ this, cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight); |
} |
} |