/*
* ******************************************************************** **
* Copyright notice **
* ** **
* (c) 2003 Entagged Developpement Team **
* http://www.sourceforge.net/projects/entagged **
* ** **
* All rights reserved **
* ** **
* This script is part of the Entagged project. The Entagged **
* project 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 2 of the License, or **
* (at your option) any later version. **
* ** **
* The GNU General Public License can be found at **
* http://www.gnu.org/copyleft/gpl.html. **
* ** **
* This copyright notice MUST APPEAR in all copies of the file! **
* ********************************************************************
*/
package entagged.audioformats.asf.data;
import java.math.BigInteger;
import java.util.Date;
import entagged.audioformats.asf.util.Utils;
/**
* This class stores the information about the file, which is contained within a
* special chunk of asf files.
*
* @author Christian Laireiter
*/
public class FileHeader extends Chunk {
/**
* Duration of the media content in 100ns steps.
*/
private final BigInteger duration;
/**
* The time the file was created.
*/
private final Date fileCreationTime;
/**
* Size of the file or stream.
*/
private BigInteger fileSize;
/**
* Usually contains value of 2.
*/
private final long flags;
/**
* Maximum size of stream packages.
* Warning: must be same size as {@link #minPackageSize}. Its not
* known how to handle deviating values.
*/
private final long maxPackageSize;
/**
* Minimun size of stream packages.
* Warning: must be same size as {@link #maxPackageSize}. Its not
* known how to handle deviating values.
*/
private final long minPackageSize;
/**
* Number of stream packages within the File.
*/
private final BigInteger packageCount;
/**
* No Idea of the Meaning, but stored anyway.
* Source documentation says it is: "Timestamp of end position"
*/
private final BigInteger timeEndPos;
/**
* Like {@link #timeEndPos}no Idea.
*/
private final BigInteger timeStartPos;
/**
* Size of an uncompressed video frame.
*/
private final long uncompressedFrameSize;
/**
* Creates an instance.
*
* @param fileHeaderStart
* Position in file or stream, where the file header starts.
* @param chunckLen
* Length of the file header (chunk)
* @param size
* Size of file or stream
* @param fileTime
* Time file or stream was created. Time is calculated since 1st
* january of 1601 in 100ns steps.
* @param pkgCount
* Number of stream packages.
* @param dur
* Duration of media clip in 100ns steps
* @param timestampStart
* Timestamp of start {@link #timeStartPos}
* @param timestampEnd
* Timestamp of end {@link #timeEndPos}
* @param headerFlags
* some stream related flags.
* @param minPkgSize
* minimun size of packages
* @param maxPkgSize
* maximum size of packages
* @param uncmpVideoFrameSize
* Size of an uncompressed Video Frame.
*/
public FileHeader(long fileHeaderStart, BigInteger chunckLen,
BigInteger size, BigInteger fileTime, BigInteger pkgCount,
BigInteger dur, BigInteger timestampStart, BigInteger timestampEnd,
long headerFlags, long minPkgSize, long maxPkgSize,
long uncmpVideoFrameSize) {
super(GUID.GUID_FILE, fileHeaderStart, chunckLen);
this.fileSize = size;
this.packageCount = pkgCount;
this.duration = dur;
this.timeStartPos = timestampStart;
this.timeEndPos = timestampEnd;
this.flags = headerFlags;
this.minPackageSize = minPkgSize;
this.maxPackageSize = maxPkgSize;
this.uncompressedFrameSize = uncmpVideoFrameSize;
this.fileCreationTime = Utils.getDateOf(fileTime).getTime();
}
/**
* @return Returns the duration.
*/
public BigInteger getDuration() {
return duration;
}
/**
* This method converts {@link #getDuration()}from 100ns steps to normal
* seconds.
*
* @return Duration of the media in seconds.
*/
public int getDurationInSeconds() {
return duration.divide(new BigInteger("10000000")).intValue();
}
/**
* @return Returns the fileCreationTime.
*/
public Date getFileCreationTime() {
return fileCreationTime;
}
/**
* @return Returns the fileSize.
*/
public BigInteger getFileSize() {
return fileSize;
}
/**
* @return Returns the flags.
*/
public long getFlags() {
return flags;
}
/**
* @return Returns the maxPackageSize.
*/
public long getMaxPackageSize() {
return maxPackageSize;
}
/**
* @return Returns the minPackageSize.
*/
public long getMinPackageSize() {
return minPackageSize;
}
/**
* @return Returns the packageCount.
*/
public BigInteger getPackageCount() {
return packageCount;
}
/**
* @return Returns the timeEndPos.
*/
public BigInteger getTimeEndPos() {
return timeEndPos;
}
/**
* @return Returns the timeStartPos.
*/
public BigInteger getTimeStartPos() {
return timeStartPos;
}
/**
* @return Returns the uncompressedFrameSize.
*/
public long getUncompressedFrameSize() {
return uncompressedFrameSize;
}
/**
* (overridden)
*
* @see entagged.audioformats.asf.data.Chunk#prettyPrint()
*/
public String prettyPrint() {
StringBuffer result = new StringBuffer(super.prettyPrint());
result.insert(0, "\nFileHeader\n");
result.append(" Filesize = " + getFileSize().toString()
+ " Bytes \n");
result.append(" Media duration= "
+ getDuration().divide(new BigInteger("10000")).toString()
+ " ms \n");
result.append(" Created at = " + getFileCreationTime() + "\n");
return result.toString();
}
}