001: /*
002: *
003: * Copyright (c) 2000 Silvere Martin-Michiellot All Rights Reserved.
004: *
005: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
006: * royalty free, license to use, modify and redistribute this
007: * software in source and binary code form,
008: * provided that i) this copyright notice and license appear on all copies of
009: * the software; and ii) Licensee does not utilize the software in a manner
010: * which is disparaging to Silvere Martin-Michiellot.
011: *
012: * This software is provided "AS IS," without a warranty of any kind. ALL
013: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
014: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
015: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
016: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
017: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
018: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
019: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
020: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
021: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
022: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
023: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
024: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
025: *
026: * This software is not designed or intended for use in on-line control of
027: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
028: * the design, construction, operation or maintenance of any nuclear
029: * facility. Licensee represents and warrants that it will not use or
030: * redistribute the Software for such purposes.
031: *
032: *
033: */
034:
035: package com.db.media.out;
036:
037: import javax.media.*;
038: import javax.media.Format;
039: import javax.media.format.*;
040: import javax.media.format.RGBFormat;
041: import javax.media.protocol.*;
042: import java.awt.Dimension;
043: import java.io.IOException;
044: import javax.media.j3d.Canvas3D;
045: import java.io.IOException;
046:
047: public class AudioVideoSaver {
048:
049: Format formats[] = new Format[2];
050: Processor processor;
051: DataSink dataSink;
052:
053: public static final boolean DEBUG = false;
054:
055: //There is currentely NO WAY OF CAPTURING SOUND rendered by the Java3D system.
056:
057: public static final int AUDIO_VIDEO = 0;
058: public static final int AUDIO_ONLY = 1;
059: public static final int VIDEO_ONLY = 2;
060:
061: public static final int DEFAULT_OUTPUT_TYPE = VIDEO_ONLY;
062:
063: protected int outputType = DEFAULT_OUTPUT_TYPE;
064:
065: public AudioVideoSaver(String url, Canvas3D canvas3D,
066: Dimension dimension, int outputType) {
067:
068: FileTypeDescriptor fileTypeDescriptor;
069: J3DPullBufferDataSource j3DPullBufferDataSource;
070: ProcessorModel processorModel;
071: //following line can't work until there is a way to cupture Audio
072: //this.outputType=outputType;
073: //line replaced by:
074: //outputType = this.outputType;
075:
076: switch (outputType) {
077: case AudioVideoSaver.AUDIO_VIDEO: {
078: formats[0] = new AudioFormat(AudioFormat.IMA4);
079: formats[1] = new VideoFormat(VideoFormat.CINEPAK);
080: fileTypeDescriptor = new FileTypeDescriptor(
081: FileTypeDescriptor.QUICKTIME);
082: }
083: case AudioVideoSaver.AUDIO_ONLY: {
084: formats[0] = new AudioFormat(AudioFormat.IMA4);
085: fileTypeDescriptor = new FileTypeDescriptor(
086: FileTypeDescriptor.WAVE);
087: }
088: default: {
089: formats[0] = new AudioFormat(AudioFormat.IMA4);
090: formats[1] = new VideoFormat(VideoFormat.CINEPAK);
091: fileTypeDescriptor = new FileTypeDescriptor(
092: FileTypeDescriptor.QUICKTIME);
093: }
094: }
095:
096: j3DPullBufferDataSource = new J3DPullBufferDataSource(canvas3D,
097: dimension);
098:
099: processorModel = new ProcessorModel(j3DPullBufferDataSource,
100: formats, fileTypeDescriptor);
101:
102: try {
103: processor = Manager.createRealizedProcessor(processorModel);
104: } catch (IOException e) {
105: System.exit(-1);
106: } catch (NoProcessorException e) {
107: System.exit(-1);
108: } catch (CannotRealizeException e) {
109: System.exit(-1);
110: }
111:
112: //get the output of processor
113: DataSource dataSource = processor.getDataOutput();
114: //create a file protocol MediaLocator with the location of the file to which bits are to be written
115: MediaLocator mediaLocator = new MediaLocator(url);
116: //create a datasink to do the file writing and open the sink to make sure we can write to it.
117: dataSink = null;
118: try {
119: dataSink = Manager.createDataSink(dataSource, mediaLocator);
120: dataSink.open();
121: } catch (NoDataSinkException e) {
122: System.exit(-1);
123: } catch (SecurityException e) {
124: System.exit(-1);
125: } catch (IOException e) {
126: System.exit(-1);
127: }
128:
129: }
130:
131: public void start() {
132:
133: try {
134: dataSink.start();
135: } catch (IOException e) {
136: System.exit(-1);
137: }
138:
139: processor.start();
140:
141: }
142:
143: public void stop() {
144:
145: //stop and close the processor when done capturing...
146: //close the datasink when EndOfStream event is received...
147: //writes stream to file...
148: processor.stop();
149: try {
150: dataSink.stop();
151: } catch (SecurityException e) {
152: System.exit(-1);
153: } catch (IOException e) {
154: System.exit(-1);
155: }
156:
157: }
158:
159: }
|