summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java
diff options
context:
space:
mode:
Diffstat (limited to 'isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java')
-rw-r--r--isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java294
1 files changed, 294 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java b/isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java
new file mode 100644
index 0000000..94d24ae
--- /dev/null
+++ b/isoparser/src/main/java/com/coremedia/iso/boxes/fragment/TrackFragmentRandomAccessBox.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2009 castLabs GmbH, Berlin
+ *
+ * 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.fragment;
+
+import com.coremedia.iso.IsoTypeReader;
+import com.coremedia.iso.IsoTypeReaderVariable;
+import com.coremedia.iso.IsoTypeWriter;
+import com.coremedia.iso.IsoTypeWriterVariable;
+import com.googlecode.mp4parser.AbstractFullBox;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * aligned(8) class TrackFragmentRandomAccessBox
+ * extends FullBox('tfra', version, 0) {
+ * unsigned int(32) track_ID;
+ * const unsigned int(26) reserved = 0;
+ * unsigned int(2) length_size_of_traf_num;
+ * unsigned int(2) length_size_of_trun_num;
+ * unsigned int(2) length_size_of_sample_num;
+ * unsigned int(32) number_of_entry;
+ * for(i=1; i <= number_of_entry; i++){
+ * if(version==1){
+ * unsigned int(64) time;
+ * unsigned int(64) moof_offset;
+ * }else{
+ * unsigned int(32) time;
+ * unsigned int(32) moof_offset;
+ * }
+ * unsigned int((length_size_of_traf_num+1) * 8) traf_number;
+ * unsigned int((length_size_of_trun_num+1) * 8) trun_number;
+ * unsigned int((length_size_of_sample_num+1) * 8) sample_number;
+ * }
+ * }
+ */
+public class TrackFragmentRandomAccessBox extends AbstractFullBox {
+ public static final String TYPE = "tfra";
+
+ private long trackId;
+ private int reserved;
+ private int lengthSizeOfTrafNum = 2;
+ private int lengthSizeOfTrunNum = 2;
+ private int lengthSizeOfSampleNum = 2;
+ private List<Entry> entries = Collections.emptyList();
+
+ public TrackFragmentRandomAccessBox() {
+ super(TYPE);
+ }
+
+
+ protected long getContentSize() {
+ long contentSize = 4;
+ contentSize += 4 + 4 /*26 + 2 + 2 + 2 */ + 4;
+ if (getVersion() == 1) {
+ contentSize += (8 + 8) * entries.size();
+ } else {
+ contentSize += (4 + 4) * entries.size();
+ }
+ contentSize += lengthSizeOfTrafNum * entries.size();
+ contentSize += lengthSizeOfTrunNum * entries.size();
+ contentSize += lengthSizeOfSampleNum * entries.size();
+ return contentSize;
+ }
+
+
+ @Override
+ public void _parseDetails(ByteBuffer content) {
+ parseVersionAndFlags(content);
+ trackId = IsoTypeReader.readUInt32(content);
+ long temp = IsoTypeReader.readUInt32(content);
+ reserved = (int) (temp >> 6);
+ lengthSizeOfTrafNum = ((int) (temp & 0x3F) >> 4) + 1;
+ lengthSizeOfTrunNum = ((int) (temp & 0xC) >> 2) + 1;
+ lengthSizeOfSampleNum = ((int) (temp & 0x3)) + 1;
+ long numberOfEntries = IsoTypeReader.readUInt32(content);
+
+ entries = new ArrayList<Entry>();
+
+ for (int i = 0; i < numberOfEntries; i++) {
+ Entry entry = new Entry();
+ if (getVersion() == 1) {
+ entry.time = IsoTypeReader.readUInt64(content);
+ entry.moofOffset = IsoTypeReader.readUInt64(content);
+ } else {
+ entry.time = IsoTypeReader.readUInt32(content);
+ entry.moofOffset = IsoTypeReader.readUInt32(content);
+ }
+ entry.trafNumber = IsoTypeReaderVariable.read(content, lengthSizeOfTrafNum);
+ entry.trunNumber = IsoTypeReaderVariable.read(content, lengthSizeOfTrunNum);
+ entry.sampleNumber = IsoTypeReaderVariable.read(content, lengthSizeOfSampleNum);
+
+ entries.add(entry);
+ }
+
+ }
+
+
+ @Override
+ protected void getContent(ByteBuffer byteBuffer) {
+ writeVersionAndFlags(byteBuffer);
+ IsoTypeWriter.writeUInt32(byteBuffer, trackId);
+ long temp;
+ temp = reserved << 6;
+ temp = temp | (((lengthSizeOfTrafNum - 1) & 0x3) << 4);
+ temp = temp | (((lengthSizeOfTrunNum - 1) & 0x3) << 2);
+ temp = temp | ((lengthSizeOfSampleNum - 1) & 0x3);
+ IsoTypeWriter.writeUInt32(byteBuffer, temp);
+ IsoTypeWriter.writeUInt32(byteBuffer, entries.size());
+
+ for (Entry entry : entries) {
+ if (getVersion() == 1) {
+ IsoTypeWriter.writeUInt64(byteBuffer, entry.time);
+ IsoTypeWriter.writeUInt64(byteBuffer, entry.moofOffset);
+ } else {
+ IsoTypeWriter.writeUInt32(byteBuffer, entry.time);
+ IsoTypeWriter.writeUInt32(byteBuffer, entry.moofOffset);
+ }
+ IsoTypeWriterVariable.write(entry.trafNumber, byteBuffer, lengthSizeOfTrafNum);
+ IsoTypeWriterVariable.write(entry.trunNumber, byteBuffer, lengthSizeOfTrunNum);
+ IsoTypeWriterVariable.write(entry.sampleNumber, byteBuffer, lengthSizeOfSampleNum);
+
+ }
+ }
+
+
+ public void setTrackId(long trackId) {
+ this.trackId = trackId;
+ }
+
+ public void setLengthSizeOfTrafNum(int lengthSizeOfTrafNum) {
+ this.lengthSizeOfTrafNum = lengthSizeOfTrafNum;
+ }
+
+ public void setLengthSizeOfTrunNum(int lengthSizeOfTrunNum) {
+ this.lengthSizeOfTrunNum = lengthSizeOfTrunNum;
+ }
+
+ public void setLengthSizeOfSampleNum(int lengthSizeOfSampleNum) {
+ this.lengthSizeOfSampleNum = lengthSizeOfSampleNum;
+ }
+
+ public long getTrackId() {
+ return trackId;
+ }
+
+ public int getReserved() {
+ return reserved;
+ }
+
+ public int getLengthSizeOfTrafNum() {
+ return lengthSizeOfTrafNum;
+ }
+
+ public int getLengthSizeOfTrunNum() {
+ return lengthSizeOfTrunNum;
+ }
+
+ public int getLengthSizeOfSampleNum() {
+ return lengthSizeOfSampleNum;
+ }
+
+ public long getNumberOfEntries() {
+ return entries.size();
+ }
+
+ public List<Entry> getEntries() {
+ return Collections.unmodifiableList(entries);
+ }
+
+ public void setEntries(List<Entry> entries) {
+ this.entries = entries;
+ }
+
+ public static class Entry {
+ private long time;
+ private long moofOffset;
+ private long trafNumber;
+ private long trunNumber;
+ private long sampleNumber;
+
+ public Entry() {
+ }
+
+ public Entry(long time, long moofOffset, long trafNumber, long trunNumber, long sampleNumber) {
+ this.moofOffset = moofOffset;
+ this.sampleNumber = sampleNumber;
+ this.time = time;
+ this.trafNumber = trafNumber;
+ this.trunNumber = trunNumber;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ public long getMoofOffset() {
+ return moofOffset;
+ }
+
+ public long getTrafNumber() {
+ return trafNumber;
+ }
+
+ public long getTrunNumber() {
+ return trunNumber;
+ }
+
+ public long getSampleNumber() {
+ return sampleNumber;
+ }
+
+ public void setTime(long time) {
+ this.time = time;
+ }
+
+ public void setMoofOffset(long moofOffset) {
+ this.moofOffset = moofOffset;
+ }
+
+ public void setTrafNumber(long trafNumber) {
+ this.trafNumber = trafNumber;
+ }
+
+ public void setTrunNumber(long trunNumber) {
+ this.trunNumber = trunNumber;
+ }
+
+ public void setSampleNumber(long sampleNumber) {
+ this.sampleNumber = sampleNumber;
+ }
+
+ @Override
+ public String toString() {
+ return "Entry{" +
+ "time=" + time +
+ ", moofOffset=" + moofOffset +
+ ", trafNumber=" + trafNumber +
+ ", trunNumber=" + trunNumber +
+ ", sampleNumber=" + sampleNumber +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Entry entry = (Entry) o;
+
+ if (moofOffset != entry.moofOffset) return false;
+ if (sampleNumber != entry.sampleNumber) return false;
+ if (time != entry.time) return false;
+ if (trafNumber != entry.trafNumber) return false;
+ if (trunNumber != entry.trunNumber) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (int) (time ^ (time >>> 32));
+ result = 31 * result + (int) (moofOffset ^ (moofOffset >>> 32));
+ result = 31 * result + (int) (trafNumber ^ (trafNumber >>> 32));
+ result = 31 * result + (int) (trunNumber ^ (trunNumber >>> 32));
+ result = 31 * result + (int) (sampleNumber ^ (sampleNumber >>> 32));
+ return result;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "TrackFragmentRandomAccessBox{" +
+ "trackId=" + trackId +
+ ", entries=" + entries +
+ '}';
+ }
+}