From 0e3907aa75f2a74991b1c1f20771f925231ed3a2 Mon Sep 17 00:00:00 2001 From: Zoltan Bettenbuk Date: Thu, 4 Aug 2016 09:00:30 -0500 Subject: [PATCH 1/2] Auto keyframe control for recording (fast seek) This change enable video bridge users that solely use the bridge for server side recording to enable auto keyframe control for faster seeking in recorded files and automatically correct intermittent issues. The function is controlled by a system parameter. --- .../impl/neomedia/recording/WebmDataSink.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java b/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java index 4914381fb..35c3e7d49 100644 --- a/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java +++ b/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java @@ -15,6 +15,8 @@ */ package org.jitsi.impl.neomedia.recording; +import org.jitsi.service.configuration.ConfigurationService; +import org.jitsi.service.libjitsi.LibJitsi; import org.jitsi.service.neomedia.MediaType; import org.jitsi.service.neomedia.control.*; import org.jitsi.service.neomedia.recording.*; @@ -125,6 +127,15 @@ public class WebmDataSink private int framesSinceLastKeyframeRequest = 0; private static int REREQUEST_KEYFRAME_INTERVAL = 100; + /** + * Property name to control auto requesting keyframes periodically + * to improve recording quality over low quality connection (e.g. proper + * network speed, but high packet loss) + */ + private static String AUTO_REQUEST_KEYFRAME_PNAME = + WebmDataSink.class.getCanonicalName() + ".AUTOKEYFRAME"; + private int autoKeyframeRequestInterval = 0; + /** * Initialize a new WebmDataSink instance. @@ -133,6 +144,12 @@ public class WebmDataSink */ public WebmDataSink(String filename, DataSource dataSource) { + ConfigurationService cfg = LibJitsi.getConfigurationService(); + this.autoKeyframeRequestInterval = + cfg.getInt(AUTO_REQUEST_KEYFRAME_PNAME, this.autoKeyframeRequestInterval); + if (this.autoKeyframeRequestInterval > 0 && logger.isInfoEnabled()) { + logger.info("Auto keyframe request is initialized for every " + this.autoKeyframeRequestInterval + " frames."); + } this.filename = filename; this.dataSource = dataSource; } @@ -375,10 +392,16 @@ else if (height*16 == width*9) if (framesSinceLastKeyframeRequest > REREQUEST_KEYFRAME_INTERVAL) keyframeRequested = false; - if (waitingForKeyframe && !keyframeRequested) + if (!keyframeRequested && + // recording not started yet + (waitingForKeyframe || + // auto keyframe request + (this.autoKeyframeRequestInterval > 0 && + framesSinceLastKeyframeRequest > this.autoKeyframeRequestInterval)) + ) { if (logger.isInfoEnabled()) - logger.info("Requesting keyframe. "+ssrc); + logger.info("Requesting keyframe. " + ssrc); if (keyFrameControl != null) keyframeRequested = keyFrameControl.requestKeyFrame(true); framesSinceLastKeyframeRequest = 0; From 160ecc359827cf227270edfd5deb3d639373e784 Mon Sep 17 00:00:00 2001 From: Zoltan Bettenbuk Date: Thu, 4 Aug 2016 10:28:14 -0500 Subject: [PATCH 2/2] Fixing import format and comment --- src/org/jitsi/impl/neomedia/recording/WebmDataSink.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java b/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java index 35c3e7d49..1095d2d27 100644 --- a/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java +++ b/src/org/jitsi/impl/neomedia/recording/WebmDataSink.java @@ -15,9 +15,9 @@ */ package org.jitsi.impl.neomedia.recording; -import org.jitsi.service.configuration.ConfigurationService; -import org.jitsi.service.libjitsi.LibJitsi; -import org.jitsi.service.neomedia.MediaType; +import org.jitsi.service.configuration.*; +import org.jitsi.service.libjitsi.*; +import org.jitsi.service.neomedia.*; import org.jitsi.service.neomedia.control.*; import org.jitsi.service.neomedia.recording.*; import org.jitsi.util.*; @@ -129,8 +129,7 @@ public class WebmDataSink /** * Property name to control auto requesting keyframes periodically - * to improve recording quality over low quality connection (e.g. proper - * network speed, but high packet loss) + * to improve seeking speed without re-encoding the file */ private static String AUTO_REQUEST_KEYFRAME_PNAME = WebmDataSink.class.getCanonicalName() + ".AUTOKEYFRAME";