Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Transitions are rendering poorly



 Hi all,

I´m having trouble with awful looking transitions.
What I do is take two pictures and create a movie from each with a set duration.
The code for creating the image movies is taken from a C example, though I´ve managed to do it with a different approach the result remains, awful.

I then use the movies for a transition(this code might look familiar to you). I used the code from 'Quicktime for Java' because I am sure this works. I have tried to set the AtomContainer by dialogue and create it myself, same difference :( - I had orginally converted the code for making the transition from the C example ´Slideshow´. But still the result is awful.

By awful I mean the Transition seems to halt at the begining of the tween and at the end, also the underlying tracks seems to differ in colour, making a very ´un´seemsless transition. I am running this with jre1.5.0_05 on Windows XP pro on a AMD Athlon 2500+.

Can any tell me why the resulting transition turns out that bad?

package com.joollu.quicktime.utils;

import java.io.File;
import java.io.IOException;

import quicktime.QTException;
import quicktime.QTSession;
import quicktime.io.IOConstants;
import quicktime.io.OpenMovieFile;
import quicktime.io.QTFile;
import quicktime.qd.QDConstants;
import quicktime.std.StdQTConstants;
import quicktime.std.image.GraphicsImporter;
import quicktime.std.image.ImageDescription;
import quicktime.std.movies.Atom;
import quicktime.std.movies.AtomContainer;
import quicktime.std.movies.EffectsList;
import quicktime.std.movies.Movie;
import quicktime.std.movies.ParameterDialog;
import quicktime.std.movies.Track;
import quicktime.std.movies.media.DataRef;
import quicktime.std.movies.media.HandlerInfo;
import quicktime.std.movies.media.Media;
import quicktime.std.movies.media.SampleInfo;
import quicktime.std.movies.media.VideoMedia;
import quicktime.std.qtcomponents.MovieExporter;
import quicktime.util.EndianOrder;
import quicktime.util.QTHandle;
import quicktime.util.QTUtils;
import quicktime.util.RawEncodedImage;

public class QTJTransition implements QDConstants, StdQTConstants, IOConstants{

  public static final int VIDEO_TRACK_WIDTH = 800;
  public static final int VIDEO_TRACK_HEIGHT = 600;
  public static final int VIDEO_TRACK_VOLUME = 0;
 
  public static final int KEY_FRAME_RATE = 30;
 
  public static final int timeScale = 600;
 
  public static final int CODEC_TYPE = kSorensonCodecType;
 
 
  int curtainDuration = 200;
  int effectDuration = 1500;
  int videoDuration = effectDuration;
  int effectStart = curtainDuration;
  int TRANSITION_DURATION = effectDuration;
 
  public QTJTransition() throws QTException, IOException {

  File f1 = new File("img-2.mov");
  File f2 = new File("img-3.mov");
  Movie mA = createImageMovie(new File("2big.jpg"),f1,TRANSITION_DURATION * 2,VIDEO_TRACK_WIDTH,VIDEO_TRACK_HEIGHT);
  Movie mB = createImageMovie(new File("3big.jpg"),f2,TRANSITION_DURATION * 2,VIDEO_TRACK_WIDTH,VIDEO_TRACK_HEIGHT);
 
  saveMovie(mA,f1);
  saveMovie(mB,f2);


  File fTran = new File("t.mov");
Movie movTran = createEmptyMovie(fTran);

makeTransition(movTran,mA,mB,"2");
saveMovie(movTran,fTran);
}
/**
* from ´Quicktime for Java´ by Chris Adamson
*/
public void makeTransition(Movie movie,Movie sourceAMovie,Movie sourceBMovie,String type) throws QTException {


AtomContainer inputMap = new AtomContainer();
ImageDescription effectDesc = null;
AtomContainer ac = new AtomContainer();
ac.insertChild(Atom.kParentIsContainer, kEffectSourceName, 1, 0, EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType("srcA")));
ac.insertChild(Atom.kParentIsContainer, kEffectSourceName, 2, 0, EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType("srcB")));

EffectsList effectsList = new EffectsList (2, 2, 0);
      AtomContainer effect =
          ParameterDialog.showParameterDialog (effectsList,
                                               0, // dialogOptions
                                               null, // parameters
                                               "Pick an effect", // title
                                               null //pictArray
                                               );
      // find out the effect type by getting the "what" atom,
      // whose data is a FOUR_CHAR_CODE
      Atom what = effect.findChildByIndex_Atom (null,
                                     StdQTConstants.kParameterWhatName,
                                                 1);
      int effectType = effect.getAtomData(what).getInt(0);
      effectType = EndianOrder.flipBigEndianToNative32(effectType);
      System.out.println ("User chose " +
                          QTUtils.fromOSType(effectType) +
                          " effect type");

      // make a sample description for the effect description
       effectDesc = ImageDescription.forEffect (effectType);

//effectDesc = ImageDescription.forEffect(kWipeTransitionType);
effectDesc.setHeight(VIDEO_TRACK_HEIGHT);
effectDesc.setWidth(VIDEO_TRACK_WIDTH);
// ac.insertChild (Atom.kParentIsContainer, kEffectWipe, 1, 0, EndianOrder.flipNativeToBigEndian32(71));


Track preEffectTrack = addVideoTrack (sourceAMovie,
     movie,
     0,
     sourceAMovie.getDuration( ) - TRANSITION_DURATION,
     0);
Track sourceATrack = addVideoTrack (sourceAMovie,
     movie,
     sourceAMovie.getDuration( ) - TRANSITION_DURATION,
     TRANSITION_DURATION,
     sourceAMovie.getDuration( ) - TRANSITION_DURATION);

Track sourceBTrack = addVideoTrack (sourceBMovie,
     movie,
     0,
     TRANSITION_DURATION,
     movie.getDuration( ) - TRANSITION_DURATION);

Track postEffectTrack = addVideoTrack (sourceBMovie,
     movie,
     TRANSITION_DURATION,
     sourceBMovie.getDuration( ) - TRANSITION_DURATION,
     movie.getDuration( ));

Track effectTrack = movie.addTrack (VIDEO_TRACK_WIDTH,
VIDEO_TRACK_HEIGHT,
                  0);

int trackARef =
  effectTrack.addReference (sourceATrack,
                             StdQTConstants.kTrackModifierReference);
int trackBRef =
  effectTrack.addReference (sourceBTrack,
                             StdQTConstants.kTrackModifierReference);

Atom aInputAtom =
inputMap.insertChild (null,
                        StdQTConstants.kTrackModifierInput,
                        trackARef,
                        0);
inputMap.insertChild (aInputAtom,
          StdQTConstants.kTrackModifierType,
          1,
          0,
          EndianOrder.flipNativeToBigEndian32(StdQTConstants.videoMediaType));
inputMap.insertChild (aInputAtom,
          StdQTConstants.kEffectDataSourceType,
          1,
          0,
          EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType ("srcA")));

