| Index: webrtc/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
 | 
| diff --git a/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
 | 
| index 08c09c7fa84fb44fc02d59d432f8b3598b33c49d..f3be4cbc694ebeac96d04b07b0fdfce35dfabf05 100644
 | 
| --- a/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
 | 
| +++ b/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
 | 
| @@ -20,10 +20,8 @@ import android.os.Bundle;
 | 
|  import android.view.Surface;
 | 
|  import java.io.IOException;
 | 
|  import java.nio.ByteBuffer;
 | 
| -import java.util.Arrays;
 | 
|  import java.util.Deque;
 | 
| -import java.util.HashSet;
 | 
| -import java.util.Set;
 | 
| +import java.util.Map;
 | 
|  import java.util.concurrent.LinkedBlockingDeque;
 | 
|  import java.util.concurrent.TimeUnit;
 | 
|  
 | 
| @@ -40,6 +38,9 @@ class HardwareVideoEncoder implements VideoEncoder {
 | 
|    // constant until API level 21.
 | 
|    private static final String KEY_BITRATE_MODE = "bitrate-mode";
 | 
|  
 | 
| +  private static final int VIDEO_AVC_PROFILE_HIGH = 8;
 | 
| +  private static final int VIDEO_AVC_LEVEL_3 = 0x100;
 | 
| +
 | 
|    private static final int MAX_VIDEO_FRAMERATE = 30;
 | 
|  
 | 
|    // See MAX_ENCODER_Q_SIZE in androidmediaencoder_jni.cc.
 | 
| @@ -51,6 +52,7 @@ class HardwareVideoEncoder implements VideoEncoder {
 | 
|    private final String codecName;
 | 
|    private final VideoCodecType codecType;
 | 
|    private final int colorFormat;
 | 
| +  private final Map<String, String> params;
 | 
|    private final ColorFormat inputColorFormat;
 | 
|    // Base interval for generating key frames.
 | 
|    private final int keyFrameIntervalSec;
 | 
| @@ -115,11 +117,12 @@ class HardwareVideoEncoder implements VideoEncoder {
 | 
|     * @throws IllegalArgumentException if colorFormat is unsupported
 | 
|     */
 | 
|    public HardwareVideoEncoder(String codecName, VideoCodecType codecType, int colorFormat,
 | 
| -      int keyFrameIntervalSec, int forceKeyFrameIntervalMs, BitrateAdjuster bitrateAdjuster,
 | 
| -      EglBase14.Context textureContext) {
 | 
| +      Map<String, String> params, int keyFrameIntervalSec, int forceKeyFrameIntervalMs,
 | 
| +      BitrateAdjuster bitrateAdjuster, EglBase14.Context textureContext) {
 | 
|      this.codecName = codecName;
 | 
|      this.codecType = codecType;
 | 
|      this.colorFormat = colorFormat;
 | 
| +    this.params = params;
 | 
|      if (textureContext == null) {
 | 
|        this.inputColorFormat = ColorFormat.valueOf(colorFormat);
 | 
|      } else {
 | 
| @@ -169,6 +172,22 @@ class HardwareVideoEncoder implements VideoEncoder {
 | 
|        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
 | 
|        format.setInteger(MediaFormat.KEY_FRAME_RATE, bitrateAdjuster.getAdjustedFramerate());
 | 
|        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
 | 
| +      if (codecType == VideoCodecType.H264) {
 | 
| +        String profileLevelId = params.get(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID);
 | 
| +        if (profileLevelId == null) {
 | 
| +          profileLevelId = VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1;
 | 
| +        }
 | 
| +        switch (profileLevelId) {
 | 
| +          case VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1:
 | 
| +            format.setInteger("profile", VIDEO_AVC_PROFILE_HIGH);
 | 
| +            format.setInteger("level", VIDEO_AVC_LEVEL_3);
 | 
| +            break;
 | 
| +          case VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1:
 | 
| +            break;
 | 
| +          default:
 | 
| +            Logging.w(TAG, "Unknown profile level id: " + profileLevelId);
 | 
| +        }
 | 
| +      }
 | 
|        Logging.d(TAG, "Format: " + format);
 | 
|        codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
 | 
|  
 | 
| 
 |