/* * 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(); }