blob: fabf36a60e41e4d43b2b5c984f9a7f7ead9e03c4 [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
Niels Möller6fd67f02019-06-13 14:37:24 +020013import android.support.annotation.Nullable;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020014import java.nio.ByteBuffer;
sakale172d892017-08-31 02:37:28 -070015import java.util.concurrent.TimeUnit;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020016
17/**
18 * An encoded frame from a video stream. Used as an input for decoders and as an output for
19 * encoders.
20 */
Niels Möller67309ef2019-09-23 12:47:16 +020021public class EncodedImage implements RefCounted {
sakal07a3bd72017-09-04 03:57:21 -070022 // Must be kept in sync with common_types.h FrameType.
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020023 public enum FrameType {
sakal07a3bd72017-09-04 03:57:21 -070024 EmptyFrame(0),
25 VideoFrameKey(3),
26 VideoFrameDelta(4);
27
28 private final int nativeIndex;
29
30 private FrameType(int nativeIndex) {
31 this.nativeIndex = nativeIndex;
32 }
33
34 public int getNative() {
35 return nativeIndex;
36 }
Magnus Jedvert4eb01882017-11-20 22:33:40 +010037
Magnus Jedvert4eb01882017-11-20 22:33:40 +010038 @CalledByNative("FrameType")
Magnus Jedvert1f2a3e72017-11-23 16:56:44 +010039 static FrameType fromNativeIndex(int nativeIndex) {
Magnus Jedvert4eb01882017-11-20 22:33:40 +010040 for (FrameType type : FrameType.values()) {
41 if (type.getNative() == nativeIndex) {
42 return type;
43 }
44 }
45 throw new IllegalArgumentException("Unknown native frame type: " + nativeIndex);
46 }
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020047 }
48
Niels Möller67309ef2019-09-23 12:47:16 +020049 private final RefCountDelegate refCountDelegate;
50 private final boolean supportsRetain;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020051 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;
Niels Möller6fd67f02019-06-13 14:37:24 +020059 public final @Nullable Integer qp;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020060
Niels Möller67309ef2019-09-23 12:47:16 +020061 // TODO(bugs.webrtc.org/9378): Use retain and release from jni code.
62 @Override
63 public void retain() {
64 refCountDelegate.retain();
65 }
66
67 @Override
68 public void release() {
69 refCountDelegate.release();
70 }
71
72 // A false return value means that the encoder expects that the buffer is no longer used after
73 // VideoEncoder.Callback.onEncodedFrame returns.
Niels Möller7c2bed82019-10-01 14:02:58 +020074 @CalledByNative
Niels Möller67309ef2019-09-23 12:47:16 +020075 boolean maybeRetain() {
76 if (supportsRetain) {
77 retain();
78 return true;
79 } else {
80 return false;
81 }
82 }
83
Magnus Jedvert1f2a3e72017-11-23 16:56:44 +010084 @CalledByNative
Niels Möller67309ef2019-09-23 12:47:16 +020085 private EncodedImage(ByteBuffer buffer, boolean supportsRetain,
86 @Nullable Runnable releaseCallback, int encodedWidth, int encodedHeight, long captureTimeNs,
Niels Möller6fd67f02019-06-13 14:37:24 +020087 FrameType frameType, int rotation, boolean completeFrame, @Nullable Integer qp) {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020088 this.buffer = buffer;
89 this.encodedWidth = encodedWidth;
90 this.encodedHeight = encodedHeight;
sakale172d892017-08-31 02:37:28 -070091 this.captureTimeMs = TimeUnit.NANOSECONDS.toMillis(captureTimeNs);
92 this.captureTimeNs = captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020093 this.frameType = frameType;
94 this.rotation = rotation;
95 this.completeFrame = completeFrame;
96 this.qp = qp;
Niels Möller67309ef2019-09-23 12:47:16 +020097 this.supportsRetain = supportsRetain;
98 this.refCountDelegate = new RefCountDelegate(releaseCallback);
Sami Kalliomäkie2410e92017-06-02 14:46:12 +020099 }
100
Niels Möller6fd67f02019-06-13 14:37:24 +0200101 @CalledByNative
102 private ByteBuffer getBuffer() {
103 return buffer;
104 }
105
106 @CalledByNative
107 private int getEncodedWidth() {
108 return encodedWidth;
109 }
110
111 @CalledByNative
112 private int getEncodedHeight() {
113 return encodedHeight;
114 }
115
116 @CalledByNative
117 private long getCaptureTimeNs() {
118 return captureTimeNs;
119 }
120
121 @CalledByNative
122 private int getFrameType() {
123 return frameType.getNative();
124 }
125
126 @CalledByNative
127 private int getRotation() {
128 return rotation;
129 }
130
131 @CalledByNative
132 private boolean getCompleteFrame() {
133 return completeFrame;
134 }
135
136 @CalledByNative
137 private @Nullable Integer getQp() {
138 return qp;
139 }
140
Bjorn Mellem5c4eebb2017-06-12 09:21:03 -0700141 public static Builder builder() {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200142 return new Builder();
143 }
144
Bjorn Mellem5c4eebb2017-06-12 09:21:03 -0700145 public static class Builder {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200146 private ByteBuffer buffer;
Niels Möller67309ef2019-09-23 12:47:16 +0200147 private boolean supportsRetain;
148 private @Nullable Runnable releaseCallback;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200149 private int encodedWidth;
150 private int encodedHeight;
sakale172d892017-08-31 02:37:28 -0700151 private long captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200152 private EncodedImage.FrameType frameType;
153 private int rotation;
154 private boolean completeFrame;
Niels Möller6fd67f02019-06-13 14:37:24 +0200155 private @Nullable Integer qp;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200156
157 private Builder() {}
158
Niels Möller67309ef2019-09-23 12:47:16 +0200159 @Deprecated
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200160 public Builder setBuffer(ByteBuffer buffer) {
161 this.buffer = buffer;
Niels Möller67309ef2019-09-23 12:47:16 +0200162 this.releaseCallback = null;
163 this.supportsRetain = false;
164 return this;
165 }
166
167 public Builder setBuffer(ByteBuffer buffer, @Nullable Runnable releaseCallback) {
168 this.buffer = buffer;
169 this.releaseCallback = releaseCallback;
170 this.supportsRetain = true;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200171 return this;
172 }
173
174 public Builder setEncodedWidth(int encodedWidth) {
175 this.encodedWidth = encodedWidth;
176 return this;
177 }
178
179 public Builder setEncodedHeight(int encodedHeight) {
180 this.encodedHeight = encodedHeight;
181 return this;
182 }
183
sakale172d892017-08-31 02:37:28 -0700184 @Deprecated
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200185 public Builder setCaptureTimeMs(long captureTimeMs) {
sakale172d892017-08-31 02:37:28 -0700186 this.captureTimeNs = TimeUnit.MILLISECONDS.toNanos(captureTimeMs);
187 return this;
188 }
189
190 public Builder setCaptureTimeNs(long captureTimeNs) {
191 this.captureTimeNs = captureTimeNs;
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200192 return this;
193 }
194
195 public Builder setFrameType(EncodedImage.FrameType frameType) {
196 this.frameType = frameType;
197 return this;
198 }
199
200 public Builder setRotation(int rotation) {
201 this.rotation = rotation;
202 return this;
203 }
204
205 public Builder setCompleteFrame(boolean completeFrame) {
206 this.completeFrame = completeFrame;
207 return this;
208 }
209
Niels Möller6fd67f02019-06-13 14:37:24 +0200210 public Builder setQp(@Nullable Integer qp) {
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200211 this.qp = qp;
212 return this;
213 }
214
215 public EncodedImage createEncodedImage() {
Niels Möller67309ef2019-09-23 12:47:16 +0200216 return new EncodedImage(buffer, supportsRetain, releaseCallback, encodedWidth, encodedHeight,
217 captureTimeNs, frameType, rotation, completeFrame, qp);
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200218 }
219 }
Sami Kalliomäkie2410e92017-06-02 14:46:12 +0200220}