/*
* @(#)VideoFormatChooser.java 1.21 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.ui;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;
import javax.media.protocol.*;
import javax.media.datasink.*;
import com.sun.media.util.JMFI18N;
public class VideoFormatChooser extends Panel implements ItemListener, ActionListener {
public static final String ACTION_TRACK_ENABLED = "ACTION_VIDEO_TRACK_ENABLED";
public static final String ACTION_TRACK_DISABLED = "ACTION_VIDEO_TRACK_DISABLED";
private VideoFormat formatOld;
private Format arrSupportedFormats [] = null;
private float customFrameRates [] = null;
private Vector vectorContSuppFormats = new Vector ();
private boolean boolDisplayEnableTrack;
private ActionListener listenerEnableTrack;
private boolean boolEnableTrackSaved = true;
private Checkbox checkEnableTrack;
private Label labelEncoding;
private Choice comboEncoding;
private Label labelSize;
// private Choice controlSize;
private VideoSizeControl controlSize;
private Label labelFrameRate;
private Choice comboFrameRate;
private Label labelExtra;
private Choice comboExtra;
private int nWidthLabel = 0;
private int nWidthData = 0;
private static final int MARGINH = 12;
private static final int MARGINV = 6;
private static final float [] standardCaptureRates = new float [] {
15f, 1f, 2f, 5f, 7.5f, 10f, 12.5f, 20f, 24f, 25f, 30f
};
private static final String DEFAULT_STRING = JMFI18N.getResource("formatchooser.default");
public VideoFormatChooser ( Format arrFormats[], VideoFormat formatDefault,
float [] frameRates ) {
this ( arrFormats, formatDefault, false, null, frameRates );
}
public VideoFormatChooser ( Format arrFormats[], VideoFormat formatDefault ) {
this ( arrFormats, formatDefault, false, null, null );
}
public VideoFormatChooser ( Format arrFormats[], VideoFormat formatDefault,
boolean boolDisplayEnableTrack,
ActionListener listenerEnableTrack) {
this(arrFormats, formatDefault, boolDisplayEnableTrack, listenerEnableTrack, null);
}
public VideoFormatChooser ( Format arrFormats[], VideoFormat formatDefault,
boolean boolDisplayEnableTrack,
ActionListener listenerEnableTrack,
boolean capture) {
this(arrFormats, formatDefault, boolDisplayEnableTrack,
listenerEnableTrack, capture? standardCaptureRates : null);
}
public VideoFormatChooser ( Format arrFormats[], VideoFormat formatDefault,
boolean boolDisplayEnableTrack,
ActionListener listenerEnableTrack,
float [] frameRates) {
int i;
int nCount;
this.arrSupportedFormats = arrFormats;
this.boolDisplayEnableTrack = boolDisplayEnableTrack;
this.listenerEnableTrack = listenerEnableTrack;
this.customFrameRates = frameRates;
nCount = arrSupportedFormats.length;
for ( i = 0; i < nCount; i++ ) {
if ( arrSupportedFormats[i] instanceof VideoFormat )
vectorContSuppFormats.addElement ( arrSupportedFormats[i] );
}
if ( isFormatSupported(formatDefault) )
this.formatOld = formatDefault;
else
this.formatOld = null;
try {
init();
}
catch (Exception e) {
e.printStackTrace();
}
}
public void setEnabled ( boolean boolEnable ) {
super.setEnabled ( boolEnable );
if ( checkEnableTrack != null )
checkEnableTrack.setEnabled ( boolEnable );
enableControls ( boolEnable );
}
public Format getFormat () {
int i;
int nSize;
String strEncoding;
Integer integerBitsPerPixel;
String strBitsPerPixel;
int nYuvType;
String strYuvType = null;
Object objectFormat;
VideoFormat formatVideo = null;
VideoFormat formatVideoNew;
RGBFormat formatRGB;
YUVFormat formatYUV;
strEncoding = comboEncoding.getSelectedItem ();
nSize = vectorContSuppFormats.size ();
for ( i = 0; i < nSize; i++ ) {
objectFormat = vectorContSuppFormats.elementAt ( i );
if ( !(objectFormat instanceof VideoFormat) )
continue;
formatVideo = (VideoFormat) objectFormat;
if ( !this.isFormatGoodForEncoding(formatVideo) )
continue;
if ( !this.isFormatGoodForVideoSize(formatVideo) )
continue;
if ( !this.isFormatGoodForFrameRate(formatVideo) )
continue;
if ( strEncoding.equalsIgnoreCase(VideoFormat.RGB) && formatVideo instanceof RGBFormat ) {
formatRGB = (RGBFormat) formatVideo;
integerBitsPerPixel = new Integer ( formatRGB.getBitsPerPixel() );
strBitsPerPixel = integerBitsPerPixel.toString ();
if ( !(comboExtra.getSelectedItem().equals(strBitsPerPixel)) )
continue;
}
else if ( strEncoding.equalsIgnoreCase(VideoFormat.YUV) && formatVideo instanceof YUVFormat ) {
formatYUV = (YUVFormat) formatVideo;
nYuvType = formatYUV.getYuvType ();
strYuvType = getYuvType ( nYuvType );
if ( strYuvType == null || !(comboExtra.getSelectedItem().equals(strYuvType)) )
continue;
}
break;
}
if ( i >= nSize )
return ( null );
if ( formatVideo.getSize() == null ) {
formatVideoNew = new VideoFormat ( null, controlSize.getVideoSize(), Format.NOT_SPECIFIED, null, -1f );
formatVideo = (VideoFormat) formatVideoNew.intersects ( formatVideo );
}
if (customFrameRates != null && formatVideo != null) {
formatVideoNew = new VideoFormat ( null, null, Format.NOT_SPECIFIED, null, getFrameRate() );
formatVideo = (VideoFormat) formatVideoNew.intersects ( formatVideo );
}
return ( formatVideo );
}
public float getFrameRate() {
String selection = comboFrameRate.getSelectedItem();
if (selection != null) {
if ( selection.equals(DEFAULT_STRING) )
return ( Format.NOT_SPECIFIED );
try {
float fr = Float.valueOf(selection).floatValue();
return fr;
}
catch (NumberFormatException nfe) {
}
}
return ( Format.NOT_SPECIFIED );
}
public void setCurrentFormat ( VideoFormat formatDefault ) {
if ( isFormatSupported(formatDefault) )
this.formatOld = formatDefault;
updateFields ( formatOld );
}
public void setFrameRate(float frameRate) {
for (int i = 0; i < comboFrameRate.getItemCount(); i++) {
float value = Float.valueOf(comboFrameRate.getItem(i)).floatValue();
if (Math.abs(frameRate - value) < 0.5) {
comboFrameRate.select(i);
return;
}
}
}
public void setSupportedFormats ( Format arrFormats[], VideoFormat formatDefault ) {
int i;
int nCount;
this.arrSupportedFormats = arrFormats;
vectorContSuppFormats.removeAllElements ();
nCount = arrSupportedFormats.length;
for ( i = 0; i < nCount; i++ ) {
if ( arrSupportedFormats[i] instanceof VideoFormat )
vectorContSuppFormats.addElement ( arrSupportedFormats[i] );
}
if ( isFormatSupported(formatDefault) )
this.formatOld = formatDefault;
else
this.formatOld = null;
setSupportedFormats ( vectorContSuppFormats );
}
public void setSupportedFormats ( Vector vectorContSuppFormats ) {
this.vectorContSuppFormats = vectorContSuppFormats;
if ( vectorContSuppFormats.isEmpty() ) {
checkEnableTrack.setState ( false );
checkEnableTrack.setEnabled ( false );
onEnableTrack ( true );
return;
}
else {
checkEnableTrack.setEnabled ( true );
checkEnableTrack.setState ( boolEnableTrackSaved );
onEnableTrack ( true );
}
if ( !isFormatSupported(this.formatOld) )
this.formatOld = null;
updateFields ( formatOld );
}
public void setTrackEnabled ( boolean boolEnable ) {
boolEnableTrackSaved = boolEnable;
if ( checkEnableTrack == null )
return;
checkEnableTrack.setState ( boolEnable );
onEnableTrack ( true );
}
public boolean isTrackEnabled () {
boolean boolEnabled;
boolEnabled = checkEnableTrack.getState ();
return ( boolEnabled );
}
public Dimension getPreferredSize () {
Dimension dim;
Dimension dimControl;
Dimension dimLabel;
dim = new Dimension ();
if ( boolDisplayEnableTrack == true ) {
dimControl = checkEnableTrack.getPreferredSize();
dim.width = Math.max ( dim.width, dimControl.width );
dim.height += dimControl.height + MARGINV;
}
dimLabel = labelEncoding.getPreferredSize ();
nWidthLabel = Math.max ( nWidthLabel, dimLabel.width );
dimControl = comboEncoding.getPreferredSize ();
nWidthData = Math.max ( nWidthData, dimControl.width );
dim.height += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelSize.getPreferredSize ();
nWidthLabel = Math.max ( nWidthLabel, dimLabel.width );
dimControl = controlSize.getPreferredSize ();
nWidthData = Math.max ( nWidthData, dimControl.width );
dim.height += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelFrameRate.getPreferredSize ();
nWidthLabel = Math.max ( nWidthLabel, dimLabel.width );
dimControl = comboFrameRate.getPreferredSize ();
nWidthData = Math.max ( nWidthData, dimControl.width );
dim.height += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelExtra.getPreferredSize ();
nWidthLabel = Math.max ( nWidthLabel, dimLabel.width );
dimControl = comboExtra.getPreferredSize ();
nWidthData = Math.max ( nWidthData, dimControl.width );
dim.height += Math.max ( dimLabel.height, dimControl.height );
dim.width = Math.max ( dim.width, nWidthLabel + MARGINH + nWidthData );
return ( dim );
}
public void doLayout () {
Dimension dimControl;
Dimension dimLabel;
Dimension dimThis;
int nLabelOffsetX;
int nDataOffsetX;
int nOffsetY;
getPreferredSize ();
nOffsetY = 0;
nLabelOffsetX = 0;
nDataOffsetX = nWidthLabel + MARGINH;
dimThis = this.getSize ();
if ( boolDisplayEnableTrack == true ) {
dimControl = checkEnableTrack.getPreferredSize();
checkEnableTrack.setBounds ( nLabelOffsetX, nOffsetY, dimControl.width, dimControl.height );
nOffsetY += dimControl.height + MARGINV;
}
dimLabel = labelEncoding.getPreferredSize ();
dimControl = comboEncoding.getPreferredSize ();
labelEncoding.setBounds ( nLabelOffsetX, nOffsetY, nWidthLabel, dimLabel.height );
comboEncoding.setBounds ( nDataOffsetX, nOffsetY, dimThis.width - nDataOffsetX, dimControl.height );
nOffsetY += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelSize.getPreferredSize ();
dimControl = controlSize.getPreferredSize ();
labelSize.setBounds ( nLabelOffsetX, nOffsetY, nWidthLabel, dimLabel.height );
controlSize.setBounds ( nDataOffsetX, nOffsetY, dimThis.width - nDataOffsetX, dimControl.height );
nOffsetY += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelFrameRate.getPreferredSize ();
dimControl = comboFrameRate.getPreferredSize ();
labelFrameRate.setBounds ( nLabelOffsetX, nOffsetY, nWidthLabel, dimLabel.height );
comboFrameRate.setBounds ( nDataOffsetX, nOffsetY, dimThis.width - nDataOffsetX, dimControl.height );
nOffsetY += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
dimLabel = labelExtra.getPreferredSize ();
dimControl = comboExtra.getPreferredSize ();
labelExtra.setBounds ( nLabelOffsetX, nOffsetY, nWidthLabel, dimLabel.height );
comboExtra.setBounds ( nDataOffsetX, nOffsetY, dimThis.width - nDataOffsetX, dimControl.height );
nOffsetY += Math.max ( dimLabel.height, dimControl.height ) + MARGINV;
}
private void init () throws Exception {
int i;
String strValue;
VideoFormat format;
VideoSize sizeVideo;
this.setLayout ( null );
checkEnableTrack = new Checkbox ( JMFI18N.getResource("formatchooser.enabletrack"), true );
checkEnableTrack.addItemListener ( this );
if ( boolDisplayEnableTrack == true ) {
this.add ( checkEnableTrack );
}
labelEncoding = new Label ( JMFI18N.getResource("formatchooser.encoding"), Label.RIGHT );
this.add ( labelEncoding );
comboEncoding = new Choice ();
comboEncoding.addItemListener ( this );
this.add ( comboEncoding );
labelSize = new Label ( JMFI18N.getResource("formatchooser.videosize"), Label.RIGHT );
this.add ( labelSize );
// controlSize = new Choice ();
if ( formatOld == null ) {
controlSize = new VideoSizeControl ();
}
else {
sizeVideo = new VideoSize ( formatOld.getSize() );
controlSize = new VideoSizeControl ( sizeVideo );
}
// controlSize.addItemListener ( this );
controlSize.addActionListener ( this );
this.add ( controlSize );
labelFrameRate = new Label ( JMFI18N.getResource("formatchooser.framerate"), Label.RIGHT );
this.add ( labelFrameRate );
comboFrameRate = new Choice ();
comboFrameRate.addItemListener ( this );
this.add ( comboFrameRate );
labelExtra = new Label ( "Extra:", Label.RIGHT );
labelExtra.setVisible ( false );
this.add ( labelExtra );
comboExtra = new Choice ();
comboExtra.setVisible ( false );
this.add ( comboExtra );
updateFields ( formatOld );
}
private void updateFields ( VideoFormat formatDefault ) {
int i;
int nSize;
String strEncoding;
String strEncodingPref = null;
Object objectFormat;
VideoFormat formatVideo;
Vector vectorEncoding = new Vector ();
boolean boolEnable;
boolEnable = comboEncoding.isEnabled ();
comboEncoding.setEnabled ( false );
comboEncoding.removeAll ();
nSize = vectorContSuppFormats.size ();
for ( i = 0; i < nSize; i++ ) {
objectFormat = vectorContSuppFormats.elementAt ( i );
if ( !(objectFormat instanceof VideoFormat) )
continue;
formatVideo = (VideoFormat) objectFormat;
strEncoding = formatVideo.getEncoding().toUpperCase();
if ( strEncodingPref == null )
strEncodingPref = strEncoding;
if ( vectorEncoding.contains(strEncoding) )
continue;
comboEncoding.addItem ( strEncoding );
vectorEncoding.addElement ( strEncoding );
}
if ( formatDefault != null ) {
strEncoding = formatDefault.getEncoding().toUpperCase();
comboEncoding.select ( strEncoding );
}
else if ( strEncodingPref != null ) {
comboEncoding.select ( strEncodingPref );
}
else if ( comboEncoding.getItemCount() > 0 )
comboEncoding.select ( 0 );
updateFieldsFromEncoding ( formatDefault );
comboEncoding.setEnabled ( boolEnable );
}
private void updateFieldsFromEncoding ( VideoFormat formatDefault ) {
int i;
int nSize;
VideoSize sizeVideo;
VideoSize sizeVideoPref = null;
boolean boolVideoSizePref = false;
Object objectFormat;
VideoFormat formatVideo;
// Vector vectorSizes = new Vector ();
Dimension formatVideoSize;
boolean boolEnable;
boolEnable = controlSize.isEnabled ();
controlSize.setEnabled ( false );
controlSize.removeAll ();
nSize = vectorContSuppFormats.size ();
for ( i = 0; i < nSize; i++ ) {
objectFormat = vectorContSuppFormats.elementAt ( i );
if ( !(objectFormat instanceof VideoFormat) )
continue;
formatVideo = (VideoFormat) objectFormat;
if ( !this.isFormatGoodForEncoding(formatVideo) )
continue;
formatVideoSize = formatVideo.getSize();
if (formatVideoSize == null)
// sizeVideo = new Dimension(-1, -1);
sizeVideo = null;
else
sizeVideo = new VideoSize ( formatVideoSize );
if ( boolVideoSizePref == false ) {
boolVideoSizePref = true;
sizeVideoPref = sizeVideo;
}
// if ( vectorSizes.contains(sizeVideo) )
// continue;
// controlSize.addItem ( sizeVideo.toString() );
controlSize.addItem ( sizeVideo );
// vectorSizes.addElement ( sizeVideo );
}
if ( formatDefault != null && this.isFormatGoodForEncoding(formatDefault) ) {
formatVideoSize = formatDefault.getSize();
if (formatVideoSize == null)
sizeVideo = null;
// sizeVideo = new Dimension(-1, -1);
else
sizeVideo = new VideoSize ( formatVideoSize );
// controlSize.select ( sizeVideo.toString() );
controlSize.select ( sizeVideo );
}
else if ( boolVideoSizePref == true ) {
// controlSize.select ( sizeVideoPref.toString() );
controlSize.select ( sizeVideoPref );
}
else if ( controlSize.getItemCount() > 0 )
controlSize.select ( 0 );
updateFieldsFromSize ( formatDefault );
controlSize.setEnabled ( boolEnable );
}
private void updateFieldsFromSize ( VideoFormat formatDefault ) {
int i;
int nSize;
Float floatFrameRate;
Float floatFrameRatePref = null;
Object objectFormat;
VideoFormat formatVideo;
Vector vectorRates = new Vector ();
boolean boolEnable;
boolEnable = comboFrameRate.isEnabled ();
comboFrameRate.setEnabled ( false );
if (customFrameRates == null)
comboFrameRate.removeAll ();
else if (comboFrameRate.getItemCount() < 1) {
// fill in with custom frame rates
for (i = 0; i < customFrameRates.length; i++)
comboFrameRate.addItem(Float.toString(customFrameRates[i]));
}
nSize = vectorContSuppFormats.size ();
for ( i = 0; i < nSize; i++ ) {
objectFormat = vectorContSuppFormats.elementAt ( i );
if ( !(objectFormat instanceof VideoFormat) )
continue;
formatVideo = (VideoFormat) objectFormat;
if ( !this.isFormatGoodForEncoding(formatVideo) )
continue;
if ( !this.isFormatGoodForVideoSize(formatVideo) )
continue;
if (customFrameRates != null) {
continue;
}
floatFrameRate = new Float ( formatVideo.getFrameRate() );
if ( floatFrameRatePref == null )
floatFrameRatePref = floatFrameRate;
if ( vectorRates.contains(floatFrameRate) )
continue;
if ( floatFrameRate.floatValue() == Format.NOT_SPECIFIED )
comboFrameRate.addItem ( DEFAULT_STRING );
else
comboFrameRate.addItem ( floatFrameRate.toString() );
vectorRates.addElement ( floatFrameRate );
}
if ( formatDefault != null && customFrameRates == null
&& this.isFormatGoodForEncoding(formatDefault)
&& this.isFormatGoodForVideoSize(formatDefault) ) {
floatFrameRate = new Float ( formatDefault.getFrameRate() );
if ( floatFrameRate.floatValue() == Format.NOT_SPECIFIED )
comboFrameRate.select ( DEFAULT_STRING );
else
comboFrameRate.select ( floatFrameRate.toString() );
}
else if ( floatFrameRatePref != null ) {
if ( floatFrameRatePref.floatValue() == Format.NOT_SPECIFIED )
comboFrameRate.select ( DEFAULT_STRING );
else
comboFrameRate.select ( floatFrameRatePref.toString() );
}
else if ( comboFrameRate.getItemCount() > 0 )
comboFrameRate.select ( 0 );
updateFieldsFromRate ( formatDefault );
comboFrameRate.setEnabled ( boolEnable );
}
private void updateFieldsFromRate ( VideoFormat formatDefault ) {
int i;
int nSize;
String strEncoding;
Integer integerBitsPerPixel;
int nYuvType;
String strYuvType = null;
Object objectFormat;
VideoFormat formatVideo;
RGBFormat formatRGB;
YUVFormat formatYUV;
Vector vectorExtra = new Vector ();
boolean boolRGB = false;
boolean boolYUV = false;
boolean boolEnable;
strEncoding = comboEncoding.getSelectedItem ();
if ( strEncoding == null )
return;
if ( strEncoding.equalsIgnoreCase(VideoFormat.RGB) ) {
labelExtra.setText ( JMFI18N.getResource("formatchooser.bitsperpixel") );
labelExtra.setVisible ( true );
comboExtra.setVisible ( true );
boolRGB = true;
}
else if ( strEncoding.equalsIgnoreCase(VideoFormat.YUV) ) {
labelExtra.setText ( JMFI18N.getResource("formatchooser.yuvtype") );
labelExtra.setVisible ( true );
comboExtra.setVisible ( true );
boolYUV = true;
}
else {
labelExtra.setVisible ( false );
comboExtra.setVisible ( false );
return;
}
boolEnable = comboExtra.isEnabled ();
comboExtra.setEnabled ( false );
comboExtra.removeAll ();
nSize = vectorContSuppFormats.size ();
for ( i = 0; i < nSize; i++ ) {
objectFormat = vectorContSuppFormats.elementAt ( i );
if ( !(objectFormat instanceof VideoFormat) )
continue;
formatVideo = (VideoFormat) objectFormat;
if ( !this.isFormatGoodForEncoding(formatVideo) )
continue;
if ( !this.isFormatGoodForVideoSize(formatVideo) )
continue;
if ( !this.isFormatGoodForFrameRate(formatVideo) )
continue;
if ( boolRGB == true && formatVideo instanceof RGBFormat ) {
formatRGB = (RGBFormat) formatVideo;
integerBitsPerPixel = new Integer ( formatRGB.getBitsPerPixel() );
if ( !(vectorExtra.contains(integerBitsPerPixel)) ) {
comboExtra.addItem ( integerBitsPerPixel.toString() );
vectorExtra.addElement ( integerBitsPerPixel );
}
}
else if ( boolYUV == true && formatVideo instanceof YUVFormat ) {
formatYUV = (YUVFormat) formatVideo;
nYuvType = formatYUV.getYuvType ();
strYuvType = getYuvType ( nYuvType );
if ( strYuvType != null && !(vectorExtra.contains(strYuvType)) ) {
comboExtra.addItem ( strYuvType );
vectorExtra.addElement ( strYuvType );
}
}
}
if ( formatDefault != null && this.isFormatGoodForEncoding(formatDefault)
&& this.isFormatGoodForVideoSize(formatDefault)
&& this.isFormatGoodForFrameRate(formatDefault) ) {
if ( boolRGB == true && formatDefault instanceof RGBFormat ) {
formatRGB = (RGBFormat) formatDefault;
integerBitsPerPixel = new Integer ( formatRGB.getBitsPerPixel() );
comboExtra.select ( integerBitsPerPixel.toString() );
}
else if ( boolYUV == true && formatDefault instanceof YUVFormat ) {
formatYUV = (YUVFormat) formatDefault;
nYuvType = formatYUV.getYuvType ();
strYuvType = getYuvType ( nYuvType );
if ( strYuvType != null )
comboExtra.select ( strYuvType );
}
else if ( comboExtra.getItemCount() > 0 )
comboExtra.select ( 0 );
}
else if ( comboExtra.getItemCount() > 0 )
comboExtra.select ( 0 );
comboExtra.setEnabled ( boolEnable );
}
private boolean isFormatGoodForEncoding ( VideoFormat format ) {
String strEncoding;
boolean boolResult = false;
strEncoding = comboEncoding.getSelectedItem ();
if ( strEncoding != null ) {
boolResult = format.getEncoding().equalsIgnoreCase(strEncoding);
}
return ( boolResult );
}
private boolean isFormatGoodForVideoSize ( VideoFormat format ) {
VideoSize sizeVideo;
boolean boolResult = false;
Dimension formatVideoSize;
sizeVideo = controlSize.getVideoSize ();
formatVideoSize = format.getSize();
if ( formatVideoSize == null )
boolResult = true;
else
boolResult = sizeVideo.equals(formatVideoSize);
return ( boolResult );
}
private boolean isFormatGoodForFrameRate ( VideoFormat format ) {
String strFrameRate;
float fFrameRate1;
float fFrameRate2;
boolean boolResult = false;
// If custom frame rates (VFW capture), always true
if (customFrameRates != null)
return true;
strFrameRate = comboFrameRate.getSelectedItem ();
if ( strFrameRate.equals(DEFAULT_STRING) )
return true;
fFrameRate2 = format.getFrameRate();
if ( fFrameRate2 == Format.NOT_SPECIFIED )
return true;
if ( strFrameRate != null ) {
fFrameRate1 = Float.valueOf(strFrameRate).floatValue();
boolResult = (fFrameRate1 == fFrameRate2);
}
return ( boolResult );
}
private boolean isFormatSupported ( VideoFormat format ) {
int i;
int nCount;
VideoFormat formatVideo;
boolean boolSupported = false;
if ( format == null )
return ( boolSupported );
nCount = vectorContSuppFormats.size ();
for ( i = 0; i < nCount && boolSupported == false; i++ ) {
formatVideo = (VideoFormat) vectorContSuppFormats.elementAt ( i );
if ( formatVideo.matches(format) )
boolSupported = true;
}
return ( boolSupported );
}
public void actionPerformed ( ActionEvent event ) {
if ( event.getActionCommand().equals(VideoSizeControl.ACTION_SIZE_CHANGED) ) {
updateFieldsFromSize ( formatOld );
}
}
public void itemStateChanged ( ItemEvent event ) {
Object objectSource;
objectSource = event.getSource ();
if ( objectSource == checkEnableTrack ) {
boolEnableTrackSaved = checkEnableTrack.getState ();
onEnableTrack ( true );
}
else if ( objectSource == comboEncoding ) {
updateFieldsFromEncoding ( formatOld );
}
else if ( objectSource == controlSize ) {
updateFieldsFromSize ( formatOld );
}
else if ( objectSource == comboFrameRate ) {
updateFieldsFromRate ( formatOld );
}
}
private void onEnableTrack ( boolean notifyListener ) {
boolean boolEnable;
ActionEvent event;
boolEnable = checkEnableTrack.getState ();
enableControls ( boolEnable && this.isEnabled() );
if ( notifyListener == true && listenerEnableTrack != null ) {
if ( boolEnable == true )
event = new ActionEvent ( this, ActionEvent.ACTION_PERFORMED, ACTION_TRACK_ENABLED );
else
event = new ActionEvent ( this, ActionEvent.ACTION_PERFORMED, ACTION_TRACK_DISABLED );
listenerEnableTrack.actionPerformed ( event );
}
}
private void enableControls ( boolean boolEnable ) {
labelEncoding.setEnabled ( boolEnable );
comboEncoding.setEnabled ( boolEnable );
labelSize.setEnabled ( boolEnable );
controlSize.setEnabled ( boolEnable );
labelFrameRate.setEnabled ( boolEnable );
comboFrameRate.setEnabled ( boolEnable );
labelExtra.setEnabled ( boolEnable );
comboExtra.setEnabled ( boolEnable );
}
private String getYuvType ( int nType ) {
String strType = null;
if ( (nType & YUVFormat.YUV_420) == YUVFormat.YUV_420 )
strType = JMFI18N.getResource("formatchooser.yuv.4:2:0");
else if ( (nType & YUVFormat.YUV_422) == YUVFormat.YUV_422 )
strType = JMFI18N.getResource("formatchooser.yuv.4:2:2");
else if ( (nType & YUVFormat.YUV_YUYV) == YUVFormat.YUV_YUYV )
strType = JMFI18N.getResource("formatchooser.yuv.YUYV");
else if ( (nType & YUVFormat.YUV_111) == YUVFormat.YUV_111 )
strType = JMFI18N.getResource("formatchooser.yuv.1:1:1");
else if ( (nType & YUVFormat.YUV_411) == YUVFormat.YUV_411 )
strType = JMFI18N.getResource("formatchooser.yuv.4:1:1");
else if ( (nType & YUVFormat.YUV_YVU9) == YUVFormat.YUV_YVU9 )
strType = JMFI18N.getResource("formatchooser.yuv.YVU9");
else
strType = null;
return ( strType );
}
}
class VideoSize extends Dimension {
public VideoSize () {
super ();
}
public VideoSize ( int nWidth, int nHeight ) {
super ( nWidth, nHeight );
}
public VideoSize ( Dimension dim ) {
super ( dim );
}
public boolean equals ( Dimension dim ) {
boolean boolResult = true;
if ( dim == null )
boolResult = false;
if ( boolResult == true )
boolResult = (this.width == dim.width);
if ( boolResult == true )
boolResult = (this.height == dim.height);
return ( boolResult );
}
public String toString () {
return ( "" + this.width + " x " + this.height );
}
}
class VideoSizeControl extends Panel implements ItemListener, ComponentListener {
private Choice comboSize;
private Panel panelCustom;
private TextField textWidth;
private TextField textHeight;
private Label labelX;
private Hashtable htSizes = new Hashtable ();
private VideoSize sizeVideoDefault = null;
private ActionListener listener;
public static final String ACTION_SIZE_CHANGED = "Size Changed";
static final String CUSTOM_STRING = JMFI18N.getResource("formatchooser.custom");
public VideoSizeControl () {
this ( null );
}
public VideoSizeControl ( VideoSize sizeVideoDefault ) {
super ();
this.sizeVideoDefault = sizeVideoDefault;
init ();
}
/*
public Dimension getPreferredSize () {
Dimension dim;
Dimension dimFieldWidth;
Dimension dimFieldHeight;
dim = labelX.getPreferredSize();
dimFieldWidth = textWidth.getPreferredSize();
dimFieldHeight = textHeight.getPreferredSize();
dim.height = Math.max ( dim.height, dimFieldWidth.height );
dim.height = Math.max ( dim.height, dimFieldHeight.height );
dim.width += 2 * Math.max ( dimFieldWidth.width, dimFieldHeight.width );
return ( dim );
}
*/
public void setEnabled ( boolean boolEnable ) {
super.setEnabled ( boolEnable );
comboSize.setEnabled ( boolEnable );
textWidth.setEnabled ( boolEnable );
textHeight.setEnabled ( boolEnable );
labelX.setEnabled ( boolEnable );
if ( boolEnable == true )
updateFields ();
}
public void addActionListener ( ActionListener listener ) {
this.listener = listener;
}
public VideoSize getVideoSize () {
String strItem;
VideoSize sizeVideo;
Object objSize;
int nWidth;
int nHeight;
strItem = comboSize.getSelectedItem ();
objSize = htSizes.get ( strItem );
if ( objSize == null || !(objSize instanceof VideoSize)
|| strItem.equals(CUSTOM_STRING) ) {
try {
nWidth = Integer.valueOf(textWidth.getText()).intValue();
}
catch ( Exception exception ) {
nWidth = 0;
}
try {
nHeight = Integer.valueOf(textHeight.getText()).intValue();
}
catch ( Exception exception ) {
nHeight = 0;
}
sizeVideo = new VideoSize ( nWidth, nHeight );
}
else {
sizeVideo = (VideoSize) objSize;
}
return ( sizeVideo );
}
public void addItem ( VideoSize sizeVideo ) {
String strItem;
if ( sizeVideo == null ) {
sizeVideo = new VideoSize ( -1, -1 );
strItem = CUSTOM_STRING;
}
else {
strItem = sizeVideo.toString ();
}
if ( htSizes.containsKey(strItem) )
return;
comboSize.addItem ( strItem );
htSizes.put ( strItem, sizeVideo );
if ( comboSize.getItemCount() == 1 )
updateFields ();
}
public void removeAll () {
comboSize.removeAll ();
htSizes = new Hashtable ();
updateFields ();
}
public void select ( VideoSize sizeVideo ) {
if ( sizeVideo == null )
comboSize.select ( CUSTOM_STRING );
else
comboSize.select ( sizeVideo.toString() );
updateFields ();
}
public void select ( int nIndex ) {
comboSize.select ( nIndex );
updateFields ();
}
public int getItemCount () {
return ( comboSize.getItemCount() );
}
private void init () {
Label label;
setLayout ( new GridLayout(0,1,4,4) );
comboSize = new Choice ();
comboSize.addItem ( CUSTOM_STRING );
comboSize.addItemListener ( this );
this.add ( comboSize );
panelCustom = new Panel (null);
panelCustom.addComponentListener ( this );
this.add ( panelCustom );
if ( sizeVideoDefault == null )
textWidth = new TextField ( 3 );
else
textWidth = new TextField ( "" + sizeVideoDefault.width, 3 );
panelCustom.add ( textWidth, BorderLayout.CENTER );
labelX = new Label ( "x", Label.CENTER );
panelCustom.add ( labelX, BorderLayout.WEST );
if ( sizeVideoDefault == null )
textHeight = new TextField ( 3 );
else
textHeight = new TextField ( "" + sizeVideoDefault.height, 3 );
panelCustom.add ( textHeight, BorderLayout.CENTER );
updateFields ();
}
private void updateFields () {
String strItem;
boolean boolEnable;
VideoSize sizeVideo;
strItem = comboSize.getSelectedItem ();
if ( strItem == null || strItem.equals(CUSTOM_STRING) ) {
boolEnable = true;
}
else {
sizeVideo = (VideoSize) htSizes.get ( strItem );
textWidth.setText ( "" + sizeVideo.width );
textHeight.setText ( "" + sizeVideo.height );
boolEnable = false;
}
textWidth.setEnabled ( boolEnable );
textHeight.setEnabled ( boolEnable );
labelX.setEnabled ( boolEnable );
}
private void resizeCustomFields () {
Dimension dimPanel;
Dimension dimLabelX;
int nWidth;
dimPanel = panelCustom.getSize();
dimLabelX = labelX.getPreferredSize();
nWidth = (dimPanel.width - dimLabelX.width) / 2;
textWidth.setBounds ( 0, 0, nWidth, dimPanel.height );
labelX.setBounds ( nWidth, 0, dimLabelX.width, dimPanel.height );
textHeight.setBounds ( nWidth + dimLabelX.width, 0, nWidth, dimPanel.height );
}
public void itemStateChanged ( ItemEvent event ) {
Object objectSource;
ActionEvent eventAction;
objectSource = event.getSource ();
if ( objectSource != comboSize )
return;
updateFields ();
if ( listener != null ) {
eventAction = new ActionEvent ( this, ActionEvent.ACTION_PERFORMED, ACTION_SIZE_CHANGED );
listener.actionPerformed ( eventAction );
}
}
public void componentResized ( ComponentEvent event ) {
resizeCustomFields ();
}
public void componentMoved ( ComponentEvent event ) {
}
public void componentShown ( ComponentEvent event ) {
}
public void componentHidden ( ComponentEvent event ) {
}
}
|