Chromium Code Reviews| 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 dc12dd95d365121d86d71822c2d531c771f7b087..0af2133c423b176d0facd7c8a07cc23da16b2d74 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() { |
| instance = this; |
| } |
| @@ -221,16 +221,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; |
| @@ -246,6 +244,7 @@ public class MediaCodecVideoEncoder { |
| if (properties == null) { |
| throw new RuntimeException("Can not find HW encoder for " + type); |
| } |
| + colorFormat = properties.colorFormat; |
|
AlexG
2015/10/19 23:38:45
Print color format in the log for debug purposes?
|
| mediaCodecThread = Thread.currentThread(); |
| try { |
| MediaFormat format = MediaFormat.createVideoFormat(mime, width, height); |
| @@ -256,26 +255,31 @@ 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) { |
| Logging.e(TAG, "Can not create media encoder"); |
| - return null; |
| + return false; |
| } |
| mediaCodec.configure( |
| format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); |
| + |
| mediaCodec.start(); |
| - colorFormat = properties.colorFormat; |
| outputBuffers = mediaCodec.getOutputBuffers(); |
|
AlexG
2015/10/19 23:38:45
Print outputBuffers.length for debug purposes?
|
| - 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(); |
| @@ -295,12 +299,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 { |
| @@ -333,7 +337,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); |
| @@ -344,7 +348,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) { |
| @@ -354,15 +358,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(); |
| @@ -431,7 +435,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); |