/** * This file is part of jFlvTool. * * jFlvTool is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * jFlvTool 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * * file name : FileWriter.java * authors : Jon Keys * created : July 5, 2007, 9:39 AM * copyright : Sony Digital Authoring Services * * modifications: * Date: Name: Description: * ---------- --------------- ---------------------------------------------- * July 5, 2007 Jon Keys Creation */ package edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.io; import java.io.FileNotFoundException; import java.nio.ByteBuffer; import java.util.ArrayList; import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.metadata.FlvHeader; import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.metadata.TagStor; import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.tags.FlvTag; import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.tags.MetaTag; /** * * @author Jon Keys */ public class FileWriter { private StreamWriter stream; private StreamReader inStream; private ByteBuffer buf; private ArrayList<TagStor> tags; private FlvHeader flvh; private boolean debug; /** Creates a new instance of FileWriter */ public FileWriter(FlvHeader flvh) { stream = null; buf = null; tags = null; this.flvh = flvh; debug = false; } public void writeTags() { BufferHelper bufh = new BufferHelper(); ByteHelper bh = new ByteHelper(); FlvTag tmpFlvt = null; int fpos = 0; byte[] buf = null; byte[] type = null; byte[] dsize = null; byte[] tstamp = null; byte[] prevTagSize = null; byte[] ender = bh.getUintBytes(0, 4); try { stream.open(); } catch (Exception ex) { System.out.println("Error - unable to open specified output file"); if (debug) { ex.printStackTrace(); } return; }// catch() // write FLV header stream.write(bufh.byte2buffer(flvh.getFlvHeaderBytes())); stream.write(bufh.byte2buffer(ender)); stream.setInputStream(inStream); int cntr = 1; for (TagStor ts : tags) { type = bh.getUintBytes(ts.getType(), 1); dsize = bh.getUintBytes(ts.getDataSize(), 3); tstamp = bh.getUintBytes(ts.getTimestamp(), 3); if (prevTagSize != null) { buf = new byte[type.length + dsize.length + tstamp.length + ender.length + prevTagSize.length]; System.arraycopy(prevTagSize, 0, buf, 0, prevTagSize.length); fpos += prevTagSize.length; } else { buf = new byte[type.length + dsize.length + tstamp.length + ender.length]; } System.arraycopy(type, 0, buf, fpos, type.length); fpos += type.length; System.arraycopy(dsize, 0, buf, fpos, dsize.length); fpos += dsize.length; System.arraycopy(tstamp, 0, buf, fpos, tstamp.length); fpos += tstamp.length; System.arraycopy(ender, 0, buf, fpos, ender.length); prevTagSize = null; type = null; dsize = null; tstamp = null; stream.write(bufh.byte2buffer(buf)); if (ts.getType() == FlvTag.META && ts.isNew()) { stream.write(((MetaTag) ts.getTag()).getDataAsBuffer()); prevTagSize = bh.getUintBytes( (((MetaTag) ts.getTag()).getDataSizeFromBuffer() - 4), 4); // System.out.println("writing meta tag"); } else { tmpFlvt = (FlvTag) ts.getTag(); stream.writeDirect(tmpFlvt.getStartingOffset(), (tmpFlvt.getDataSize() - 15)); prevTagSize = bh.getUintBytes((tmpFlvt.getDataSize() - 4), 4); // System.out.println("writing other tag"); } buf = null; fpos = 0; }// for if (prevTagSize != null) { stream.write(bufh.byte2buffer(prevTagSize)); } }// writeTags() public void setStream(StreamWriter stream) { this.stream = stream; } public void setTags(ArrayList<TagStor> tags) { this.tags = tags; } public void setInStream(StreamReader inStream) { this.inStream = inStream; } public boolean isDebug() { return debug; } public void setDebug(boolean debug) { this.debug = debug; } }// FileWriter()