/*
* @(#)JPEGFormat.java 1.7 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media.format;
import javax.media.Format;
import javax.media.format.VideoFormat;
import java.awt.Dimension;
/**
* Describes JPEG compressed video data.
*
*
* @since JMF 2.0
*/
public class JPEGFormat extends VideoFormat {
/**
* JPEG 422 decimation.
*/
static final public int DEC_422 = 0;
/**
* JPEG 420 decimation.
*/
static final public int DEC_420 = 1;
/**
* JPEG 444 decimation.
*/
static final public int DEC_444 = 2;
/**
* JPEG 402 decimation.
*/
static final public int DEC_402 = 3;
/**
* JPEG 411 decimation.
*/
static final public int DEC_411 = 4;
/**
* JPEG encoding parameter quality factor.
**/
int qFactor = NOT_SPECIFIED;
/**
* Indicates whether or not JPEG decimation is used.
**/
int decimation = NOT_SPECIFIED;
/**
* Constructs a default <CODE>JPEGFormat</CODE> object.
*/
public JPEGFormat() {
super(VideoFormat.JPEG);
}
/**
* Constructs a <CODE>JPEGFormat</CODE> with the specified parameters.
*
* @param size A <CODE>Dimension</CODE> that specifies the frame size.
* @param maxDataLength The maximum size of the compressed data array.
* @param dataType The class type of the data.
* @param frameRate The frame rate of the video.
* @param q The JPEG quality factor.
* This is a value from 0 to 100, where 0 is the lowest
* quality and 100 is the highest.
* @param dec The JPEG decimation used.
*/
public JPEGFormat(Dimension size, int maxDataLength,
Class dataType, float frameRate, int q, int dec) {
super(VideoFormat.JPEG, size, maxDataLength, dataType, frameRate);
this.qFactor = q;
this.decimation = dec;
}
/**
* Gets the JPEG quality factor for this <CODE>JPEGFormat</CODE>.
* @return An integer in the range 0 to 100, where 0 is the lowest
* quality and 100 is the highest.
*/
public int getQFactor() {
return qFactor;
}
/**
* Gets the decimation of the video.
* @return An integer that indicates the decimation of this
* <code>Format</code>:
DEC_422, DEC_420, DEC_444, DEC_402, or DEC_411.
*/
public int getDecimation() {
return decimation;
}
/**
* Creates a clone of this <CODE>JPEGFormat</CODE> by copying each format
* attribute to the clone.
* @return A clone of this <CODE>JPEGFormat</CODE>.
*/
public Object clone() {
JPEGFormat f = new JPEGFormat(getSize(), getMaxDataLength(),
getDataType(), getFrameRate(),
qFactor, decimation);
f.copy(this);
return f;
}
/**
* Copies the attributes from the specified <CODE>Format</CODE> into
* this <CODE>JPEGFormat</CODE>.
* @param f The <CODE>Format</CODE> to copy the attributes from.
*/
protected void copy(Format f) {
super.copy(f);
JPEGFormat jf = (JPEGFormat)f;
qFactor = jf.qFactor;
decimation = jf.decimation;
}
/**
* Gets a <CODE>String</CODE> representation of the attributes of this
* <code>JPEGFormat</code>. For example: "JPEG, 352x240, ...".
* @return A <CODE>String</CODE> that describes the <code>JPEGFormat</code>
* attributes.
*/
public String toString() {
String s = getEncoding() + " video format:";
if (size != null)
s += " size = " + size.width + "x" + size.height;
if (frameRate != NOT_SPECIFIED)
s += " FrameRate = " + frameRate;
if (maxDataLength != NOT_SPECIFIED)
s += " maxDataLength = " + maxDataLength;
if (dataType != null)
s += " dataType = " + dataType;
if (qFactor != NOT_SPECIFIED)
s += " q factor = " + qFactor;
if (decimation != NOT_SPECIFIED)
s += " decimation = " + decimation;
return s;
}
/**
* Compares the specified <CODE>Format</CODE> with this <code>JPEGFormat</code>.
* Returns <CODE>true</CODE>
* only if the specified <CODE>Format</CODE> is an <CODE>JPEGFormat</CODE> and
* all of its attributes are
* identical to this <code>JPEGFormat</code>.
* @param format The <CODE>Format</CODE> to compare with this one.
* @return <CODE>true</CODE> if the specified <CODE>Format</CODE> is the same,
* <CODE>false</CODE> if it is not.
*/
public boolean equals(Object format) {
if (format instanceof JPEGFormat) {
JPEGFormat vf = (JPEGFormat)format;
return super.equals(format) &&
qFactor == vf.qFactor &&
decimation == vf.decimation;
}
return false;
}
/**
* Checks whether or not the specified <CODE>Format</CODE> <EM>matches</EM>
* this <CODE>JPEGFormat</CODE>.
* Matches only compares the attributes that are defined in the specified
* <CODE>Format</CODE>, unspecified attributes are ignored.
* <p>
* The two <CODE>Format</CODE> objects do not have to be of the same class to
* match. For example, if "A" are "B" are being compared, a
* match is possible if "A" is derived from "B"
* or "B" is derived from "A". (The compared attributes must still match, or
* <CODE>matches</CODE> fails.)
* @param format The <CODE>Format</CODE> to compare with this one.
* @return <CODE>true</CODE> if the specified <CODE>Format</CODE> matches this one,
* <CODE>false</CODE> if it does not.
*/
public boolean matches(Format format) {
if (!super.matches(format))
return false;
if (!(format instanceof JPEGFormat))
return true;
JPEGFormat vf = (JPEGFormat)format;
return
(qFactor == NOT_SPECIFIED || vf.qFactor == NOT_SPECIFIED ||
qFactor == vf.qFactor) &&
(decimation == NOT_SPECIFIED || vf.decimation == NOT_SPECIFIED ||
decimation == vf.decimation);
}
/**
* Finds the attributes shared by two matching <CODE>Format</CODE> objects.
* If the specified <CODE>Format</CODE> does not match this one, the result is
* undefined.
* @param The matching <CODE>Format</CODE> to intersect with this
* <CODE>JPEGFormat</CODE>.
* @return A <CODE>Format</CODE> object
* with its attributes set to those attributes common to both
* <CODE>Format</CODE> objects.
* @see #matches
*/
public Format intersects(Format format) {
Format fmt;
if ((fmt = super.intersects(format)) == null)
return null;
if (!(format instanceof JPEGFormat))
return fmt;
JPEGFormat other = (JPEGFormat)format;
JPEGFormat res = (JPEGFormat)fmt;
res.qFactor = (qFactor != NOT_SPECIFIED ?
qFactor : other.qFactor);
res.decimation = (decimation != NOT_SPECIFIED ?
decimation : other.decimation);
return res;
}
}
|