diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt index 5a062c1970..4821afe01d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionState.kt @@ -46,11 +46,11 @@ data class MediaSelectionState( return editorStateMap[uri] as? VideoTrimData ?: VideoTrimData() } - fun calculateMaxVideoDurationUs(maxFileSize: Long, videoDuration: Duration): Long { + fun calculateMaxVideoDurationUs(videoDuration: Duration): Long { return if (isStory && !MediaConstraints.isVideoTranscodeAvailable()) { Stories.MAX_VIDEO_DURATION_MILLIS } else { - TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(transcodingConfigs, videoDuration, maxFileSize).seconds.inWholeMicroseconds + TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(transcodingConfigs, videoDuration).seconds.inWholeMicroseconds } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt index 4e02ad1bba..9bfd1a045c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionViewModel.kt @@ -172,11 +172,11 @@ class MediaSelectionViewModel( .filter { media -> MediaUtil.isNonGifVideo(media) } .associate { video: Media -> val duration = video.duration.milliseconds.inWholeMicroseconds - val maxDuration = it.calculateMaxVideoDurationUs(getMediaConstraints().getEditorVideoMaxSize(), video.duration.milliseconds) - if (duration < maxDuration) { - video.uri to VideoTrimData(false, duration, 0, duration) - } else { + val maxDuration = it.calculateMaxVideoDurationUs(video.duration.milliseconds) + if (MediaConstraints.isVideoTranscodeAvailable() && duration >= maxDuration) { video.uri to VideoTrimData(true, duration, 0, maxDuration) + } else { + video.uri to VideoTrimData(false, duration, 0, duration) } } @@ -362,7 +362,7 @@ class MediaSelectionViewModel( val durationEdited = clampedStartTime > 0 || endTimeUs < totalDurationUs val isEntireDuration = startTimeUs == 0L && endTimeUs == totalDurationUs val endMoved = !isEntireDuration && data.endTimeUs != endTimeUs - val maxVideoDurationUs: Long = it.calculateMaxVideoDurationUs(getMediaConstraints().getEditorVideoMaxSize(), (endTimeUs - clampedStartTime).microseconds) + val maxVideoDurationUs: Long = it.calculateMaxVideoDurationUs((endTimeUs - clampedStartTime).microseconds) val preserveStartTime = unedited || !endMoved val videoTrimData = VideoTrimData(durationEdited, totalDurationUs, clampedStartTime, endTimeUs) val updatedData = clampToMaxClipDuration(videoTrimData, maxVideoDurationUs, preserveStartTime) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index f8dba3d60d..b1622ce1bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -612,7 +612,7 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment), Schedul val size: Long = tryGetUriSize(requireContext(), uri, Long.MAX_VALUE) val maxSend = sharedViewModel.getMediaConstraints().getEditorVideoMaxSize() if (size > maxSend) { - videoTimeLine.setTimeLimit(TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(state.transcodingConfigs, state.getOrCreateVideoTrimData(uri).totalInputDurationUs.microseconds, maxSend), TimeUnit.SECONDS) + videoTimeLine.setTimeLimit(TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(state.transcodingConfigs, state.getOrCreateVideoTrimData(uri).totalInputDurationUs.microseconds), TimeUnit.SECONDS) } if (state.isTouchEnabled) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt index d5baf45c7c..17d1a25e22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt @@ -130,13 +130,9 @@ object MediaSendV3Repository : MediaSendRepository { } } - override fun getMaxVideoDurationUs(quality: SentMediaQuality, maxFileSizeBytes: Long, duration: Duration): Long { + override fun getMaxVideoDurationUs(quality: SentMediaQuality, duration: Duration): Long { val config = PushMediaConstraints(quality).videoTranscodingSettings - return TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(config, duration, maxFileSizeBytes).seconds.inWholeMicroseconds - } - - override fun getVideoMaxSizeBytes(): Long { - return PushMediaConstraints(null).getEditorVideoMaxSize() + return TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(config, duration).seconds.inWholeMicroseconds } override fun isVideoTranscodeAvailable(): Boolean { diff --git a/app/src/test/java/org/thoughtcrime/securesms/video/TranscodingConfigTest.kt b/app/src/test/java/org/thoughtcrime/securesms/video/TranscodingConfigTest.kt index 9305d7cc16..3eecffb189 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/video/TranscodingConfigTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/video/TranscodingConfigTest.kt @@ -78,7 +78,7 @@ class TranscodingConfigTest { fun givenLargeFileSize_whenIGetMaxVideoUploadDuration_thenIExpectCoercionToTierMaxDuration() { val tier = QualityTier(resolution = 480, videoBitrateMbps = 1.0f, audioBitrateKbps = 128, maxDurationSec = 30) - val result = TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(listOf(tier), 10.seconds, maxFileSize = 10000000L) + val result = TranscodingConfig.calculateMaxVideoUploadDurationInSeconds(listOf(tier), 10.seconds) assertEquals(tier.maxDurationSec, result) } diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt index 6ce869c9b8..8c332ea06e 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt @@ -58,19 +58,13 @@ interface MediaSendRepository { suspend fun send(request: SendRequest): SendResult /** - * Gets the maximum video duration in microseconds based on quality and file size limits. + * Gets the maximum video duration in microseconds based on quality. * * @param quality The sent media quality. - * @param maxFileSizeBytes Maximum file size in bytes. * @param duration Duration of the video. * @return Maximum duration in microseconds. */ - fun getMaxVideoDurationUs(quality: SentMediaQuality, maxFileSizeBytes: Long, duration: Duration): Long - - /** - * Gets the maximum video file size in bytes. - */ - fun getVideoMaxSizeBytes(): Long + fun getMaxVideoDurationUs(quality: SentMediaQuality, duration: Duration): Long /** * Checks if video transcoding is available on this device. diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt index 5c82cc3e67..756277e9d3 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt @@ -421,8 +421,8 @@ class MediaSendViewModel( .filterNot { snapshot.editorStateMap.containsKey(it.uri) } .filter { isNonGifVideo(it) } .associate { video -> - val maxVideoDurationUs = getMaxVideoDurationUs(video.duration.milliseconds) val durationUs = video.duration.milliseconds.inWholeMicroseconds + val maxVideoDurationUs = if (repository.isVideoTranscodeAvailable()) getMaxVideoDurationUs(video.duration.milliseconds) else durationUs video.uri to EditorState.VideoTrim.forVideo(durationUs, maxVideoDurationUs) } @@ -698,7 +698,6 @@ class MediaSendViewModel( val snapshot = state.value return repository.getMaxVideoDurationUs( quality = snapshot.sentMediaQuality, - maxFileSizeBytes = repository.getVideoMaxSizeBytes(), duration = duration ) } diff --git a/lib/video/src/main/java/org/thoughtcrime/securesms/video/TranscodingConfig.kt b/lib/video/src/main/java/org/thoughtcrime/securesms/video/TranscodingConfig.kt index e019d3c4c9..f7446d8ffe 100644 --- a/lib/video/src/main/java/org/thoughtcrime/securesms/video/TranscodingConfig.kt +++ b/lib/video/src/main/java/org/thoughtcrime/securesms/video/TranscodingConfig.kt @@ -48,12 +48,8 @@ object TranscodingConfig { ?: TranscodeConfig() } - fun calculateMaxVideoUploadDurationInSeconds(tiers: List, videoDuration: Duration, maxFileSize: Long): Int { - val config = getQualityTier(tiers, videoDuration) - val upperFileSizeLimitWithMargin = (maxFileSize / 1.1).toLong() - val totalBitRate = ((config.videoBitrateMbps * VideoConstants.MB) + (config.audioBitrateKbps * VideoConstants.KB)).toLong() - val maxDurationFromFileSize = Math.toIntExact((upperFileSizeLimitWithMargin * 8) / totalBitRate) - return maxDurationFromFileSize.coerceAtMost(config.maxDurationSec) + fun calculateMaxVideoUploadDurationInSeconds(tiers: List, videoDuration: Duration): Int { + return getQualityTier(tiers, videoDuration).maxDurationSec } @JvmStatic