Charge time spent in the decode unit queue to the decoder rather than receive time

This commit is contained in:
Cameron Gutman 2020-12-31 16:35:29 -06:00
parent 175e842feb
commit b1f453f7ba
5 changed files with 15 additions and 12 deletions

View File

@ -638,7 +638,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public int submitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, int decodeUnitType, public int submitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, int decodeUnitType,
int frameNumber, long receiveTimeMs) { int frameNumber, long receiveTimeMs, long enqueueTimeMs) {
if (stopping) { if (stopping) {
// Don't bother if we're stopping // Don't bother if we're stopping
return MoonBridge.DR_OK; return MoonBridge.DR_OK;
@ -699,11 +699,13 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
int inputBufferIndex; int inputBufferIndex;
ByteBuffer buf; ByteBuffer buf;
long timestampUs = System.nanoTime() / 1000; long timestampUs = enqueueTimeMs * 1000;
if (!FRAME_RENDER_TIME_ONLY) { if (!FRAME_RENDER_TIME_ONLY) {
// Count time from first packet received to decode start // Count time from first packet received to enqueue time as receive time
activeWindowVideoStats.totalTimeMs += (timestampUs / 1000) - receiveTimeMs; // We will count DU queue time as part of decoding, because it is directly
// caused by a slow decoder.
activeWindowVideoStats.totalTimeMs += enqueueTimeMs - receiveTimeMs;
} }
if (timestampUs <= lastTimestampUs) { if (timestampUs <= lastTimestampUs) {

View File

@ -10,7 +10,7 @@ public abstract class VideoDecoderRenderer {
// This is called once for each frame-start NALU. This means it will be called several times // This is called once for each frame-start NALU. This means it will be called several times
// for an IDR frame which contains several parameter sets and the I-frame data. // for an IDR frame which contains several parameter sets and the I-frame data.
public abstract int submitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, int decodeUnitType, public abstract int submitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, int decodeUnitType,
int frameNumber, long receiveTimeMs); int frameNumber, long receiveTimeMs, long enqueueTimeMs);
public abstract void cleanup(); public abstract void cleanup();

View File

@ -149,11 +149,11 @@ public class MoonBridge {
} }
public static int bridgeDrSubmitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength, public static int bridgeDrSubmitDecodeUnit(byte[] decodeUnitData, int decodeUnitLength,
int decodeUnitType, int decodeUnitType, int frameNumber,
int frameNumber, long receiveTimeMs) { long receiveTimeMs, long enqueueTimeMs) {
if (videoRenderer != null) { if (videoRenderer != null) {
return videoRenderer.submitDecodeUnit(decodeUnitData, decodeUnitLength, return videoRenderer.submitDecodeUnit(decodeUnitData, decodeUnitLength,
decodeUnitType, frameNumber, receiveTimeMs); decodeUnitType, frameNumber, receiveTimeMs, enqueueTimeMs);
} }
else { else {
return DR_OK; return DR_OK;

View File

@ -79,7 +79,7 @@ Java_com_limelight_nvstream_jni_MoonBridge_init(JNIEnv *env, jclass clazz) {
BridgeDrStartMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrStart", "()V"); BridgeDrStartMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrStart", "()V");
BridgeDrStopMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrStop", "()V"); BridgeDrStopMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrStop", "()V");
BridgeDrCleanupMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrCleanup", "()V"); BridgeDrCleanupMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrCleanup", "()V");
BridgeDrSubmitDecodeUnitMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrSubmitDecodeUnit", "([BIIIJ)I"); BridgeDrSubmitDecodeUnitMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeDrSubmitDecodeUnit", "([BIIIJJ)I");
BridgeArInitMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArInit", "(III)I"); BridgeArInitMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArInit", "(III)I");
BridgeArStartMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStart", "()V"); BridgeArStartMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStart", "()V");
BridgeArStopMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStop", "()V"); BridgeArStopMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeArStop", "()V");
@ -157,7 +157,8 @@ int BridgeDrSubmitDecodeUnit(PDECODE_UNIT decodeUnit) {
ret = (*env)->CallStaticIntMethod(env, GlobalBridgeClass, BridgeDrSubmitDecodeUnitMethod, ret = (*env)->CallStaticIntMethod(env, GlobalBridgeClass, BridgeDrSubmitDecodeUnitMethod,
DecodedFrameBuffer, currentEntry->length, currentEntry->bufferType, DecodedFrameBuffer, currentEntry->length, currentEntry->bufferType,
decodeUnit->frameNumber, (jlong)decodeUnit->receiveTimeMs); decodeUnit->frameNumber, (jlong)decodeUnit->receiveTimeMs,
(jlong)decodeUnit->enqueueTimeMs);
if ((*env)->ExceptionCheck(env)) { if ((*env)->ExceptionCheck(env)) {
// We will crash here // We will crash here
(*JVM)->DetachCurrentThread(JVM); (*JVM)->DetachCurrentThread(JVM);
@ -178,7 +179,7 @@ int BridgeDrSubmitDecodeUnit(PDECODE_UNIT decodeUnit) {
ret = (*env)->CallStaticIntMethod(env, GlobalBridgeClass, BridgeDrSubmitDecodeUnitMethod, ret = (*env)->CallStaticIntMethod(env, GlobalBridgeClass, BridgeDrSubmitDecodeUnitMethod,
DecodedFrameBuffer, offset, BUFFER_TYPE_PICDATA, DecodedFrameBuffer, offset, BUFFER_TYPE_PICDATA,
decodeUnit->frameNumber, decodeUnit->frameNumber,
(jlong)decodeUnit->receiveTimeMs); (jlong)decodeUnit->receiveTimeMs, (jlong)decodeUnit->enqueueTimeMs);
if ((*env)->ExceptionCheck(env)) { if ((*env)->ExceptionCheck(env)) {
// We will crash here // We will crash here
(*JVM)->DetachCurrentThread(JVM); (*JVM)->DetachCurrentThread(JVM);

@ -1 +1 @@
Subproject commit 3aa246385680454c8564d28ca3a8807eb4f56195 Subproject commit fd950b64528ce6ca6cf5d24d93418f1dda8bd0ca