diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 7c6d826c4..aa181b417 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -109,6 +109,7 @@ import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.views.Stub; +import org.thoughtcrime.securesms.video.recode.VideoRecoder; import java.io.File; import java.io.FileOutputStream; @@ -853,7 +854,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity case AttachmentTypeSelector.TAKE_PHOTO: attachmentManager.capturePhoto(this, TAKE_PHOTO); break; case AttachmentTypeSelector.RECORD_VIDEO: - attachmentManager.captureVideo(this, RECORD_VIDEO); break; + if(VideoRecoder.canRecode()) { + attachmentManager.captureVideo(this, RECORD_VIDEO); + } + else { + Toast.makeText(this, "This device does not support video-compression (requires Android 4.4 KitKat)", Toast.LENGTH_LONG).show(); + } + break; } } @@ -959,7 +966,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity final SettableFuture future = new SettableFuture<>(); DcMsg msg = null; - Boolean recompress = Boolean.FALSE; + Integer recompress = 0; composeText.setText(""); @@ -976,7 +983,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity // recompress jpeg-files unless sent as documents if (MediaUtil.isJpegType(contentType) && slideDeck.getDocumentSlide()==null) { - recompress = true; + recompress = DcMsg.DC_MSG_IMAGE; } } else if (MediaUtil.isAudioType(contentType)) { @@ -985,6 +992,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } else if (MediaUtil.isVideoType(contentType)) { msg = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO); + recompress = DcMsg.DC_MSG_VIDEO; } else { msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE); @@ -1008,11 +1016,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override protected Void doInBackground(Object... param) { DcMsg msg = (DcMsg)param[0]; - Boolean recompress = (Boolean)param[1]; + Integer recompress = (Integer)param[1]; if (action==ACTION_SEND_OUT) { if(msg!=null) { - if(recompress) { - BitmapUtil.recodeImageMsg(ConversationActivity.this, msg); + if(recompress!=0) { + if(recompress==DcMsg.DC_MSG_IMAGE) { + BitmapUtil.recodeImageMsg(ConversationActivity.this, msg); + } + else if(recompress==DcMsg.DC_MSG_VIDEO) { + VideoRecoder.recodeVideo(ConversationActivity.this, msg); + } } dcContext.sendMsg(dcChat.getId(), msg); Util.runOnMain(()-> sendComplete(dcChat.getId())); diff --git a/src/org/thoughtcrime/securesms/video/recode/VideoRecoder.java b/src/org/thoughtcrime/securesms/video/recode/VideoRecoder.java index f92873a93..aabc79614 100644 --- a/src/org/thoughtcrime/securesms/video/recode/VideoRecoder.java +++ b/src/org/thoughtcrime/securesms/video/recode/VideoRecoder.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.video.recode; import android.annotation.SuppressLint; import android.annotation.TargetApi; +import android.content.Context; import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaCodecList; @@ -9,6 +10,8 @@ import android.media.MediaExtractor; import android.media.MediaFormat; import android.os.Build; +import com.b44t.messenger.DcMsg; + import java.io.File; import java.nio.ByteBuffer; @@ -618,7 +621,7 @@ public class VideoRecoder { return true; } - public class VideoEditedInfo { + public static class VideoEditedInfo { public long startTime; public long endTime; public int rotationValue; @@ -631,4 +634,55 @@ public class VideoRecoder { public String originalPath; } + public static boolean canRecode() + { + boolean canRecode = true; + if (Build.VERSION.SDK_INT < 16 /*= Jelly Bean 4.1 (before that codecInfo.getName() was not there) */) { + canRecode = false; + } + else if (Build.VERSION.SDK_INT < 18 /*= Jelly Bean 4.3*/) { + try { + MediaCodecInfo codecInfo = VideoRecoder.selectCodec(VideoRecoder.MIME_TYPE); + if (codecInfo == null) { + canRecode = false; + } else { + String name = codecInfo.getName(); + if (name.equals("OMX.google.h264.encoder") || + name.equals("OMX.ST.VFM.H264Enc") || + name.equals("OMX.Exynos.avc.enc") || + name.equals("OMX.MARVELL.VIDEO.HW.CODA7542ENCODER") || + name.equals("OMX.MARVELL.VIDEO.H264ENCODER") || + name.equals("OMX.k3.video.encoder.avc") || + name.equals("OMX.TI.DUCATI1.VIDEO.H264E")) { + canRecode = false; + } else { + if (VideoRecoder.selectColorFormat(codecInfo, VideoRecoder.MIME_TYPE) == 0) { + canRecode = false; + } + } + } + } catch (Exception e) { + canRecode = false; + } + } + return canRecode; + } + + public static void recodeVideo(Context context, DcMsg msg) { + + if (!canRecode()) { + return; + } + + String source = msg.getFile(); + + VideoEditedInfo vei = new VideoEditedInfo(); + vei.startTime = 0; + vei.endTime = 0; + vei.rotationValue = 0; + + VideoRecoder videoRecoder = new VideoRecoder(); + + // TODO: call videoRecoder.convertVideo(source, vei); + } }