/* * @(#)YUVFormat.java 1.21 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media.format; import java.awt.Dimension; import javax.media.Format; /** * Describes YUV image data. * @since JMF 2.0 */ public class YUVFormat extends VideoFormat { /** YUV Planar 4:1:1 type. */ public static final int YUV_411 = 1; /** YUV Planar 4:2:0 type. */ public static final int YUV_420 = 2; /** YUV Planar 4:2:2 type. */ public static final int YUV_422 = 4; /** YUV Planar 1:1:1 type. */ public static final int YUV_111 = 8; /** * YUV Planar YVU9 type. Contains a Y value for * every pixel and U and V values for every 4x4 block of pixels. */ public static final int YUV_YVU9 = 16; /** * YUV 4:2:2 interleaved format. The components are ordered as * specified by the offsetY, offsetU and offsetV attributes. * For example, if the ordering is Y, V, Y and U, the offsets would * be offsetY=0;offsetU=3;offsetV=1. The position of the second Y is implied. * Y pixel stride is assumed to be 2 and the U and V pixel strides are assumed * to be 4. */ public static final int YUV_YUYV = 32; /** * When added to the yuvType, specifies that the chrominance values * are signed. */ public static final int YUV_SIGNED = 64; /* 512 taken for YVU9 from Indeo 3.2 decoder */ /** The YUV format type */ protected int yuvType = NOT_SPECIFIED; /** Length of a row of Y values. Would be >= width of the frame. */ protected int strideY = NOT_SPECIFIED; /** Length of a row of U or V values. */ protected int strideUV = NOT_SPECIFIED; /** * When the YUV data is in planar format, specifies the offset into * the data for the Y plane. This value is ignored in the interleaved * formats. */ protected int offsetY= NOT_SPECIFIED; /** * When the YUV data is in planar format, specifies the offset into * the data for the U plane. This value is ignored in the interleaved * formats. */ protected int offsetU = NOT_SPECIFIED; /** * When the YUV data is in planar format, specifies the offset into * the data for the V plane. This value is ignored in the interleaved * formats. */ protected int offsetV = NOT_SPECIFIED; // The encoding string for YUV. private static String ENCODING = VideoFormat.YUV; /** * Constructs a <CODE>YUVFormat</CODE> object that represents all YUV formats. */ public YUVFormat() { super(ENCODING); } /** * Constructs a <CODE>YUVFormat</CODE> object for a specific <CODE>yuvType</CODE>. * @param yuvType The YUV type for this <CODE>YUVFormat</CODE>: YUV_411, YUV_420, * YUV_422, YUV_111, YUV_YVU9, or YUV_YUYV. */ public YUVFormat(int yuvType) { super(ENCODING); this.yuvType = yuvType; } /** * Constructs a <CODE>YUVFormat</CODE> with the specified properties. Use this * constructor for interleaved YUV formats (YUV_YUYV). * @param size A <CODE>Dimension</CODE> that specifies the frame size. * @param maxDataLength The maximum size of the data array. * @param dataType The type of the data. * @param yuvType The YUV ordering type. * @param strideY The number of data elements between the first Y * component in a row and the first Y component in the next row. */ // public YUVFormat(Dimension size, int maxDataLength, // Class dataType, // int yuvType, int strideY) { // // Call VideoFormat constructor // super(ENCODING, size, maxDataLength, dataType); // // Set YUV properties. // this.yuvType = yuvType; // this.strideY = strideY; // this.strideUV = strideY; // this.offsetY = 0; // this.offsetU = 0; // this.offsetV = 0; // } /** * Constructs a <CODE>YUVFormat</CODE> with the specified properties. Use this * constructor for planar YUV formats. (YUV_411, YUV_420, * YUV_422, YUV_111, or YUV_YVU9.) * @param size A <CODE>Dimension</CODE> that specifies the frame size. * @param maxDataLength The maximum size of the data array. * @param dataType The type of the data. * @param yuvType The YUV ordering type. * @param strideY The number of data elements between the first Y * component in a row and the first Y component in the next row. * @param strideUV The number of data elements between the first U * component in a row and the first U component in the next row. The * same value is expected for the V component. * @param offsetY The offset into the data array where the Y plane * begins. * @param offsetU The offset into the data array where the U plane * begins. * @param offsetV The offset into the data array where the V plane * begins. */ public YUVFormat(Dimension size, int maxDataLength, Class dataType, float frameRate, int yuvType, int strideY, int strideUV, int offsetY, int offsetU, int offsetV) { // Call VideoFormat constructor super(ENCODING, size, maxDataLength, dataType, frameRate); // Set YUV properties. this.yuvType = yuvType; this.strideY = strideY; this.strideUV = strideUV; this.offsetY = offsetY; this.offsetU = offsetU; this.offsetV = offsetV; } /** * Gets the YUV data format. * @return The YUV type: YUV_411, YUV_420, * YUV_422, YUV_111, YUV_YVU9, or YUV_YUYV. */ public int getYuvType() { return yuvType; } /** * Gets the Y stride--the length of a row of Y values. * @return An integer representing the Y stride. */ public int getStrideY() { return strideY; } /** * Gets the UV stride--the length of a row of U or V values. * @return An integer representing the UV stride. */ public int getStrideUV() { return strideUV; } /** * Gets the Y offset--the position in the data where the Y values begin. * @return An integer representing the Y offset. */ public int getOffsetY() { return offsetY; } /** * Gets the U offset--the position in the data where the U values begin. * @return An integer representing the U offset. */ public int getOffsetU() { return offsetU; } /** * Gets the V offset--the position in the data where the V values begin. * @return An integer representing the V offset. */ public int getOffsetV() { return offsetV; } /** * Creates a clone of this <CODE>YUVFormat</CODE>. * @return A clone of this <CODE>YUVFormat</CODE>. */ public Object clone() { YUVFormat f = new YUVFormat(size, maxDataLength, dataType, frameRate, yuvType, strideY, strideUV, offsetY, offsetU, offsetV); f.copy(this); return f; } /** * Copies the attributes from the specified <CODE>Format</CODE> into * this <CODE>YUVFormat</CODE>. * @param f The <CODE>Format</CODE> to copy the attributes from. */ protected void copy(Format f) { super.copy(f); if (f instanceof YUVFormat) { YUVFormat other = (YUVFormat) f; yuvType = other.yuvType; strideY = other.strideY; strideUV = other.strideUV; offsetY = other.offsetY; offsetU = other.offsetU; offsetV = other.offsetV; } } /** * Compares the specified <CODE>Format</CODE> with this <code>YUVFormat</code>. * Returns <CODE>true</CODE> only if the specified <CODE>Format</CODE> * is a <CODE>YUVFormat</CODE> object and all of * its attributes are identical to * the attributes in this <code>YUVFormat</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 YUVFormat) { YUVFormat other = (YUVFormat) format; return super.equals(format) && yuvType == other.yuvType && strideY == other.strideY && strideUV == other.strideUV && offsetY == other.offsetY && offsetU == other.offsetU && offsetV == other.offsetV; } else return false; } /** * Checks whether or not the specified <CODE>Format</CODE> <EM>matches</EM> * this <CODE>YUVFormat</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 YUVFormat)) return true; YUVFormat other = (YUVFormat) format; return (yuvType == NOT_SPECIFIED || other.yuvType == NOT_SPECIFIED || yuvType == other.yuvType) && (strideY == NOT_SPECIFIED || other.strideY == NOT_SPECIFIED || strideY == other.strideY) && (strideUV == NOT_SPECIFIED || other.strideUV == NOT_SPECIFIED || strideUV == other.strideUV) && (offsetY == NOT_SPECIFIED || other.offsetY == NOT_SPECIFIED || offsetY == other.offsetY) && (offsetU == NOT_SPECIFIED || other.offsetU == NOT_SPECIFIED || offsetU == other.offsetU) && (offsetV == NOT_SPECIFIED || other.offsetV == NOT_SPECIFIED || offsetV == other.offsetV); } /** * 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>YUVFormat</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 YUVFormat)) return fmt; YUVFormat other = (YUVFormat)format; YUVFormat res = (YUVFormat)fmt; res.yuvType = (yuvType != NOT_SPECIFIED ? yuvType : other.yuvType); res.strideY = (strideY != NOT_SPECIFIED ? strideY : other.strideY); res.strideUV = (strideUV != NOT_SPECIFIED ? strideUV : other.strideUV); res.offsetY = (offsetY != NOT_SPECIFIED ? offsetY : other.offsetY); res.offsetU = (offsetU != NOT_SPECIFIED ? offsetU : other.offsetU); res.offsetV = (offsetV != NOT_SPECIFIED ? offsetV : other.offsetV); 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() { YUVFormat fmt; if ((fmt = (YUVFormat)super.relax()) == null) return null; fmt.strideY = NOT_SPECIFIED; fmt.strideUV = NOT_SPECIFIED; fmt.offsetY = NOT_SPECIFIED; fmt.offsetU = NOT_SPECIFIED; fmt.offsetV = NOT_SPECIFIED; return fmt; } /** * Gets a <CODE>String</CODE> representation of the attributes of this * <CODE>YUVFormat</CODE>. For example: "YUV Video Format, 352x240, ...". * @return A <CODE>String</CODE> that describes the format attributes. */ public String toString() { return "YUV Video Format: Size = " + size + " MaxDataLength = " + maxDataLength + " DataType = " + dataType + " yuvType = " + yuvType + " StrideY = " + strideY + " StrideUV = " + strideUV + " OffsetY = " + offsetY + " OffsetU = " + offsetU + " OffsetV = " + offsetV + "\n"; } }