| /* | |
| * 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; | |
| /** | |
| * Interface for a video decoder that can be used in WebRTC. All calls to the class will be made on | |
| * a single decoding thread. | |
| */ | |
| public interface VideoDecoder { | |
| /** Settings passed to the decoder by WebRTC. */ | |
| public class Settings { | |
| public final int numberOfCores; | |
| public final int width; | |
| public final int height; | |
| @CalledByNative("Settings") | |
| public Settings(int numberOfCores, int width, int height) { | |
| this.numberOfCores = numberOfCores; | |
| this.width = width; | |
| this.height = height; | |
| } | |
| } | |
| /** Additional info for decoding. */ | |
| public class DecodeInfo { | |
| public final boolean isMissingFrames; | |
| public final long renderTimeMs; | |
| public DecodeInfo(boolean isMissingFrames, long renderTimeMs) { | |
| this.isMissingFrames = isMissingFrames; | |
| this.renderTimeMs = renderTimeMs; | |
| } | |
| } | |
| public interface Callback { | |
| /** | |
| * Call to return a decoded frame. Can be called on any thread. | |
| * | |
| * @param frame Decoded frame | |
| * @param decodeTimeMs Time it took to decode the frame in milliseconds or null if not available | |
| * @param qp QP value of the decoded frame or null if not available | |
| */ | |
| void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp); | |
| } | |
| /** | |
| * The decoder implementation backing this interface is either 1) a Java | |
| * decoder (e.g., an Android platform decoder), or alternatively 2) a native | |
| * decoder (e.g., a software decoder or a C++ decoder adapter). | |
| * | |
| * For case 1), createNativeVideoDecoder() should return zero. | |
| * In this case, we expect the native library to call the decoder through | |
| * JNI using the Java interface declared below. | |
| * | |
| * For case 2), createNativeVideoDecoder() 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::VideoDecoder* (ownership is transferred to | |
| * the caller). The native library should then directly call the | |
| * webrtc::VideoDecoder interface without going through JNI. All calls to | |
| * the Java interface methods declared below should thus throw an | |
| * UnsupportedOperationException. | |
| */ | |
| @CalledByNative | |
| default long createNativeVideoDecoder() { | |
| return 0; | |
| } | |
| /** | |
| * Initializes the decoding process with specified settings. Will be called on the decoding thread | |
| * before any decode calls. | |
| */ | |
| @CalledByNative VideoCodecStatus initDecode(Settings settings, Callback decodeCallback); | |
| /** | |
| * Called when the decoder is no longer needed. Any more calls to decode will not be made. | |
| */ | |
| @CalledByNative VideoCodecStatus release(); | |
| /** | |
| * Request the decoder to decode a frame. | |
| */ | |
| @CalledByNative VideoCodecStatus decode(EncodedImage frame, DecodeInfo info); | |
| /** | |
| * The decoder should return true if it prefers late decoding. That is, it can not decode | |
| * infinite number of frames before the decoded frame is consumed. | |
| */ | |
| @CalledByNative boolean getPrefersLateDecoding(); | |
| /** | |
| * Should return a descriptive name for the implementation. Gets called once and cached. May be | |
| * called from arbitrary thread. | |
| */ | |
| @CalledByNative String getImplementationName(); | |
| } |