From 4af6e0480adae2c8a56384b2b842616cb72b503f Mon Sep 17 00:00:00 2001 From: Nicholas Tinsley Date: Thu, 8 Aug 2024 14:40:21 -0400 Subject: [PATCH] Fix playback position indicator for trimmed video clips. --- .../securesms/mediasend/VideoEditorFragment.kt | 7 ++++--- .../org/thoughtcrime/securesms/video/VideoPlayer.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt index aaad75d11d..ff982f95be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.kt @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelec import org.thoughtcrime.securesms.video.videoconverter.VideoThumbnailsRangeSelectorView.PositionDragListener import java.io.IOException import kotlin.time.Duration.Companion.microseconds +import kotlin.time.Duration.Companion.milliseconds class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragment { private val sharedViewModel: MediaSelectionViewModel by viewModels(ownerProducer = { requireActivity() }) @@ -46,9 +47,9 @@ class VideoEditorFragment : Fragment(), PositionDragListener, MediaSendPageFragm private val updatePosition = object : Runnable { override fun run() { if (MediaConstraints.isVideoTranscodeAvailable()) { - val playbackPositionUs = player.playbackPositionUs - if (playbackPositionUs >= 0) { - videoTimeLine.setActualPosition(playbackPositionUs) + val playbackPosition = player.truePlaybackPosition + if (playbackPosition >= 0) { + videoTimeLine.setActualPosition(playbackPosition.milliseconds.inWholeMicroseconds) handler.postDelayed(this, 100) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java index 009450c4cf..1fcf4394cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -288,9 +288,15 @@ public class VideoPlayer extends FrameLayout { return 0L; } - public long getPlaybackPositionUs() { + /** + * After calling {@link #setPlaybackPosition}, the underlying {@link Player} resets the current position to 0. + * We manually store the offset of where we clipped to, and add that here. + * + * @return the current playback position, rounded to the nearest millisecond + */ + public long getTruePlaybackPosition() { if (this.exoPlayer != null) { - return TimeUnit.MILLISECONDS.toMicros(this.exoPlayer.getCurrentPosition()); + return this.exoPlayer.getCurrentPosition() + Math.round(clippedStartUs / 1000.0); } return -1L; }