| /* | |
| * 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 javax.annotation.Nullable; | |
| import org.webrtc.EncodedImage; | |
| /** | |
| * Interface for a video encoder that can be used with WebRTC. All calls will be made on the | |
| * encoding thread. The encoder may be constructed on a different thread and changing thread after | |
| * calling release is allowed. | |
| */ | |
| public interface VideoEncoder { | |
| /** Settings passed to the encoder by WebRTC. */ | |
| public class Settings { | |
| public final int numberOfCores; | |
| public final int width; | |
| public final int height; | |
| public final int startBitrate; // Kilobits per second. | |
| public final int maxFramerate; | |
| public final int numberOfSimulcastStreams; | |
| public final boolean automaticResizeOn; | |
| @CalledByNative("Settings") | |
| public Settings(int numberOfCores, int width, int height, int startBitrate, int maxFramerate, | |
| int numberOfSimulcastStreams, boolean automaticResizeOn) { | |
| this.numberOfCores = numberOfCores; | |
| this.width = width; | |
| this.height = height; | |
| this.startBitrate = startBitrate; | |
| this.maxFramerate = maxFramerate; | |
| this.numberOfSimulcastStreams = numberOfSimulcastStreams; | |
| this.automaticResizeOn = automaticResizeOn; | |
| } | |
| } | |
| /** Additional info for encoding. */ | |
| public class EncodeInfo { | |
| public final EncodedImage.FrameType[] frameTypes; | |
| @CalledByNative("EncodeInfo") | |
| public EncodeInfo(EncodedImage.FrameType[] frameTypes) { | |
| this.frameTypes = frameTypes; | |
| } | |
| } | |
| // TODO(sakal): Add values to these classes as necessary. | |
| /** Codec specific information about the encoded frame. */ | |
| public class CodecSpecificInfo {} | |
| public class CodecSpecificInfoVP8 extends CodecSpecificInfo {} | |
| public class CodecSpecificInfoVP9 extends CodecSpecificInfo {} | |
| public class CodecSpecificInfoH264 extends CodecSpecificInfo {} | |
| /** | |
| * Represents bitrate allocated for an encoder to produce frames. Bitrate can be divided between | |
| * spatial and temporal layers. | |
| */ | |
| public class BitrateAllocation { | |
| // First index is the spatial layer and second the temporal layer. | |
| public final int[][] bitratesBbs; | |
| /** | |
| * Initializes the allocation with a two dimensional array of bitrates. The first index of the | |
| * array is the spatial layer and the second index in the temporal layer. | |
| */ | |
| @CalledByNative("BitrateAllocation") | |
| public BitrateAllocation(int[][] bitratesBbs) { | |
| this.bitratesBbs = bitratesBbs; | |
| } | |
| /** | |
| * Gets the total bitrate allocated for all layers. | |
| */ | |
| public int getSum() { | |
| int sum = 0; | |
| for (int[] spatialLayer : bitratesBbs) { | |
| for (int bitrate : spatialLayer) { | |
| sum += bitrate; | |
| } | |
| } | |
| return sum; | |
| } | |
| } | |
| /** Settings for WebRTC quality based scaling. */ | |
| public class ScalingSettings { | |
| public final boolean on; | |
| @Nullable public final Integer low; | |
| @Nullable public final Integer high; | |
| /** | |
| * Settings to disable quality based scaling. | |
| */ | |
| public static final ScalingSettings OFF = new ScalingSettings(); | |
| /** | |
| * Creates settings to enable quality based scaling. | |
| * | |
| * @param low Average QP at which to scale up the resolution. | |
| * @param high Average QP at which to scale down the resolution. | |
| */ | |
| public ScalingSettings(int low, int high) { | |
| this.on = true; | |
| this.low = low; | |
| this.high = high; | |
| } | |
| private ScalingSettings() { | |
| this.on = false; | |
| this.low = null; | |
| this.high = null; | |
| } | |
| // TODO(bugs.webrtc.org/8830): Below constructors are deprecated. | |
| // Default thresholds are going away, so thresholds have to be set | |
| // when scaling is on. | |
| /** | |
| * Creates quality based scaling setting. | |
| * | |
| * @param on True if quality scaling is turned on. | |
| */ | |
| @Deprecated | |
| public ScalingSettings(boolean on) { | |
| this.on = on; | |
| this.low = null; | |
| this.high = null; | |
| } | |
| /** | |
| * Creates quality based scaling settings with custom thresholds. | |
| * | |
| * @param on True if quality scaling is turned on. | |
| * @param low Average QP at which to scale up the resolution. | |
| * @param high Average QP at which to scale down the resolution. | |
| */ | |
| @Deprecated | |
| public ScalingSettings(boolean on, int low, int high) { | |
| this.on = on; | |
| this.low = low; | |
| this.high = high; | |
| } | |
| @Override | |
| public String toString() { | |
| return on ? "[ " + low + ", " + high + " ]" : "OFF"; | |
| } | |
| } | |
| public interface Callback { | |
| /** | |
| * Call to return an encoded frame. It is safe to assume the byte buffer held by |frame| is not | |
| * accessed after the call to this method returns. | |
| */ | |
| void onEncodedFrame(EncodedImage frame, CodecSpecificInfo info); | |
| } | |
| /** | |
| * The encoder implementation backing this interface is either 1) a Java | |
| * encoder (e.g., an Android platform encoder), or alternatively 2) a native | |
| * encoder (e.g., a software encoder or a C++ encoder adapter). | |
| * | |
| * For case 1), createNativeVideoEncoder() should return zero. | |
| * In this case, we expect the native library to call the encoder through | |
| * JNI using the Java interface declared below. | |
| * | |
| * For case 2), createNativeVideoEncoder() should return a non-zero value. | |
| * In this case, we expect the native library to treat the returned value as | |
| * a raw pointer of type webrtc::VideoEncoder* (ownership is transferred to | |
| * the caller). The native library should then directly call the | |
| * webrtc::VideoEncoder interface without going through JNI. All calls to | |
| * the Java interface methods declared below should thus throw an | |
| * UnsupportedOperationException. | |
| */ | |
| @CalledByNative | |
| default long createNativeVideoEncoder() { | |
| return 0; | |
| } | |
| /** | |
| * Returns true if the encoder is backed by hardware. | |
| */ | |
| @CalledByNative | |
| default boolean isHardwareEncoder() { | |
| return true; | |
| } | |
| /** | |
| * Initializes the encoding process. Call before any calls to encode. | |
| */ | |
| @CalledByNative VideoCodecStatus initEncode(Settings settings, Callback encodeCallback); | |
| /** | |
| * Releases the encoder. No more calls to encode will be made after this call. | |
| */ | |
| @CalledByNative VideoCodecStatus release(); | |
| /** | |
| * Requests the encoder to encode a frame. | |
| */ | |
| @CalledByNative VideoCodecStatus encode(VideoFrame frame, EncodeInfo info); | |
| /** | |
| * Informs the encoder of the packet loss and the round-trip time of the network. | |
| * | |
| * @param packetLoss How many packets are lost on average per 255 packets. | |
| * @param roundTripTimeMs Round-trip time of the network in milliseconds. | |
| */ | |
| @CalledByNative VideoCodecStatus setChannelParameters(short packetLoss, long roundTripTimeMs); | |
| /** Sets the bitrate allocation and the target framerate for the encoder. */ | |
| @CalledByNative VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate); | |
| /** Any encoder that wants to use WebRTC provided quality scaler must implement this method. */ | |
| @CalledByNative ScalingSettings getScalingSettings(); | |
| /** | |
| * Should return a descriptive name for the implementation. Gets called once and cached. May be | |
| * called from arbitrary thread. | |
| */ | |
| @CalledByNative String getImplementationName(); | |
| } |