From 295760daa187d30aa81f6cc5f7768538080c09f6 Mon Sep 17 00:00:00 2001 From: magjed Date: Thu, 12 Jan 2017 01:11:57 -0800 Subject: [PATCH] Reland of Android: Add field trial for Intel HW Vp8 encoder (patchset #1 id:1 of https://codereview.webrtc.org/2624143002/ ) Reason for revert: Fixed external test issues. Original issue's description: > Revert of Android: Add field trial for Intel HW Vp8 encoder (patchset #1 id:1 of https://codereview.webrtc.org/2614373004/ ) > > Reason for revert: > Breaks external test code. > > Original issue's description: > > Android: Add field trial for Intel HW Vp8 encoder > > > > Also enable Intel HW Vp8 encoder by default in AppRTCMobile. > > > > BUG=webrtc:6683 > > > > Review-Url: https://codereview.webrtc.org/2614373004 > > Cr-Commit-Position: refs/heads/master@{#16002} > > Committed: https://chromium.googlesource.com/external/webrtc/+/cecf86e9b0ba41c35eda360ae24b17b333ae1977 > > TBR=sakal@webrtc.org > # Skipping CQ checks because original CL landed less than 1 days ago. > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=webrtc:6683 > > Review-Url: https://codereview.webrtc.org/2624143002 > Cr-Commit-Position: refs/heads/master@{#16005} > Committed: https://chromium.googlesource.com/external/webrtc/+/c999a08128360b945ce94f6990afa9b6a77cea5e TBR=sakal@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:6683 Review-Url: https://codereview.webrtc.org/2625903005 Cr-Commit-Position: refs/heads/master@{#16025} --- .../appspot/apprtc/PeerConnectionClient.java | 8 ++++--- .../org/webrtc/MediaCodecVideoEncoder.java | 23 +++++++++++++------ .../api/org/webrtc/PeerConnectionFactory.java | 14 +++++++++-- .../sdk/android/src/jni/peerconnection_jni.cc | 2 +- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java index 406b4a2f96..9f7a47ef83 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java @@ -75,6 +75,7 @@ public class PeerConnectionClient { private static final String AUDIO_CODEC_ISAC = "ISAC"; private static final String VIDEO_CODEC_PARAM_START_BITRATE = "x-google-start-bitrate"; private static final String VIDEO_FLEXFEC_FIELDTRIAL = "WebRTC-FlexFEC-03/Enabled/"; + private static final String VIDEO_VP8_INTEL_HW_ENCODER_FIELDTRIAL = "WebRTC-IntelVP8/Enabled/"; private static final String AUDIO_CODEC_PARAM_BITRATE = "maxaveragebitrate"; private static final String AUDIO_ECHO_CANCELLATION_CONSTRAINT = "googEchoCancellation"; private static final String AUDIO_AUTO_GAIN_CONTROL_CONSTRAINT = "googAutoGainControl"; @@ -373,12 +374,13 @@ public class PeerConnectionClient { isError = false; // Initialize field trials. + String fieldTrials = ""; if (peerConnectionParameters.videoFlexfecEnabled) { - PeerConnectionFactory.initializeFieldTrials(VIDEO_FLEXFEC_FIELDTRIAL); + fieldTrials += VIDEO_FLEXFEC_FIELDTRIAL; Log.d(TAG, "Enable FlexFEC field trial."); - } else { - PeerConnectionFactory.initializeFieldTrials(""); } + fieldTrials += VIDEO_VP8_INTEL_HW_ENCODER_FIELDTRIAL; + PeerConnectionFactory.initializeFieldTrials(fieldTrials); // Check preferred video codec. preferredVideoCodec = VIDEO_CODEC_VP8; diff --git a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java index 432c0bf877..c3e2133f77 100644 --- a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java +++ b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java @@ -20,8 +20,8 @@ import android.opengl.GLES20; import android.os.Build; import android.os.Bundle; import android.view.Surface; - import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -114,8 +114,17 @@ public class MediaCodecVideoEncoder { "OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT); private static final MediaCodecProperties exynosVp8HwProperties = new MediaCodecProperties( "OMX.Exynos.", Build.VERSION_CODES.M, BitrateAdjustmentType.DYNAMIC_ADJUSTMENT); - private static final MediaCodecProperties[] vp8HwList = - new MediaCodecProperties[] {qcomVp8HwProperties, exynosVp8HwProperties}; + private static final MediaCodecProperties intelVp8HwProperties = new MediaCodecProperties( + "OMX.Intel.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.NO_ADJUSTMENT); + private static MediaCodecProperties[] vp8HwList() { + final ArrayList supported_codecs = new ArrayList(); + supported_codecs.add(qcomVp8HwProperties); + supported_codecs.add(exynosVp8HwProperties); + if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-IntelVP8").equals("Enabled")) { + supported_codecs.add(intelVp8HwProperties); + } + return supported_codecs.toArray(new MediaCodecProperties[supported_codecs.size()]); + } // List of supported HW VP9 encoders. private static final MediaCodecProperties qcomVp9HwProperties = new MediaCodecProperties( @@ -203,14 +212,14 @@ public class MediaCodecVideoEncoder { // Functions to query if HW encoding is supported. public static boolean isVp8HwSupported() { return !hwEncoderDisabledTypes.contains(VP8_MIME_TYPE) - && (findHwEncoder(VP8_MIME_TYPE, vp8HwList, supportedColorList) != null); + && (findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedColorList) != null); } public static EncoderProperties vp8HwEncoderProperties() { if (hwEncoderDisabledTypes.contains(VP8_MIME_TYPE)) { return null; } else { - return findHwEncoder(VP8_MIME_TYPE, vp8HwList, supportedColorList); + return findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedColorList); } } @@ -226,7 +235,7 @@ public class MediaCodecVideoEncoder { public static boolean isVp8HwSupportedUsingTextures() { return !hwEncoderDisabledTypes.contains(VP8_MIME_TYPE) - && (findHwEncoder(VP8_MIME_TYPE, vp8HwList, supportedSurfaceColorList) != null); + && (findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedSurfaceColorList) != null); } public static boolean isVp9HwSupportedUsingTextures() { @@ -387,7 +396,7 @@ public class MediaCodecVideoEncoder { if (type == VideoCodecType.VIDEO_CODEC_VP8) { mime = VP8_MIME_TYPE; properties = findHwEncoder( - VP8_MIME_TYPE, vp8HwList, useSurface ? supportedSurfaceColorList : supportedColorList); + VP8_MIME_TYPE, vp8HwList(), useSurface ? supportedSurfaceColorList : supportedColorList); keyFrameIntervalSec = 100; } else if (type == VideoCodecType.VIDEO_CODEC_VP9) { mime = VP9_MIME_TYPE; diff --git a/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java index 75d3be9e8b..4a7bca61c0 100644 --- a/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java +++ b/webrtc/sdk/android/api/org/webrtc/PeerConnectionFactory.java @@ -17,8 +17,15 @@ import java.util.List; * the PeerConnection API for clients. */ public class PeerConnectionFactory { + private static volatile boolean nativeLibLoaded; + static { - System.loadLibrary("jingle_peerconnection_so"); + try { + System.loadLibrary("jingle_peerconnection_so"); + nativeLibLoaded = true; + } catch (UnsatisfiedLinkError t) { + nativeLibLoaded = false; + } } private static final String TAG = "PeerConnectionFactory"; @@ -64,7 +71,10 @@ public class PeerConnectionFactory { // } else { // method2(); // } - public static native String fieldTrialsFindFullName(String name); + public static String fieldTrialsFindFullName(String name) { + return nativeLibLoaded ? nativeFieldTrialsFindFullName(name) : ""; + } + private static native String nativeFieldTrialsFindFullName(String name); // Internal tracing initialization. Must be called before PeerConnectionFactory is created to // prevent racing with tracing code. public static native void initializeInternalTracer(); diff --git a/webrtc/sdk/android/src/jni/peerconnection_jni.cc b/webrtc/sdk/android/src/jni/peerconnection_jni.cc index 5d3b6c50cb..7407adef89 100644 --- a/webrtc/sdk/android/src/jni/peerconnection_jni.cc +++ b/webrtc/sdk/android/src/jni/peerconnection_jni.cc @@ -1145,7 +1145,7 @@ JOW(void, PeerConnectionFactory_initializeInternalTracer)(JNIEnv* jni, jclass) { rtc::tracing::SetupInternalTracer(); } -JOW(jstring, PeerConnectionFactory_fieldTrialsFindFullName) +JOW(jstring, PeerConnectionFactory_nativeFieldTrialsFindFullName) (JNIEnv* jni, jclass, jstring j_name) { return JavaStringFromStdString( jni, webrtc::field_trial::FindFullName(JavaToStdString(jni, j_name)));