blob: dc8eb62615ae2dd5ea53cd0089b0b102bbccdc6c [file] [log] [blame]
Sami Kalliomäkie2410e92017-06-02 14:46:12 +02001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11package org.webrtc;
12
13import java.nio.ByteBuffer;
sakale172d892017-08-31 02:37:28 -070014import java.util.concurrent.TimeUnit;
Magnus Jedvert4eb01882017-11-20 22:33:40 +010015// TODO(bugs.webrtc.org/8556): Remove unnecessary import.
16import org.webrtc.EncodedImage;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020017
18/**
19 * An encoded frame from a video stream. Used as an input for decoders and as an output for
20 * encoders.
21 */
22public class EncodedImage {
sakal07a3bd72017-09-04 03:57:21 -070023 // Must be kept in sync with common_types.h FrameType.
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020024 public enum FrameType {
sakal07a3bd72017-09-04 03:57:21 -070025 EmptyFrame(0),
26 VideoFrameKey(3),
27 VideoFrameDelta(4);
28
29 private final int nativeIndex;
30
31 private FrameType(int nativeIndex) {
32 this.nativeIndex = nativeIndex;
33 }
34
35 public int getNative() {
36 return nativeIndex;
37 }
Magnus Jedvert4eb01882017-11-20 22:33:40 +010038
39 // TODO(bugs.webrtc.org/8556): Remove unnecessary 'EncodedImage.'.
40 @CalledByNative("FrameType")
41 static EncodedImage.FrameType fromNativeIndex(int nativeIndex) {
42 for (FrameType type : FrameType.values()) {
43 if (type.getNative() == nativeIndex) {
44 return type;
45 }
46 }
47 throw new IllegalArgumentException("Unknown native frame type: " + nativeIndex);
48 }
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020049 }
50
51 public final ByteBuffer buffer;
52 public final int encodedWidth;
53 public final int encodedHeight;
sakale172d892017-08-31 02:37:28 -070054 public final long captureTimeMs; // Deprecated
55 public final long captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020056 public final FrameType frameType;
57 public final int rotation;
58 public final boolean completeFrame;
59 public final Integer qp;
60
sakale172d892017-08-31 02:37:28 -070061 private EncodedImage(ByteBuffer buffer, int encodedWidth, int encodedHeight, long captureTimeNs,
Sami Kalliomäki26ecfcc2017-06-14 13:46:58 +020062 FrameType frameType, int rotation, boolean completeFrame, Integer qp) {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020063 this.buffer = buffer;
64 this.encodedWidth = encodedWidth;
65 this.encodedHeight = encodedHeight;
sakale172d892017-08-31 02:37:28 -070066 this.captureTimeMs = TimeUnit.NANOSECONDS.toMillis(captureTimeNs);
67 this.captureTimeNs = captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020068 this.frameType = frameType;
69 this.rotation = rotation;
70 this.completeFrame = completeFrame;
71 this.qp = qp;
72 }
73
Bjorn Mellem5c4eebb2017-06-12 09:21:03 -070074 public static Builder builder() {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020075 return new Builder();
76 }
77
Bjorn Mellem5c4eebb2017-06-12 09:21:03 -070078 public static class Builder {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020079 private ByteBuffer buffer;
80 private int encodedWidth;
81 private int encodedHeight;
sakale172d892017-08-31 02:37:28 -070082 private long captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020083 private EncodedImage.FrameType frameType;
84 private int rotation;
85 private boolean completeFrame;
86 private Integer qp;
87
88 private Builder() {}
89
90 public Builder setBuffer(ByteBuffer buffer) {
91 this.buffer = buffer;
92 return this;
93 }
94
95 public Builder setEncodedWidth(int encodedWidth) {
96 this.encodedWidth = encodedWidth;
97 return this;
98 }
99
100 public Builder setEncodedHeight(int encodedHeight) {
101 this.encodedHeight = encodedHeight;
102 return this;
103 }
104
sakale172d892017-08-31 02:37:28 -0700105 @Deprecated
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200106 public Builder setCaptureTimeMs(long captureTimeMs) {
sakale172d892017-08-31 02:37:28 -0700107 this.captureTimeNs = TimeUnit.MILLISECONDS.toNanos(captureTimeMs);
108 return this;
109 }
110
111 public Builder setCaptureTimeNs(long captureTimeNs) {
112 this.captureTimeNs = captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200113 return this;
114 }
115
116 public Builder setFrameType(EncodedImage.FrameType frameType) {
117 this.frameType = frameType;
118 return this;
119 }
120
121 public Builder setRotation(int rotation) {
122 this.rotation = rotation;
123 return this;
124 }
125
126 public Builder setCompleteFrame(boolean completeFrame) {
127 this.completeFrame = completeFrame;
128 return this;
129 }
130
131 public Builder setQp(Integer qp) {
132 this.qp = qp;
133 return this;
134 }
135
136 public EncodedImage createEncodedImage() {
sakale172d892017-08-31 02:37:28 -0700137 return new EncodedImage(buffer, encodedWidth, encodedHeight, captureTimeNs, frameType,
Sami Kalliomäki26ecfcc2017-06-14 13:46:58 +0200138 rotation, completeFrame, qp);
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200139 }
140 }
Magnus Jedvert4eb01882017-11-20 22:33:40 +0100141
142 // TODO(bugs.webrtc.org/8551) Remove.
143 @CalledByNative
144 static EncodedImage create(ByteBuffer buffer, int encodedWidth, int encodedHeight,
145 long captureTimeNs, EncodedImage.FrameType frameType, int rotation, boolean completeFrame,
146 Integer qp) {
147 return new EncodedImage(
148 buffer, encodedWidth, encodedHeight, captureTimeNs, frameType, rotation, completeFrame, qp);
149 }
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200150}