/*
* JSwiff is an open source Java API for Macromedia Flash file generation
* and manipulation
*
* Copyright (C) 2004-2005 Ralf Terdic (contact@jswiff.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.jswiff.swfrecords.tags;
import com.jswiff.io.InputBitStream;
import com.jswiff.io.OutputBitStream;
import java.io.IOException;
/**
* This tag provides a single frame of streaming video data. The format of the
* video stream must be defined in a preceding <code>DefineVideoStream</code>
* tag. The video frame rate is limited by the SWF frame rate, as an SWF frame
* can contain at most one video frame.
*
* @see DefineVideoStream
* @since SWF 6
*/
public final class VideoFrame extends Tag {
private int streamId;
private int frameNum;
private byte[] videoData;
/**
* Creates a new VideoFrame tag. Provide the character ID of the video
* stream, the sequential frame number and the raw video data contained in
* this frame.
*
* @param streamId character ID of video stream
* @param frameNum frame number
* @param videoData raw video frame data
*/
public VideoFrame(int streamId, int frameNum, byte[] videoData) {
code = TagConstants.VIDEO_FRAME;
this.streamId = streamId;
this.frameNum = frameNum;
this.videoData = videoData;
}
VideoFrame() {
// empty
}
/**
* Sets the frame number. Frame numbers are sequential and start at 0.
*
* @param frameNum sequential frame number
*/
public void setFrameNum(int frameNum) {
this.frameNum = frameNum;
}
/**
* Returns the frame number. Frame numbers are sequential and start at 0.
*
* @return sequential frame number
*/
public int getFrameNum() {
return frameNum;
}
/**
* Sets the character ID of the video stream this frame belongs to.
*
* @param streamId video stream character ID
*/
public void setStreamId(int streamId) {
this.streamId = streamId;
}
/**
* Returns the character ID of the video stream this frame belongs to.
*
* @return video stream character ID
*/
public int getStreamId() {
return streamId;
}
/**
* Specifies the raw data contained in this video frame.
*
* @param videoData video frame data (as byte array)
*/
public void setVideoData(byte[] videoData) {
this.videoData = videoData;
}
/**
* Returns the raw data contained in this video frame.
*
* @return video frame data (as byte array)
*/
public byte[] getVideoData() {
return videoData;
}
protected void writeData(OutputBitStream outStream)
throws IOException {
outStream.writeUI16(streamId);
outStream.writeUI16(frameNum);
outStream.writeBytes(videoData);
}
void setData(byte[] data) throws IOException {
InputBitStream inStream = new InputBitStream(data);
streamId = inStream.readUI16();
frameNum = inStream.readUI16();
int videoDataLength = data.length - 4;
videoData = new byte[videoDataLength];
System.arraycopy(data, 4, videoData, 0, videoDataLength);
}
}