Skip to content

Commit a665513

Browse files
ChenYangY陈阳阳
and
陈阳阳
authored
fix(ffprobe-number-format-exception): fix gson parse SideData.rotatio… (#358)
* fix(ffprobe-number-format-exception): fix gson parse SideData.rotation NumberFormatException * fix(ffprobe-number-format-exception): change deprecated method newInstance --------- Co-authored-by: 陈阳阳 <[email protected]>
1 parent ead7e04 commit a665513

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

src/main/java/net/bramp/ffmpeg/FFmpegUtils.java

+3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import java.util.regex.Pattern;
1414
import net.bramp.commons.lang3.math.gson.FractionAdapter;
1515
import net.bramp.ffmpeg.adapter.FFmpegPacketsAndFramesAdapter;
16+
import net.bramp.ffmpeg.adapter.FFmpegStreamSideDataAdapter;
1617
import net.bramp.ffmpeg.gson.LowercaseEnumTypeAdapterFactory;
1718
import net.bramp.ffmpeg.probe.FFmpegFrameOrPacket;
19+
import net.bramp.ffmpeg.probe.FFmpegStream;
1820
import org.apache.commons.lang3.math.Fraction;
1921

2022
/** Helper class with commonly used methods */
@@ -130,6 +132,7 @@ private static Gson setupGson() {
130132
builder.registerTypeAdapterFactory(new LowercaseEnumTypeAdapterFactory());
131133
builder.registerTypeAdapter(Fraction.class, new FractionAdapter());
132134
builder.registerTypeAdapter(FFmpegFrameOrPacket.class, new FFmpegPacketsAndFramesAdapter());
135+
builder.registerTypeAdapter(FFmpegStream.SideData.class, new FFmpegStreamSideDataAdapter());
133136

134137
return builder.create();
135138
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package net.bramp.ffmpeg.adapter;
2+
3+
import com.google.gson.*;
4+
import net.bramp.ffmpeg.probe.FFmpegStream;
5+
6+
import java.lang.reflect.AnnotatedType;
7+
import java.lang.reflect.Field;
8+
import java.lang.reflect.Type;
9+
10+
public class FFmpegStreamSideDataAdapter implements JsonDeserializer<FFmpegStream.SideData> {
11+
@Override
12+
public FFmpegStream.SideData deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
13+
if (!(jsonElement instanceof JsonObject)) return null;
14+
try {
15+
Object sideData = Class.forName(FFmpegStream.SideData.class.getName()).getConstructor().newInstance();
16+
Field[] fields = Class.forName(FFmpegStream.SideData.class.getName()).getFields();
17+
for (Field field: fields) {
18+
String fieldName = field.getName();
19+
AnnotatedType annotatedType = field.getAnnotatedType();
20+
Object deserialize = jsonDeserializationContext.deserialize(((JsonObject) jsonElement).get(fieldName), annotatedType.getType());
21+
field.set(sideData, deserialize);
22+
}
23+
return (FFmpegStream.SideData) sideData;
24+
} catch (Exception exception) {
25+
return null;
26+
}
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package net.bramp.ffmpeg.adapter;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import net.bramp.ffmpeg.probe.FFmpegStream;
6+
import org.junit.BeforeClass;
7+
import org.junit.Test;
8+
9+
import static org.junit.Assert.assertEquals;
10+
11+
public class FFmpegStreamSideDataAdapterTest {
12+
static Gson gson;
13+
@BeforeClass
14+
public static void setGson() {
15+
GsonBuilder builder = new GsonBuilder();
16+
builder.registerTypeAdapter(FFmpegStream.SideData.class, new FFmpegStreamSideDataAdapter());
17+
gson = builder.create();
18+
}
19+
20+
@Test
21+
public void testNumberFormatException() {
22+
FFmpegStream.SideData sideData = gson.fromJson("{\"side_data_type\": \"Display Matrix\", \"displaymatrix\": \"\n00000000: 0 0 0\n00000001: 0 0 0\n00000002: 0 0 1073741824\n\", \"rotation\": -9223372036854775808}", FFmpegStream.SideData.class);
23+
assertEquals(sideData.side_data_type, "Display Matrix");
24+
assertEquals(sideData.displaymatrix, "\n00000000: 0 0 0\n00000001: 0 0 0\n00000002: 0 0 1073741824\n");
25+
assertEquals(sideData.rotation, 0);
26+
}
27+
28+
@Test
29+
public void testNormalVideo() {
30+
FFmpegStream.SideData sideData = gson.fromJson("{\"side_data_type\": \"Display Matrix\", \"displaymatrix\": \"\n00000000: 0 -65536 0\n00000001: 65536 0 0\n00000002: 0 0 1073741824\n\", \"rotation\": 90}", FFmpegStream.SideData.class);
31+
assertEquals(sideData.side_data_type, "Display Matrix");
32+
assertEquals(sideData.displaymatrix, "\n00000000: 0 -65536 0\n00000001: 65536 0 0\n00000002: 0 0 1073741824\n");
33+
assertEquals(sideData.rotation, 90);
34+
}
35+
36+
}

0 commit comments

Comments
 (0)