FileDocCategorySizeDatePackage
PanelMediaTargetFormat.javaAPI DocJMF 2.1.1e15071Mon May 12 12:20:32 BST 2003jmapps.export

PanelMediaTargetFormat.java

/*
 * @(#)PanelMediaTargetFormat.java	1.6 02/08/21
 *
 * Copyright (c) 1996-2002 Sun Microsystems, Inc.  All rights reserved.
 */

package jmapps.export;

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;
import com.sun.media.ui.TabControl;
import com.sun.media.ui.AudioFormatChooser;
import com.sun.media.ui.VideoFormatChooser;

import jmapps.ui.*;


public class PanelMediaTargetFormat extends JMPanel implements ActionListener, ItemListener {

    private Processor               processor = null;
    private String                  strTargetType = PanelMediaTargetType.TYPE_OTHER;
    private ContentDescriptor       arrContentDescriptors [] = null;
    private Hashtable               hashtableContentDescriptors = null;
    private TrackControl            arrTrackControls [] = null;
    private String                  arrAllowContentType [] = null;

    private JMPanel         panelContent;
    private Choice          comboContentType;
    private TabControl      tabControl;
    private Vector          vectorPanelsAudio;
    private Vector          vectorPanelsVideo;
    private Vector          vectorTracksAudio;
    private Vector          vectorTracksVideo;

    private Image           imageAudioEn = null;
    private Image           imageAudioDis = null;
    private Image           imageVideoEn = null;
    private Image           imageVideoDis = null;


    public PanelMediaTargetFormat () {
    	super ();

    	try {
    	    init ();
    	}
    	catch ( Exception exception ) {
    	    exception.printStackTrace ();
    	}
    }

    public void setAllowContentType ( String arrAllowContentType[] ) {
        this.arrAllowContentType = arrAllowContentType;
    }

    private void init () throws Exception {
    	Panel	   panelDescription;
//        Toolkit    toolkit;

    	this.setLayout ( new BorderLayout(6,6) );

    	panelDescription = new Panel ( new GridLayout(0,1) );
    	this.add ( panelDescription, BorderLayout.NORTH );
    	panelDescription.add ( new Label(JMFI18N.getResource("jmstudio.export.format.label1")) );
    	panelDescription.add ( new Label(JMFI18N.getResource("jmstudio.export.format.label2")) );

        panelContent = new JMPanel ( new BorderLayout(6,6) );
        panelContent.setEmptyBorder ( 6, 6, 6, 6 );
        this.add ( panelContent, BorderLayout.CENTER );

        imageAudioEn = ImageArea.loadImage ( "audio.gif", this, true );
        imageAudioDis = ImageArea.loadImage ( "audio-disabled.gif", this, true );
        imageVideoEn = ImageArea.loadImage ( "video.gif", this, true );
        imageVideoDis = ImageArea.loadImage ( "video-disabled.gif", this, true );
    }

    public void setProcessor ( Processor processor, String strContType, String strTargetType ) {
        this.processor = processor;
        this.strTargetType = strTargetType;

        arrContentDescriptors = processor.getSupportedContentDescriptors ();
        arrTrackControls = processor.getTrackControls ();

        panelContent.removeAll ();
        buildPage ();

        if ( strTargetType.equals(PanelMediaTargetType.TYPE_NETWORK) )
            strContType = (new ContentDescriptor(ContentDescriptor.RAW_RTP)).toString ();
        if ( strTargetType.equals(PanelMediaTargetType.TYPE_SCREEN) )
            strContType = (new ContentDescriptor(ContentDescriptor.RAW)).toString ();

        if ( strContType != null )
            comboContentType.select ( strContType );
        changeContentType ();
    }

    public void updateProcessorFormat () {
        int                 i;
        int                 nCount;
        VideoFormatChooser  panelVideo;
        AudioFormatChooser  panelAudio;
        TrackControl        trackControl;
        Format              format;


        nCount = vectorPanelsVideo.size ();
        for ( i = 0;  i < nCount;  i++ ) {
            panelVideo = (VideoFormatChooser) vectorPanelsVideo.elementAt ( i );
            trackControl = (TrackControl) vectorTracksVideo.elementAt ( i );

            if ( panelVideo.isTrackEnabled() == false ) {
                trackControl.setEnabled ( false );
                continue;
            }
            format = panelVideo.getFormat ();
            if ( format == null ) {
                MessageDialog.createErrorDialog ( this.getFrame(), "Internal error. Unable to match choosen video format. Track will be disabled." );
                trackControl.setEnabled ( false );
            }
            else {
                trackControl.setEnabled ( true );
                trackControl.setFormat ( format );
            }
        }

        nCount = vectorPanelsAudio.size ();
        for ( i = 0;  i < nCount;  i++ ) {
            panelAudio = (AudioFormatChooser) vectorPanelsAudio.elementAt ( i );
            trackControl = (TrackControl) vectorTracksAudio.elementAt ( i );

            if ( panelAudio.isTrackEnabled() == false ) {
                trackControl.setEnabled ( false );
                continue;
            }
            format = panelAudio.getFormat ();
            if ( format == null ) {
                MessageDialog.createErrorDialog ( this.getFrame(), "Internal error. Unable to match choosen audio format. Track will be disabled." );
                trackControl.setEnabled ( false );
            }
            else {
                trackControl.setEnabled ( true );
                trackControl.setFormat ( format );
            }
        }
    }

