Index: webrtc/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java |
diff --git a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java |
index bd4dfb79460489b1aa1ffd30777da7411796e0bd..4ba6b727df5cdccd83332841bcccc610ae026ef5 100644 |
--- a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java |
+++ b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java |
@@ -41,6 +41,14 @@ public class MediaCodecVideoDecoder { |
private static final String TAG = "MediaCodecVideoDecoder"; |
private static final long MAX_DECODE_TIME_MS = 200; |
+ // TODO(magjed): Use MediaFormat constants when part of the public API. |
+ private static final String FORMAT_KEY_STRIDE = "stride"; |
+ private static final String FORMAT_KEY_SLICE_HEIGHT = "slice-height"; |
+ private static final String FORMAT_KEY_CROP_LEFT = "crop-left"; |
+ private static final String FORMAT_KEY_CROP_RIGHT = "crop-right"; |
+ private static final String FORMAT_KEY_CROP_TOP = "crop-top"; |
+ private static final String FORMAT_KEY_CROP_BOTTOM = "crop-bottom"; |
+ |
// Tracks webrtc::VideoCodecType. |
public enum VideoCodecType { VIDEO_CODEC_VP8, VIDEO_CODEC_VP9, VIDEO_CODEC_H264 } |
@@ -596,14 +604,25 @@ public class MediaCodecVideoDecoder { |
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: |
MediaFormat format = mediaCodec.getOutputFormat(); |
Logging.d(TAG, "Decoder format changed: " + format.toString()); |
- int new_width = format.getInteger(MediaFormat.KEY_WIDTH); |
- int new_height = format.getInteger(MediaFormat.KEY_HEIGHT); |
- if (hasDecodedFirstFrame && (new_width != width || new_height != height)) { |
+ final int newWidth; |
+ final int newHeight; |
+ if (format.containsKey(FORMAT_KEY_CROP_LEFT) && format.containsKey(FORMAT_KEY_CROP_RIGHT) |
+ && format.containsKey(FORMAT_KEY_CROP_BOTTOM) |
+ && format.containsKey(FORMAT_KEY_CROP_TOP)) { |
+ newWidth = 1 + format.getInteger(FORMAT_KEY_CROP_RIGHT) |
+ - format.getInteger(FORMAT_KEY_CROP_LEFT); |
+ newHeight = 1 + format.getInteger(FORMAT_KEY_CROP_BOTTOM) |
+ - format.getInteger(FORMAT_KEY_CROP_TOP); |
+ } else { |
+ newWidth = format.getInteger(MediaFormat.KEY_WIDTH); |
+ newHeight = format.getInteger(MediaFormat.KEY_HEIGHT); |
+ } |
+ if (hasDecodedFirstFrame && (newWidth != width || newHeight != height)) { |
throw new RuntimeException("Unexpected size change. Configured " + width + "*" + height |
- + ". New " + new_width + "*" + new_height); |
+ + ". New " + newWidth + "*" + newHeight); |
} |
- width = format.getInteger(MediaFormat.KEY_WIDTH); |
- height = format.getInteger(MediaFormat.KEY_HEIGHT); |
+ width = newWidth; |
+ height = newHeight; |
if (!useSurface && format.containsKey(MediaFormat.KEY_COLOR_FORMAT)) { |
colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT); |
@@ -612,11 +631,11 @@ public class MediaCodecVideoDecoder { |
throw new IllegalStateException("Non supported color format: " + colorFormat); |
} |
} |
- if (format.containsKey("stride")) { |
- stride = format.getInteger("stride"); |
+ if (format.containsKey(FORMAT_KEY_STRIDE)) { |
+ stride = format.getInteger(FORMAT_KEY_STRIDE); |
} |
- if (format.containsKey("slice-height")) { |
- sliceHeight = format.getInteger("slice-height"); |
+ if (format.containsKey(FORMAT_KEY_SLICE_HEIGHT)) { |
+ sliceHeight = format.getInteger(FORMAT_KEY_SLICE_HEIGHT); |
} |
Logging.d(TAG, "Frame stride and slice height: " + stride + " x " + sliceHeight); |
stride = Math.max(width, stride); |