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(); | |
} | |
} | |
} |