/* * Copyright (C) 2011 in-somnia * * This file is part of JAAD. * * JAAD is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * JAAD is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General * Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. * If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.jaad.mp4.boxes.impl; import java.io.IOException; import net.sourceforge.jaad.mp4.MP4InputStream; import net.sourceforge.jaad.mp4.boxes.FullBox; /** * The shadow sync table provides an optional set of sync samples that can be * used when seeking or for similar purposes. In normal forward play they are * ignored. * * Each entry in the ShadowSyncTable consists of a pair of sample numbers. The * first entry (shadowed-sample-number) indicates the number of the sample that * a shadow sync will be defined for. This should always be a non-sync sample * (e.g. a frame difference). The second sample number (sync-sample-number) * indicates the sample number of the sync sample (i.e. key frame) that can be * used when there is a random access at, or before, the shadowed-sample-number. * * The entries in the ShadowSyncBox shall be sorted based on the * shadowed-sample-number field. The shadow sync samples are normally placed in * an area of the track that is not presented during normal play (edited out by * means of an edit list), though this is not a requirement. The shadow sync * table can be ignored and the track will play (and seek) correctly if it is * ignored (though perhaps not optimally). * * The ShadowSyncSample replaces, not augments, the sample that it shadows (i.e. * the next sample sent is shadowed-sample-number+1). The shadow sync sample is * treated as if it occurred at the time of the sample it shadows, having the * duration of the sample it shadows. * * Hinting and transmission might become more complex if a shadow sample is used * also as part of normal playback, or is used more than once as a shadow. In * this case the hint track might need separate shadow syncs, all of which can * get their media data from the one shadow sync in the media track, to allow * for the different time-stamps etc. needed in their headers. * * @author in-somnia */ public class ShadowSyncSampleBox extends FullBox { private long[][] sampleNumbers; public ShadowSyncSampleBox() { super("Shadow Sync Sample Box"); } @Override public void decode(MP4InputStream in) throws IOException { super.decode(in); final int entryCount = (int) in.readBytes(4); sampleNumbers = new long[entryCount][2]; for(int i = 0; i<entryCount; i++) { sampleNumbers[i][0] = in.readBytes(4); //shadowedSampleNumber; sampleNumbers[i][1] = in.readBytes(4); //syncSampleNumber; } } /** * A map of sample number pairs: * 0 (shadowed-sample-number): gives the number of a sample for which there * is an alternative sync sample. * 1 (sync-sample-number): gives the number of the alternative sync sample. * * @return the sample number pairs */ public long[][] getSampleNumbers() { return sampleNumbers; } }