diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java index 1b5b1717b5..1a40253672 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java @@ -6,13 +6,15 @@ import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.signal.core.util.Util; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.LocaleRemoteConfig; -import org.signal.core.util.Util; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.video.TranscodingPreset; import org.thoughtcrime.securesms.video.videoconverter.utils.DeviceCapabilities; +import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil; +import org.whispersystems.signalservice.internal.crypto.PaddingInputStream; import java.util.Arrays; @@ -65,7 +67,10 @@ public class PushMediaConstraints extends MediaConstraints { @Override public long getCompressedVideoMaxSize(Context context) { - return getMaxAttachmentSize(); + long maxCipherTextSize = RemoteConfig.videoTranscodeTargetSizeBytes(); + long maxPaddedSize = AttachmentCipherStreamUtil.getPlaintextLength(maxCipherTextSize); + + return Math.min(PaddingInputStream.getMaxUnpaddedSize(maxPaddedSize), getMaxAttachmentSize()); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 8b4adddb64..abe24258a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -929,6 +929,15 @@ object RemoteConfig { hotSwappable = true ) + /** Maximum size a video transcode should target in bytes */ + @JvmStatic + @get:JvmName("videoTranscodeTargetSizeBytes") + val videoTranscodeTargetSizeBytes: Long by remoteLong( + key = "global.videoAttachments.transcodeTargetBytes", + defaultValue = 100.mebiBytes.inWholeBytes, + hotSwappable = true + ) + /** Maximum input size when opening a video to send in bytes */ @JvmStatic @get:JvmName("maxSourceTranscodeVideoSizeBytes")