Restrict video send duration.

This commit is contained in:
Alan Evans
2020-11-17 17:13:46 -04:00
committed by Alex Hart
parent 95468c85a8
commit 6e7858e00f
9 changed files with 84 additions and 41 deletions

View File

@@ -14,12 +14,15 @@ import org.thoughtcrime.securesms.util.MediaUtil;
public final class VideoUtil {
public static final int AUDIO_BIT_RATE = 192_000;
public static final int VIDEO_FRAME_RATE = 30;
public static final int VIDEO_BIT_RATE = 2_000_000;
public static final int VIDEO_LONG_WIDTH = 1280;
public static final int VIDEO_SHORT_WIDTH = 720;
public static final int VIDEO_MAX_LENGTH_S = 30;
public static final int AUDIO_BIT_RATE = 192_000;
public static final int VIDEO_FRAME_RATE = 30;
public static final int VIDEO_BIT_RATE = 2_000_000;
static final int VIDEO_SHORT_WIDTH = 720;
private static final int VIDEO_LONG_WIDTH = 1280;
private static final int VIDEO_MAX_RECORD_LENGTH_S = 30;
private static final int VIDEO_MAX_UPLOAD_LENGTH_S = 120;
private static final int TOTAL_BYTES_PER_SECOND = (VIDEO_BIT_RATE / 8) + (AUDIO_BIT_RATE / 8);
@@ -38,11 +41,15 @@ public final class VideoUtil {
: new Size(VIDEO_LONG_WIDTH, VIDEO_SHORT_WIDTH);
}
public static int getMaxVideoDurationInSeconds(@NonNull Context context, @NonNull MediaConstraints mediaConstraints) {
public static int getMaxVideoRecordDurationInSeconds(@NonNull Context context, @NonNull MediaConstraints mediaConstraints) {
int allowedSize = mediaConstraints.getCompressedVideoMaxSize(context);
int duration = (int) Math.floor((float) allowedSize / TOTAL_BYTES_PER_SECOND);
return Math.min(duration, VIDEO_MAX_LENGTH_S);
return Math.min(duration, VIDEO_MAX_RECORD_LENGTH_S);
}
public static int getMaxVideoUploadDurationInSeconds() {
return VIDEO_MAX_UPLOAD_LENGTH_S;
}
@RequiresApi(21)

View File

@@ -11,12 +11,14 @@ import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.annotation.RequiresApi;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.logging.Log;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
@@ -24,6 +26,8 @@ import java.util.concurrent.TimeUnit;
@RequiresApi(api = 23)
public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView {
private static final String TAG = Log.tag(VideoThumbnailsRangeSelectorView.class);
private static final long MINIMUM_SELECTABLE_RANGE = TimeUnit.MILLISECONDS.toMicros(500);
private static final int ANIMATION_DURATION_MS = 100;
@@ -63,6 +67,7 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
@ColorInt private int thumbHintBackgroundColor;
private long dragStartTimeMs;
private long dragEndTimeMs;
private long maximumSelectableRangeMicros;
public VideoThumbnailsRangeSelectorView(final Context context) {
super(context);
@@ -137,6 +142,13 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
}
}
if (setMinValue(getMinValue())) {
Log.d(TAG, "Clamped video duration to " + getMaxValue());
if (onRangeChangeListener != null) {
onRangeChangeListener.onRangeDragEnd(getMinValue(), getMaxValue(), getDuration(), Thumb.MAX);
}
}
invalidate();
}
@@ -310,11 +322,18 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
final long duration = getDuration();
final long minDiff = Math.max(MINIMUM_SELECTABLE_RANGE, pixelToDuration(thumbSizePixels * 2.5f));
final long maxDiff = maximumSelectableRangeMicros <= MINIMUM_SELECTABLE_RANGE ? 0 : Math.max(maximumSelectableRangeMicros, pixelToDuration(thumbSizePixels * 2.5f));
if (thumb == Thumb.MIN) {
newMin = clamp(newMin, 0, currentMax - minDiff);
if (maxDiff > 0) {
newMax = clamp(newMax, newMin + minDiff, Math.min(newMin + maxDiff, duration));
}
} else {
newMax = clamp(newMax, currentMin + minDiff, duration);
if (maxDiff > 0) {
newMin = clamp(newMin, Math.max(0, newMax - maxDiff), newMax - minDiff);
}
}
if (newMin != currentMin || newMax != currentMax) {
@@ -425,6 +444,10 @@ public final class VideoThumbnailsRangeSelectorView extends VideoThumbnailsView
}
}
public void setTimeLimit(int t, @NonNull TimeUnit timeUnit) {
maximumSelectableRangeMicros = timeUnit.toMicros(t);
}
public enum Thumb {
MIN,
MAX,