From 3d215caf53aaa614e3fc8aeb9c274cb1ddb44360 Mon Sep 17 00:00:00 2001 From: michel_jacobson Date: Thu, 28 Nov 2002 16:16:27 +0000 Subject: [PATCH] modifications to handle url in place of file and to be used with SmartQT4JApplet --- source/org/thdl/media/SmartQT4JPlayer.java | 445 ++++++++------------- 1 file changed, 156 insertions(+), 289 deletions(-) diff --git a/source/org/thdl/media/SmartQT4JPlayer.java b/source/org/thdl/media/SmartQT4JPlayer.java index 790be00..70b6c97 100644 --- a/source/org/thdl/media/SmartQT4JPlayer.java +++ b/source/org/thdl/media/SmartQT4JPlayer.java @@ -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; + } + } +} \ No newline at end of file