diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/DataSource.java new file mode 100644 index 0000000000000000000000000000000000000000..48c71d52ad13b9a966b93d0b102255d4fd6472f4 --- /dev/null +++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/DataSource.java @@ -0,0 +1,35 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +package org.jitsi.impl.neomedia.jmfext.media.protocol.greyfading; + +import javax.media.control.*; + +import org.jitsi.impl.neomedia.jmfext.media.protocol.*; + +/** + * Implements a <tt>CaptureDevice</tt> which provides a fading animation from + * white to black to white... in form of video. + * + * @author Thomas Kuntz + */ +public class DataSource + extends AbstractVideoPullBufferCaptureDevice +{ + /** + * {@inheritDoc} + * + * Implements + * {@link AbstractPushBufferCaptureDevice#createStream(int, FormatControl)}. + */ + protected VideoGreyFadingStream createStream( + int streamIndex, + FormatControl formatControl) + { + return new VideoGreyFadingStream(this, formatControl); + } +} diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingMediaDevice.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingMediaDevice.java new file mode 100644 index 0000000000000000000000000000000000000000..ea8670f4ac29791b2d91c44bb8f5f33d992ce456 --- /dev/null +++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingMediaDevice.java @@ -0,0 +1,98 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + + +package org.jitsi.impl.neomedia.jmfext.media.protocol.greyfading; + +import java.awt.Dimension; + +import javax.media.*; +import javax.media.format.*; +import javax.media.protocol.*; + +import org.jitsi.impl.neomedia.device.*; +import org.jitsi.service.neomedia.*; + + +/** + * Implements a <tt>MediaDevice</tt> which provides a fading animation from + * white to black to white... in form of video. + * + * @author Thomas Kuntz + */ +public class VideoGreyFadingMediaDevice + extends MediaDeviceImpl +{ + /** + * The default framerate the<tt>MediaDevice</tt> will have. + */ + public final static int DEFAULT_FRAMERATE = 10; + + /** + * The default dimension the<tt>MediaDevice</tt> will have. + */ + public final static Dimension DEFAULT_DIMENSION = new Dimension(640,480); + + /** + * Initializes a new <tt>VideoGreyFadingMediaDevice</tt> with default + * framerate and dimension. + */ + public VideoGreyFadingMediaDevice() + { + this(DEFAULT_FRAMERATE,DEFAULT_DIMENSION); + } + + /** + * Initializes a new <tt>VideoGreyFadingMediaDevice</tt> with the given + * framerate and the default dimension. + * @param framerate the framerate of the <tt>CaptureDevice</tt> behind this + * <tt>MediaDevice</tt>. + */ + public VideoGreyFadingMediaDevice(int framerate) + { + this(framerate,DEFAULT_DIMENSION); + } + + /** + * Initializes a new <tt>VideoGreyFadingMediaDevice</tt> with the given + * dimension and the default framerate. + * @param dimension the dimension (width & height) of the + * <tt>CaptureDevice</tt> behind this <tt>MediaDevice</tt>. + */ + public VideoGreyFadingMediaDevice(Dimension dimension) + { + this(DEFAULT_FRAMERATE,dimension); + } + + /** + * Initializes a new <tt>VideoGreyFadingMediaDevice</tt> with the given + * framerate and dimension. + * @param framerate the framerate of the <tt>CaptureDevice</tt> behind this + * <tt>MediaDevice</tt>. + * @param dimension the dimension (width & height) of the + * <tt>CaptureDevice</tt> behind this <tt>MediaDevice</tt>. + */ + public VideoGreyFadingMediaDevice(int framerate, Dimension dimension) + { + super(new CaptureDeviceInfo( + "GreyFadingVideo", + new MediaLocator("greyfading:"), + new Format[] + { + new RGBFormat( + dimension, // size + Format.NOT_SPECIFIED, // maxDataLength + Format.byteArray, // dataType + framerate, // frameRate + 32, // bitsPerPixel + 2 /* red */, + 3 /* green */, + 4 /* blue */) + }), + MediaType.VIDEO); + } +} diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingStream.java new file mode 100644 index 0000000000000000000000000000000000000000..6bdfe6a6750997053cd49c1917418fc443b671bf --- /dev/null +++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/greyfading/VideoGreyFadingStream.java @@ -0,0 +1,152 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +package org.jitsi.impl.neomedia.jmfext.media.protocol.greyfading; + +import javax.media.*; +import javax.media.control.*; +import javax.media.format.*; + +import org.jitsi.impl.neomedia.codec.*; +import org.jitsi.impl.neomedia.jmfext.media.protocol.*; + +import java.awt.Dimension; +import java.io.*; +import java.util.*; + +/** + * Implements a <tt>PullBufferStream</tt> which provides a fading animation from + * white to black to white... in form of video. + * + * @author Thomas Kuntz + */ +public class VideoGreyFadingStream + extends AbstractVideoPullBufferStream<DataSource> +{ + /** + * The value for the color of the RGB bytes + */ + private int color = 0; + + /** + * Indicate if the video is fading toward white (if true) or toward + * black (if false) + */ + private boolean increment = true; + + /** + * The timestamp of the last time the <tt>doRead</tt> function returned + * (the timestamp is taken just before the return). + */ + private long timeLastRead = 0; + + /** + * Initializes a new <tt>VideoGreyFadingStream</tt> which is to be exposed + * by a specific <tt>VideoGreyFadingCaptureDevice</tt> and which is to have + * its <tt>Format</tt>-related information abstracted by a specific + * <tt>FormatControl</tt>. + * + * @param dataSource the <tt>VideoGreyFadingCaptureDevice</tt> which is + * initializing the new instance and which is to expose it in its array + * of <tt>PushBufferStream</tt>s + * @param formatControl the <tt>FormatControl</tt> which is to abstract + * the <tt>Format</tt>-related information of the new instance + */ + public VideoGreyFadingStream( + DataSource dataSource, + FormatControl formatControl) + { + super(dataSource, formatControl); + } + + /** + * Reads available media data from this instance into a specific + * <tt>Buffer</tt>. + * + * @param buffer the <tt>Buffer</tt> to write the available media data + * into + * @throws IOException if an I/O error has prevented the reading of + * available media data from this instance into the specified + * <tt>buffer</tt> + */ + @Override + protected void doRead(Buffer buffer) + throws IOException + { + long millis = 0; + VideoFormat format; + + + format = (VideoFormat)buffer.getFormat(); + + if (format == null) + { + format = (VideoFormat)getFormat(); + if (format != null) + buffer.setFormat(format); + } + + Dimension size = format.getSize(); + int frameSizeInBytes + = (int) ( + size.getHeight() + * size.getWidth() + * 4); + + byte[] data + = AbstractCodec2.validateByteArraySize( + buffer, + frameSizeInBytes, + false); + + Arrays.fill(data, 0, frameSizeInBytes, (byte) color); + + if(increment) + { + color+=3; + } + else + { + color-=3; + } + if(color >= 255) + { + increment = false; + color=255; + } + else if(color <= 0) + { + increment = true; + color=0; + } + + buffer.setData(data); + buffer.setOffset(0); + buffer.setLength(frameSizeInBytes); + + + buffer.setTimeStamp(System.nanoTime()); + + + //To respect the framerate, we wait for the remaining milliseconds since + //last doRead call. + millis = System.currentTimeMillis() - timeLastRead; + millis = (long)(1000.0 / format.getFrameRate()) - millis; + if(millis > 0) + { + try + { + Thread.sleep(millis); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + timeLastRead=System.currentTimeMillis(); + } +} \ No newline at end of file