| /* |
| * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| package org.webrtc; |
| |
| import java.nio.ByteBuffer; |
| import java.util.concurrent.TimeUnit; |
| |
| /** |
| * An encoded frame from a video stream. Used as an input for decoders and as an output for |
| * encoders. |
| */ |
| public class EncodedImage { |
| // Must be kept in sync with common_types.h FrameType. |
| public enum FrameType { |
| EmptyFrame(0), |
| VideoFrameKey(3), |
| VideoFrameDelta(4); |
| |
| private final int nativeIndex; |
| |
| private FrameType(int nativeIndex) { |
| this.nativeIndex = nativeIndex; |
| } |
| |
| public int getNative() { |
| return nativeIndex; |
| } |
| |
| @CalledByNative("FrameType") |
| static FrameType fromNativeIndex(int nativeIndex) { |
| for (FrameType type : FrameType.values()) { |
| if (type.getNative() == nativeIndex) { |
| return type; |
| } |
| } |
| throw new IllegalArgumentException("Unknown native frame type: " + nativeIndex); |
| } |
| } |
| |
| public final ByteBuffer buffer; |
| public final int encodedWidth; |
| public final int encodedHeight; |
| public final long captureTimeMs; // Deprecated |
| public final long captureTimeNs; |
| public final FrameType frameType; |
| public final int rotation; |
| public final boolean completeFrame; |
| public final Integer qp; |
| |
| @CalledByNative |
| private EncodedImage(ByteBuffer buffer, int encodedWidth, int encodedHeight, long captureTimeNs, |
| FrameType frameType, int rotation, boolean completeFrame, Integer qp) { |
| this.buffer = buffer; |
| this.encodedWidth = encodedWidth; |
| this.encodedHeight = encodedHeight; |
| this.captureTimeMs = TimeUnit.NANOSECONDS.toMillis(captureTimeNs); |
| this.captureTimeNs = captureTimeNs; |
| this.frameType = frameType; |
| this.rotation = rotation; |
| this.completeFrame = completeFrame; |
| this.qp = qp; |
| } |
| |
| public static Builder builder() { |
| return new Builder(); |
| } |
| |
| public static class Builder { |
| private ByteBuffer buffer; |
| private int encodedWidth; |
| private int encodedHeight; |
| private long captureTimeNs; |
| private EncodedImage.FrameType frameType; |
| private int rotation; |
| private boolean completeFrame; |
| private Integer qp; |
| |
| private Builder() {} |
| |
| public Builder setBuffer(ByteBuffer buffer) { |
| this.buffer = buffer; |
| return this; |
| } |
| |
| public Builder setEncodedWidth(int encodedWidth) { |
| this.encodedWidth = encodedWidth; |
| return this; |
| } |
| |
| public Builder setEncodedHeight(int encodedHeight) { |
| this.encodedHeight = encodedHeight; |
| return this; |
| } |
| |
| @Deprecated |
| public Builder setCaptureTimeMs(long captureTimeMs) { |
| this.captureTimeNs = TimeUnit.MILLISECONDS.toNanos(captureTimeMs); |
| return this; |
| } |
| |
| public Builder setCaptureTimeNs(long captureTimeNs) { |
| this.captureTimeNs = captureTimeNs; |
| return this; |
| } |
| |
| public Builder setFrameType(EncodedImage.FrameType frameType) { |
| this.frameType = frameType; |
| return this; |
| } |
| |
| public Builder setRotation(int rotation) { |
| this.rotation = rotation; |
| return this; |
| } |
| |
| public Builder setCompleteFrame(boolean completeFrame) { |
| this.completeFrame = completeFrame; |
| return this; |
| } |
| |
| public Builder setQp(Integer qp) { |
| this.qp = qp; |
| return this; |
| } |
| |
| public EncodedImage createEncodedImage() { |
| return new EncodedImage(buffer, encodedWidth, encodedHeight, captureTimeNs, frameType, |
| rotation, completeFrame, qp); |
| } |
| } |
| } |