package com.coremedia.iso.boxes; 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; /** * aligned(8) class SampleToGroupBox * extends FullBox('sbgp', version = 0, 0) * { * unsigned int(32) grouping_type; * unsigned int(32) entry_count; * for (i=1; i <= entry_count; i++) * { * unsigned int(32) sample_count; * unsigned int(32) group_description_index; * } * } */ public class SampleToGroupBox extends AbstractFullBox { public static final String TYPE = "sbgp"; private long groupingType; private long entryCount; private long groupingTypeParameter; private List<Entry> entries = new ArrayList<Entry>(); public SampleToGroupBox() { super(TYPE); } @Override protected long getContentSize() { return 12 + entryCount * 8; } public long getGroupingTypeParameter() { return groupingTypeParameter; } /** * Usage of this parameter requires version == 1. The version must be set manually. */ public void setGroupingTypeParameter(long groupingTypeParameter) { this.groupingTypeParameter = groupingTypeParameter; } public List<Entry> getEntries() { return entries; } public void setEntries(List<Entry> entries) { this.entries = entries; } public long getGroupingType() { return groupingType; } public void setGroupingType(long groupingType) { this.groupingType = groupingType; } @Override public void _parseDetails(ByteBuffer content) { parseVersionAndFlags(content); groupingType = IsoTypeReader.readUInt32(content); if (getVersion() == 1) { groupingTypeParameter = IsoTypeReader.readUInt32(content); } else { groupingTypeParameter = -1; } entryCount = IsoTypeReader.readUInt32(content); for (int i = 0; i < entryCount; i++) { Entry entry = new Entry(); entry.setSampleCount(IsoTypeReader.readUInt32(content)); entry.setGroupDescriptionIndex(IsoTypeReader.readUInt32(content)); entries.add(entry); } } @Override protected void getContent(ByteBuffer byteBuffer) { writeVersionAndFlags(byteBuffer); IsoTypeWriter.writeUInt32(byteBuffer, groupingType); if (getVersion() == 1) { IsoTypeWriter.writeUInt32(byteBuffer, groupingTypeParameter); } IsoTypeWriter.writeUInt32(byteBuffer, entryCount); for (Entry entry : entries) { IsoTypeWriter.writeUInt32(byteBuffer, entry.getSampleCount()); IsoTypeWriter.writeUInt32(byteBuffer, entry.getGroupDescriptionIndex()); } } public static class Entry { private long sampleCount; private long groupDescriptionIndex; public long getSampleCount() { return sampleCount; } public void setSampleCount(long sampleCount) { this.sampleCount = sampleCount; } public long getGroupDescriptionIndex() { return groupDescriptionIndex; } public void setGroupDescriptionIndex(long groupDescriptionIndex) { this.groupDescriptionIndex = groupDescriptionIndex; } } }