modifications to handle url in place of file and to be used with SmartQT4JApplet
This commit is contained in:
parent
178ffcb800
commit
3d215caf53
1 changed files with 156 additions and 289 deletions
|
@ -1,17 +1,17 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
@ -31,29 +31,39 @@ import quicktime.std.movies.media.DataRef;
|
|||
import quicktime.io.*;
|
||||
import quicktime.app.time.*;
|
||||
import quicktime.std.clocks.*;
|
||||
import quicktime.app.QTFactory;
|
||||
|
||||
public class SmartQT4JPlayer extends SmartMoviePanel
|
||||
{
|
||||
//attributes
|
||||
private QTCanvas canvas; //this hands over screen real estate to
|
||||
//native graphics that quicktime can control
|
||||
|
||||
private QTPlayer player; //this is the the client for the canvas
|
||||
//In my app it will get set to a
|
||||
// quicktime.app.player object
|
||||
|
||||
private Movie movie; //this is the content used in
|
||||
//QTDrawable player's quicktime.app.player constructor
|
||||
public class SmartQT4JPlayer extends SmartMoviePanel {
|
||||
|
||||
private MovieController controller;
|
||||
|
||||
private RateCallBack rateCallBack = null;
|
||||
private TimeJumpCallBack jumpCallBack = null;
|
||||
private myJumpCallBack theJumpper = null;
|
||||
private myRateCallBack theRater = null;
|
||||
private URL mediaUrl = null;
|
||||
private TimeBase myMoviesTimeBase;
|
||||
private QTCanvas canvas;
|
||||
private QTPlayer player;
|
||||
|
||||
private TimeBaseTimeCallBack theMoviesTimeCallback;
|
||||
private TimeBaseTimeCallBackStopper theStopper;
|
||||
//constructor
|
||||
public SmartQT4JPlayer(Container cont, URL mediaURL) {
|
||||
super( new GridLayout() );
|
||||
try {
|
||||
loadMovie(mediaURL);
|
||||
} catch (SmartMoviePanelException smpe) {
|
||||
smpe.printStackTrace();
|
||||
}
|
||||
}
|
||||
//destructor
|
||||
public void destroy() {
|
||||
if (theJumpper != null)
|
||||
theJumpper.cancelAndCleanup();
|
||||
if(theRater != null)
|
||||
theRater.cancelAndCleanup();
|
||||
|
||||
private URL mediaUrl = null;
|
||||
removeAllAnnotationPlayers();
|
||||
QTSession.close();
|
||||
removeAll();
|
||||
mediaUrl = null;
|
||||
System.out.println("Clean up performed.");
|
||||
}
|
||||
|
||||
//accessors
|
||||
public String getIdentifyingName() {
|
||||
|
@ -64,354 +74,211 @@ public class SmartQT4JPlayer extends SmartMoviePanel
|
|||
}
|
||||
public void setParentContainer(Container c) {
|
||||
}
|
||||
public void setPlayer(QTPlayer player)
|
||||
{
|
||||
this.player = player;
|
||||
public void setPlayer(QTDrawable player) {
|
||||
this.player = (QTPlayer)player;
|
||||
}
|
||||
public QTPlayer getPlayer()
|
||||
{
|
||||
public QTPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public void setMovie(Movie movie)
|
||||
{
|
||||
this.movie = movie;
|
||||
}
|
||||
public void setMovie(URL movieURL)
|
||||
{
|
||||
try
|
||||
{
|
||||
DataRef movieDataRef = new DataRef( "file://" + movieURL.getFile() );
|
||||
Movie m = new Movie();
|
||||
m = m.fromDataRef( movieDataRef, StdQTConstants.newMovieActive );
|
||||
setMovie(m);
|
||||
getMovie().setTimeScale(1000);
|
||||
mediaUrl = movieURL;
|
||||
}
|
||||
catch(QTException qte)
|
||||
{
|
||||
qte.printStackTrace();
|
||||
System.out.println( movieURL.toString() );
|
||||
}
|
||||
}
|
||||
public Movie getMovie()
|
||||
{
|
||||
return movie;
|
||||
}
|
||||
|
||||
public void setController(MovieController controller)
|
||||
{
|
||||
this.controller = controller;
|
||||
}
|
||||
public MovieController getController()
|
||||
{
|
||||
return controller;
|
||||
}
|
||||
|
||||
public void setCanvas(QTCanvas canvas)
|
||||
{
|
||||
public void setCanvas(QTCanvas canvas) {
|
||||
this.canvas = canvas;
|
||||
}
|
||||
public QTCanvas getCanvas()
|
||||
{
|
||||
public QTCanvas getCanvas() {
|
||||
return canvas;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//contract methods - initialize
|
||||
public void displayBorders(boolean borders) throws SmartMoviePanelException
|
||||
{
|
||||
public void displayBorders(boolean borders) throws SmartMoviePanelException {
|
||||
}
|
||||
public void displayController(boolean controller) throws SmartMoviePanelException
|
||||
{
|
||||
public void displayController(boolean controller) throws SmartMoviePanelException {
|
||||
}
|
||||
public void loadMovie(URL mediaURL) throws SmartMoviePanelException
|
||||
{
|
||||
|
||||
public void loadMovie(URL mediaURL) throws SmartMoviePanelException {
|
||||
//Initialize a QT session and add a test image
|
||||
|
||||
|
||||
//These three try/catch blocks come from PlayMovie.java copyright
|
||||
// Apple Co. I'm using it to test that QT and QT4Java exist
|
||||
try
|
||||
{
|
||||
try {
|
||||
if (QTSession.isInitialized() == false) {
|
||||
QTSession.open();
|
||||
try
|
||||
{
|
||||
try {
|
||||
setCanvas( new QTCanvas(QTCanvas.kInitialSize, 0.5F, 0.5F) );
|
||||
this.add( getCanvas() );
|
||||
getCanvas().setClient(ImageDrawer.getQTLogo(), true);
|
||||
}
|
||||
catch(QTException qte)
|
||||
{
|
||||
} catch(QTException qte) {
|
||||
qte.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (NoClassDefFoundError er)
|
||||
{
|
||||
} catch (NoClassDefFoundError er) {
|
||||
add (new Label ("Can't Find QTJava classes"), "North");
|
||||
add (new Label ("Check install and try again"), "South");
|
||||
}
|
||||
catch (SecurityException se)
|
||||
{
|
||||
} catch (SecurityException se) {
|
||||
// this is thrown by MRJ trying to find QTSession class
|
||||
add (new Label ("Can't Find QTJava classes"), "North");
|
||||
add (new Label ("Check install and try again"), "South");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// do a dynamic test for QTException
|
||||
} catch (Exception e) {
|
||||
// do a dynamic test for QTException
|
||||
//so the QTException class is not loaded unless
|
||||
// an unknown exception is thrown by the runtime
|
||||
if (e instanceof ClassNotFoundException || e instanceof java.io.FileNotFoundException)
|
||||
{
|
||||
if (e instanceof ClassNotFoundException || e instanceof java.io.FileNotFoundException) {
|
||||
add (new Label ("Can't Find QTJava classes"), "North");
|
||||
add (new Label ("Check install and try again"), "South");
|
||||
}
|
||||
else if (e instanceof QTException)
|
||||
{
|
||||
} else if (e instanceof QTException) {
|
||||
add (new Label ("Problem with QuickTime install"), "North");
|
||||
if (((QTException)e).errorCode() == -2093)
|
||||
add (new Label ("QuickTime must be installed"), "South");
|
||||
add (new Label ("QuickTime must be installed"), "South");
|
||||
else
|
||||
add (new Label (e.getMessage()), "South");
|
||||
}
|
||||
}
|
||||
|
||||
setMovie(mediaURL);
|
||||
try
|
||||
{
|
||||
getCanvas().removeClient();
|
||||
setController( new MovieController( getMovie() ));
|
||||
getController().setKeysEnabled(true);
|
||||
setPlayer(new QTPlayer( getController() ));
|
||||
try {
|
||||
this.remove( getCanvas() );
|
||||
setPlayer(QTFactory.makeDrawable(mediaURL.toString()));
|
||||
getCanvas().setClient( getPlayer(), true );
|
||||
this.add( getCanvas() );
|
||||
TimeBase theMoviesTimeBase = getMovie().getTimeBase();
|
||||
|
||||
// this callback is triggered when the rate of the movie changes (0 is stopped, >0 is playing)
|
||||
rateCallBack = new RateCallBack(theMoviesTimeBase, 0, StdQTConstants.triggerRateChange) {
|
||||
public void execute() {
|
||||
System.out.println("Rate changed to: " + String.valueOf(rateWhenCalled));
|
||||
if (rateWhenCalled > 0)
|
||||
launchAnnotationTimer();
|
||||
else
|
||||
cancelAnnotationTimer();
|
||||
schedule(this);
|
||||
}
|
||||
};
|
||||
schedule(rateCallBack);
|
||||
System.out.println("loadMovie:"+mediaURL.toString());
|
||||
|
||||
// this callback is triggered when there is a jump in the timebase, ie when the slider control is adjusted
|
||||
jumpCallBack = new TimeJumpCallBack(theMoviesTimeBase) {
|
||||
public void execute() {
|
||||
System.out.println("Time Jump. New rate: " + String.valueOf(rateWhenCalled));
|
||||
if (rateWhenCalled > 0)
|
||||
launchAnnotationTimer();
|
||||
schedule(this);
|
||||
}
|
||||
};
|
||||
schedule(jumpCallBack);
|
||||
}
|
||||
catch(QTException qte)
|
||||
{
|
||||
myMoviesTimeBase = getPlayer().getTimeBase();
|
||||
theJumpper = new myJumpCallBack(myMoviesTimeBase);
|
||||
theJumpper.callMeWhen();
|
||||
theRater = new myRateCallBack(myMoviesTimeBase, 0, StdQTConstants.triggerRateChange);
|
||||
theRater.callMeWhen();
|
||||
Timer timer = new Timer(10,1,new Tickler(), getPlayer().getMovieController().getMovie());
|
||||
timer.setActive(true);
|
||||
} catch(QTException qte) {
|
||||
System.out.println("loadMovie failed");
|
||||
qte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void schedule(QTCallBack callBack) {
|
||||
try {
|
||||
callBack.callMeWhen();
|
||||
} catch (StdQTException stdqte) {
|
||||
stdqte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//contract methods - control media
|
||||
public void cmd_playOn() throws SmartMoviePanelException
|
||||
{
|
||||
try
|
||||
{
|
||||
public void cmd_playOn() throws SmartMoviePanelException {
|
||||
try {
|
||||
getPlayer().setRate(1.0F);
|
||||
}
|
||||
catch(QTException qte)
|
||||
{
|
||||
} catch(QTException qte) {
|
||||
qte.printStackTrace();
|
||||
}
|
||||
}
|
||||
public void cmd_playSegment(Integer startTime, Integer stopTime) throws SmartMoviePanelException
|
||||
{
|
||||
try
|
||||
{
|
||||
getPlayer().setRate(0);
|
||||
getPlayer().setTime( startTime.intValue() );
|
||||
public void cmd_playSegment(Integer startTime, Integer stopTime) throws SmartMoviePanelException {
|
||||
try {
|
||||
int myScale = getPlayer().getScale();
|
||||
cmd_stop();
|
||||
getPlayer().setTime( (startTime.intValue() * myScale) / 1000 );
|
||||
|
||||
int value;
|
||||
if (stopTime == null)
|
||||
value=getEndTime();
|
||||
else
|
||||
value=stopTime.intValue();
|
||||
|
||||
TimeBase theMoviesTimeBase = getPlayer().getTimeBase();
|
||||
theStopper = new TimeBaseTimeCallBackStopper(theMoviesTimeBase, 1000, value, StdQTConstants.triggerTimeEither);
|
||||
theStopper.callMeWhen();
|
||||
|
||||
if (stopTime == null) {
|
||||
myMoviesTimeBase.setStopTime(new TimeRecord(myScale, getEndTime()));
|
||||
//System.out.println("startTime:"+(startTime.intValue()*myScale)/1000+" stopTime: to the End" );
|
||||
} else {
|
||||
myMoviesTimeBase.setStopTime(new TimeRecord(myScale, (stopTime.intValue()*myScale)/1000));
|
||||
//System.out.println("startTime:"+(startTime.intValue()*myScale)/1000+" stopTime:"+(stopTime.intValue()*myScale)/1000 );
|
||||
}
|
||||
cmd_playOn();
|
||||
|
||||
/*
|
||||
System.out.println("Set start time to " +startTime.intValue() );
|
||||
if (stopTime != null)
|
||||
System.out.println("Set stop time " +stopTime.intValue() );
|
||||
System.out.println("Current time " +getPlayer().getTime() );
|
||||
if (stopTime != null)
|
||||
System.out.println("Time Stopper's stop trigger " +theStopper.getCallTime() );
|
||||
System.out.println("Player Scale: " +getPlayer().getScale() );
|
||||
System.out.println("Movie Scale: " +getMovie().getTimeScale() );
|
||||
*/
|
||||
}
|
||||
catch (SmartMoviePanelException smpe) {}
|
||||
catch (StdQTException sqte) {}
|
||||
catch (QTException qte) {}
|
||||
catch (SmartMoviePanelException smpe) {
|
||||
}
|
||||
catch (StdQTException sqte) {
|
||||
}
|
||||
catch (QTException qte) {
|
||||
}
|
||||
}
|
||||
public void cmd_stop() throws SmartMoviePanelException
|
||||
{
|
||||
try
|
||||
{
|
||||
public void cmd_stop() throws SmartMoviePanelException {
|
||||
try {
|
||||
getPlayer().setRate(0.0F);
|
||||
}
|
||||
catch(QTException qte)
|
||||
{
|
||||
} catch(QTException qte) {
|
||||
qte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//contract methods - media status
|
||||
public boolean isInitialized() {
|
||||
return true; //FIXME what should this do?
|
||||
}
|
||||
public boolean isPlaying() {
|
||||
try {
|
||||
if (getMovie().getRate() > 0)
|
||||
if (player.getRate() > 0)
|
||||
return true;
|
||||
} catch (StdQTException stdqte) {
|
||||
stdqte.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public int getCurrentTime()
|
||||
{
|
||||
//doit envoyer le temps en sec fois 1000
|
||||
public int getCurrentTime() {
|
||||
try {
|
||||
return getMovie().getTime();
|
||||
int myScale = getPlayer().getScale();
|
||||
//System.out.println("getCurrentTime():"+(player.getTime()*1000)/myScale);
|
||||
return (player.getTime()*1000)/myScale;
|
||||
} catch (StdQTException stqte) {
|
||||
stqte.printStackTrace();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
public int getEndTime()
|
||||
{
|
||||
try {
|
||||
return getMovie().getDuration();
|
||||
} catch (StdQTException stqte) {
|
||||
stqte.printStackTrace();
|
||||
} catch (QTException qte) {
|
||||
System.out.println("getCurrentTimeErr");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
public int getEndTime() {
|
||||
try {
|
||||
int myScale = getPlayer().getScale();
|
||||
return (player.getDuration()*1000)/myScale;
|
||||
} catch (StdQTException stqte) {
|
||||
stqte.printStackTrace();
|
||||
return 0;
|
||||
} catch (QTException qte) {
|
||||
System.out.println("getCurrentTimeErr");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//helper methods - QT4J
|
||||
|
||||
public void destroy()
|
||||
{
|
||||
if (rateCallBack != null)
|
||||
rateCallBack.cancelAndCleanup();
|
||||
if (jumpCallBack != null)
|
||||
jumpCallBack.cancelAndCleanup();
|
||||
removeAllAnnotationPlayers();
|
||||
QTSession.close();
|
||||
removeAll();
|
||||
mediaUrl = null;
|
||||
System.out.println("Clean up performed.");
|
||||
}
|
||||
|
||||
//constructor
|
||||
public SmartQT4JPlayer(Container cont, URL mediaURL)
|
||||
{
|
||||
public SmartQT4JPlayer() {
|
||||
super( new GridLayout() );
|
||||
try {
|
||||
loadMovie(mediaURL);
|
||||
} catch (SmartMoviePanelException smpe) {
|
||||
smpe.printStackTrace();
|
||||
}
|
||||
}
|
||||
public SmartQT4JPlayer()
|
||||
{
|
||||
super( new GridLayout() );
|
||||
}
|
||||
|
||||
// inner classes
|
||||
|
||||
|
||||
class TimeBaseTimeCallBack extends quicktime.std.clocks.TimeCallBack
|
||||
{
|
||||
private int callTime;
|
||||
private TimeBase theTimeBase;
|
||||
|
||||
public void setCallTime(int time)
|
||||
{
|
||||
callTime=time;
|
||||
value=callTime;
|
||||
class myRateCallBack extends quicktime.std.clocks.RateCallBack {
|
||||
public myRateCallBack(TimeBase tb, int scale, int flag) throws QTException {
|
||||
super(tb, scale, flag);
|
||||
}
|
||||
public int getCallTime()
|
||||
{
|
||||
return callTime;
|
||||
}
|
||||
public void execute()
|
||||
{
|
||||
try
|
||||
{
|
||||
// System.out.println("--- TimeCallBack@triggerTimeEither--- called at:" + timeWhenCalledMsecs + "msecs");
|
||||
|
||||
cancel();
|
||||
//reschedule
|
||||
callMeWhen();
|
||||
}
|
||||
catch (StdQTException e)
|
||||
{}
|
||||
}
|
||||
public TimeBaseTimeCallBack(TimeBase tb, int scale, int value, int flags) throws QTException
|
||||
{
|
||||
super(tb, scale, value, flags);
|
||||
// setCallTime(value/1000);
|
||||
setCallTime(value);
|
||||
theTimeBase = tb;
|
||||
}
|
||||
}
|
||||
|
||||
class TimeBaseTimeCallBackStopper extends TimeBaseTimeCallBack
|
||||
{
|
||||
public void execute()
|
||||
{
|
||||
public void execute() {
|
||||
try {
|
||||
/*
|
||||
System.out.println("---TimeCallBackStopper--- called at:" + timeWhenCalledMsecs + "msecs");
|
||||
System.out.println("---TimeCallBackStopper--- callTime is: " + getCallTime() + " msecs");
|
||||
*/
|
||||
cmd_stop();
|
||||
|
||||
/*
|
||||
System.out.println("---TimeCallBackStopper--- Player time is: " + getPlayer().getTime() + " msecs");
|
||||
System.out.println("---TimeCallBackStopper--- Movie time is: " + getMovie().getTime() + " msecs");
|
||||
*/
|
||||
|
||||
cancelAndCleanup();
|
||||
//reschedule
|
||||
//callMeWhen();
|
||||
}
|
||||
catch (SmartMoviePanelException smpe) {}
|
||||
//System.out.println("myRateCallBack: " + String.valueOf(rateWhenCalled));
|
||||
if (rateWhenCalled > 0)
|
||||
launchAnnotationTimer();
|
||||
else
|
||||
cancelAnnotationTimer();
|
||||
cancel();
|
||||
callMeWhen();
|
||||
} catch (Exception e) {
|
||||
System.out.println("myRateCallBack err: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
public TimeBaseTimeCallBackStopper(TimeBase tb, int scale, int value, int flags) throws QTException
|
||||
{
|
||||
super(tb, scale, value, flags);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
class myJumpCallBack extends quicktime.std.clocks.TimeJumpCallBack {
|
||||
public myJumpCallBack(TimeBase tb) throws QTException {
|
||||
super(tb);
|
||||
}
|
||||
public void execute() {
|
||||
try {
|
||||
//System.out.println("myJumpCallBack: " + String.valueOf(rateWhenCalled));
|
||||
if (rateWhenCalled > 0)
|
||||
launchAnnotationTimer();
|
||||
cancel();
|
||||
callMeWhen();
|
||||
} catch (Exception e) {
|
||||
System.out.println("myJumpCallBack err: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
public class Tickler implements Ticklish {
|
||||
public void timeChanged(int newTime) throws QTException {
|
||||
//System.out.println("*** TimerClass *** timeChanged at:"+newTime);
|
||||
}
|
||||
public boolean tickle(float er,int time) throws QTException {
|
||||
//System.out.println("*** TimerClass *** tickle at:"+time);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue