From 5dddcb32ef11d57fc0bb6f4476e360d414849394 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Tue, 19 Sep 2017 19:42:56 +0200 Subject: ignore http upload file size constraints for videos that will be compressed --- .../pixart/messenger/persistance/FileBackend.java | 33 ++++++++++++++++++++-- .../services/AttachFileToConversationRunnable.java | 10 +++++-- 2 files changed, 38 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main/java/de/pixart/messenger/persistance/FileBackend.java b/src/main/java/de/pixart/messenger/persistance/FileBackend.java index ee645c50b..62153cb48 100644 --- a/src/main/java/de/pixart/messenger/persistance/FileBackend.java +++ b/src/main/java/de/pixart/messenger/persistance/FileBackend.java @@ -169,6 +169,18 @@ public class FileBackend { return true; //exception to be compatible with HTTP Upload < v0.2 } for (Uri uri : uris) { + String mime = context.getContentResolver().getType(uri); + if (mime != null && mime.startsWith("video/")) { + try { + Dimensions dimensions = FileBackend.getVideoDimensions(context, uri); + if (dimensions.getMin() >= 720) { + Log.d(Config.LOGTAG, "do not consider video file with min width larger or equal than 720 for size check"); + continue; + } + } catch (NotAVideoFile notAVideoFile) { + //ignore and fall through + } + } if (FileBackend.getFileSize(context, uri) > max) { Log.d(Config.LOGTAG, "not all files are under " + max + " bytes. suggesting falling back to jingle"); return false; @@ -863,6 +875,17 @@ public class FileBackend { } catch (Exception e) { throw new NotAVideoFile(); } + return getVideoDimensions(metadataRetriever); + } + + + private static Dimensions getVideoDimensions(Context context, Uri uri) throws NotAVideoFile { + MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); + mediaMetadataRetriever.setDataSource(context, uri); + return getVideoDimensions(mediaMetadataRetriever); + } + + private static Dimensions getVideoDimensions(MediaMetadataRetriever metadataRetriever) throws NotAVideoFile { String hasVideo = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO); if (hasVideo == null) { throw new NotAVideoFile(); @@ -888,7 +911,7 @@ public class FileBackend { return rotated ? new Dimensions(width, height) : new Dimensions(height, width); } - private int extractRotationFromMediaRetriever(MediaMetadataRetriever metadataRetriever) { + private static int extractRotationFromMediaRetriever(MediaMetadataRetriever metadataRetriever) { int rotation; if (Build.VERSION.SDK_INT >= 17) { String r = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); @@ -903,7 +926,7 @@ public class FileBackend { return rotation; } - private class Dimensions { + private static class Dimensions { public final int width; public final int height; @@ -911,9 +934,13 @@ public class FileBackend { this.width = width; this.height = height; } + + public int getMin() { + return Math.min(width, height); + } } - private class NotAVideoFile extends Exception { + private static class NotAVideoFile extends Exception { } diff --git a/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java b/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java index 40e8bd242..1a9980e17 100644 --- a/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java +++ b/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java @@ -13,6 +13,7 @@ import java.io.FileNotFoundException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.util.concurrent.Future; import de.pixart.messenger.Config; import de.pixart.messenger.R; @@ -81,7 +82,12 @@ public class AttachFileToConversationRunnable implements Runnable, MediaTranscod file.getParentFile().mkdirs(); ParcelFileDescriptor parcelFileDescriptor = mXmppConnectionService.getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); - MediaTranscoder.getInstance().transcodeVideo(fileDescriptor, file.getAbsolutePath(), MediaFormatStrategyPresets.createAndroidStandardStrategy(mXmppConnectionService.getCompressVideoBitratePreference(), mXmppConnectionService.getCompressVideoResolutionPreference()), this); + Future future = MediaTranscoder.getInstance().transcodeVideo(fileDescriptor, file.getAbsolutePath(), MediaFormatStrategyPresets.createAndroidStandardStrategy(mXmppConnectionService.getCompressVideoBitratePreference(), mXmppConnectionService.getCompressVideoResolutionPreference()), this); + try { + future.get(); + } catch (Exception e) { + throw new AssertionError(e); + } } @Override @@ -113,7 +119,7 @@ public class AttachFileToConversationRunnable implements Runnable, MediaTranscod @Override public void onTranscodeFailed(Exception e) { mXmppConnectionService.stopForcingForegroundNotification(); - Log.d(Config.LOGTAG, "video transcoding failed " + e.getMessage()); + Log.d(Config.LOGTAG, "video transcoding failed", e); processAsFile(); } -- cgit v1.2.3