// video tracks don't need volume
int VOLUME = 0;
// make every frame a key (self-contained) frame
int KEY_FRAME_RATE = frameRate;
Movie newmovie = null;
java.util.Random rand = new java.util.Random();
try
{
int random = rand.nextInt();
// create a new empty movie and a track
String tempFile = "Phoenix" + java.lang.Integer.toString(random) + ".mov";
QTFile movFile = new QTFile(new File(tempFile));
newmovie = Movie.createMovieFile(movFile, StdQTConstants.kMoviePlayer,
StdQTConstants.createMovieFileDeleteCurFile
| StdQTConstants.createMovieFileDontCreateResFile);
Track videoTrack = newmovie.addTrack(WIDTH, HEIGHT, VOLUME);
// create media for new track
VideoMedia videoMedia = new VideoMedia(videoTrack, timeScale);
// get a GraphicsImporter
GraphicsImporter gi = new GraphicsImporter(
StdQTConstants.kQTFileTypePicture);
// create an offscreen QDGraphics / GWorld the size of the picts
// importer will draw into this and pass to CSequence
QDGraphics gw = new QDGraphics(new QDRect(0, 0, WIDTH, HEIGHT));
// set importer's GWorld
gi.setGWorld(gw, null);
QDRect gRect = new QDRect(0, 0, WIDTH, HEIGHT);
// add images to media
videoMedia.beginEdits();
int frames = pics.length;
int rawImageSize = QTImage.getMaxCompressionSize(gw, gRect,
gw.getPixMap().getPixelSize(), StdQTConstants.codecLosslessQuality,
CODEC_TYPE, CodecComponent.bestFidelityCodec);
QTHandle imageHandle = new QTHandle(rawImageSize, true);
imageHandle.lock();
RawEncodedImage compressed = RawEncodedImage.fromQTHandle(imageHandle);
CSequence seq = new CSequence(gw, gRect, gw.getPixMap().getPixelSize(),
CODEC_TYPE, CodecComponent.bestFidelityCodec,
StdQTConstants.codecLosslessQuality,
StdQTConstants.codecLosslessQuality,
KEY_FRAME_RATE, null, StdQTConstants.codecFlagUpdatePrevious);
ImageDescription imgDesc = seq.getDescription();
// attempt to loop through all frames, scaling to fit the first frame
for (int x = 0; x < frames; x++)
{
QDRect srcRect = new QDRect(0, 0, pics[x].getPictFrame().getWidthF(),
pics[x].getPictFrame().getHeightF());
// add 512 byte header so the grapics importer will think that it's
// dealing with a pict file
byte[] newPictBytes = new byte[pics[x].getSize() + 512];
pics[x].copyToArray(0, newPictBytes, 512, newPictBytes.length - 512);
pics[x] = new Pict(newPictBytes);
// export the pict
DataRef ref = new DataRef(pics[x],
StdQTConstants.kDataRefQTFileTypeTag, "PICT");
gi.setDataReference(ref);
// create matrix to represent scaling of each pict
Matrix drawMatrix = new Matrix();
drawMatrix.rect(srcRect, gRect);
gi.setMatrix(drawMatrix);
gi.draw();
// compress frame
CompressedFrameInfo cfInfo = seq.compressFrame(gw, gRect,
StdQTConstants.codecFlagUpdatePrevious, compressed);
// check to see if frame is a key frame
boolean syncSample = (cfInfo.getSimilarity() == 0);
int flags = syncSample ? 0 : StdQTConstants.mediaSampleNotSync;
// add compressed frame to video media
videoMedia.addSample(imageHandle, 0, cfInfo.getDataSize(),
timeScale / frameRate, imgDesc, 1, flags);
} // for
// done adding samples to the media
videoMedia.endEdits();
// insert media into track
videoTrack.insertMedia(0, 0, videoMedia.getDuration(), 1);
// save changes made into file and add to movie
OpenMovieFile omf = OpenMovieFile.asWrite(movFile);
newmovie.addResource(omf, StdQTConstants.movieInDataForkResID,
movFile.getName());
// delete file created; prevent any thread problems by terminating
// current thread
try
{