/* * 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() + "]"; } }