Index: talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
diff --git a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
index fa3d472e0f3a71beda8991870730368bb5a2f844..6a218fd56834f649a05e9972f0550fc999ead744 100644 |
--- a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
+++ b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
@@ -96,13 +96,13 @@ public class MediaCodecVideoEncoder { |
CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar, |
COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m |
}; |
- private int colorFormat; |
- // Video encoder type. |
private VideoCodecType type; |
+ private int colorFormat; // Used by native code. |
+ |
// SPS and PPS NALs (Config frame) for H.264. |
private ByteBuffer configData = null; |
- private MediaCodecVideoEncoder() { |
+ MediaCodecVideoEncoder() { |
mediaCodecThread = null; |
} |
@@ -209,16 +209,14 @@ public class MediaCodecVideoEncoder { |
} |
} |
- // Return the array of input buffers, or null on failure. |
- private ByteBuffer[] initEncode( |
- VideoCodecType type, int width, int height, int kbps, int fps) { |
+ // Returns false if the hardware encoder currently can't be used. |
+ boolean initEncode(VideoCodecType type, int width, int height, int kbps, int fps) { |
Logging.d(TAG, "Java initEncode: " + type + " : " + width + " x " + height + |
- ". @ " + kbps + " kbps. Fps: " + fps + |
- ". Color: 0x" + Integer.toHexString(colorFormat)); |
+ ". @ " + kbps + " kbps. Fps: " + fps + "."); |
+ |
if (mediaCodecThread != null) { |
throw new RuntimeException("Forgot to release()?"); |
} |
- this.type = type; |
EncoderProperties properties = null; |
String mime = null; |
int keyFrameIntervalSec = 0; |
@@ -234,6 +232,7 @@ public class MediaCodecVideoEncoder { |
if (properties == null) { |
throw new RuntimeException("Can not find HW encoder for " + type); |
} |
+ colorFormat = properties.colorFormat; |
mediaCodecThread = Thread.currentThread(); |
try { |
MediaFormat format = MediaFormat.createVideoFormat(mime, width, height); |
@@ -244,25 +243,30 @@ public class MediaCodecVideoEncoder { |
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec); |
Logging.d(TAG, " Format: " + format); |
mediaCodec = createByCodecName(properties.codecName); |
+ this.type = type; |
if (mediaCodec == null) { |
- return null; |
+ return false; |
} |
mediaCodec.configure( |
format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); |
+ |
mediaCodec.start(); |
- colorFormat = properties.colorFormat; |
outputBuffers = mediaCodec.getOutputBuffers(); |
- ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); |
- Logging.d(TAG, "Input buffers: " + inputBuffers.length + |
- ". Output buffers: " + outputBuffers.length); |
- return inputBuffers; |
+ |
} catch (IllegalStateException e) { |
Logging.e(TAG, "initEncode failed", e); |
- return null; |
+ return false; |
} |
+ return true; |
+ } |
+ |
+ ByteBuffer[] getInputBuffers() { |
+ ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); |
+ Logging.d(TAG, "Input buffers: " + inputBuffers.length); |
+ return inputBuffers; |
} |
- private boolean encode( |
+ boolean encodeBuffer( |
boolean isKeyframe, int inputBuffer, int size, |
long presentationTimestampUs) { |
checkOnMediaCodecThread(); |
@@ -282,12 +286,12 @@ public class MediaCodecVideoEncoder { |
return true; |
} |
catch (IllegalStateException e) { |
- Logging.e(TAG, "encode failed", e); |
+ Logging.e(TAG, "encodeBuffer failed", e); |
return false; |
} |
} |
- private void release() { |
+ void release() { |
Logging.d(TAG, "Java releaseEncoder"); |
checkOnMediaCodecThread(); |
try { |
@@ -318,7 +322,7 @@ public class MediaCodecVideoEncoder { |
// Dequeue an input buffer and return its index, -1 if no input buffer is |
// available, or -2 if the codec is no longer operative. |
- private int dequeueInputBuffer() { |
+ int dequeueInputBuffer() { |
checkOnMediaCodecThread(); |
try { |
return mediaCodec.dequeueInputBuffer(DEQUEUE_TIMEOUT); |
@@ -329,7 +333,7 @@ public class MediaCodecVideoEncoder { |
} |
// Helper struct for dequeueOutputBuffer() below. |
- private static class OutputBufferInfo { |
+ static class OutputBufferInfo { |
public OutputBufferInfo( |
int index, ByteBuffer buffer, |
boolean isKeyFrame, long presentationTimestampUs) { |
@@ -339,15 +343,15 @@ public class MediaCodecVideoEncoder { |
this.presentationTimestampUs = presentationTimestampUs; |
} |
- private final int index; |
- private final ByteBuffer buffer; |
- private final boolean isKeyFrame; |
- private final long presentationTimestampUs; |
+ public final int index; |
+ public final ByteBuffer buffer; |
+ public final boolean isKeyFrame; |
+ public final long presentationTimestampUs; |
} |
// Dequeue and return an output buffer, or null if no output is ready. Return |
// a fake OutputBufferInfo with index -1 if the codec is no longer operable. |
- private OutputBufferInfo dequeueOutputBuffer() { |
+ OutputBufferInfo dequeueOutputBuffer() { |
checkOnMediaCodecThread(); |
try { |
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); |
@@ -416,7 +420,7 @@ public class MediaCodecVideoEncoder { |
// Release a dequeued output buffer back to the codec for re-use. Return |
// false if the codec is no longer operable. |
- private boolean releaseOutputBuffer(int index) { |
+ boolean releaseOutputBuffer(int index) { |
checkOnMediaCodecThread(); |
try { |
mediaCodec.releaseOutputBuffer(index, false); |