mirror of
https://github.com/samsonjs/media.git
synced 2026-04-05 11:15:46 +00:00
Allow to disable libyuv dependency on LIBVPX
Goal: reduce binary size. PiperOrigin-RevId: 231198579
This commit is contained in:
parent
866835ea03
commit
19144c4c73
10 changed files with 47 additions and 155 deletions
|
|
@ -41,6 +41,9 @@
|
|||
* Add `Handler` parameter to `ConcatenatingMediaSource` methods which take a
|
||||
callback `Runnable`.
|
||||
* Remove `player` and `isTopLevelSource` parameters from `MediaSource.prepare`.
|
||||
* VP9 extension: Remove RGB output mode and libyuv dependency, and switch to
|
||||
surface YUV output as the default. Remove constructor parameters `scaleToFit`
|
||||
and `useSurfaceYuvOutput`.
|
||||
* Change signature of `PlayerNotificationManager.NotificationListener` to better
|
||||
fit service requirements. Remove ability to set a custom stop action.
|
||||
|
||||
|
|
|
|||
|
|
@ -34,26 +34,6 @@ VP9_EXT_PATH="${EXOPLAYER_ROOT}/extensions/vp9/src/main"
|
|||
NDK_PATH="<path to Android NDK>"
|
||||
```
|
||||
|
||||
* Fetch libvpx and libyuv:
|
||||
|
||||
```
|
||||
cd "${VP9_EXT_PATH}/jni" && \
|
||||
git clone https://chromium.googlesource.com/webm/libvpx libvpx && \
|
||||
git clone https://chromium.googlesource.com/libyuv/libyuv libyuv
|
||||
```
|
||||
|
||||
* Checkout the appropriate branches of libvpx and libyuv (the scripts and
|
||||
makefiles bundled in this repo are known to work only at these versions of the
|
||||
libraries - we will update this periodically as newer versions of
|
||||
libvpx/libyuv are released):
|
||||
|
||||
```
|
||||
cd "${VP9_EXT_PATH}/jni/libvpx" && \
|
||||
git checkout tags/v1.7.0 -b v1.7.0 && \
|
||||
cd "${VP9_EXT_PATH}/jni/libyuv" && \
|
||||
git checkout 996a2bbd
|
||||
```
|
||||
|
||||
* Run a script that generates necessary configuration files for libvpx:
|
||||
|
||||
```
|
||||
|
|
@ -78,10 +58,6 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4
|
|||
* Android config scripts should be re-generated by running
|
||||
`generate_libvpx_android_configs.sh`
|
||||
* Clean and re-build the project.
|
||||
* If you want to use your own version of libvpx or libyuv, place it in
|
||||
`${VP9_EXT_PATH}/jni/libvpx` or `${VP9_EXT_PATH}/jni/libyuv` respectively. But
|
||||
please note that `generate_libvpx_android_configs.sh` and the makefiles need
|
||||
to be modified to work with arbitrary versions of libvpx and libyuv.
|
||||
|
||||
## Using the extension ##
|
||||
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ public class VpxPlaybackTest {
|
|||
@Override
|
||||
public void run() {
|
||||
Looper.prepare();
|
||||
LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0);
|
||||
LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(0);
|
||||
DefaultTrackSelector trackSelector = new DefaultTrackSelector();
|
||||
player = ExoPlayerFactory.newInstance(context, new Renderer[] {videoRenderer}, trackSelector);
|
||||
player.addListener(this);
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@
|
|||
*/
|
||||
package com.google.android.exoplayer2.ext.vp9;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.SystemClock;
|
||||
|
|
@ -109,7 +107,6 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
/** The default input buffer size. */
|
||||
private static final int DEFAULT_INPUT_BUFFER_SIZE = 768 * 1024; // Value based on cs/SoftVpx.cpp.
|
||||
|
||||
private final boolean scaleToFit;
|
||||
private final boolean disableLoopFilter;
|
||||
private final long allowedJoiningTimeMs;
|
||||
private final int maxDroppedFramesToNotify;
|
||||
|
|
@ -119,7 +116,6 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
private final TimedValueQueue<Format> formatQueue;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
||||
private final boolean useSurfaceYuvOutput;
|
||||
|
||||
private Format format;
|
||||
private Format pendingFormat;
|
||||
|
|
@ -133,7 +129,6 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
private @ReinitializationState int decoderReinitializationState;
|
||||
private boolean decoderReceivedBuffers;
|
||||
|
||||
private Bitmap bitmap;
|
||||
private boolean renderedFirstFrame;
|
||||
private long initialPositionUs;
|
||||
private long joiningDeadlineMs;
|
||||
|
|
@ -158,16 +153,14 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
protected DecoderCounters decoderCounters;
|
||||
|
||||
/**
|
||||
* @param scaleToFit Whether video frames should be scaled to fit when rendering.
|
||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
||||
* can attempt to seamlessly join an ongoing playback.
|
||||
*/
|
||||
public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs) {
|
||||
this(scaleToFit, allowedJoiningTimeMs, null, null, 0);
|
||||
public LibvpxVideoRenderer(long allowedJoiningTimeMs) {
|
||||
this(allowedJoiningTimeMs, null, null, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scaleToFit Whether video frames should be scaled to fit when rendering.
|
||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
||||
* can attempt to seamlessly join an ongoing playback.
|
||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
||||
|
|
@ -176,23 +169,22 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||
*/
|
||||
public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs,
|
||||
Handler eventHandler, VideoRendererEventListener eventListener,
|
||||
public LibvpxVideoRenderer(
|
||||
long allowedJoiningTimeMs,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener eventListener,
|
||||
int maxDroppedFramesToNotify) {
|
||||
this(
|
||||
scaleToFit,
|
||||
allowedJoiningTimeMs,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
maxDroppedFramesToNotify,
|
||||
/* drmSessionManager= */ null,
|
||||
/* playClearSamplesWithoutKeys= */ false,
|
||||
/* disableLoopFilter= */ false,
|
||||
/* useSurfaceYuvOutput= */ false);
|
||||
/* disableLoopFilter= */ false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scaleToFit Whether video frames should be scaled to fit when rendering.
|
||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
||||
* can attempt to seamlessly join an ongoing playback.
|
||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
||||
|
|
@ -208,26 +200,21 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
||||
* @param disableLoopFilter Disable the libvpx in-loop smoothing filter.
|
||||
* @param useSurfaceYuvOutput Directly output YUV to the Surface via ANativeWindow.
|
||||
*/
|
||||
public LibvpxVideoRenderer(
|
||||
boolean scaleToFit,
|
||||
long allowedJoiningTimeMs,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener eventListener,
|
||||
int maxDroppedFramesToNotify,
|
||||
DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
boolean disableLoopFilter,
|
||||
boolean useSurfaceYuvOutput) {
|
||||
boolean disableLoopFilter) {
|
||||
super(C.TRACK_TYPE_VIDEO);
|
||||
this.scaleToFit = scaleToFit;
|
||||
this.disableLoopFilter = disableLoopFilter;
|
||||
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
||||
this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
|
||||
this.drmSessionManager = drmSessionManager;
|
||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
||||
this.useSurfaceYuvOutput = useSurfaceYuvOutput;
|
||||
joiningDeadlineMs = C.TIME_UNSET;
|
||||
clearReportedVideoSize();
|
||||
formatHolder = new FormatHolder();
|
||||
|
|
@ -586,18 +573,14 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
*/
|
||||
protected void renderOutputBuffer(VpxOutputBuffer outputBuffer) throws VpxDecoderException {
|
||||
int bufferMode = outputBuffer.mode;
|
||||
boolean renderRgb = bufferMode == VpxDecoder.OUTPUT_MODE_RGB && surface != null;
|
||||
boolean renderSurface = bufferMode == VpxDecoder.OUTPUT_MODE_SURFACE_YUV && surface != null;
|
||||
boolean renderYuv = bufferMode == VpxDecoder.OUTPUT_MODE_YUV && outputBufferRenderer != null;
|
||||
lastRenderTimeUs = SystemClock.elapsedRealtime() * 1000;
|
||||
if (!renderRgb && !renderYuv && !renderSurface) {
|
||||
if (!renderYuv && !renderSurface) {
|
||||
dropOutputBuffer(outputBuffer);
|
||||
} else {
|
||||
maybeNotifyVideoSizeChanged(outputBuffer.width, outputBuffer.height);
|
||||
if (renderRgb) {
|
||||
renderRgbFrame(outputBuffer, scaleToFit);
|
||||
outputBuffer.release();
|
||||
} else if (renderYuv) {
|
||||
if (renderYuv) {
|
||||
outputBufferRenderer.setOutputBuffer(outputBuffer);
|
||||
// The renderer will release the buffer.
|
||||
} else { // renderSurface
|
||||
|
|
@ -675,8 +658,7 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
this.surface = surface;
|
||||
this.outputBufferRenderer = outputBufferRenderer;
|
||||
if (surface != null) {
|
||||
outputMode =
|
||||
useSurfaceYuvOutput ? VpxDecoder.OUTPUT_MODE_SURFACE_YUV : VpxDecoder.OUTPUT_MODE_RGB;
|
||||
outputMode = VpxDecoder.OUTPUT_MODE_SURFACE_YUV;
|
||||
} else {
|
||||
outputMode =
|
||||
outputBufferRenderer != null ? VpxDecoder.OUTPUT_MODE_YUV : VpxDecoder.OUTPUT_MODE_NONE;
|
||||
|
|
@ -739,8 +721,7 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
NUM_OUTPUT_BUFFERS,
|
||||
initialInputBufferSize,
|
||||
mediaCrypto,
|
||||
disableLoopFilter,
|
||||
useSurfaceYuvOutput);
|
||||
disableLoopFilter);
|
||||
decoder.setOutputMode(outputMode);
|
||||
TraceUtil.endSection();
|
||||
long decoderInitializedTimestamp = SystemClock.elapsedRealtime();
|
||||
|
|
@ -940,23 +921,6 @@ public class LibvpxVideoRenderer extends BaseRenderer {
|
|||
return drmSessionState != DrmSession.STATE_OPENED_WITH_KEYS;
|
||||
}
|
||||
|
||||
private void renderRgbFrame(VpxOutputBuffer outputBuffer, boolean scale) {
|
||||
if (bitmap == null
|
||||
|| bitmap.getWidth() != outputBuffer.width
|
||||
|| bitmap.getHeight() != outputBuffer.height) {
|
||||
bitmap = Bitmap.createBitmap(outputBuffer.width, outputBuffer.height, Bitmap.Config.RGB_565);
|
||||
}
|
||||
bitmap.copyPixelsFromBuffer(outputBuffer.data);
|
||||
Canvas canvas = surface.lockCanvas(null);
|
||||
if (scale) {
|
||||
canvas.scale(
|
||||
((float) canvas.getWidth()) / outputBuffer.width,
|
||||
((float) canvas.getHeight()) / outputBuffer.height);
|
||||
}
|
||||
canvas.drawBitmap(bitmap, 0, 0, null);
|
||||
surface.unlockCanvasAndPost(canvas);
|
||||
}
|
||||
|
||||
private void setJoiningDeadlineMs() {
|
||||
joiningDeadlineMs = allowedJoiningTimeMs > 0
|
||||
? (SystemClock.elapsedRealtime() + allowedJoiningTimeMs) : C.TIME_UNSET;
|
||||
|
|
|
|||
|
|
@ -31,8 +31,7 @@ import java.nio.ByteBuffer;
|
|||
|
||||
public static final int OUTPUT_MODE_NONE = -1;
|
||||
public static final int OUTPUT_MODE_YUV = 0;
|
||||
public static final int OUTPUT_MODE_RGB = 1;
|
||||
public static final int OUTPUT_MODE_SURFACE_YUV = 2;
|
||||
public static final int OUTPUT_MODE_SURFACE_YUV = 1;
|
||||
|
||||
private static final int NO_ERROR = 0;
|
||||
private static final int DECODE_ERROR = 1;
|
||||
|
|
@ -52,7 +51,6 @@ import java.nio.ByteBuffer;
|
|||
* @param exoMediaCrypto The {@link ExoMediaCrypto} object required for decoding encrypted
|
||||
* content. Maybe null and can be ignored if decoder does not handle encrypted content.
|
||||
* @param disableLoopFilter Disable the libvpx in-loop smoothing filter.
|
||||
* @param enableSurfaceYuvOutputMode Whether OUTPUT_MODE_SURFACE_YUV is allowed.
|
||||
* @throws VpxDecoderException Thrown if an exception occurs when initializing the decoder.
|
||||
*/
|
||||
public VpxDecoder(
|
||||
|
|
@ -60,8 +58,7 @@ import java.nio.ByteBuffer;
|
|||
int numOutputBuffers,
|
||||
int initialInputBufferSize,
|
||||
ExoMediaCrypto exoMediaCrypto,
|
||||
boolean disableLoopFilter,
|
||||
boolean enableSurfaceYuvOutputMode)
|
||||
boolean disableLoopFilter)
|
||||
throws VpxDecoderException {
|
||||
super(new VpxInputBuffer[numInputBuffers], new VpxOutputBuffer[numOutputBuffers]);
|
||||
if (!VpxLibrary.isAvailable()) {
|
||||
|
|
@ -71,7 +68,7 @@ import java.nio.ByteBuffer;
|
|||
if (exoMediaCrypto != null && !VpxLibrary.vpxIsSecureDecodeSupported()) {
|
||||
throw new VpxDecoderException("Vpx decoder does not support secure decode.");
|
||||
}
|
||||
vpxDecContext = vpxInit(disableLoopFilter, enableSurfaceYuvOutputMode);
|
||||
vpxDecContext = vpxInit(disableLoopFilter, true);
|
||||
if (vpxDecContext == 0) {
|
||||
throw new VpxDecoderException("Failed to initialize decoder");
|
||||
}
|
||||
|
|
@ -86,8 +83,8 @@ import java.nio.ByteBuffer;
|
|||
/**
|
||||
* Sets the output mode for frames rendered by the decoder.
|
||||
*
|
||||
* @param outputMode The output mode. One of {@link #OUTPUT_MODE_NONE}, {@link #OUTPUT_MODE_RGB}
|
||||
* and {@link #OUTPUT_MODE_YUV}.
|
||||
* @param outputMode The output mode. One of {@link #OUTPUT_MODE_NONE} and {@link
|
||||
* #OUTPUT_MODE_YUV}.
|
||||
*/
|
||||
public void setOutputMode(int outputMode) {
|
||||
this.outputMode = outputMode;
|
||||
|
|
|
|||
|
|
@ -60,36 +60,20 @@ public final class VpxOutputBuffer extends OutputBuffer {
|
|||
* Initializes the buffer.
|
||||
*
|
||||
* @param timeUs The presentation timestamp for the buffer, in microseconds.
|
||||
* @param mode The output mode. One of {@link VpxDecoder#OUTPUT_MODE_NONE},
|
||||
* {@link VpxDecoder#OUTPUT_MODE_RGB} and {@link VpxDecoder#OUTPUT_MODE_YUV}.
|
||||
* @param mode The output mode. One of {@link VpxDecoder#OUTPUT_MODE_NONE} and {@link
|
||||
* VpxDecoder#OUTPUT_MODE_YUV}.
|
||||
*/
|
||||
public void init(long timeUs, int mode) {
|
||||
this.timeUs = timeUs;
|
||||
this.mode = mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the buffer based on the given dimensions. Called via JNI after decoding completes.
|
||||
* @return Whether the buffer was resized successfully.
|
||||
*/
|
||||
public boolean initForRgbFrame(int width, int height) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.yuvPlanes = null;
|
||||
if (!isSafeToMultiply(width, height) || !isSafeToMultiply(width * height, 2)) {
|
||||
return false;
|
||||
}
|
||||
int minimumRgbSize = width * height * 2;
|
||||
initData(minimumRgbSize);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the buffer based on the given stride. Called via JNI after decoding completes.
|
||||
*
|
||||
* @return Whether the buffer was resized successfully.
|
||||
*/
|
||||
public boolean initForYuvFrame(int width, int height, int yStride, int uvStride,
|
||||
int colorspace) {
|
||||
public boolean initForYuvFrame(int width, int height, int yStride, int uvStride, int colorspace) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.colorspace = colorspace;
|
||||
|
|
|
|||
|
|
@ -17,12 +17,6 @@
|
|||
WORKING_DIR := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
LIBVPX_ROOT := $(WORKING_DIR)/libvpx
|
||||
LIBYUV_ROOT := $(WORKING_DIR)/libyuv
|
||||
|
||||
# build libyuv_static.a
|
||||
LOCAL_PATH := $(WORKING_DIR)
|
||||
LIBYUV_DISABLE_JPEG := "yes"
|
||||
include $(LIBYUV_ROOT)/Android.mk
|
||||
|
||||
# build libvpx.so
|
||||
LOCAL_PATH := $(WORKING_DIR)
|
||||
|
|
@ -37,7 +31,7 @@ LOCAL_CPP_EXTENSION := .cc
|
|||
LOCAL_SRC_FILES := vpx_jni.cc
|
||||
LOCAL_LDLIBS := -llog -lz -lm -landroid
|
||||
LOCAL_SHARED_LIBRARIES := libvpx
|
||||
LOCAL_STATIC_LIBRARIES := libyuv_static cpufeatures
|
||||
LOCAL_STATIC_LIBRARIES := cpufeatures
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
$(call import-module,android/cpufeatures)
|
||||
|
|
|
|||
|
|
@ -30,8 +30,6 @@
|
|||
#include <cstring>
|
||||
#include <new>
|
||||
|
||||
#include "libyuv.h" // NOLINT
|
||||
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
|
|
@ -61,7 +59,6 @@
|
|||
(JNIEnv* env, jobject thiz, ##__VA_ARGS__)\
|
||||
|
||||
// JNI references for VpxOutputBuffer class.
|
||||
static jmethodID initForRgbFrame;
|
||||
static jmethodID initForYuvFrame;
|
||||
static jfieldID dataField;
|
||||
static jfieldID outputModeField;
|
||||
|
|
@ -393,11 +390,7 @@ class JniBufferManager {
|
|||
};
|
||||
|
||||
struct JniCtx {
|
||||
JniCtx(bool enableBufferManager) {
|
||||
if (enableBufferManager) {
|
||||
buffer_manager = new JniBufferManager();
|
||||
}
|
||||
}
|
||||
JniCtx() { buffer_manager = new JniBufferManager(); }
|
||||
|
||||
~JniCtx() {
|
||||
if (native_window) {
|
||||
|
|
@ -440,9 +433,8 @@ int vpx_release_frame_buffer(void* priv, vpx_codec_frame_buffer_t* fb) {
|
|||
return buffer_manager->release(*(int*)fb->priv);
|
||||
}
|
||||
|
||||
DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
||||
jboolean enableBufferManager) {
|
||||
JniCtx* context = new JniCtx(enableBufferManager);
|
||||
jlong vpxInit(JNIEnv* env, jboolean disableLoopFilter) {
|
||||
JniCtx* context = new JniCtx();
|
||||
context->decoder = new vpx_codec_ctx_t();
|
||||
vpx_codec_dec_cfg_t cfg = {0, 0, 0};
|
||||
cfg.threads = android_getCpuCount();
|
||||
|
|
@ -469,14 +461,12 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
|||
}
|
||||
#endif
|
||||
}
|
||||
if (enableBufferManager) {
|
||||
err = vpx_codec_set_frame_buffer_functions(
|
||||
context->decoder, vpx_get_frame_buffer, vpx_release_frame_buffer,
|
||||
context->buffer_manager);
|
||||
if (err) {
|
||||
LOGE("ERROR: Failed to set libvpx frame buffer functions, error = %d.",
|
||||
err);
|
||||
}
|
||||
err = vpx_codec_set_frame_buffer_functions(
|
||||
context->decoder, vpx_get_frame_buffer, vpx_release_frame_buffer,
|
||||
context->buffer_manager);
|
||||
if (err) {
|
||||
LOGE("ERROR: Failed to set libvpx frame buffer functions, error = %d.",
|
||||
err);
|
||||
}
|
||||
|
||||
// Populate JNI References.
|
||||
|
|
@ -484,8 +474,6 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
|||
"com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer");
|
||||
initForYuvFrame = env->GetMethodID(outputBufferClass, "initForYuvFrame",
|
||||
"(IIIII)Z");
|
||||
initForRgbFrame = env->GetMethodID(outputBufferClass, "initForRgbFrame",
|
||||
"(II)Z");
|
||||
dataField = env->GetFieldID(outputBufferClass, "data",
|
||||
"Ljava/nio/ByteBuffer;");
|
||||
outputModeField = env->GetFieldID(outputBufferClass, "mode", "I");
|
||||
|
|
@ -494,6 +482,15 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
|||
return reinterpret_cast<intptr_t>(context);
|
||||
}
|
||||
|
||||
DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter,
|
||||
jboolean enableBufferManager) {
|
||||
return vpxInit(env, disableLoopFilter);
|
||||
}
|
||||
|
||||
DECODER_FUNC(jlong, vpxInitilization, jboolean disableLoopFilter) {
|
||||
return vpxInit(env, disableLoopFilter);
|
||||
}
|
||||
|
||||
DECODER_FUNC(jlong, vpxDecode, jlong jContext, jobject encoded, jint len) {
|
||||
JniCtx* const context = reinterpret_cast<JniCtx*>(jContext);
|
||||
const uint8_t* const buffer =
|
||||
|
|
@ -537,28 +534,10 @@ DECODER_FUNC(jint, vpxGetFrame, jlong jContext, jobject jOutputBuffer) {
|
|||
}
|
||||
|
||||
const int kOutputModeYuv = 0;
|
||||
const int kOutputModeRgb = 1;
|
||||
const int kOutputModeSurfaceYuv = 2;
|
||||
const int kOutputModeSurfaceYuv = 1;
|
||||
|
||||
int outputMode = env->GetIntField(jOutputBuffer, outputModeField);
|
||||
if (outputMode == kOutputModeRgb) {
|
||||
// resize buffer if required.
|
||||
jboolean initResult = env->CallBooleanMethod(jOutputBuffer, initForRgbFrame,
|
||||
img->d_w, img->d_h);
|
||||
if (env->ExceptionCheck() || !initResult) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get pointer to the data buffer.
|
||||
const jobject dataObject = env->GetObjectField(jOutputBuffer, dataField);
|
||||
uint8_t* const dst =
|
||||
reinterpret_cast<uint8_t*>(env->GetDirectBufferAddress(dataObject));
|
||||
|
||||
libyuv::I420ToRGB565(img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y],
|
||||
img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U],
|
||||
img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V],
|
||||
dst, img->d_w * 2, img->d_w, img->d_h);
|
||||
} else if (outputMode == kOutputModeYuv) {
|
||||
if (outputMode == kOutputModeYuv) {
|
||||
const int kColorspaceUnknown = 0;
|
||||
const int kColorspaceBT601 = 1;
|
||||
const int kColorspaceBT709 = 2;
|
||||
|
|
@ -616,9 +595,6 @@ DECODER_FUNC(jint, vpxGetFrame, jlong jContext, jobject jOutputBuffer) {
|
|||
}
|
||||
} else if (outputMode == kOutputModeSurfaceYuv &&
|
||||
img->fmt != VPX_IMG_FMT_I42016) {
|
||||
if (!context->buffer_manager) {
|
||||
return -1; // enableBufferManager was not set in vpxInit.
|
||||
}
|
||||
int id = *(int*)img->fb_priv;
|
||||
context->buffer_manager->add_ref(id);
|
||||
JniFrameBuffer* jfb = context->buffer_manager->get_buffer(id);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
# Constructors accessed via reflection in DefaultRenderersFactory
|
||||
-dontnote com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer
|
||||
-keepclassmembers class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer {
|
||||
<init>(boolean, long, android.os.Handler, com.google.android.exoplayer2.video.VideoRendererEventListener, int);
|
||||
<init>(long, android.os.Handler, com.google.android.exoplayer2.video.VideoRendererEventListener, int);
|
||||
}
|
||||
-dontnote com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer
|
||||
-keepclassmembers class com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer {
|
||||
|
|
|
|||
|
|
@ -233,7 +233,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||
Class<?> clazz = Class.forName("com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer");
|
||||
Constructor<?> constructor =
|
||||
clazz.getConstructor(
|
||||
boolean.class,
|
||||
long.class,
|
||||
android.os.Handler.class,
|
||||
com.google.android.exoplayer2.video.VideoRendererEventListener.class,
|
||||
|
|
@ -242,7 +241,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||
Renderer renderer =
|
||||
(Renderer)
|
||||
constructor.newInstance(
|
||||
true,
|
||||
allowedVideoJoiningTimeMs,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
|
|
|
|||
Loading…
Reference in a new issue