/** * Creates a 'tfra' - track fragment random access box for the given track with the isoFile. * The tfra contains a map of random access points with time as key and offset within the isofile * as value. * * @param track the concerned track * @return a track fragment random access box. */ protected Box createTfra(StreamingTrack track) { TrackFragmentRandomAccessBox tfra = new TrackFragmentRandomAccessBox(); tfra.setVersion(1); // use long offsets and times long[] offsets = tfraOffsets.get(track); long[] times = tfraTimes.get(track); List<TrackFragmentRandomAccessBox.Entry> entries = new ArrayList<TrackFragmentRandomAccessBox.Entry>(times.length); for (int i = 0; i < times.length; i++) { entries.add(new TrackFragmentRandomAccessBox.Entry(times[i], offsets[i], 1, 1, 1)); } tfra.setEntries(entries); tfra.setTrackId(track.getTrackExtension(TrackIdTrackExtension.class).getTrackId()); return tfra; }
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 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); } }
@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); } }
@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); } }
TrackFragmentRandomAccessBox tfra = new TrackFragmentRandomAccessBox(); tfra.setVersion(1); // use long offsets and times List<TrackFragmentRandomAccessBox.Entry> offset2timeEntries = new LinkedList<TrackFragmentRandomAccessBox.Entry>(); tfra.setEntries(offset2timeEntries); tfra.setTrackId(track.getTrackMetaData().getTrackId()); return tfra;
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; }
TrackFragmentRandomAccessBox tfra = new TrackFragmentRandomAccessBox(); tfra.setVersion(1); // use long offsets and times List<TrackFragmentRandomAccessBox.Entry> offset2timeEntries = new LinkedList<TrackFragmentRandomAccessBox.Entry>(); tfra.setEntries(offset2timeEntries); tfra.setTrackId(track.getTrackMetaData().getTrackId()); return tfra;