    public boolean[] getEnabledVideoTracks () {
        int                 i;
        int                 nCount;
        VideoFormatChooser  panelVideo;
        boolean             arrResult [];


        nCount = vectorPanelsVideo.size ();
        arrResult = new boolean [ nCount ];
        for ( i = 0;  i < nCount;  i++ ) {
            panelVideo = (VideoFormatChooser) vectorPanelsVideo.elementAt ( i );
            arrResult[i] = panelVideo.isTrackEnabled ();
        }
        return ( arrResult );
    }

    public boolean[] getEnabledAudioTracks () {
        int                 i;
        int                 nCount;
        AudioFormatChooser  panelAudio;
        boolean             arrResult [];


        nCount = vectorPanelsAudio.size ();
        arrResult = new boolean [ nCount ];
        for ( i = 0;  i < nCount;  i++ ) {
            panelAudio = (AudioFormatChooser) vectorPanelsAudio.elementAt ( i );
            arrResult[i] = panelAudio.isTrackEnabled ();
        }
        return ( arrResult );
    }

    public void actionPerformed ( ActionEvent event ) {
        String        strCmd;
        Object        objectSource;

        strCmd = event.getActionCommand ();
        objectSource = event.getSource ();

        if ( strCmd.equals(AudioFormatChooser.ACTION_TRACK_ENABLED) ) {
            if ( objectSource instanceof AudioFormatChooser )
                tabControl.setPageImage ( (Panel)objectSource, imageAudioEn );
        }
        else if ( strCmd.equals(AudioFormatChooser.ACTION_TRACK_DISABLED) ) {
            if ( objectSource instanceof AudioFormatChooser )
                tabControl.setPageImage ( (Panel)objectSource, imageAudioDis );
        }
        else if ( strCmd.equals(VideoFormatChooser.ACTION_TRACK_ENABLED) ) {
            if ( objectSource instanceof VideoFormatChooser )
                tabControl.setPageImage ( (Panel)objectSource, imageVideoEn );
        }
        else if ( strCmd.equals(VideoFormatChooser.ACTION_TRACK_DISABLED) ) {
            if ( objectSource instanceof VideoFormatChooser )
                tabControl.setPageImage ( (Panel)objectSource, imageVideoDis );
        }
    }

    public void itemStateChanged ( ItemEvent event ) {
        Object              objectSource;

        objectSource = event.getSource ();
        if ( objectSource == comboContentType ) {
            changeContentType ();
        }
    }

    private void buildPage () {
        int      i;
        int      nCount;
        String   strContType;
        Panel    panelFormat;
        Panel    panel;
        Label    label;


        panelFormat = new Panel ( new BorderLayout(6,6) );
        panelContent.add ( panelFormat, BorderLayout.NORTH );

        label = new Label ( JMFI18N.getResource("jmstudio.export.format.format") );
        panelFormat.add ( label, BorderLayout.WEST );
        comboContentType = new Choice ();
        comboContentType.addItemListener ( this );
        nCount = arrContentDescriptors.length;
        hashtableContentDescriptors = new Hashtable ();
        for ( i = 0;  i < nCount;  i++ ) {
            strContType = arrContentDescriptors[i].getContentType();
            // filter
            if ( !isContentTypeAllowed(strContType) )
                continue;

            strContType = arrContentDescriptors[i].toString ();
            comboContentType.addItem ( strContType );
            hashtableContentDescriptors.put ( strContType, arrContentDescriptors[i] );
        }
        panelFormat.add ( comboContentType, BorderLayout.CENTER );

        panel = buildTrackFormatPanel ();
        panelContent.add ( panel, BorderLayout.CENTER );
    }

