blob: 01dcacaa9db5b3c45a6672c70898d1764a24bbc1 [file] [log] [blame]
/*
* 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 com.coremedia.iso.boxes;
import com.coremedia.iso.IsoFile;
import com.coremedia.iso.IsoTypeReader;
import com.coremedia.iso.IsoTypeWriter;
import com.coremedia.iso.Utf8;
import com.googlecode.mp4parser.AbstractFullBox;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* This box within a Media Box declares the process by which the media-data in the track is presented,
* and thus, the nature of the media in a track.
* This Box when present in a Meta Box, declares the structure or format of the 'meta' box contents.
* See ISO/IEC 14496-12 for details.
*
* @see MetaBox
* @see MediaBox
*/
public class HandlerBox extends AbstractFullBox {
public static final String TYPE = "hdlr";
public static final Map<String, String> readableTypes;
static {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("odsm", "ObjectDescriptorStream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("crsm", "ClockReferenceStream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("sdsm", "SceneDescriptionStream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("m7sm", "MPEG7Stream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("ocsm", "ObjectContentInfoStream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("ipsm", "IPMP Stream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("mjsm", "MPEG-J Stream - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
hm.put("mdir", "Apple Meta Data iTunes Reader");
hm.put("mp7b", "MPEG-7 binary XML");
hm.put("mp7t", "MPEG-7 XML");
hm.put("vide", "Video Track");
hm.put("soun", "Sound Track");
hm.put("hint", "Hint Track");
hm.put("appl", "Apple specific");
hm.put("meta", "Timed Metadata track - defined in ISO/IEC JTC1/SC29/WG11 - CODING OF MOVING PICTURES AND AUDIO");
readableTypes = Collections.unmodifiableMap(hm);
}
private String handlerType;
private String name = null;
private long a, b, c;
private boolean zeroTerm = true;
private long shouldBeZeroButAppleWritesHereSomeValue;
public HandlerBox() {
super(TYPE);
}
public String getHandlerType() {
return handlerType;
}
/**
* You are required to add a '\0' string termination by yourself.
*
* @param name the new human readable name
*/
public void setName(String name) {
this.name = name;
}
public void setHandlerType(String handlerType) {
this.handlerType = handlerType;
}
public String getName() {
return name;
}
public String getHumanReadableTrackType() {
return readableTypes.get(handlerType) != null ? readableTypes.get(handlerType) : "Unknown Handler Type";
}
protected long getContentSize() {
if (zeroTerm) {
return 25 + Utf8.utf8StringLengthInBytes(name);
} else {
return 24 + Utf8.utf8StringLengthInBytes(name);
}
}
@Override
public void _parseDetails(ByteBuffer content) {
parseVersionAndFlags(content);
shouldBeZeroButAppleWritesHereSomeValue = IsoTypeReader.readUInt32(content);
handlerType = IsoTypeReader.read4cc(content);
a = IsoTypeReader.readUInt32(content);
b = IsoTypeReader.readUInt32(content);
c = IsoTypeReader.readUInt32(content);
if (content.remaining() > 0) {
name = IsoTypeReader.readString(content, content.remaining());
if (name.endsWith("\0")) {
name = name.substring(0, name.length() - 1);
zeroTerm = true;
} else {
zeroTerm = false;
}
} else {
zeroTerm = false; //No string at all, not even zero term char
}
}
@Override
protected void getContent(ByteBuffer byteBuffer) {
writeVersionAndFlags(byteBuffer);
IsoTypeWriter.writeUInt32(byteBuffer, shouldBeZeroButAppleWritesHereSomeValue);
byteBuffer.put(IsoFile.fourCCtoBytes(handlerType));
IsoTypeWriter.writeUInt32(byteBuffer, a);
IsoTypeWriter.writeUInt32(byteBuffer, b);
IsoTypeWriter.writeUInt32(byteBuffer, c);
if (name != null) {
byteBuffer.put(Utf8.convert(name));
}
if (zeroTerm) {
byteBuffer.put((byte) 0);
}
}
public String toString() {
return "HandlerBox[handlerType=" + getHandlerType() + ";name=" + getName() + "]";
}
}