package com.coremedia.iso.boxes.sampleentry; import com.coremedia.iso.BoxParser; import com.coremedia.iso.IsoTypeReader; import com.coremedia.iso.IsoTypeWriter; import java.io.IOException; import java.nio.ByteBuffer; import com.googlecode.mp4parser.DataSource; import java.nio.channels.WritableByteChannel; public class SubtitleSampleEntry extends AbstractSampleEntry { public static final String TYPE1 = "stpp"; private String namespace = ""; private String schemaLocation = ""; private String imageMimeType = ""; public SubtitleSampleEntry() { super(TYPE1); } @Override public long getSize() { long s = getContainerSize(); long t = 8 + namespace.length() + schemaLocation.length() + imageMimeType.length() + 3; return s + t + ((largeBox || (s + t + 8) >= (1L << 32)) ? 16 : 8); } @Override public void parse(DataSource dataSource, ByteBuffer header, long contentSize, BoxParser boxParser) throws IOException { ByteBuffer byteBuffer = ByteBuffer.allocate(8); dataSource.read((ByteBuffer) byteBuffer.rewind()); byteBuffer.position(6); dataReferenceIndex = IsoTypeReader.readUInt16(byteBuffer); long start = dataSource.position(); ByteBuffer content = ByteBuffer.allocate(1024); dataSource.read((ByteBuffer) content.rewind()); namespace = IsoTypeReader.readString((ByteBuffer) content.rewind()); dataSource.position(start + namespace.length() + 1); dataSource.read((ByteBuffer) content.rewind()); schemaLocation = IsoTypeReader.readString((ByteBuffer) content.rewind()); dataSource.position(start + namespace.length() + schemaLocation.length() + 2); dataSource.read((ByteBuffer) content.rewind()); imageMimeType = IsoTypeReader.readString((ByteBuffer) content.rewind()); dataSource.position(start + namespace.length() + schemaLocation.length() + imageMimeType.length() + 3); parseContainer(dataSource, contentSize - (header.remaining() + namespace.length() + schemaLocation.length() + imageMimeType.length() + 3), boxParser); } @Override public void getBox(WritableByteChannel writableByteChannel) throws IOException { writableByteChannel.write(getHeader()); ByteBuffer byteBuffer = ByteBuffer.allocate(8 + namespace.length() + schemaLocation.length() + imageMimeType.length() + 3); byteBuffer.position(6); IsoTypeWriter.writeUInt16(byteBuffer, dataReferenceIndex); IsoTypeWriter.writeZeroTermUtf8String(byteBuffer, namespace); IsoTypeWriter.writeZeroTermUtf8String(byteBuffer, schemaLocation); IsoTypeWriter.writeZeroTermUtf8String(byteBuffer, imageMimeType); writableByteChannel.write((ByteBuffer) byteBuffer.rewind()); writeContainer(writableByteChannel); } public String getNamespace() { return namespace; } public void setNamespace(String namespace) { this.namespace = namespace; } public String getSchemaLocation() { return schemaLocation; } public void setSchemaLocation(String schemaLocation) { this.schemaLocation = schemaLocation; } public String getImageMimeType() { return imageMimeType; } public void setImageMimeType(String imageMimeType) { this.imageMimeType = imageMimeType; } }