/*
* @(#)AviVideoFormat.java 1.8 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.format;
import java.awt.Dimension;
import javax.media.Format;
import javax.media.format.VideoFormat;
/**
* An extended video format class that contains additional information from
* the video header of an AVI file. This includes codec specific information
* required by certain codecs.
*/
public class AviVideoFormat extends VideoFormat {
protected int planes = NOT_SPECIFIED;
protected int bitsPerPixel = NOT_SPECIFIED;
protected int imageSize = NOT_SPECIFIED;
protected int xPelsPerMeter = NOT_SPECIFIED;
protected int yPelsPerMeter = NOT_SPECIFIED;
protected int clrUsed = NOT_SPECIFIED;
protected int clrImportant = NOT_SPECIFIED;
protected byte [] codecSpecificHeader = null;
public AviVideoFormat(String encoding) {
super(encoding);
}
public AviVideoFormat(String encoding, Dimension size, int maxDataLength,
Class dataType, float frameRate, int planes, int bitsPerPixel,
int imageSize, int xPelsPerMeter, int yPelsPerMeter,
int clrUsed, int clrImportant, byte[] codecHeader) {
super(encoding, size, maxDataLength, dataType, frameRate);
this.planes = planes;
this.bitsPerPixel = bitsPerPixel;
this.imageSize = imageSize;
this.xPelsPerMeter = xPelsPerMeter;
this.yPelsPerMeter = yPelsPerMeter;
this.clrUsed = clrUsed;
this.clrImportant = clrImportant;
this.codecSpecificHeader = codecHeader;
}
public int getPlanes() {
return planes;
}
public int getBitsPerPixel() {
return bitsPerPixel;
}
public int getImageSize() {
return imageSize;
}
public int getXPelsPerMeter() {
return xPelsPerMeter;
}
public int getYPelsPerMeter() {
return yPelsPerMeter;
}
public int getClrUsed() {
return clrUsed;
}
public int getClrImportant() {
return clrImportant;
}
public byte [] getCodecSpecificHeader() {
return codecSpecificHeader;
}
/**
* Return a clone of this format.
*/
public Object clone() {
AviVideoFormat f = new AviVideoFormat(encoding);
f.copy(this);
return f;
}
/**
* Copy the attributes from the given object.
*/
protected void copy(Format f) {
super.copy(f);
if (f instanceof AviVideoFormat) {
AviVideoFormat other = (AviVideoFormat) f;
planes = other.planes;
bitsPerPixel = other.bitsPerPixel;
imageSize = other.imageSize;
xPelsPerMeter = other.xPelsPerMeter;
yPelsPerMeter = other.yPelsPerMeter;
clrUsed = other.clrUsed;
clrImportant = other.clrImportant;
codecSpecificHeader = other.codecSpecificHeader;
}
}
/**
* @return True if the given format is the same as this one.
*/
public boolean equals(Object format) {
if (format instanceof AviVideoFormat) {
AviVideoFormat other = (AviVideoFormat) format;
boolean result = super.equals(format) &&
planes == other.planes &&
bitsPerPixel == other.bitsPerPixel &&
imageSize == other.imageSize &&
xPelsPerMeter == other.xPelsPerMeter &&
yPelsPerMeter == other.yPelsPerMeter &&
clrUsed == other.clrUsed &&
clrImportant == other.clrImportant;
if (result == false)
return false;
else {
if (codecSpecificHeader == other.codecSpecificHeader)
return true;
if (codecSpecificHeader == null ||
other.codecSpecificHeader == null)
return false;
if (codecSpecificHeader.length != other.codecSpecificHeader.length)
return false;
for (int i = 0; i < codecSpecificHeader.length; i++)
if (codecSpecificHeader[i] != other.codecSpecificHeader[i])
return false;
return true;
}
} else
return false;
}
/**
* Test to see if the given format matches this format.
* Matches compares attributes that are defined and ignore attributes
* that are unspecified.
* Two formats do not have to be of the same class to be considered
* a match. Say "A" are "B" are the two classes. If "A" derives "B"
* or "B" derives "A", then a match is possible (after comparing
* individual attributes. Otherwise, matches fails. This is to
* prevent matching VideoFormat and AudioFormat, for example.
* @return true if the given format matches this one.
*/
public boolean matches(Format format) {
if (!super.matches(format))
return false;
if (!(format instanceof AviVideoFormat))
return true;
AviVideoFormat other = (AviVideoFormat) format;
boolean returnVal =
(planes == NOT_SPECIFIED || other.planes == NOT_SPECIFIED ||
planes == other.planes) &&
(bitsPerPixel == NOT_SPECIFIED || other.bitsPerPixel == NOT_SPECIFIED ||
bitsPerPixel == other.bitsPerPixel) &&
(imageSize == NOT_SPECIFIED || other.imageSize == NOT_SPECIFIED ||
imageSize == other.imageSize) &&
(xPelsPerMeter == NOT_SPECIFIED || other.xPelsPerMeter == NOT_SPECIFIED ||
xPelsPerMeter == other.xPelsPerMeter) &&
(yPelsPerMeter == NOT_SPECIFIED || other.yPelsPerMeter == NOT_SPECIFIED ||
yPelsPerMeter == other.yPelsPerMeter) &&
(clrUsed == NOT_SPECIFIED || other.clrUsed == NOT_SPECIFIED ||
clrUsed == other.clrUsed) &&
(clrImportant == NOT_SPECIFIED || other.clrImportant == NOT_SPECIFIED ||
clrImportant == other.clrImportant)
&&
(codecSpecificHeader == null || other.codecSpecificHeader == null ||
codecSpecificHeader == other.codecSpecificHeader ||
codecSpecificHeader.equals(codecSpecificHeader));
return returnVal;
}
/**
* Find the common attributes of two matching formats.
* If the given format does not match this one, the result is
* undefined. Otherwise, it returns a format object
* with its attributes set to the common attributes of the two.
* @return a format object with its attributes set to the common
* attributes of the two.
* @see matches
*/
public Format intersects(Format format) {
Format fmt;
if ((fmt = super.intersects(format)) == null)
return null;
if (!(format instanceof AviVideoFormat))
return fmt;
AviVideoFormat other = (AviVideoFormat)format;
AviVideoFormat res = (AviVideoFormat)fmt;
res.planes = (planes != NOT_SPECIFIED ?
planes : other.planes);
res.bitsPerPixel = (bitsPerPixel != NOT_SPECIFIED ?
bitsPerPixel : other.bitsPerPixel);
res.imageSize = (imageSize != NOT_SPECIFIED ?
imageSize : other.imageSize);
res.xPelsPerMeter = (xPelsPerMeter != NOT_SPECIFIED ?
xPelsPerMeter : other.xPelsPerMeter);
res.yPelsPerMeter = (yPelsPerMeter != NOT_SPECIFIED ?
yPelsPerMeter : other.yPelsPerMeter);
res.clrUsed = (clrUsed != NOT_SPECIFIED ?
clrUsed : other.clrUsed);
res.clrImportant = (clrImportant != NOT_SPECIFIED ?
clrImportant : other.clrImportant);
res.codecSpecificHeader = (codecSpecificHeader != null ?
codecSpecificHeader : other.codecSpecificHeader);
return res;
}
public Format relax() {
AviVideoFormat fmt;
if ((fmt = (AviVideoFormat)super.relax()) == null)
return null;
fmt.imageSize = NOT_SPECIFIED;
return fmt;
}
public String toString() {
String s = super.toString() + " " + (codecSpecificHeader != null ? codecSpecificHeader.length : 0) + " extra bytes";
return s;
}
}
|