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 java.io.IOException;
038: import javax.media.Duration;
039: import javax.media.Time;
040: import javax.media.protocol.PullBufferDataSource;
041: import javax.media.protocol.PullBufferStream;
042: import javax.media.util.ImageToBuffer;
043: import java.awt.image.BufferedImage;
044: import java.awt.Dimension;
045: import javax.media.j3d.*;
046:
047: /*
048: *
049: */
050:
051: public class J3DPullBufferDataSource extends PullBufferDataSource {
052:
053: private BufferedImage bufferedImage;
054: private ImageComponent2D imageComponent2D;
055: private Canvas3D canvas3D;
056: private ImageToBuffer imageToBuffer;
057:
058: private final static float DEFAULT_FRAME_RATE = 25;
059: private float frameRate = DEFAULT_FRAME_RATE;
060:
061: J3DPullBufferDataSource() {
062:
063: throw new java.lang.IllegalArgumentException(
064: "Constructor J3DPullDataSource needs a Canvas3D and Dimension.");
065:
066: }
067:
068: //only an offscreen canvas should be used isOffScreen()
069: J3DPullBufferDataSource(Canvas3D canvas3D, Dimension dimension) {
070:
071: super ();
072: if (canvas3D.isOffScreen()) {
073: this .canvas3D = canvas3D;
074: bufferedImage = new BufferedImage(dimension.width,
075: dimension.height, BufferedImage.TYPE_INT_ARGB);
076: imageComponent2D = new ImageComponent2D(
077: ImageComponent.FORMAT_RGBA, bufferedImage);
078:
079: this .canvas3D.setOffScreenBuffer(imageComponent2D);
080: imageToBuffer = new ImageToBuffer();
081: } else {
082: throw new java.lang.IllegalArgumentException(
083: "Only offscreen Canvas3D are allowed as J3DPullDataSource.");
084: }
085:
086: }
087:
088: public void connect() {
089:
090: }
091:
092: public void disconnect() {
093:
094: }
095:
096: public float getFrameRate() {
097:
098: return this .frameRate;
099:
100: }
101:
102: public java.lang.String getContentType() {
103:
104: return new String("video.quicktime");
105: //following line can't work until there is a way to cupture Audio
106: //by the way it would be useful to make two classes out of this one
107: //one for audio and one for video
108: //return new String ("audio.x-wav");
109:
110: }
111:
112: public java.lang.Object getControl(java.lang.String controlName) {
113:
114: return null;
115:
116: }
117:
118: public java.lang.Object[] getControls() {
119:
120: Object[] objects;
121:
122: objects = new Object[0];
123:
124: return objects;
125:
126: }
127:
128: public Time getDuration() {
129:
130: return Duration.DURATION_UNKNOWN;
131:
132: }
133:
134: public PullBufferStream[] getStreams() {
135:
136: J3DPullBufferSourceStream[] j3DPullBufferSourceStreams = new J3DPullBufferSourceStream[1];
137:
138: bufferedImage = canvas3D.getOffScreenBuffer().getImage();
139: //There is currentely NO WAY OF CAPTURING SOUND rendered by the Java3D system.
140:
141: j3DPullBufferSourceStreams[0] = new J3DPullBufferSourceStream(
142: imageToBuffer.createBuffer(bufferedImage, frameRate));
143:
144: //prepare next image
145: canvas3D.renderOffScreenBuffer();
146: canvas3D.waitForOffScreenRendering();
147:
148: return j3DPullBufferSourceStreams;
149:
150: }
151:
152: //please do a canvas3D.startRenderer() be fore using this
153: public void start() {
154:
155: canvas3D.renderOffScreenBuffer();
156: canvas3D.waitForOffScreenRendering();
157: //There is currentely NO WAY OF CAPTURING SOUND rendered by the Java3D system.
158:
159: }
160:
161: public void stop() {
162:
163: }
164:
165: }
|