From cecf86e9b0ba41c35eda360ae24b17b333ae1977 Mon Sep 17 00:00:00 2001 From: magjed Date: Wed, 11 Jan 2017 00:57:43 -0800 Subject: [PATCH] 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} --- .../appspot/apprtc/PeerConnectionClient.java | 8 ++++--- .../org/webrtc/MediaCodecVideoEncoder.java | 23 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java index cc5e457cbf..737e854b87 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java @@ -73,6 +73,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"; @@ -371,12 +372,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;