From 9d25d8b99b190a329d7b3649ab15d11c3a6bd9c4 Mon Sep 17 00:00:00 2001 From: boby Date: Wed, 9 Jun 2021 22:31:40 +0900 Subject: [PATCH] Added "prft" and "ssix" box supported in "iso6" brand --- .../part12/ProducerReferenceTimeBox.java | 87 +++++++++++++ .../iso14496/part12/SubsegmentIndexBox.java | 119 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/ProducerReferenceTimeBox.java create mode 100644 isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/SubsegmentIndexBox.java diff --git a/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/ProducerReferenceTimeBox.java b/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/ProducerReferenceTimeBox.java new file mode 100644 index 000000000..baa4926f4 --- /dev/null +++ b/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/ProducerReferenceTimeBox.java @@ -0,0 +1,87 @@ +/* + * Copyright 2021 glboby27@gmail.com + * + * 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 org.mp4parser.boxes.iso14496.part12; + +import org.mp4parser.support.AbstractFullBox; +import org.mp4parser.tools.IsoTypeReader; +import org.mp4parser.tools.IsoTypeWriter; + +import java.nio.ByteBuffer; + +/** + *

4cc = "{@value #TYPE}"

+ *
+ * aligned(8) class ProducerReferenceTimeBox extends FullBox(‘prft’, version, 0) {
+ *  unsigned int(32) reference_track_ID;
+ *  unsigned int(64) ntp_timestamp;
+ *  if (version==0) {
+ *   unsigned int(32)  media_time;
+ *  } else {
+ *   unsigned int(64)  media_time;
+ *  }
+ * }
+ * 
+ */ +public class ProducerReferenceTimeBox extends AbstractFullBox { + public static final String TYPE = "prft"; + private long referenceTrackId; + private long ntpTimestamp; + private long mediaTime; + + public ProducerReferenceTimeBox() { super(TYPE); } + + public long getReferenceTrackId() { return referenceTrackId; } + + public void setReferenceTrackId(long referenceTrackId) { this.referenceTrackId = referenceTrackId; } + + public long getNtpTimestamp() { return ntpTimestamp; } + + public void setNtpTimestamp(long ntpTimestamp) { this.ntpTimestamp = ntpTimestamp; } + + public long getMediaTime() { return mediaTime; } + + public void setMediaTime(long mediaTime) { this.mediaTime = mediaTime; } + + @Override + protected long getContentSize() { + return getVersion() == 0 ? 16 : 20; + } + + @Override + public void _parseDetails(ByteBuffer content) { + parseVersionAndFlags(content); + setReferenceTrackId(IsoTypeReader.readUInt32(content)); + setNtpTimestamp(IsoTypeReader.readUInt64(content)); + if (getVersion() == 0) { + setMediaTime(IsoTypeReader.readUInt32(content)); + } else { + setMediaTime(IsoTypeReader.readUInt64(content)); + } + } + + @Override + protected void getContent(ByteBuffer byteBuffer) { + writeVersionAndFlags(byteBuffer); + IsoTypeWriter.writeUInt32(byteBuffer, getReferenceTrackId()); + IsoTypeWriter.writeUInt64(byteBuffer, getNtpTimestamp()); + if (getVersion() == 0) { + IsoTypeWriter.writeUInt32(byteBuffer, getMediaTime()); + } else { + IsoTypeWriter.writeUInt64(byteBuffer, getMediaTime()); + } + } +} \ No newline at end of file diff --git a/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/SubsegmentIndexBox.java b/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/SubsegmentIndexBox.java new file mode 100644 index 000000000..4b2a1c991 --- /dev/null +++ b/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part12/SubsegmentIndexBox.java @@ -0,0 +1,119 @@ +/* + * Copyright 2021 glboby27@gmail.com + * + * 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 org.mp4parser.boxes.iso14496.part12; + +import org.mp4parser.support.AbstractFullBox; +import org.mp4parser.tools.IsoTypeReader; +import org.mp4parser.tools.IsoTypeWriter; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + *

4cc = "{@value #TYPE}"

+ *
+ * aligned(8) class SubsegmentIndexBox extends FullBox(‘ssix’, 0, 0) {
+ *  unsigned int(32) subsegment_count;
+ *  for( i=1; i <= subsegment_count; i++)
+ *  {
+ *   unsigned int(32)  ranges_count;
+ *   for ( j=1; j <= range_count; j++) {
+ *    unsigned int(8) level;
+ *    unsigned int(24) range_size;
+ *   }
+ *  }
+ * }
+ * 
+ */ +public class SubsegmentIndexBox extends AbstractFullBox { + public static final String TYPE = "ssix"; + private long subsegmentCount; + final private List subSegEntries = new ArrayList<>(); + + public SubsegmentIndexBox() { super(TYPE); } + + public long getSubsegmentCount() { return subsegmentCount; } + + public void setSubsegmentCount(long subsegmentCount) { this.subsegmentCount = subsegmentCount; } + + public List getSubSegEntries() { return subSegEntries; } + + @Override + protected long getContentSize() { + long size = 4; + for (SubSegmentEntry subSegEntry : subSegEntries) { + size += 4; + size += (subSegEntry.rangeEntries.size() * (long)(1 + 3)); + } + return size; + } + + @Override + public void _parseDetails(ByteBuffer content) { + parseVersionAndFlags(content); + setSubsegmentCount(IsoTypeReader.readUInt32(content)); + for (int i = 0; i < getSubsegmentCount(); i++) { + SubSegmentEntry subSegmentEntry = new SubSegmentEntry(); + subSegmentEntry.setRangesCount(IsoTypeReader.readUInt32(content)); + for (int j = 0; j < subSegmentEntry.getRangesCount(); j++) { + SubSegmentEntry.RangeEntry rangeEntry = new SubSegmentEntry.RangeEntry(); + rangeEntry.setLevel(IsoTypeReader.readUInt8(content)); + rangeEntry.setRangeSize(IsoTypeReader.readUInt24(content)); + subSegmentEntry.getRangeEntries().add(rangeEntry); + } + getSubSegEntries().add(subSegmentEntry); + } + } + + @Override + protected void getContent(ByteBuffer byteBuffer) { + writeVersionAndFlags(byteBuffer); + IsoTypeWriter.writeUInt32(byteBuffer, getSubsegmentCount()); + for (SubSegmentEntry subSegmentEntry : getSubSegEntries()) { + IsoTypeWriter.writeUInt32(byteBuffer, subSegmentEntry.getRangesCount()); + for (SubSegmentEntry.RangeEntry rangeEntry : subSegmentEntry.getRangeEntries()) { + IsoTypeWriter.writeUInt8(byteBuffer, rangeEntry.getLevel()); + IsoTypeWriter.writeUInt24(byteBuffer, rangeEntry.getRangeSize()); + } + } + } + + public static class SubSegmentEntry { + private long rangesCount; + final private List rangeEntries = new ArrayList<>(); + + public long getRangesCount() { return rangesCount; } + + public void setRangesCount(long rangesCount) { this.rangesCount = rangesCount; } + + public List getRangeEntries() { return rangeEntries; } + + public static class RangeEntry { + private int level; + private int rangeSize; + + public int getLevel() { return level; } + + public void setLevel(int level) { this.level = level; } + + public int getRangeSize() { return rangeSize; } + + public void setRangeSize(int rangeSize) { this.rangeSize = rangeSize; } + } + } +}