package org.jcodec.player.filters.http;
import javax.sound.sampled.AudioFormat;
import org.jcodec.common.model.ChannelLabel;
import org.jcodec.common.model.Rational;
import org.jcodec.common.model.Size;
import org.jcodec.player.filters.MediaInfo;
import org.jcodec.player.filters.MediaInfo.AudioInfo;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* Downloads frames and media info from JCodec streaming server
*
* @author The JCodec project
*
*/
public class MediaInfoParser {
public static MediaInfo[] parseMediaInfos(String encoded) {
JSONArray tracks = (JSONArray) JSONValue.parse(encoded);
MediaInfo[] infos = new MediaInfo[tracks.size()];
int i = 0;
for (Object track : tracks) {
MediaInfo mi = parseMediaInfo((JSONObject) track);
if (mi != null)
infos[i++] = mi;
}
return infos;
}
public static MediaInfo parseMediaInfo(String encoded) {
return parseMediaInfo((JSONObject) JSONValue.parse(encoded));
}
private static MediaInfo parseMediaInfo(JSONObject track) {
String type = (String) track.get("type");
if ("video".equals(type)) {
return parseVideo((JSONObject) track.get("info"));
} else if ("audio".equals(type)) {
return parseAudio((JSONObject) track.get("info"));
}
return null;
}
private static MediaInfo parseAudio(JSONObject info) {
MediaInfo gen = parseMedia(info);
JSONObject transcodedInfo = (JSONObject) info.get("transcodedFrom");
if (transcodedInfo != null)
gen.setTranscodedFrom(parseAudio(transcodedInfo));
return new AudioInfo(gen, parseFormat((JSONObject) info.get("af")),
((Number) info.get("framesPerPacket")).intValue(), parseLabels((JSONArray) info.get("labels")));
}
private static ChannelLabel[] parseLabels(JSONArray labels) {
ChannelLabel[] result = new ChannelLabel[labels.size()];
for (int i = 0; i < labels.size(); i++) {
result[i] = ChannelLabel.valueOf((String) labels.get(i));
}
return result;
}
private static AudioFormat parseFormat(JSONObject format) {
return new AudioFormat(((Number) format.get("sampleRate")).intValue(),
((Number) format.get("sampleSizeInBits")).intValue(), ((Number) format.get("channels")).intValue(),
true, (Boolean) format.get("bigEndian"));
}
private static MediaInfo parseVideo(JSONObject info) {
MediaInfo gen = parseMedia(info);
JSONObject transcodedInfo = (JSONObject) info.get("transcodedFrom");
if (transcodedInfo != null)
gen.setTranscodedFrom(parseVideo(transcodedInfo));
return new MediaInfo.VideoInfo(gen, parseRational((JSONObject) info.get("par")),
parseSize((JSONObject) info.get("dim")));
}
private static Rational parseRational(JSONObject rational) {
return new Rational(((Number) rational.get("num")).intValue(), ((Number) rational.get("den")).intValue());
}
private static Size parseSize(JSONObject size) {
return new Size(((Number) size.get("width")).intValue(), ((Number) size.get("height")).intValue());
}
private static MediaInfo parseMedia(JSONObject info) {
return new MediaInfo((String) info.get("fourcc"), ((Number) info.get("timescale")).intValue(),
((Number) info.get("duration")).intValue(), ((Number) info.get("nFrames")).intValue(),
(String) info.get("name"), null);
}
}