/** * JEBML - Java library to read/write EBML/Matroska elements. * Copyright (C) 2004 Jory Stone <jebml@jory.info> * Based on Javatroska (C) 2002 John Cannon <spyder@matroska.org> * * This library 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 2.1 of the License, or (at your option) any later version. * * This library 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.jcodec.containers.mkv.elements; import java.io.IOException; import org.jcodec.containers.mkv.Reader; import org.jcodec.containers.mkv.ebml.Element; import org.jcodec.containers.mkv.ebml.MasterElement; import org.jcodec.containers.mkv.util.ArrayCopy; import org.jcodec.containers.mkv.util.TLinkedList; /** * Summary description for MatroskaCluster. */ public class MatroskaCluster extends MasterElement { protected int[] laceMode = null; protected TLinkedList frames = new TLinkedList(); protected long clusterTimecode = 0; public MatroskaCluster(byte[] type) { super(type); } /** * Set the current lacing mode. * * @param trackNo * Track Number for the track to enable lacing for. 1-based index * @param laceMode * The lacing moe to use. See NO_LACING, XIPH_LACING, and * EBML_LACING. */ void setLaceMode(short trackNo, int laceMode) { if (this.laceMode == null) { this.laceMode = new int[trackNo]; } if (this.laceMode.length < trackNo) { int[] oldLaceMode = this.laceMode; this.laceMode = new int[trackNo]; ; ArrayCopy.arraycopy(this.laceMode, 0, oldLaceMode, 0, oldLaceMode.length); } this.laceMode[trackNo - 1] = laceMode; } /** * Get the current lacing mode. * * @param trackNo * Track Number for the track to enable lacing for. 1-based index * @return -1 if the track no is invalid */ int getLaceMode(short trackNo) { if (this.laceMode == null) { return -1; } if (this.laceMode.length < trackNo) { return -1; } return this.laceMode[trackNo - 1]; } public void AddFrame(Frame frame) { // Is this the earliest timecode? if (frame.Timecode < clusterTimecode) { clusterTimecode = frame.Timecode; } frames.add(frame); } public Element readNextChild(Reader reader) throws IOException { if (usedSize > size) { System.err.println("Size " + size + " of Cluster block is lesser then number of actual elements read ( " + usedSize + " ). File offset: " + reader.getPos()); } else if (usedSize == size) return null; Element elem = reader.readNextElement(); // elem == 'null', only if 0x00 was read as first byte of id // if (elem == null) { // while (elem == null && usedSize < reader.getAvailable()) { // usedSize += 1; // since elem == null, 0x00 was read instead of // // element ID, one byte should be accounted for // elem = reader.readNextElement(); // } // // if (usedSize > this.getSize()) // return null; // } if (elem != null){ elem.setParent(this); usedSize += elem.getSize(); } return elem; } }