NekoX/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java

384 lines
17 KiB
Java
Raw Normal View History

2015-05-21 23:27:27 +02:00
/*
2019-01-23 18:03:33 +01:00
* This is the source code of Telegram for Android v. 5.x.x.
2015-05-21 23:27:27 +02:00
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
2019-01-23 18:03:33 +01:00
* Copyright Nikolai Kudashov, 2013-2018.
2015-05-21 23:27:27 +02:00
*/
2015-09-24 22:52:02 +02:00
package org.telegram.messenger;
2015-05-21 23:27:27 +02:00
import android.graphics.Bitmap;
import android.view.View;
import org.telegram.tgnet.SerializedData;
2017-07-08 18:32:04 +02:00
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.Components.PhotoFilterView;
import org.telegram.ui.Components.Point;
2017-07-08 18:32:04 +02:00
import java.util.ArrayList;
2015-05-21 23:27:27 +02:00
import java.util.Locale;
public class VideoEditedInfo {
2015-05-21 23:27:27 +02:00
public long startTime;
public long endTime;
2020-07-26 10:03:38 +02:00
public long avatarStartTime = -1;
2019-08-22 01:53:26 +02:00
public float start;
public float end;
2015-05-21 23:27:27 +02:00
public int rotationValue;
public int originalWidth;
public int originalHeight;
2020-07-26 10:03:38 +02:00
public int originalBitrate;
2015-05-21 23:27:27 +02:00
public int resultWidth;
public int resultHeight;
public int bitrate;
2018-07-30 04:07:02 +02:00
public int framerate = 24;
2015-05-21 23:27:27 +02:00
public String originalPath;
2017-03-31 01:58:05 +02:00
public long estimatedSize;
public long estimatedDuration;
2017-07-08 18:32:04 +02:00
public boolean roundVideo;
public boolean muted;
2019-12-31 14:08:08 +01:00
public long originalDuration;
2017-07-08 18:32:04 +02:00
public TLRPC.InputFile file;
public TLRPC.InputEncryptedFile encryptedFile;
public byte[] key;
public byte[] iv;
public MediaController.SavedFilterState filterState;
public String paintPath;
public ArrayList<MediaEntity> mediaEntities;
2020-07-26 10:03:38 +02:00
public MediaController.CropState cropState;
public boolean isPhoto;
2015-05-21 23:27:27 +02:00
2019-12-31 14:08:08 +01:00
public boolean canceled;
public boolean videoConvertFirstWrite;
public boolean needUpdateProgress = false;
public static class MediaEntity {
public byte type;
public byte subType;
public float x;
public float y;
public float rotation;
public float width;
public float height;
public String text;
public int color;
public int fontSize;
public int viewWidth;
public int viewHeight;
public float scale;
public float textViewWidth;
public float textViewHeight;
public float textViewX;
public float textViewY;
public TLRPC.Document document;
public Object parentObject;
public int[] metadata;
public long ptr;
public float currentFrame;
public float framesPerDraw;
public Bitmap bitmap;
public View view;
public MediaEntity() {
}
private MediaEntity(SerializedData data) {
type = data.readByte(false);
subType = data.readByte(false);
x = data.readFloat(false);
y = data.readFloat(false);
rotation = data.readFloat(false);
width = data.readFloat(false);
height = data.readFloat(false);
text = data.readString(false);
color = data.readInt32(false);
fontSize = data.readInt32(false);
viewWidth = data.readInt32(false);
viewHeight = data.readInt32(false);
}
private void serializeTo(SerializedData data) {
data.writeByte(type);
data.writeByte(subType);
data.writeFloat(x);
data.writeFloat(y);
data.writeFloat(rotation);
data.writeFloat(width);
data.writeFloat(height);
data.writeString(text);
data.writeInt32(color);
data.writeInt32(fontSize);
data.writeInt32(viewWidth);
data.writeInt32(viewHeight);
}
2020-07-26 10:03:38 +02:00
public MediaEntity copy() {
MediaEntity entity = new MediaEntity();
entity.type = type;
entity.subType = subType;
entity.x = x;
entity.y = y;
entity.rotation = rotation;
entity.width = width;
entity.height = height;
entity.text = text;
entity.color = color;
entity.fontSize = fontSize;
entity.viewWidth = viewWidth;
entity.viewHeight = viewHeight;
entity.scale = scale;
entity.textViewWidth = textViewWidth;
entity.textViewHeight = textViewHeight;
entity.textViewX = textViewX;
entity.textViewY = textViewY;
return entity;
}
}
2019-12-31 14:08:08 +01:00
2015-05-21 23:27:27 +02:00
public String getString() {
String filters;
2020-07-26 10:03:38 +02:00
if (avatarStartTime != -1 || filterState != null || paintPath != null || mediaEntities != null && !mediaEntities.isEmpty() || cropState != null) {
int len = 10;
if (filterState != null) {
len += 160;
}
byte[] paintPathBytes;
if (paintPath != null) {
paintPathBytes = paintPath.getBytes();
len += paintPathBytes.length;
} else {
paintPathBytes = null;
}
SerializedData serializedData = new SerializedData(len);
2020-07-26 10:03:38 +02:00
serializedData.writeInt32(5);
serializedData.writeInt64(avatarStartTime);
serializedData.writeInt32(originalBitrate);
if (filterState != null) {
serializedData.writeByte(1);
serializedData.writeFloat(filterState.enhanceValue);
2020-07-26 10:03:38 +02:00
serializedData.writeFloat(filterState.softenSkinValue);
serializedData.writeFloat(filterState.exposureValue);
serializedData.writeFloat(filterState.contrastValue);
serializedData.writeFloat(filterState.warmthValue);
serializedData.writeFloat(filterState.saturationValue);
serializedData.writeFloat(filterState.fadeValue);
serializedData.writeInt32(filterState.tintShadowsColor);
serializedData.writeInt32(filterState.tintHighlightsColor);
serializedData.writeFloat(filterState.highlightsValue);
serializedData.writeFloat(filterState.shadowsValue);
serializedData.writeFloat(filterState.vignetteValue);
serializedData.writeFloat(filterState.grainValue);
serializedData.writeInt32(filterState.blurType);
serializedData.writeFloat(filterState.sharpenValue);
serializedData.writeFloat(filterState.blurExcludeSize);
if (filterState.blurExcludePoint != null) {
serializedData.writeFloat(filterState.blurExcludePoint.x);
serializedData.writeFloat(filterState.blurExcludePoint.y);
} else {
serializedData.writeFloat(0);
serializedData.writeFloat(0);
}
serializedData.writeFloat(filterState.blurExcludeBlurSize);
serializedData.writeFloat(filterState.blurAngle);
for (int a = 0; a < 4; a++) {
PhotoFilterView.CurvesValue curvesValue;
if (a == 0) {
curvesValue = filterState.curvesToolValue.luminanceCurve;
} else if (a == 1) {
curvesValue = filterState.curvesToolValue.redCurve;
} else if (a == 2) {
curvesValue = filterState.curvesToolValue.greenCurve;
} else {
curvesValue = filterState.curvesToolValue.blueCurve;
}
serializedData.writeFloat(curvesValue.blacksLevel);
serializedData.writeFloat(curvesValue.shadowsLevel);
serializedData.writeFloat(curvesValue.midtonesLevel);
serializedData.writeFloat(curvesValue.highlightsLevel);
serializedData.writeFloat(curvesValue.whitesLevel);
}
} else {
serializedData.writeByte(0);
}
if (paintPathBytes != null) {
serializedData.writeByte(1);
serializedData.writeByteArray(paintPathBytes);
} else {
serializedData.writeByte(0);
}
if (mediaEntities != null && !mediaEntities.isEmpty()) {
serializedData.writeByte(1);
serializedData.writeInt32(mediaEntities.size());
for (int a = 0, N = mediaEntities.size(); a < N; a++) {
mediaEntities.get(a).serializeTo(serializedData);
}
serializedData.writeByte(isPhoto ? 1 : 0);
} else {
serializedData.writeByte(0);
}
2020-07-26 10:03:38 +02:00
if (cropState != null) {
serializedData.writeByte(1);
serializedData.writeFloat(cropState.cropPx);
serializedData.writeFloat(cropState.cropPy);
serializedData.writeFloat(cropState.cropPw);
serializedData.writeFloat(cropState.cropPh);
serializedData.writeFloat(cropState.cropScale);
serializedData.writeFloat(cropState.cropRotate);
serializedData.writeInt32(cropState.transformWidth);
serializedData.writeInt32(cropState.transformHeight);
serializedData.writeInt32(cropState.transformRotation);
serializedData.writeBool(cropState.mirrored);
} else {
serializedData.writeByte(0);
}
filters = Utilities.bytesToHex(serializedData.toByteArray());
serializedData.cleanup();
} else {
filters = "";
}
return String.format(Locale.US, "-1_%d_%d_%d_%d_%d_%d_%d_%d_%d_%d_-%s_%s", startTime, endTime, rotationValue, originalWidth, originalHeight, bitrate, resultWidth, resultHeight, originalDuration, framerate, filters, originalPath);
2015-05-21 23:27:27 +02:00
}
public boolean parseString(String string) {
2015-05-21 23:27:27 +02:00
if (string.length() < 6) {
return false;
2015-05-21 23:27:27 +02:00
}
try {
String[] args = string.split("_");
2019-12-31 14:08:08 +01:00
if (args.length >= 11) {
startTime = Long.parseLong(args[1]);
endTime = Long.parseLong(args[2]);
rotationValue = Integer.parseInt(args[3]);
originalWidth = Integer.parseInt(args[4]);
originalHeight = Integer.parseInt(args[5]);
bitrate = Integer.parseInt(args[6]);
resultWidth = Integer.parseInt(args[7]);
resultHeight = Integer.parseInt(args[8]);
2019-12-31 14:08:08 +01:00
originalDuration = Long.parseLong(args[9]);
framerate = Integer.parseInt(args[10]);
muted = bitrate == -1;
int start;
if (args[11].startsWith("-")) {
start = 12;
String s = args[11].substring(1);
if (s.length() > 0) {
SerializedData serializedData = new SerializedData(Utilities.hexToBytes(s));
int version = serializedData.readInt32(false);
2020-07-26 10:03:38 +02:00
if (version >= 3) {
avatarStartTime = serializedData.readInt64(false);
originalBitrate = serializedData.readInt32(false);
}
byte has = serializedData.readByte(false);
if (has != 0) {
filterState = new MediaController.SavedFilterState();
filterState.enhanceValue = serializedData.readFloat(false);
2020-07-26 10:03:38 +02:00
if (version >= 5) {
filterState.softenSkinValue = serializedData.readFloat(false);
}
filterState.exposureValue = serializedData.readFloat(false);
filterState.contrastValue = serializedData.readFloat(false);
filterState.warmthValue = serializedData.readFloat(false);
filterState.saturationValue = serializedData.readFloat(false);
filterState.fadeValue = serializedData.readFloat(false);
filterState.tintShadowsColor = serializedData.readInt32(false);
filterState.tintHighlightsColor = serializedData.readInt32(false);
filterState.highlightsValue = serializedData.readFloat(false);
filterState.shadowsValue = serializedData.readFloat(false);
filterState.vignetteValue = serializedData.readFloat(false);
filterState.grainValue = serializedData.readFloat(false);
filterState.blurType = serializedData.readInt32(false);
filterState.sharpenValue = serializedData.readFloat(false);
filterState.blurExcludeSize = serializedData.readFloat(false);
filterState.blurExcludePoint = new Point(serializedData.readFloat(false), serializedData.readFloat(false));
filterState.blurExcludeBlurSize = serializedData.readFloat(false);
filterState.blurAngle = serializedData.readFloat(false);
for (int a = 0; a < 4; a++) {
PhotoFilterView.CurvesValue curvesValue;
if (a == 0) {
curvesValue = filterState.curvesToolValue.luminanceCurve;
} else if (a == 1) {
curvesValue = filterState.curvesToolValue.redCurve;
} else if (a == 2) {
curvesValue = filterState.curvesToolValue.greenCurve;
} else {
curvesValue = filterState.curvesToolValue.blueCurve;
}
curvesValue.blacksLevel = serializedData.readFloat(false);
curvesValue.shadowsLevel = serializedData.readFloat(false);
curvesValue.midtonesLevel = serializedData.readFloat(false);
curvesValue.highlightsLevel = serializedData.readFloat(false);
curvesValue.whitesLevel = serializedData.readFloat(false);
}
}
has = serializedData.readByte(false);
if (has != 0) {
byte[] bytes = serializedData.readByteArray(false);
paintPath = new String(bytes);
}
has = serializedData.readByte(false);
if (has != 0) {
int count = serializedData.readInt32(false);
mediaEntities = new ArrayList<>(count);
for (int a = 0; a < count; a++) {
mediaEntities.add(new MediaEntity(serializedData));
}
isPhoto = serializedData.readByte(false) == 1;
}
2020-07-26 10:03:38 +02:00
if (version >= 2) {
has = serializedData.readByte(false);
if (has != 0) {
cropState = new MediaController.CropState();
cropState.cropPx = serializedData.readFloat(false);
cropState.cropPy = serializedData.readFloat(false);
cropState.cropPw = serializedData.readFloat(false);
cropState.cropPh = serializedData.readFloat(false);
cropState.cropScale = serializedData.readFloat(false);
cropState.cropRotate = serializedData.readFloat(false);
cropState.transformWidth = serializedData.readInt32(false);
cropState.transformHeight = serializedData.readInt32(false);
cropState.transformRotation = serializedData.readInt32(false);
if (version >= 4) {
cropState.mirrored = serializedData.readBool(false);
}
}
}
serializedData.cleanup();
}
} else {
start = 11;
}
2018-07-30 04:07:02 +02:00
for (int a = start; a < args.length; a++) {
if (originalPath == null) {
originalPath = args[a];
} else {
originalPath += "_" + args[a];
}
2015-05-21 23:27:27 +02:00
}
}
return true;
} catch (Exception e) {
2017-03-31 01:58:05 +02:00
FileLog.e(e);
2015-05-21 23:27:27 +02:00
}
return false;
2015-05-21 23:27:27 +02:00
}
2017-07-08 18:32:04 +02:00
public boolean needConvert() {
2020-07-26 10:03:38 +02:00
return mediaEntities != null || paintPath != null || filterState != null || cropState != null || !roundVideo || roundVideo && (startTime > 0 || endTime != -1 && endTime != estimatedDuration);
2017-07-08 18:32:04 +02:00
}
public boolean canAutoPlaySourceVideo() {
2020-07-26 10:03:38 +02:00
return roundVideo;
}
2015-05-21 23:27:27 +02:00
}