org.mp4parser.boxes.apple.AppleDataBox Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of isoparser Show documentation
Show all versions of isoparser Show documentation
A generic parser and writer for all ISO 14496 based files (MP4, Quicktime, DCF, PDCF, ...)
The newest version!
package org.mp4parser.boxes.apple;
import org.mp4parser.support.AbstractBox;
import org.mp4parser.support.DoNotParseDetail;
import org.mp4parser.tools.IsoTypeReader;
import org.mp4parser.tools.IsoTypeWriter;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Locale;
/**
* Created by sannies on 10/12/13.
*/
public abstract class AppleDataBox extends AbstractBox {
private static HashMap language = new HashMap();
static {
language.put("0", "English");
language.put("1", "French");
language.put("2", "German");
language.put("3", "Italian");
language.put("4", "Dutch");
language.put("5", "Swedish");
language.put("6", "Spanish");
language.put("7", "Danish");
language.put("8", "Portuguese");
language.put("9", "Norwegian");
language.put("10", "Hebrew");
language.put("11", "Japanese");
language.put("12", "Arabic");
language.put("13", "Finnish");
language.put("14", "Greek");
language.put("15", "Icelandic");
language.put("16", "Maltese");
language.put("17", "Turkish");
language.put("18", "Croatian");
language.put("19", "Traditional_Chinese");
language.put("20", "Urdu");
language.put("21", "Hindi");
language.put("22", "Thai");
language.put("23", "Korean");
language.put("24", "Lithuanian");
language.put("25", "Polish");
language.put("26", "Hungarian");
language.put("27", "Estonian");
language.put("28", "Lettish");
language.put("29", "Sami");
language.put("30", "Faroese");
language.put("31", "Farsi");
language.put("32", "Russian");
language.put("33", "Simplified_Chinese");
language.put("34", "Flemish");
language.put("35", "Irish");
language.put("36", "Albanian");
language.put("37", "Romanian");
language.put("38", "Czech");
language.put("39", "Slovak");
language.put("40", "Slovenian");
language.put("41", "Yiddish");
language.put("42", "Serbian");
language.put("43", "Macedonian");
language.put("44", "Bulgarian");
language.put("45", "Ukrainian");
language.put("46", "Belarusian");
language.put("47", "Uzbek");
language.put("48", "Kazakh");
language.put("49", "Azerbaijani");
language.put("50", "AzerbaijanAr");
language.put("51", "Armenian");
language.put("52", "Georgian");
language.put("53", "Moldavian");
language.put("54", "Kirghiz");
language.put("55", "Tajiki");
language.put("56", "Turkmen");
language.put("57", "Mongolian");
language.put("58", "MongolianCyr");
language.put("59", "Pashto");
language.put("60", "Kurdish");
language.put("61", "Kashmiri");
language.put("62", "Sindhi");
language.put("63", "Tibetan");
language.put("64", "Nepali");
language.put("65", "Sanskrit");
language.put("66", "Marathi");
language.put("67", "Bengali");
language.put("68", "Assamese");
language.put("69", "Gujarati");
language.put("70", "Punjabi");
language.put("71", "Oriya");
language.put("72", "Malayalam");
language.put("73", "Kannada");
language.put("74", "Tamil");
language.put("75", "Telugu");
language.put("76", "Sinhala");
language.put("77", "Burmese");
language.put("78", "Khmer");
language.put("79", "Lao");
language.put("80", "Vietnamese");
language.put("81", "Indonesian");
language.put("82", "Tagalog");
language.put("83", "MalayRoman");
language.put("84", "MalayArabic");
language.put("85", "Amharic");
language.put("87", "Galla");
language.put("87", "Oromo");
language.put("88", "Somali");
language.put("89", "Swahili");
language.put("90", "Kinyarwanda");
language.put("91", "Rundi");
language.put("92", "Nyanja");
language.put("93", "Malagasy");
language.put("94", "Esperanto");
language.put("128", "Welsh");
language.put("129", "Basque");
language.put("130", "Catalan");
language.put("131", "Latin");
language.put("132", "Quechua");
language.put("133", "Guarani");
language.put("134", "Aymara");
language.put("135", "Tatar");
language.put("136", "Uighur");
language.put("137", "Dzongkha");
language.put("138", "JavaneseRom");
language.put("32767", "Unspecified");
}
int dataType;
int dataCountry;
int dataLanguage;
protected AppleDataBox(String type, int dataType) {
super(type);
this.dataType = dataType;
}
public String getLanguageString() {
String lang = language.get("" + dataLanguage);
if (lang == null) {
ByteBuffer b = ByteBuffer.wrap(new byte[2]);
IsoTypeWriter.writeUInt16(b, dataLanguage);
b.reset();
return new Locale(IsoTypeReader.readIso639(b)).getDisplayLanguage();
} else {
return lang;
}
}
@Override
protected long getContentSize() {
return getDataLength() + 16;
// actualdatalength + dataheader
}
public int getDataType() {
return dataType;
}
public int getDataCountry() {
return dataCountry;
}
public void setDataCountry(int dataCountry) {
this.dataCountry = dataCountry;
}
public int getDataLanguage() {
return dataLanguage;
}
public void setDataLanguage(int dataLanguage) {
this.dataLanguage = dataLanguage;
}
@DoNotParseDetail
protected ByteBuffer parseDataLength4ccTypeCountryLanguageAndReturnRest(ByteBuffer content) {
int dataLength = content.getInt();
int data4cc = content.getInt(); // 'data'
dataType = content.getInt();
dataCountry = content.getShort();
if (dataCountry < 0) {
dataCountry += (1 << 16);
}
dataLanguage = content.getShort();
if (dataLanguage < 0) {
dataLanguage += (1 << 16);
}
ByteBuffer data = (ByteBuffer) content.duplicate().slice().limit(dataLength - 16);
((Buffer)content).position(dataLength - 16 + content.position());
return data;
}
@Override
protected void _parseDetails(ByteBuffer content) {
ByteBuffer data = parseDataLength4ccTypeCountryLanguageAndReturnRest(content);
parseData(data);
}
protected void getContent(ByteBuffer byteBuffer) {
writeDataLength4ccTypeCountryLanguage(byteBuffer);
byteBuffer.put(writeData());
}
protected abstract byte[] writeData();
protected abstract void parseData(ByteBuffer data);
protected abstract int getDataLength();
@DoNotParseDetail
protected void writeDataLength4ccTypeCountryLanguage(ByteBuffer content) {
content.putInt(getDataLength() + 16);
content.put("data".getBytes());
content.putInt(dataType);
IsoTypeWriter.writeUInt16(content, dataCountry);
IsoTypeWriter.writeUInt16(content, dataLanguage);
}
}