001package net.bramp.ffmpeg.adapter;
002
003import com.google.gson.JsonDeserializationContext;
004import com.google.gson.JsonDeserializer;
005import com.google.gson.JsonElement;
006import com.google.gson.JsonObject;
007import com.google.gson.JsonParseException;
008import java.lang.reflect.AnnotatedType;
009import java.lang.reflect.Field;
010import java.lang.reflect.Type;
011import net.bramp.ffmpeg.probe.FFmpegStream;
012
013/** Gson type adapter that deserializes FFmpeg stream side data from JSON. */
014public class FFmpegStreamSideDataAdapter implements JsonDeserializer<FFmpegStream.SideData> {
015  @Override
016  public FFmpegStream.SideData deserialize(
017      JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
018      throws JsonParseException {
019    if (!(jsonElement instanceof JsonObject)) {
020      return null;
021    }
022    try {
023      Object sideData =
024          Class.forName(FFmpegStream.SideData.class.getName()).getConstructor().newInstance();
025      Field[] fields = Class.forName(FFmpegStream.SideData.class.getName()).getFields();
026      for (Field field : fields) {
027        String fieldName = field.getName();
028        AnnotatedType annotatedType = field.getAnnotatedType();
029        Object deserialize =
030            jsonDeserializationContext.deserialize(
031                ((JsonObject) jsonElement).get(fieldName), annotatedType.getType());
032        field.set(sideData, deserialize);
033      }
034      return (FFmpegStream.SideData) sideData;
035    } catch (Exception exception) {
036      return null;
037    }
038  }
039}