From 8a8eb6e19da67ef9df1976de7f94bd09105a9894 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Mon, 21 Jul 2025 16:09:30 +0300 Subject: [PATCH] scale video frame when possible --- .../alextran/immich/images/ThumbnailsImpl.kt | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt index d6aa1b3e0f..5f6ac3c0f1 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt @@ -96,16 +96,25 @@ class ThumbnailsImpl(context: Context) : ThumbnailApi { private fun decodeVideoThumbnail(assetId: String, targetWidth: Int, targetHeight: Int): Bitmap { val uri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, assetId.toLong()) - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - contentResolver.loadThumbnail(uri, Size(targetWidth, targetHeight), null) - } else { - val retriever = MediaMetadataRetriever() - try { - retriever.setDataSource(ctx, uri) - retriever.getFrameAtTime(0L) ?: throw RuntimeException("Failed to extract video frame") - } finally { - retriever.release() - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + return contentResolver.loadThumbnail(uri, Size(targetWidth, targetHeight), null) + } + + val retriever = MediaMetadataRetriever() + try { + retriever.setDataSource(ctx, uri) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + retriever.getScaledFrameAtTime( + 0L, + MediaMetadataRetriever.OPTION_NEXT_SYNC, + targetWidth, + targetHeight + ) + } else { + retriever.getFrameAtTime(0L) + } ?: throw RuntimeException("Failed to extract video frame") + } finally { + retriever.release() } }