summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java
diff options
context:
space:
mode:
Diffstat (limited to 'isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java')
-rw-r--r--isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java213
1 files changed, 213 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java b/isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java
new file mode 100644
index 0000000..407e79f
--- /dev/null
+++ b/isoparser/src/main/java/com/coremedia/iso/boxes/sampleentry/VisualSampleEntry.java
@@ -0,0 +1,213 @@
+/*
+ * 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.sampleentry;
+
+import com.coremedia.iso.IsoTypeReader;
+import com.coremedia.iso.IsoTypeWriter;
+import com.coremedia.iso.Utf8;
+import com.coremedia.iso.boxes.Box;
+import com.coremedia.iso.boxes.ContainerBox;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Contains information common to all visual tracks.
+ * <code>
+ * <pre>
+ * class VisualSampleEntry(codingname) extends SampleEntry (codingname){
+ * unsigned int(16) pre_defined = 0;
+ * const unsigned int(16) reserved = 0;
+ * unsigned int(32)[3] pre_defined = 0;
+ * unsigned int(16) width;
+ * unsigned int(16) height;
+ * template unsigned int(32) horizresolution = 0x00480000; // 72 dpi
+ * template unsigned int(32) vertresolution = 0x00480000; // 72 dpi
+ * const unsigned int(32) reserved = 0;
+ * template unsigned int(16) frame_count = 1;
+ * string[32] compressorname;
+ * template unsigned int(16) depth = 0x0018;
+ * int(16) pre_defined = -1;
+ * }<br>
+ * </pre>
+ * </code>
+ * <p/>
+ * Format-specific informationis appened as boxes after the data described in ISO/IEC 14496-12 chapter 8.16.2.
+ */
+public class VisualSampleEntry extends SampleEntry implements ContainerBox {
+ public static final String TYPE1 = "mp4v";
+ public static final String TYPE2 = "s263";
+ public static final String TYPE3 = "avc1";
+
+
+ /**
+ * Identifier for an encrypted video track.
+ *
+ * @see com.coremedia.iso.boxes.ProtectionSchemeInformationBox
+ */
+ public static final String TYPE_ENCRYPTED = "encv";
+
+
+ private int width;
+ private int height;
+ private double horizresolution = 72;
+ private double vertresolution = 72;
+ private int frameCount = 1;
+ private String compressorname;
+ private int depth = 24;
+
+ private long[] predefined = new long[3];
+
+ public VisualSampleEntry(String type) {
+ super(type);
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public double getHorizresolution() {
+ return horizresolution;
+ }
+
+ public double getVertresolution() {
+ return vertresolution;
+ }
+
+ public int getFrameCount() {
+ return frameCount;
+ }
+
+ public String getCompressorname() {
+ return compressorname;
+ }
+
+ public int getDepth() {
+ return depth;
+ }
+
+ public void setCompressorname(String compressorname) {
+ this.compressorname = compressorname;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ public void setHorizresolution(double horizresolution) {
+ this.horizresolution = horizresolution;
+ }
+
+ public void setVertresolution(double vertresolution) {
+ this.vertresolution = vertresolution;
+ }
+
+ public void setFrameCount(int frameCount) {
+ this.frameCount = frameCount;
+ }
+
+ public void setDepth(int depth) {
+ this.depth = depth;
+ }
+
+ @Override
+ public void _parseDetails(ByteBuffer content) {
+ _parseReservedAndDataReferenceIndex(content);
+ long tmp = IsoTypeReader.readUInt16(content);
+ assert 0 == tmp : "reserved byte not 0";
+ tmp = IsoTypeReader.readUInt16(content);
+ assert 0 == tmp : "reserved byte not 0";
+ predefined[0] = IsoTypeReader.readUInt32(content); // should be zero
+ predefined[1] = IsoTypeReader.readUInt32(content); // should be zero
+ predefined[2] = IsoTypeReader.readUInt32(content); // should be zero
+ width = IsoTypeReader.readUInt16(content);
+ height = IsoTypeReader.readUInt16(content);
+ horizresolution = IsoTypeReader.readFixedPoint1616(content);
+ vertresolution = IsoTypeReader.readFixedPoint1616(content);
+ tmp = IsoTypeReader.readUInt32(content);
+ assert 0 == tmp : "reserved byte not 0";
+ frameCount = IsoTypeReader.readUInt16(content);
+ int compressornameDisplayAbleData = IsoTypeReader.readUInt8(content);
+ if (compressornameDisplayAbleData > 31) {
+ System.out.println("invalid compressor name displayable data: " + compressornameDisplayAbleData);
+ compressornameDisplayAbleData = 31;
+ }
+ byte[] bytes = new byte[compressornameDisplayAbleData];
+ content.get(bytes);
+ compressorname = Utf8.convert(bytes);
+ if (compressornameDisplayAbleData < 31) {
+ byte[] zeros = new byte[31 - compressornameDisplayAbleData];
+ content.get(zeros);
+ //assert Arrays.equals(zeros, new byte[zeros.length]) : "The compressor name length was not filled up with zeros";
+ }
+ depth = IsoTypeReader.readUInt16(content);
+ tmp = IsoTypeReader.readUInt16(content);
+ assert 0xFFFF == tmp;
+
+ _parseChildBoxes(content);
+
+ }
+
+
+ protected long getContentSize() {
+ long contentSize = 78;
+ for (Box boxe : boxes) {
+ contentSize += boxe.getSize();
+ }
+ return contentSize;
+ }
+
+ @Override
+ protected void getContent(ByteBuffer byteBuffer) {
+ _writeReservedAndDataReferenceIndex(byteBuffer);
+ IsoTypeWriter.writeUInt16(byteBuffer, 0);
+ IsoTypeWriter.writeUInt16(byteBuffer, 0);
+ IsoTypeWriter.writeUInt32(byteBuffer, predefined[0]);
+ IsoTypeWriter.writeUInt32(byteBuffer, predefined[1]);
+ IsoTypeWriter.writeUInt32(byteBuffer, predefined[2]);
+
+ IsoTypeWriter.writeUInt16(byteBuffer, getWidth());
+ IsoTypeWriter.writeUInt16(byteBuffer, getHeight());
+
+ IsoTypeWriter.writeFixedPont1616(byteBuffer, getHorizresolution());
+ IsoTypeWriter.writeFixedPont1616(byteBuffer, getVertresolution());
+
+
+ IsoTypeWriter.writeUInt32(byteBuffer, 0);
+ IsoTypeWriter.writeUInt16(byteBuffer, getFrameCount());
+ IsoTypeWriter.writeUInt8(byteBuffer, Utf8.utf8StringLengthInBytes(getCompressorname()));
+ byteBuffer.put(Utf8.convert(getCompressorname()));
+ int a = Utf8.utf8StringLengthInBytes(getCompressorname());
+ while (a < 31) {
+ a++;
+ byteBuffer.put((byte) 0);
+ }
+ IsoTypeWriter.writeUInt16(byteBuffer, getDepth());
+ IsoTypeWriter.writeUInt16(byteBuffer, 0xFFFF);
+
+ _writeChildBoxes(byteBuffer);
+
+ }
+
+}