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());