From debbc7801fbd359d4ca84c35fa5c9d0018e86554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Fri, 2 Feb 2018 10:01:46 +0100 Subject: [PATCH] Use correct presentationTimestampUs for VideoFrames in old encoder. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In MediaCodecVideoEncoder, VideoFrame timestamp was used as a presentation timestamp. With this change timestamp maintained in C++ code is used instead. This matches the behaviour with old frame callbacks. Bug: b/72832862 Change-Id: I1f0543ebe837ccac22c83a81a81f3ea128e2a866 Reviewed-on: https://webrtc-review.googlesource.com/47381 Reviewed-by: Anders Carlsson Commit-Queue: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#21872} --- sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java | 6 +++--- sdk/android/src/jni/androidmediaencoder.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java b/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java index 2e8b802769..bcb4b98a6b 100644 --- a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java +++ b/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java @@ -634,10 +634,10 @@ public class MediaCodecVideoEncoder { * Encodes a new style VideoFrame. |bufferIndex| is -1 if we are not encoding in surface mode. */ @CalledByNativeUnchecked - boolean encodeFrame(long nativeEncoder, boolean isKeyframe, VideoFrame frame, int bufferIndex) { + boolean encodeFrame(long nativeEncoder, boolean isKeyframe, VideoFrame frame, int bufferIndex, + long presentationTimestampUs) { checkOnMediaCodecThread(); try { - long presentationTimestampUs = TimeUnit.NANOSECONDS.toMicros(frame.getTimestampNs()); checkKeyFrameRequired(isKeyframe, presentationTimestampUs); VideoFrame.Buffer buffer = frame.getBuffer(); @@ -649,7 +649,7 @@ public class MediaCodecVideoEncoder { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); VideoFrameDrawer.drawTexture(drawer, textureBuffer, new Matrix() /* renderMatrix */, width, height, 0 /* viewportX */, 0 /* viewportY */, width, height); - eglBase.swapBuffers(frame.getTimestampNs()); + eglBase.swapBuffers(TimeUnit.MICROSECONDS.toNanos(presentationTimestampUs)); } else { VideoFrame.I420Buffer i420Buffer = buffer.toI420(); final int chromaHeight = (height + 1) / 2; diff --git a/sdk/android/src/jni/androidmediaencoder.cc b/sdk/android/src/jni/androidmediaencoder.cc index 8908b8e4fc..f71b508ef4 100644 --- a/sdk/android/src/jni/androidmediaencoder.cc +++ b/sdk/android/src/jni/androidmediaencoder.cc @@ -897,7 +897,7 @@ bool MediaCodecVideoEncoder::EncodeJavaFrame(JNIEnv* jni, int input_buffer_index) { bool encode_status = Java_MediaCodecVideoEncoder_encodeFrame( jni, j_media_codec_video_encoder_, jlongFromPointer(this), key_frame, - frame, input_buffer_index); + frame, input_buffer_index, current_timestamp_us_); if (CheckException(jni)) { ALOGE << "Exception in encode frame."; ProcessHWError(true /* reset_if_fallback_unavailable */);