• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.googlecode.mp4parser.boxes.piff;
2 
3 import com.coremedia.iso.IsoTypeReader;
4 import com.coremedia.iso.IsoTypeWriter;
5 import com.googlecode.mp4parser.AbstractFullBox;
6 
7 import java.nio.ByteBuffer;
8 import java.util.ArrayList;
9 import java.util.List;
10 
11 /**
12  * The syntax of the fields defined in this section, specified in ABNF [RFC5234], is as follows:
13  * TfrfBox = TfrfBoxLength TfrfBoxType [TfrfBoxLongLength] TfrfBoxUUID TfrfBoxFields
14  * TfrfBoxChildren
15  * TfrfBoxType = "u" "u" "i" "d"
16  * TfrfBoxLength = BoxLength
17  * TfrfBoxLongLength = LongBoxLength
18  * TfrfBoxUUID = %xD4 %x80 %x7E %xF2 %xCA %x39 %x46 %x95
19  * %x8E %x54 %x26 %xCB %x9E %x46 %xA7 %x9F
20  * TfrfBoxFields = TfrfBoxVersion
21  * TfrfBoxFlags
22  * FragmentCount
23  * (1* TfrfBoxDataFields32) / (1* TfrfBoxDataFields64)
24  * TfrfBoxVersion = %x00 / %x01
25  * TfrfBoxFlags = 24*24 RESERVED_BIT
26  * FragmentCount = UINT8
27  * TfrfBoxDataFields32 = FragmentAbsoluteTime32
28  * FragmentDuration32
29  * TfrfBoxDataFields64 = FragmentAbsoluteTime64
30  * FragmentDuration64
31  * FragmentAbsoluteTime64 = UNSIGNED_INT32
32  * FragmentDuration64 = UNSIGNED_INT32
33  * FragmentAbsoluteTime64 = UNSIGNED_INT64
34  * FragmentDuration64 = UNSIGNED_INT64
35  * TfrfBoxChildren = *( VendorExtensionUUIDBox )
36  */
37 public class TfrfBox extends AbstractFullBox {
38     public List<Entry> entries = new ArrayList<Entry>();
39 
TfrfBox()40     public TfrfBox() {
41         super("uuid");
42     }
43 
44     @Override
getUserType()45     public byte[] getUserType() {
46         return new byte[]{(byte) 0xd4, (byte) 0x80, (byte) 0x7e, (byte) 0xf2, (byte) 0xca, (byte) 0x39, (byte) 0x46,
47                 (byte) 0x95, (byte) 0x8e, (byte) 0x54, 0x26, (byte) 0xcb, (byte) 0x9e, (byte) 0x46, (byte) 0xa7, (byte) 0x9f};
48     }
49 
50     @Override
getContentSize()51     protected long getContentSize() {
52         return 5 + entries.size() * (getVersion() == 0x01 ? 16 : 8);
53     }
54 
55     @Override
getContent(ByteBuffer byteBuffer)56     protected void getContent(ByteBuffer byteBuffer) {
57         writeVersionAndFlags(byteBuffer);
58         IsoTypeWriter.writeUInt8(byteBuffer, entries.size());
59 
60         for (Entry entry : entries) {
61             if (getVersion() == 0x01) {
62                 IsoTypeWriter.writeUInt64(byteBuffer, entry.fragmentAbsoluteTime);
63                 IsoTypeWriter.writeUInt64(byteBuffer, entry.fragmentAbsoluteDuration);
64             } else {
65                 IsoTypeWriter.writeUInt32(byteBuffer, entry.fragmentAbsoluteTime);
66                 IsoTypeWriter.writeUInt32(byteBuffer, entry.fragmentAbsoluteDuration);
67             }
68         }
69     }
70 
71     @Override
_parseDetails(ByteBuffer content)72     public void _parseDetails(ByteBuffer content) {
73         parseVersionAndFlags(content);
74         int fragmentCount = IsoTypeReader.readUInt8(content);
75 
76         for (int i = 0; i < fragmentCount; i++) {
77             Entry entry = new Entry();
78             if (getVersion() == 0x01) {
79                 entry.fragmentAbsoluteTime = IsoTypeReader.readUInt64(content);
80                 entry.fragmentAbsoluteDuration = IsoTypeReader.readUInt64(content);
81             } else {
82                 entry.fragmentAbsoluteTime = IsoTypeReader.readUInt32(content);
83                 entry.fragmentAbsoluteDuration = IsoTypeReader.readUInt32(content);
84             }
85             entries.add(entry);
86         }
87     }
88 
89 
getFragmentCount()90     public long getFragmentCount() {
91         return entries.size();
92     }
93 
getEntries()94     public List<Entry> getEntries() {
95         return entries;
96     }
97 
98     @Override
toString()99     public String toString() {
100         final StringBuilder sb = new StringBuilder();
101         sb.append("TfrfBox");
102         sb.append("{entries=").append(entries);
103         sb.append('}');
104         return sb.toString();
105     }
106 
107     public class Entry {
108         long fragmentAbsoluteTime;
109         long fragmentAbsoluteDuration;
110 
getFragmentAbsoluteTime()111         public long getFragmentAbsoluteTime() {
112             return fragmentAbsoluteTime;
113         }
114 
getFragmentAbsoluteDuration()115         public long getFragmentAbsoluteDuration() {
116             return fragmentAbsoluteDuration;
117         }
118 
119         @Override
toString()120         public String toString() {
121             final StringBuilder sb = new StringBuilder();
122             sb.append("Entry");
123             sb.append("{fragmentAbsoluteTime=").append(fragmentAbsoluteTime);
124             sb.append(", fragmentAbsoluteDuration=").append(fragmentAbsoluteDuration);
125             sb.append('}');
126             return sb.toString();
127         }
128     }
129 }
130