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 f3f03c1d20c0dab4d5aa749c690ed2558040a82b..d112af316fe5bcbb379b6b0876c52d49c85d2999 100644 |
--- a/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
+++ b/talk/app/webrtc/java/src/org/webrtc/MediaCodecVideoEncoder.java |
@@ -61,7 +61,7 @@ public class MediaCodecVideoEncoder { |
} |
private static final int DEQUEUE_TIMEOUT = 0; // Non-blocking, no wait. |
- // Active running encoder instance. Set in initDecode() (called from native code) |
+ // Active running encoder instance. Set in initEncode() (called from native code) |
// and reset to null in release() call. |
private static MediaCodecVideoEncoder runningInstance = null; |
private Thread mediaCodecThread; |
@@ -99,13 +99,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() { |
magjed_webrtc
2015/10/22 23:24:17
Can't we just remove this constructor?
perkj_webrtc
2015/11/12 13:25:22
Done.
|
} |
// Helper struct for findHwEncoder() below. |
@@ -223,16 +223,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; |
@@ -249,6 +247,9 @@ public class MediaCodecVideoEncoder { |
throw new RuntimeException("Can not find HW encoder for " + type); |
} |
runningInstance = this; // Encoder is now running and can be queried for stack traces. |
+ colorFormat = properties.colorFormat; |
+ Logging.d(TAG, "Color format: " + colorFormat); |
+ |
mediaCodecThread = Thread.currentThread(); |
try { |
MediaFormat format = MediaFormat.createVideoFormat(mime, width, height); |
@@ -259,26 +260,32 @@ 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(); |
- ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); |
- Logging.d(TAG, "Input buffers: " + inputBuffers.length + |
- ". Output buffers: " + outputBuffers.length); |
- return inputBuffers; |
+ Logging.d(TAG, "Output buffers: " + outputBuffers.length); |
+ |
} 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(); |
@@ -298,12 +305,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 { |
@@ -336,7 +343,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); |
@@ -347,7 +354,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) { |
@@ -357,15 +364,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(); |
@@ -434,7 +441,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); |