Atom bInputAtom =
inputMap.insertChild (null,
                        StdQTConstants.kTrackModifierInput,
                        trackBRef,
                        0);
inputMap.insertChild (bInputAtom,
         StdQTConstants.kTrackModifierType,
         1,
         0,
         EndianOrder.flipNativeToBigEndian32(StdQTConstants.videoMediaType));

inputMap.insertChild (bInputAtom,
         StdQTConstants.kEffectDataSourceType,
         1,
         0,
         EndianOrder.flipNativeToBigEndian32(QTUtils.toOSType ("srcB")));




VideoMedia videoMedia = new VideoMedia(effectTrack,timeScale);

videoMedia.beginEdits();

videoMedia.addSample(ac,
0,
    ac.getSize(),
    TRANSITION_DURATION,
    effectDesc,
    1,
    0    
    );

videoMedia.setInputMap(inputMap);
videoMedia.endEdits();

effectTrack.insertMedia (sourceAMovie.getDuration( ) - TRANSITION_DURATION, // trackStart
                       0, // mediaTime
                       TRANSITION_DURATION, // mediaDuration
                       1); // mediaRate
}

public Movie createImageMovie(File imgFile,File movieFile, int duration, int width, int height) throws QTException, IOException{
  QTFile imageFile = new QTFile(imgFile);
Movie movie = createEmptyMovie(movieFile);
//GraphicsImporter gi = new GraphicsImporter();
//System.out.println(gi.getDataHandle());
DataRef dr = new DataRef(imageFile);
Movie refMovie = Movie.fromDataRef(dr,newMovieDontResolveDataRefs);

Track refTrack = refMovie.getIndTrack(1);
Media media = refTrack.getMedia();

//SampleDescription desc = new SampleDescription(0);
//System.out.println(desc.getSize());
GraphicsImporter importer = new GraphicsImporter(imageFile); // importer grafik fra billede
ImageDescription id = importer.getImageDescription();
SampleInfo si = media.getSampleReference(0,1);

HandlerInfo hi = media.getHandlerDescription();

Track imageTrack = movie.addTrack(width,height,VIDEO_TRACK_VOLUME);

VideoMedia vm = new VideoMedia(imageTrack,timeScale);

vm.addDataRef(dr);

vm.beginEdits();

int sampleDur = vm.addSampleReference(0,importer.getDataSize(),duration,id,1,0);//,duration,desc,1,0);

vm.endEdits();

imageTrack.insertMedia(0,0,duration,1);

saveMovie(movie,movieFile);

return movie;
}
public static void saveMovie(Movie movie,File file) throws QTException, IOException{
OpenMovieFile omf = OpenMovieFile.asWrite (new QTFile(file));
    movie.addResource (omf,
                       movieInDataForkResID,
                       file.getName());
}

public static Track addVideoTrack (Movie sourceMovie,
          Movie targetMovie,
          int srcIn,
          int srcDuration,
          int targetTime) throws QTException {

// find first video track
Track videoTrack =
sourceMovie.getIndTrackType (1,
                videoMediaType,
                movieTrackMediaType);
if (videoTrack == null)
throw new QTException ("can´t find a video track");
// add videoTrack to targetMovie
Track newTrack =
targetMovie.newTrack (videoTrack.getSize( ).getWidthF( ),videoTrack.getSize( ).getHeightF( ),1.0f);

VideoMedia newMedia = new VideoMedia (newTrack,videoTrack.getMedia( ).getTimeScale( ), new DataRef(new QTHandle( )));

videoTrack.insertSegment (newTrack,
srcIn, // 0
srcDuration, // videoTrack.getDuration( )
targetTime);
return newTrack;
  }
public Movie createEmptyMovie(java.io.File file) throws QTException, IOException{
QTFile movFile = new QTFile (file);
return
        Movie.createMovieFile(movFile,
                              kMoviePlayer,
                              createMovieFileDeleteCurFile |
                              createMovieFileDontCreateResFile);
}

  public static void main (String[] args) {
      try {
          QTSession.open();
          new QTJTransition();         
      } catch (Exception e) {
          e.printStackTrace();
      } finally{
      QTSession.close();
      }
  }
}

regards, 

- Kenneth Nielsen

____________________________________________________________

Bestil lige nu TDC Bredbånd for 0 kr.
- Læs mere på http://tdc.dk/bredbaand/

Denne mail er sendt via Mail på TDC Online
- Læs mere om TDC's mailtjeneste på http://mail.tdconline.dk/
____________________________________________________________
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
QuickTime-java mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quicktime-java/email@hidden

This email sent to email@hidden



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.