diff --git a/build/shared/tools/MovieMaker/src/MovieMakerTool.java b/build/shared/tools/MovieMaker/src/MovieMakerTool.java
index 0753089aa..6874b7710 100644
--- a/build/shared/tools/MovieMaker/src/MovieMakerTool.java
+++ b/build/shared/tools/MovieMaker/src/MovieMakerTool.java
@@ -1,8 +1,9 @@
/*
- * @(#)QuickTimeMovieMakerMain.java 1.1.1 2011-01-09
- *
+ * The majority of this code is
* Copyright © 2010-2011 Werner Randelshofer, Immensee, Switzerland.
* All rights reserved.
+ * (However, he should not be held responsible for the current mess of a hack
+ * that it has become.)
*
* You may not use, copy or modify this file, except in compliance with the
* license agreement you entered into with Werner Randelshofer.
@@ -41,6 +42,18 @@ import processing.app.Editor;
import processing.app.tools.Tool;
+// TODO [fry 2011-09-06]
+// + The dialog box is super ugly. It's a hacked up version of the previous
+// interface, but it'll take a bit of time to clean it up.
+// http://code.google.com/p/processing/issues/detail?id=836
+// + the None compressor seems to have bugs, so just disabled it instead.
+// + the 'pass through' option seems to be broken, it's been removed, and in
+// its place is an option to use the same width and height as the original
+// images. however, the code has not been refactored with the new name.
+// + when this new 'pass through' is set, there's some nastiness with how
+// the 'final' width/height variables are passed to the movie maker.
+// this is an easy fix but needs a couple minutes.
+
/**
* Hacked from Werner Randelshofer's QuickTimeWriter demo. The original version
* can be found here.
@@ -102,8 +115,8 @@ public class MovieMakerTool extends JFrame implements Tool {
prefs = Preferences.userNodeForPackage(MovieMakerTool.class);
imageFolderField.setText(prefs.get("movie.imageFolder", ""));
soundFileField.setText(prefs.get("movie.soundFile", ""));
- widthField.setText("" + prefs.getInt("movie.width", 320));
- heightField.setText("" + prefs.getInt("movie.height", 240));
+ widthField.setText("" + prefs.getInt("movie.width", 640));
+ heightField.setText("" + prefs.getInt("movie.height", 480));
passThroughCheckBox.setSelected(prefs.getBoolean("movie.passThrough", false));
String fps = "" + prefs.getDouble("movie.fps", 30);
if (fps.endsWith(".0")) {
@@ -112,6 +125,13 @@ public class MovieMakerTool extends JFrame implements Tool {
fpsField.setText(fps);
compressionBox.setSelectedIndex(Math.max(0, Math.min(compressionBox.getItemCount() - 1, prefs.getInt("movie.compression", 1))));
+ passThroughCheckBox.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ widthField.setEnabled(passThroughCheckBox.isSelected());
+ heightField.setEnabled(passThroughCheckBox.isSelected());
+ }
+ });
+
// String streaming = prefs.get("movie.streaming", "fastStartCompressed");
// for (Enumeration i = streamingGroup.getElements(); i.hasMoreElements();) {
// AbstractButton btn = i.nextElement();
@@ -129,7 +149,7 @@ public class MovieMakerTool extends JFrame implements Tool {
imageFolderHelpLabel = new JLabel();
imageFolderField = new JTextField();
chooseImageFolderButton = new JButton();
- soundFileHelpLable = new JLabel();
+ soundFileHelpLabel = new JLabel();
soundFileField = new JTextField();
chooseSoundFileButton = new JButton();
createMovieButton = new JButton();
@@ -184,7 +204,7 @@ public class MovieMakerTool extends JFrame implements Tool {
chooseImageFolderButton.setText("Choose...");
chooseImageFolderButton.addActionListener(formListener);
- soundFileHelpLable.setText("Drag a sound file into the field below (.au, .aiff, .wav, .mp3):");
+ soundFileHelpLabel.setText("Drag a sound file into the field below (.au, .aiff, .wav, .mp3):");
chooseSoundFileButton.setText("Choose...");
chooseSoundFileButton.addActionListener(formListener);
@@ -208,7 +228,8 @@ public class MovieMakerTool extends JFrame implements Tool {
compressionLabel.setFont(font);
compressionLabel.setText("Compression:");
compressionBox.setFont(font);
- compressionBox.setModel(new DefaultComboBoxModel(new String[] { "None", "Animation", "JPEG", "PNG" }));
+ //compressionBox.setModel(new DefaultComboBoxModel(new String[] { "None", "Animation", "JPEG", "PNG" }));
+ compressionBox.setModel(new DefaultComboBoxModel(new String[] { "Animation", "JPEG", "PNG" }));
fpsLabel.setFont(font);
fpsLabel.setText("Frame Rate:");
@@ -273,7 +294,7 @@ public class MovieMakerTool extends JFrame implements Tool {
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(aboutLabel, GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE)
.addComponent(imageFolderHelpLabel)
- .addComponent(soundFileHelpLable)
+ .addComponent(soundFileHelpLabel)
.addGroup(layout.createSequentialGroup()
.addComponent(soundFileField, GroupLayout.DEFAULT_SIZE, 372, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
@@ -285,15 +306,6 @@ public class MovieMakerTool extends JFrame implements Tool {
.addComponent(chooseImageFolderButton))))
.addGroup(layout.createSequentialGroup()
.addContainerGap())))
- /*.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(streamingLabel)
- .addGroup(layout.createSequentialGroup()
- .addGap(21, 21, 21)
- .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(fastStartRadio)
- .addComponent(noPreparationRadio)
- .addComponent(fastStartCompressedRadio))))))
- .addContainerGap())*/
);
layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
@@ -319,20 +331,12 @@ public class MovieMakerTool extends JFrame implements Tool {
.addComponent(compressionLabel)
.addComponent(passThroughCheckBox))
.addGap(18, 18, 18)
- .addComponent(soundFileHelpLable)
+ .addComponent(soundFileHelpLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(soundFileField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(chooseSoundFileButton))
.addGap(18, 18, 18)
-// .addComponent(streamingLabel)
-// .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
-// .addComponent(noPreparationRadio)
-// .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
-// .addComponent(fastStartRadio)
-// .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
-// .addComponent(fastStartCompressedRadio)
-// .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 4, Short.MAX_VALUE)
.addComponent(createMovieButton)
.addContainerGap())
);
@@ -395,6 +399,12 @@ public class MovieMakerTool extends JFrame implements Tool {
}
}
+
+ // this is super naughty, and shouldn't be out here. it's a hack to get the
+ // ImageIcon width/height setting to work. there are better ways to do this
+ // given a bit of time. you know, time? the infinite but non-renewable resource?
+ int width, height;
+
private void createMovie(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createMovie
// ---------------------------------
// Check input
@@ -408,7 +418,6 @@ public class MovieMakerTool extends JFrame implements Tool {
return;
}
- final int width, height;
final double fps;
try {
width = Integer.parseInt(widthField.getText());
@@ -425,16 +434,16 @@ public class MovieMakerTool extends JFrame implements Tool {
final QuickTimeWriter.VideoFormat videoFormat;
switch (compressionBox.getSelectedIndex()) {
- case 0:
- videoFormat = QuickTimeWriter.VideoFormat.RAW;
- break;
- case 1:
+// case 0:
+// videoFormat = QuickTimeWriter.VideoFormat.RAW;
+// break;
+ case 0://1:
videoFormat = QuickTimeWriter.VideoFormat.RLE;
break;
- case 2:
+ case 1://2:
videoFormat = QuickTimeWriter.VideoFormat.JPG;
break;
- case 3:
+ case 2://3:
default:
videoFormat = QuickTimeWriter.VideoFormat.PNG;
break;
@@ -449,7 +458,7 @@ public class MovieMakerTool extends JFrame implements Tool {
prefs.putInt("movie.height", height);
prefs.putDouble("movie.fps", fps);
prefs.putInt("movie.compression", compressionBox.getSelectedIndex());
-// prefs.putBoolean("movie.passThrough", passThroughCheckBox.isSelected());
+ prefs.putBoolean("movie.passThrough", passThroughCheckBox.isSelected());
// ---------------------------------
@@ -502,9 +511,12 @@ public class MovieMakerTool extends JFrame implements Tool {
Arrays.sort(imgFiles);
}
-// // Check on first image, if we can actually do pass through
-// if (passThrough) {
-// }
+ // Check on first image, if we can actually do pass through
+ if (passThrough) {
+ ImageIcon temp = new ImageIcon(imgFiles[0].getAbsolutePath());
+ width = temp.getIconWidth();
+ height = temp.getIconHeight();
+ }
// Delete movie file if it already exists.
if (movieFile.exists()) {
@@ -512,9 +524,9 @@ public class MovieMakerTool extends JFrame implements Tool {
}
if (imageFolder != null && soundFile != null) {
- writeVideoAndAudio(movieFile, imgFiles, soundFile, width, height, fps, videoFormat, passThrough, streaming);
+ writeVideoAndAudio(movieFile, imgFiles, soundFile, width, height, fps, videoFormat, /*passThrough,*/ streaming);
} else if (imageFolder != null) {
- writeVideoOnlyVFR(movieFile, imgFiles, width, height, fps, videoFormat, passThrough, streaming);
+ writeVideoOnlyVFR(movieFile, imgFiles, width, height, fps, videoFormat, /*passThrough,*/ streaming);
} else {
writeAudioOnly(movieFile, soundFile, streaming);
@@ -551,7 +563,7 @@ public class MovieMakerTool extends JFrame implements Tool {
// }//GEN-LAST:event_streamingRadioPerformed
/** variable frame rate. */
- private void writeVideoOnlyVFR(File movieFile, File[] imgFiles, int width, int height, double fps, QuickTimeWriter.VideoFormat videoFormat, boolean passThrough, String streaming) throws IOException {
+ private void writeVideoOnlyVFR(File movieFile, File[] imgFiles, int width, int height, double fps, QuickTimeWriter.VideoFormat videoFormat, /*boolean passThrough,*/ String streaming) throws IOException {
File tmpFile = streaming.equals("none") ? movieFile : new File(movieFile.getPath() + ".tmp");
ProgressMonitor p = new ProgressMonitor(MovieMakerTool.this, "Creating " + movieFile.getName(), "Creating Output File...", 0, imgFiles.length);
Graphics2D g = null;
@@ -568,7 +580,8 @@ public class MovieMakerTool extends JFrame implements Tool {
qtOut.addVideoTrack(videoFormat, timeScale, width, height);
qtOut.setSyncInterval(0, 30);
- if (!passThrough) {
+ //if (!passThrough) {
+ if (true) {
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
prevImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
@@ -582,7 +595,8 @@ public class MovieMakerTool extends JFrame implements Tool {
p.setNote("Processing " + f.getName());
p.setProgress(i);
- if (passThrough) {
+ //if (passThrough) {
+ if (false) {
qtOut.writeSample(0, f, duration);
} else {
BufferedImage fImg = ImageIO.read(f);
@@ -755,7 +769,7 @@ public class MovieMakerTool extends JFrame implements Tool {
}
}
- private void writeVideoAndAudio(File movieFile, File[] imgFiles, File audioFile, int width, int height, double fps, QuickTimeWriter.VideoFormat videoFormat, boolean passThrough, String streaming) throws IOException {
+ private void writeVideoAndAudio(File movieFile, File[] imgFiles, File audioFile, int width, int height, double fps, QuickTimeWriter.VideoFormat videoFormat, /*boolean passThrough,*/ String streaming) throws IOException {
File tmpFile = streaming.equals("none") ? movieFile : new File(movieFile.getPath() + ".tmp");
ProgressMonitor p = new ProgressMonitor(MovieMakerTool.this, "Creating " + movieFile.getName(), "Creating Output File...", 0, imgFiles.length);
AudioInputStream audioIn = null;
@@ -795,7 +809,8 @@ public class MovieMakerTool extends JFrame implements Tool {
}
// Create video buffer
- if (!passThrough) {
+ //if (!passThrough) {
+ if (true) {
imgBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
g = imgBuffer.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
@@ -834,7 +849,8 @@ public class MovieMakerTool extends JFrame implements Tool {
// catch up with video time
p.setProgress(imgIndex);
p.setNote("Processing " + imgFiles[imgIndex].getName());
- if (passThrough) {
+ //if (passThrough) {
+ if (false) {
qtOut.writeSample(1, imgFiles[imgIndex], vsDuration);
} else {
BufferedImage fImg = ImageIO.read(imgFiles[imgIndex]);
@@ -908,7 +924,7 @@ public class MovieMakerTool extends JFrame implements Tool {
// private JRadioButton noPreparationRadio;
private JCheckBox passThroughCheckBox;
private JTextField soundFileField;
- private JLabel soundFileHelpLable;
+ private JLabel soundFileHelpLabel;
// private ButtonGroup streamingGroup;
// private JLabel streamingLabel;
private JTextField widthField;