    private Panel buildTrackFormatPanel () {
//        Panel               panel;
        AudioFormatChooser  chooserAudio;
        VideoFormatChooser  chooserVideo;
        int                 i;
        int                 nCount;
        int                 nIndexAudio;
        int                 nIndexVideo;
        int                 nAudioTrackCount = 0;
        int                 nVideoTrackCount = 0;
        Format              format;
        String              strTitle;
        String              strEncoding;
        String              strAudio = JMFI18N.getResource("jmstudio.export.format.audio");
        String              strVideo = JMFI18N.getResource("jmstudio.export.format.video");
        String              strHinted = JMFI18N.getResource("jmstudio.export.format.hinted");


        tabControl = new TabControl ( TabControl.ALIGN_TOP );

        nIndexAudio = 0;
        nIndexVideo = 0;
        nAudioTrackCount = 0;
        nVideoTrackCount = 0;
        vectorPanelsAudio = new Vector ();
        vectorPanelsVideo = new Vector ();
        vectorTracksAudio = new Vector ();
        vectorTracksVideo = new Vector ();

        nCount = arrTrackControls.length;
        for ( i = 0;  i < nCount;  i++ ) {
            format = arrTrackControls[i].getFormat ();
            if ( format instanceof VideoFormat )
                nVideoTrackCount++;
            if ( format instanceof AudioFormat )
                nAudioTrackCount++;
        }

        for ( i = 0;  i < nCount;  i++ ) {
            format = arrTrackControls[i].getFormat ();
            if ( format instanceof AudioFormat ) {
                if ( nAudioTrackCount < 2 )
                    strTitle = new String ( strAudio );
                else {
                    nIndexAudio++;
                    strTitle = new String ( strAudio + " " + nIndexAudio );
                }
                strEncoding = format.getEncoding ();
                if ( strEncoding.endsWith("/rtp") )
                    strTitle = strTitle + " " + strHinted;
                chooserAudio = new AudioFormatChooser ( arrTrackControls[i].getSupportedFormats(), (AudioFormat)format, true, this );
                chooserAudio.setTrackEnabled ( arrTrackControls[i].isEnabled() );
                tabControl.addPage ( chooserAudio, strTitle, imageAudioEn );
                vectorPanelsAudio.addElement ( chooserAudio );
                vectorTracksAudio.addElement ( arrTrackControls[i] );
            }
            else if ( format instanceof VideoFormat ) {
                if ( nVideoTrackCount < 2 )
                    strTitle = new String ( strVideo );
                else {
                    nIndexVideo++;
                    strTitle = new String ( strVideo + " " + nIndexVideo );
                }
                strEncoding = format.getEncoding ();
                if ( strEncoding.endsWith("/rtp") )
                    strTitle = strTitle + " " + strHinted;
                chooserVideo = new VideoFormatChooser ( arrTrackControls[i].getSupportedFormats(), (VideoFormat)format, true, this );
                chooserVideo.setTrackEnabled ( arrTrackControls[i].isEnabled() );
                tabControl.addPage ( chooserVideo, strTitle, imageVideoEn );
                vectorPanelsVideo.addElement ( chooserVideo );
                vectorTracksVideo.addElement ( arrTrackControls[i] );
            }
        }

        return ( tabControl );
    }

    private void changeContentType () {
        int                 i;
        int                 nCount;
        VideoFormatChooser  panelVideo;
        AudioFormatChooser  panelAudio;
        TrackControl        trackControl;
        String              strContentType;
        ContentDescriptor   contentDescriptor;


        strContentType = comboContentType.getSelectedItem ();
        contentDescriptor = (ContentDescriptor) hashtableContentDescriptors.get ( strContentType );

        if ( processor.setContentDescriptor(contentDescriptor) == null ) {
            System.err.println ( "Error setting content descriptor on " + "processor" );
        }

        nCount = vectorPanelsVideo.size ();
        for ( i = 0;  i < nCount;  i++ ) {
            panelVideo = (VideoFormatChooser) vectorPanelsVideo.elementAt ( i );
            trackControl = (TrackControl) vectorTracksVideo.elementAt ( i );
            panelVideo.setSupportedFormats ( trackControl.getSupportedFormats(), (VideoFormat)trackControl.getFormat() );
        }

        nCount = vectorPanelsAudio.size ();
        for ( i = 0;  i < nCount;  i++ ) {
            panelAudio = (AudioFormatChooser) vectorPanelsAudio.elementAt ( i );
            trackControl = (TrackControl) vectorTracksAudio.elementAt ( i );
            panelAudio.setSupportedFormats ( trackControl.getSupportedFormats(), (AudioFormat)trackControl.getFormat() );
        }
    }

    private boolean isContentTypeAllowed ( String strContType ) {
        int        i;
        boolean    boolResult = false;
        String     strTypeRaw;
        String     strTypeRawRtp;

        if ( arrAllowContentType != null ) {
            for ( i = 0;  i < arrAllowContentType.length  &&  boolResult == false;  i++ ) {
                if ( arrAllowContentType[i].equalsIgnoreCase(strContType) )
                    boolResult = true;
            }
        }
        else if ( strTargetType.equals(PanelMediaTargetType.TYPE_NETWORK) ) {
            strTypeRaw = ContentDescriptor.mimeTypeToPackageName ( ContentDescriptor.RAW );
            strTypeRawRtp = ContentDescriptor.mimeTypeToPackageName ( ContentDescriptor.RAW_RTP );
            if ( strContType.equals(strTypeRaw)  ||  strContType.equals(strTypeRawRtp) )
                boolResult = true;
        }
        else
            boolResult = true;

        return ( boolResult );
    }

}