summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java
diff options
context:
space:
mode:
Diffstat (limited to 'isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java')
-rw-r--r--isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java151
1 files changed, 151 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java b/isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java
new file mode 100644
index 0000000..01dcaca
--- /dev/null
+++ b/isoparser/src/main/java/com/coremedia/iso/boxes/HandlerBox.java
@@ -0,0 +1,151 @@
+/*
+ * 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() + "]";
+ }
+}