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