/* * @(#)VideoFormat.java 1.44 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media.format; import javax.media.Format; import java.awt.Dimension; /** * Encapsulates format information for * video data. * The attributes of a <code>VideoFormat</code> include * the encoding type, frame size, * frame rate, and the data type. * @since JMF 2.0 */ public class VideoFormat extends Format { protected Dimension size = null; protected int maxDataLength = NOT_SPECIFIED; protected float frameRate = NOT_SPECIFIED; // Standard video encoding strings /** Cinepak format. */ public static final String CINEPAK = "cvid"; /** JPEG format. */ public static final String JPEG = "jpeg"; /** JPEG RTP format */ public static final String JPEG_RTP = "jpeg/rtp"; /** MPEG format. */ public static final String MPEG = "mpeg"; /** MPEG RTP format. */ public static final String MPEG_RTP = "mpeg/rtp"; /** H.261 format. */ public static final String H261 = "h261"; /** H261 RTP format **/ public static final String H261_RTP = "h261/rtp"; /** H.263 format. */ public static final String H263 = "h263"; /** H.263 (RFC 2190) RTP format **/ public static final String H263_RTP = "h263/rtp"; /** H.263+ (RFC 2429 aka H263-1998) RTP format **/ public static final String H263_1998_RTP = "h263-1998/rtp"; /** Raw RGB format. */ public static final String RGB = "rgb"; /** Raw YUV or YCrCb format. */ public static final String YUV = "yuv"; /** 8-bit Indexed RGB format. */ public static final String IRGB = "irgb"; /** Sorensen format. */ public static final String SMC = "smc"; /** Run Length Encoded video format. */ public static final String RLE = "rle"; public static final String RPZA = "rpza"; /** Motion JPEG format. */ public static final String MJPG = "mjpg"; /** Motion JPEG-A format. */ public static final String MJPEGA = "mjpa"; /** Motion JPEG-B format. */ public static final String MJPEGB = "mjpb"; /** Indeo Video 3.2 */ public static final String INDEO32 = "iv32"; /** Indeo Interactive 4.1 */ public static final String INDEO41 = "iv41"; /** Indeo Interactive 5.0 */ public static final String INDEO50 = "iv50"; /** * Constructs a <CODE>VideoFormat</CODE> with the specified encoding type. * @param encoding A <CODE>String</CODE> that describes the encoding type * for this <CODE>VideoFormat</CODE>. */ public VideoFormat(String encoding) { super(encoding); } /** * Constructs a <CODE>VideoFormat</CODE> with the specified attributes. * @param encoding A <CODE>String</CODE> that describes the encoding * type for this <CODE>VideoFormat</CODE>. * @param size The size of a video frame. * @param maxDataLength The maximum length of a data chunk. * @param dataType The type of data. For example, byte array. * @param frameRate The frame rate. */ public VideoFormat(String encoding, Dimension size, int maxDataLength, Class dataType, float frameRate) { this(encoding); if (size != null) this.size = new Dimension(size); this.maxDataLength = maxDataLength; this.dataType = dataType; this.frameRate = frameRate; } /** * Gets the dimensions of a video frame in this <code>VideoFormat</code>. * @return A <CODE>Dimension</CODE> that specifies the frame size. */ public Dimension getSize() { return size; } /** * Gets the length of the largest data chunk associated with this * <code>VideoFormat</code>. * @return The maximum length of a data chunk in this <code>VideoFormat</code>. */ public int getMaxDataLength() { return maxDataLength; } /** * Creates a clone of this <code>VideoFormat</code> by copying each field to * the clone. * @return A clone of this <code>VideoFormat</code>. */ public Object clone() { VideoFormat f = new VideoFormat(encoding, size, maxDataLength, dataType, frameRate); f.copy(this); return f; } /** * Gets the frame rate associated with this <code>VideoFormat</code>. * @return The frame rate. */ public float getFrameRate(){ return frameRate; } /** * Copies the attributes from the specified * <CODE>Format</CODE> into this <CODE>VideoFormat</CODE>. * @param f The <CODE>Format</CODE> to copy the attributes from. */ protected void copy(Format f) { super.copy(f); VideoFormat vf = (VideoFormat)f; if (vf.size != null) size = new Dimension(vf.size); maxDataLength = vf.maxDataLength; frameRate = vf.frameRate; } /** * Gets a <CODE>String</CODE> representation of the attributes of this * <CODE>VideoFormat</CODE>. For example: "RGB, 352x240, ...". * @return A <CODE>String</CODE> that describes the * <code>VideoFormat</code> attributes. */ public String toString() { String s = ""; if (getEncoding() != null) s += getEncoding().toUpperCase(); else s += "N/A"; if (size != null) s += ", " + size.width + "x" + size.height; if (frameRate != NOT_SPECIFIED) s += ", FrameRate=" + ((int)(frameRate * 10) / 10f); if (maxDataLength != NOT_SPECIFIED) s += ", Length=" + maxDataLength; if (dataType != null && dataType != Format.byteArray) s += ", " + dataType; return s; } /** * Compares the specified <CODE>Format</CODE> with this <code>VideoFormat</code>. * Returns <CODE>true</CODE> only if the specified <CODE>Format</CODE> * is a <CODE>VideoFormat</CODE> object and all of * its attributes are identical to * the attributes in this <code>VideoFormat</code>. * @param format The <CODE>Format</CODE> to compare. * @return true if the specified <CODE>Format</CODE> is the same as this one. */ public boolean equals(Object format) { if (format instanceof VideoFormat) { VideoFormat vf = (VideoFormat)format; if (size == null || vf.size == null) { if (size != vf.size) return false; } else { if (!size.equals(vf.size)) return false; } return super.equals(format) && maxDataLength == vf.maxDataLength && frameRate == vf.frameRate; } return false; } /** * Checks whether or not the specified <CODE>Format</CODE> <EM>matches</EM> * this <CODE>VideoFormat</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 VideoFormat)) return true; VideoFormat vf = (VideoFormat)format; return (size == null || vf.size == null || size.equals(vf.size)) && (frameRate == NOT_SPECIFIED || vf.frameRate == NOT_SPECIFIED || frameRate == vf.frameRate); } /** * 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>VideoFormat</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 VideoFormat)) return fmt; VideoFormat other = (VideoFormat)format; VideoFormat res = (VideoFormat)fmt; res.size = (size != null ? size : other.size); res.maxDataLength = (maxDataLength != NOT_SPECIFIED ? maxDataLength : other.maxDataLength); res.frameRate = (frameRate != NOT_SPECIFIED ? frameRate : other.frameRate); return res; } /** * Generate a format that's less restrictive than this format but * contains the basic attributes that will make this resulting format * useful for format matching. * @return A <CODE>Format</CODE> that's less restrictive than the * this format. */ public Format relax() { VideoFormat fmt; if ((fmt = (VideoFormat)super.relax()) == null) return null; fmt.size = null; fmt.maxDataLength = NOT_SPECIFIED; fmt.frameRate = NOT_SPECIFIED; return fmt; } }