com.googlecode.mp4parser.authoring.SampleImpl 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, ...)
package com.googlecode.mp4parser.authoring;
import com.coremedia.iso.boxes.Container;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel;
import static com.googlecode.mp4parser.util.CastUtils.l2i;
public class SampleImpl implements Sample {
private final long offset;
private final long size;
private ByteBuffer[] data;
private final Container parent;
public SampleImpl(ByteBuffer buf) {
this.offset = -1;
this.size = buf.limit();
this.data = new ByteBuffer[]{buf};
this.parent = null;
}
public SampleImpl(ByteBuffer[] data) {
this.offset = -1;
int _size = 0;
for (ByteBuffer byteBuffer : data) {
_size += byteBuffer.remaining();
}
this.size = _size;
this.data = data;
this.parent = null;
}
public SampleImpl(long offset, long sampleSize, ByteBuffer data) {
this.offset = offset;
this.size = sampleSize;
this.data = new ByteBuffer[]{data};
this.parent = null;
}
public SampleImpl(long offset, long sampleSize, Container parent) {
this.offset = offset;
this.size = sampleSize;
this.data = null;
this.parent = parent;
}
protected void ensureData() {
if (data != null) return;
if (parent == null) {
throw new RuntimeException("Missing parent container, can't read sample " + this);
}
try {
data = new ByteBuffer[]{parent.getByteBuffer(offset, size)};
} catch (IOException e) {
throw new RuntimeException("couldn't read sample " + this, e);
}
}
public void writeTo(WritableByteChannel channel) throws IOException {
ensureData();
for (ByteBuffer b : data) {
channel.write(b.duplicate());
}
}
public long getSize() {
return size;
}
public ByteBuffer asByteBuffer() {
ensureData();
byte[] bCopy = new byte[l2i(size)];
ByteBuffer copy = ByteBuffer.wrap(bCopy);
for (ByteBuffer b : data) {
copy.put(b.duplicate());
}
copy.rewind();
return copy;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("SampleImpl");
sb.append("{offset=").append(offset);
sb.append("{size=").append(size);
sb.append('}');
return sb.toString();
}
}