Index: talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java |
diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java b/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java |
index 72b62c3f9fbdf376e1be8628c7379691fb1b43fa..ee01eede9e6e87f63929b4956143fae2b02f79fd 100644 |
--- a/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java |
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoCapturerAndroid.java |
@@ -569,11 +569,12 @@ |
} |
rotation = (info.orientation + rotation) % 360; |
// Mark the frame owning |data| as used. |
- final ByteBuffer buffer = videoBuffers.reserveByteBuffer(data, captureTimeNs); |
- if (buffer != null) { |
+ // Note that since data is directBuffer, |
+ // data.length >= videoBuffers.frameSize. |
+ if (videoBuffers.reserveByteBuffer(data, captureTimeNs)) { |
cameraFramesCount++; |
- frameObserver.OnFrameCaptured(buffer, captureFormat.width, captureFormat.height, |
- rotation, captureTimeNs); |
+ frameObserver.OnFrameCaptured(data, videoBuffers.frameSize, captureFormat.width, |
+ captureFormat.height, rotation, captureTimeNs); |
} else { |
Logging.w(TAG, "reserveByteBuffer failed - dropping frame."); |
} |
@@ -655,8 +656,7 @@ |
: " Pending buffers: " + pendingFramesTimeStamps() + ".")); |
} |
- // Returns the reserved byte buffer, or null on failure. |
- public ByteBuffer reserveByteBuffer(byte[] data, long timeStamp) { |
+ public boolean reserveByteBuffer(byte[] data, long timeStamp) { |
checkIsOnValidThread(); |
final ByteBuffer buffer = queuedBuffers.remove(data); |
if (buffer == null) { |
@@ -664,21 +664,21 @@ |
// capture format in |startPreviewOnCameraThread|. Drop these old frames. |
Logging.w(TAG, "Received callback buffer from previous configuration with length: " |
+ (data == null ? "null" : data.length)); |
- return null; |
+ return false; |
} |
if (buffer.capacity() != frameSize) { |
throw new IllegalStateException("Callback buffer has unexpected frame size"); |
} |
if (pendingBuffers.containsKey(timeStamp)) { |
Logging.e(TAG, "Timestamp already present in pending buffers - they need to be unique"); |
- return null; |
+ return false; |
} |
pendingBuffers.put(timeStamp, buffer); |
if (queuedBuffers.isEmpty()) { |
Logging.v(TAG, "Camera is running out of capture buffers." |
+ " Pending buffers: " + pendingFramesTimeStamps()); |
} |
- return buffer; |
+ return true; |
} |
public void returnBuffer(long timeStamp) { |
@@ -722,8 +722,8 @@ |
// Delivers a captured frame. Called on a Java thread owned by |
// VideoCapturerAndroid. |
- abstract void OnFrameCaptured(ByteBuffer buffer, int width, int height, int rotation, |
- long timeStamp); |
+ abstract void OnFrameCaptured(byte[] data, int length, int width, int height, |
+ int rotation, long timeStamp); |
// Requests an output format from the video capturer. Captured frames |
// by the camera will be scaled/or dropped by the video capturer. |
@@ -746,9 +746,9 @@ |
} |
@Override |
- public void OnFrameCaptured(ByteBuffer buffer, int width, int height, int rotation, |
- long timeStamp) { |
- nativeOnFrameCaptured(nativeCapturer, buffer, width, height, rotation, timeStamp); |
+ public void OnFrameCaptured(byte[] data, int length, int width, int height, |
+ int rotation, long timeStamp) { |
+ nativeOnFrameCaptured(nativeCapturer, data, length, width, height, rotation, timeStamp); |
} |
@Override |
@@ -759,7 +759,7 @@ |
private native void nativeCapturerStarted(long nativeCapturer, |
boolean success); |
private native void nativeOnFrameCaptured(long nativeCapturer, |
- ByteBuffer buffer, int width, int height, int rotation, long timeStamp); |
+ byte[] data, int length, int width, int height, int rotation, long timeStamp); |
private native void nativeOnOutputFormatRequest(long nativeCapturer, |
int width, int height, int fps); |
} |