
This CL extends our support for injecting native codecs such that downstream users can create Java codecs that are backed by custom native codecs. After this CL, the Java codec interfaces expose createNativeVideo{En,Decoder}() methods that may return a value representing a pointer to the backing native codec. Previously, a similar mechanism was used for the special case of non-public Java codecs extending from the internal WrappedNativeVideo{En,De}coder classes. Tested: AppRTCMobile on Pixel XL and Pixel 2. Bug: webrtc:9495 Change-Id: I079ff744afc7bf9873ff983e775c136a6667266d Reviewed-on: https://webrtc-review.googlesource.com/87264 Commit-Queue: Rasmus Brandt <brandtr@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23883}
100 lines
3.5 KiB
Java
100 lines
3.5 KiB
Java
/*
|
|
* 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();
|
|
}
|