about summary refs log tree commit diff
path: root/patches/expo-image-picker+16.1.4.patch
blob: 0396fecbc18a61df7c8f5c5004dcd732fbdceb62 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
diff --git a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
index c863fb8..cde8859 100644
--- a/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
+++ b/node_modules/expo-image-picker/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt
@@ -101,16 +101,30 @@ internal class MediaHandler(
       val fileData = getAdditionalFileData(sourceUri)
       val mimeType = getType(context.contentResolver, sourceUri)
 
+      // Extract basic metadata
+      var width = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)
+      var height = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)
+      val rotation = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)
+
+      // Android returns the encoded width/height which do not take the display rotation into
+      // account. For videos recorded in portrait mode the encoded dimensions are often landscape
+      // (e.g. 1920x1080) paired with a 90°/270° rotation flag.  iOS adjusts these values before
+      // reporting them, so to keep the behaviour consistent across platforms we swap the width
+      // and height when the rotation indicates the video should be displayed in portrait.
+      if (rotation % 180 != 0) {
+        width = height.also { height = width }
+      }
+
       return ImagePickerAsset(
         type = MediaType.VIDEO,
         uri = outputUri.toString(),
-        width = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH),
-        height = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT),
+        width = width,
+        height = height,
         fileName = fileData?.fileName,
         fileSize = fileData?.fileSize,
         mimeType = mimeType,
         duration = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_DURATION),
-        rotation = metadataRetriever.extractInt(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION),
+        rotation = rotation,
         assetId = sourceUri.getMediaStoreAssetId()
       )
     } catch (cause: FailedToExtractVideoMetadataException) {