mirror of
https://github.com/deltachat/deltachat-android.git
synced 2025-10-03 17:59:39 +02:00
be conservative in sending videos
This commit is contained in:
parent
13c1c7a4f2
commit
a59f6fd69b
2 changed files with 31 additions and 17 deletions
|
@ -1025,18 +1025,22 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||||
if (action==ACTION_SEND_OUT) {
|
if (action==ACTION_SEND_OUT) {
|
||||||
dcContext.setDraft(dcChat.getId(), null);
|
dcContext.setDraft(dcChat.getId(), null);
|
||||||
|
|
||||||
if(msg!=null) {
|
if(msg!=null)
|
||||||
|
{
|
||||||
|
boolean doSend = true;
|
||||||
if(recompress!=0) {
|
if(recompress!=0) {
|
||||||
|
|
||||||
if(recompress==DcMsg.DC_MSG_IMAGE) {
|
if(recompress==DcMsg.DC_MSG_IMAGE) {
|
||||||
BitmapUtil.recodeImageMsg(ConversationActivity.this, msg);
|
BitmapUtil.recodeImageMsg(ConversationActivity.this, msg);
|
||||||
}
|
}
|
||||||
else if(recompress==DcMsg.DC_MSG_VIDEO) {
|
else if(recompress==DcMsg.DC_MSG_VIDEO) {
|
||||||
VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
|
doSend = VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dcContext.sendMsg(dcChat.getId(), msg);
|
if (doSend) {
|
||||||
|
dcContext.sendMsg(dcChat.getId(), msg);
|
||||||
|
}
|
||||||
|
|
||||||
Util.runOnMain(()-> sendComplete(dcChat.getId()));
|
Util.runOnMain(()-> sendComplete(dcChat.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import android.media.MediaExtractor;
|
||||||
import android.media.MediaFormat;
|
import android.media.MediaFormat;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.b44t.messenger.DcMsg;
|
import com.b44t.messenger.DcMsg;
|
||||||
import com.coremedia.iso.IsoFile;
|
import com.coremedia.iso.IsoFile;
|
||||||
|
@ -758,10 +759,17 @@ public class VideoRecoder {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void logNtoast(Context context, String str)
|
||||||
|
{
|
||||||
|
Log.w(TAG, str);
|
||||||
|
Util.runOnMain(()->Toast.makeText(context, str, Toast.LENGTH_LONG).show());
|
||||||
|
}
|
||||||
|
|
||||||
// prepareVideo() assumes the msg object is set up properly to being sent;
|
// prepareVideo() assumes the msg object is set up properly to being sent;
|
||||||
// the function fills out missing information and also recodes the video as needed;
|
// the function fills out missing information and also recodes the video as needed;
|
||||||
// to get a responsive ui, DcChat.prepareMsg() may be called.
|
// to get a responsive ui, DcChat.prepareMsg() may be called.
|
||||||
public static void prepareVideo(Context context, int chatId, DcMsg msg) {
|
// return: true=video might be prepared, can be sent, false=error
|
||||||
|
public static boolean prepareVideo(Context context, int chatId, DcMsg msg) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String inPath = msg.getFile();
|
String inPath = msg.getFile();
|
||||||
|
@ -769,8 +777,8 @@ public class VideoRecoder {
|
||||||
// try to get information from video file
|
// try to get information from video file
|
||||||
VideoEditedInfo vei = getVideoEditInfoFromFile(inPath);
|
VideoEditedInfo vei = getVideoEditInfoFromFile(inPath);
|
||||||
if (vei == null) {
|
if (vei == null) {
|
||||||
Log.w(TAG, String.format("recoding for %s failed: cannot get info", inPath));
|
logNtoast(context, String.format("recoding for %s failed: cannot get info", inPath));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
vei.rotationValue = vei.originalRotationValue;
|
vei.rotationValue = vei.originalRotationValue;
|
||||||
vei.startTime = 0;
|
vei.startTime = 0;
|
||||||
|
@ -786,8 +794,8 @@ public class VideoRecoder {
|
||||||
msg.setDuration((int)vei.originalDurationMs);
|
msg.setDuration((int)vei.originalDurationMs);
|
||||||
|
|
||||||
if (!canRecode()) {
|
if (!canRecode()) {
|
||||||
Log.w(TAG, String.format("recoding for %s failed: this system cannot recode videos", inPath));
|
logNtoast(context, String.format("recoding for %s failed: this system cannot recode videos", inPath));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if video bitrate is already reasonable
|
// check if video bitrate is already reasonable
|
||||||
|
@ -796,7 +804,7 @@ public class VideoRecoder {
|
||||||
long inBytes = new File(inPath).length();
|
long inBytes = new File(inPath).length();
|
||||||
if (inBytes > 0 && inBytes <= MAX_BYTES && vei.originalVideoBitrate <= MAX_KBPS*2 /*be tolerant as long the file size matches*/) {
|
if (inBytes > 0 && inBytes <= MAX_BYTES && vei.originalVideoBitrate <= MAX_KBPS*2 /*be tolerant as long the file size matches*/) {
|
||||||
Log.i(TAG, String.format("recoding for %s is not needed, %d bytes and %d kbps are ok", inPath, inBytes, vei.originalVideoBitrate));
|
Log.i(TAG, String.format("recoding for %s is not needed, %d bytes and %d kbps are ok", inPath, inBytes, vei.originalVideoBitrate));
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate new video bitrate, sth. between 200 kbps and 1500 kbps
|
// calculate new video bitrate, sth. between 200 kbps and 1500 kbps
|
||||||
|
@ -839,22 +847,22 @@ public class VideoRecoder {
|
||||||
vei.estimatedBytes = VideoRecoder.calculateEstimatedSize((float) resultDurationMs / vei.originalDurationMs,
|
vei.estimatedBytes = VideoRecoder.calculateEstimatedSize((float) resultDurationMs / vei.originalDurationMs,
|
||||||
vei.resultVideoBitrate, vei.originalDurationMs, vei.originalAudioBytes);
|
vei.resultVideoBitrate, vei.originalDurationMs, vei.originalAudioBytes);
|
||||||
|
|
||||||
if (vei.estimatedBytes > MAX_BYTES) {
|
if (vei.estimatedBytes > MAX_BYTES+MAX_BYTES/4) {
|
||||||
Log.w(TAG, String.format("recoding for %s: resulting file may too large", inPath));
|
logNtoast(context, String.format("recoding for %s failed: resulting file probably too large", inPath));
|
||||||
// continue anyway
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// recode
|
// recode
|
||||||
String tempPath = DcHelper.getContext(context).getBlobdirFile(inPath);
|
String tempPath = DcHelper.getContext(context).getBlobdirFile(inPath);
|
||||||
VideoRecoder videoRecoder = new VideoRecoder();
|
VideoRecoder videoRecoder = new VideoRecoder();
|
||||||
if (!videoRecoder.convertVideo(vei, tempPath)) {
|
if (!videoRecoder.convertVideo(vei, tempPath)) {
|
||||||
Log.w(TAG, String.format("recoding for %s failed: cannot convert to temporary file %s", inPath, tempPath));
|
logNtoast(context, String.format("recoding for %s failed: cannot convert to temporary file %s", inPath, tempPath));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Util.moveFile(tempPath, inPath)) {
|
if (!Util.moveFile(tempPath, inPath)) {
|
||||||
Log.w(TAG, String.format("recoding for %s failed: cannot move temporary file %s", inPath, tempPath));
|
logNtoast(context, String.format("recoding for %s failed: cannot move temporary file %s", inPath, tempPath));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.i(TAG, String.format("recoding for %s done", inPath));
|
Log.i(TAG, String.format("recoding for %s done", inPath));
|
||||||
|
@ -862,5 +870,7 @@ public class VideoRecoder {
|
||||||
catch(Exception e) {
|
catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue