public void addFrame(int[] _pixels, int w, int h) { if (readyForFrames) { RawEncodedImage pixelData = gw.getPixMap().getPixelData(); int rowBytes = pixelData.getRowBytes() / 4; int[] newpixels = new int[rowBytes * h]; for (int i = 0; i < rowBytes; i++) { for (int j = 0; j < h; j++) { if (i < w) { newpixels[i + j * rowBytes] = _pixels[i + j * w]; } else { newpixels[i + j * rowBytes] = 0; } } } pixelData.setInts(0, newpixels); compressAndAdd(); } }
private void compressAndAdd() { try { if (temporalSupported) { CompressedFrameInfo cfInfo = seq.compressFrame(gw, bounds, StdQTConstants.codecFlagUpdatePrevious, compressedImage); boolean syncSample = cfInfo.getSimilarity() == 0; // see developer.apple.com/qa/qtmcc/qtmcc20.html videoMedia.addSample( imageHandle, 0, cfInfo.getDataSize(), TIME_SCALE / rate, imgDesc, 1, syncSample ? 0 : StdQTConstants.mediaSampleNotSync); } else { imgDesc = QTImage.fCompress( gw, gw.getBounds(), 32, codecQuality, codecType, CodecComponent.anyCodec, null, 0, RawEncodedImage.fromQTHandle(imageHandle)); boolean syncSample = true; // UM, what the hell should this be??? videoMedia.addSample( imageHandle, 0, imgDesc.getDataSize(), TIME_SCALE / rate, imgDesc, 1, syncSample ? 0 : StdQTConstants.mediaSampleNotSync); } } catch (QTException e) { e.printStackTrace(); } }
private void initMovie(String filename) { try { String path = parent.savePath(filename); movFile = new QTFile(new File(path)); movie = Movie.createMovieFile( movFile, StdQTConstants.kMoviePlayer, StdQTConstants.createMovieFileDeleteCurFile); int timeScale = TIME_SCALE; // 100 units per second videoTrack = movie.addTrack(width, height, 0); videoMedia = new VideoMedia(videoTrack, timeScale); videoMedia.beginEdits(); bounds = new QDRect(0, 0, width, height); int rawImageSize = QTImage.getMaxCompressionSize( gw, bounds, gw.getPixMap().getPixelSize(), codecQuality, codecType, CodecComponent.anyCodec); imageHandle = new QTHandle(rawImageSize, true); imageHandle.lock(); compressedImage = RawEncodedImage.fromQTHandle(imageHandle); seq = new CSequence( gw, bounds, gw.getPixMap().getPixelSize(), codecType, CodecComponent.bestFidelityCodec, codecQuality, codecQuality, keyFrameRate, null, 0); imgDesc = seq.getDescription(); readyForFrames = true; } catch (QTException e) { if (e.errorCode() == Errors.noCodecErr) { if (imageHandle == null) { // This means QTImage.getMaxCompressionSize() failed System.err.println( "The specified codec is not supported, " + "please ensure that the parameters are valid, " + "and in the correct order."); } else { // If it's a -8961 error, quietly do it the other way // (this happens when RAW is specified) temporalSupported = false; readyForFrames = true; } } else if (e.errorCode() == Errors.fBsyErr) { System.err.println("The movie file already exists. " + "Please delete it first."); } else { e.printStackTrace(); } } }