summaryrefslogtreecommitdiff
path: root/isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java
diff options
context:
space:
mode:
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java')
-rw-r--r--isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java129
1 files changed, 129 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java
new file mode 100644
index 0000000..1e862e9
--- /dev/null
+++ b/isoparser/src/main/java/com/googlecode/mp4parser/boxes/piff/TfrfBox.java
@@ -0,0 +1,129 @@
+package com.googlecode.mp4parser.boxes.piff;
+
+import com.coremedia.iso.IsoTypeReader;
+import com.coremedia.iso.IsoTypeWriter;
+import com.googlecode.mp4parser.AbstractFullBox;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The syntax of the fields defined in this section, specified in ABNF [RFC5234], is as follows:
+ * TfrfBox = TfrfBoxLength TfrfBoxType [TfrfBoxLongLength] TfrfBoxUUID TfrfBoxFields
+ * TfrfBoxChildren
+ * TfrfBoxType = "u" "u" "i" "d"
+ * TfrfBoxLength = BoxLength
+ * TfrfBoxLongLength = LongBoxLength
+ * TfrfBoxUUID = %xD4 %x80 %x7E %xF2 %xCA %x39 %x46 %x95
+ * %x8E %x54 %x26 %xCB %x9E %x46 %xA7 %x9F
+ * TfrfBoxFields = TfrfBoxVersion
+ * TfrfBoxFlags
+ * FragmentCount
+ * (1* TfrfBoxDataFields32) / (1* TfrfBoxDataFields64)
+ * TfrfBoxVersion = %x00 / %x01
+ * TfrfBoxFlags = 24*24 RESERVED_BIT
+ * FragmentCount = UINT8
+ * TfrfBoxDataFields32 = FragmentAbsoluteTime32
+ * FragmentDuration32
+ * TfrfBoxDataFields64 = FragmentAbsoluteTime64
+ * FragmentDuration64
+ * FragmentAbsoluteTime64 = UNSIGNED_INT32
+ * FragmentDuration64 = UNSIGNED_INT32
+ * FragmentAbsoluteTime64 = UNSIGNED_INT64
+ * FragmentDuration64 = UNSIGNED_INT64
+ * TfrfBoxChildren = *( VendorExtensionUUIDBox )
+ */
+public class TfrfBox extends AbstractFullBox {
+ public List<Entry> entries = new ArrayList<Entry>();
+
+ public TfrfBox() {
+ super("uuid");
+ }
+
+ @Override
+ public byte[] getUserType() {
+ return new byte[]{(byte) 0xd4, (byte) 0x80, (byte) 0x7e, (byte) 0xf2, (byte) 0xca, (byte) 0x39, (byte) 0x46,
+ (byte) 0x95, (byte) 0x8e, (byte) 0x54, 0x26, (byte) 0xcb, (byte) 0x9e, (byte) 0x46, (byte) 0xa7, (byte) 0x9f};
+ }
+
+ @Override
+ protected long getContentSize() {
+ return 5 + entries.size() * (getVersion() == 0x01 ? 16 : 8);
+ }
+
+ @Override
+ protected void getContent(ByteBuffer byteBuffer) {
+ writeVersionAndFlags(byteBuffer);
+ IsoTypeWriter.writeUInt8(byteBuffer, entries.size());
+
+ for (Entry entry : entries) {
+ if (getVersion() == 0x01) {
+ IsoTypeWriter.writeUInt64(byteBuffer, entry.fragmentAbsoluteTime);
+ IsoTypeWriter.writeUInt64(byteBuffer, entry.fragmentAbsoluteDuration);
+ } else {
+ IsoTypeWriter.writeUInt32(byteBuffer, entry.fragmentAbsoluteTime);
+ IsoTypeWriter.writeUInt32(byteBuffer, entry.fragmentAbsoluteDuration);
+ }
+ }
+ }
+
+ @Override
+ public void _parseDetails(ByteBuffer content) {
+ parseVersionAndFlags(content);
+ int fragmentCount = IsoTypeReader.readUInt8(content);
+
+ for (int i = 0; i < fragmentCount; i++) {
+ Entry entry = new Entry();
+ if (getVersion() == 0x01) {
+ entry.fragmentAbsoluteTime = IsoTypeReader.readUInt64(content);
+ entry.fragmentAbsoluteDuration = IsoTypeReader.readUInt64(content);
+ } else {
+ entry.fragmentAbsoluteTime = IsoTypeReader.readUInt32(content);
+ entry.fragmentAbsoluteDuration = IsoTypeReader.readUInt32(content);
+ }
+ entries.add(entry);
+ }
+ }
+
+
+ public long getFragmentCount() {
+ return entries.size();
+ }
+
+ public List<Entry> getEntries() {
+ return entries;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("TfrfBox");
+ sb.append("{entries=").append(entries);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public class Entry {
+ long fragmentAbsoluteTime;
+ long fragmentAbsoluteDuration;
+
+ public long getFragmentAbsoluteTime() {
+ return fragmentAbsoluteTime;
+ }
+
+ public long getFragmentAbsoluteDuration() {
+ return fragmentAbsoluteDuration;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Entry");
+ sb.append("{fragmentAbsoluteTime=").append(fragmentAbsoluteTime);
+ sb.append(", fragmentAbsoluteDuration=").append(fragmentAbsoluteDuration);
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+}