org.mp4parser.support.AbstractContainerBox 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!
/*
* Copyright 2008 CoreMedia AG, Hamburg
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mp4parser.support;
import org.mp4parser.BasicContainer;
import org.mp4parser.BoxParser;
import org.mp4parser.Container;
import org.mp4parser.ParsableBox;
import org.mp4parser.tools.IsoTypeWriter;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
/**
* Abstract base class suitable for most boxes acting purely as container for other boxes.
*/
public class AbstractContainerBox extends BasicContainer implements ParsableBox {
protected String type;
protected boolean largeBox;
Container parent;
public AbstractContainerBox(String type) {
this.type = type;
}
public void setParent(Container parent) {
this.parent = parent;
}
public long getSize() {
long s = getContainerSize();
return s + ((largeBox || (s + 8) >= (1L << 32)) ? 16 : 8);
}
public String getType() {
return type;
}
protected ByteBuffer getHeader() {
ByteBuffer header;
if (largeBox || getSize() >= (1L << 32)) {
header = ByteBuffer.wrap(new byte[]{0, 0, 0, 1, type.getBytes()[0], type.getBytes()[1], type.getBytes()[2], type.getBytes()[3], 0, 0, 0, 0, 0, 0, 0, 0});
((Buffer)header).position(8);
IsoTypeWriter.writeUInt64(header, getSize());
} else {
header = ByteBuffer.wrap(new byte[]{0, 0, 0, 0, type.getBytes()[0], type.getBytes()[1], type.getBytes()[2], type.getBytes()[3]});
IsoTypeWriter.writeUInt32(header, getSize());
}
((Buffer)header).rewind();
return header;
}
public void parse(ReadableByteChannel dataSource, ByteBuffer header, long contentSize, BoxParser boxParser) throws IOException {
this.largeBox = header.remaining() == 16; // sometime people use large boxes without requiring them
initContainer(dataSource, contentSize, boxParser);
}
public void getBox(WritableByteChannel writableByteChannel) throws IOException {
writableByteChannel.write(getHeader());
writeContainer(writableByteChannel);
}
}