Ignore:
Timestamp:
2010-06-18T20:14:22+02:00 (15 years ago)
Author:
guardian
Message:
 
Location:
applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java

    r21656 r21779  
    9191        }
    9292       
     93        //wal k waypoints forward/backward
     94        public void jumpRel(int k)
     95        {
     96
     97                if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
     98                {
     99                        jump(ls.get(ls.indexOf(curr)+k));
     100                }
     101                Main.map.mapView.repaint();
     102        }
     103       
    93104        //select the k-th waypoint
    94105        public void jump(int k)
    95106        {
    96                 if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size()))
    97                 {
    98                         jump(ls.get(ls.indexOf(curr)+k)); //FIXME here is a bug
    99                 }               
     107                if (k>0)
     108                {
     109                        if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
     110                        {
     111                                jump(ls.get(k));
     112                        }
     113                        Main.map.mapView.repaint();
     114                }
    100115        }
    101116       
     
    294309        public long getRelativeTime()
    295310        {
    296                 return curr.getTime().getTime()-start.getTime().getTime(); //TODO assumes timeintervall is constant!!!!
     311                return getRelativeTime(curr);
     312        }
     313       
     314        public long getRelativeTime(WayPoint p)
     315        {
     316                return p.getTime().getTime()-start.getTime().getTime(); //TODO assumes timeintervall is constant!!!!
    297317        }
    298318
    299319        //jumps to a specific time
    300320        public void jump(long relTime) {
    301                 int pos = (int) (relTime/1000);//TODO ugly quick hack   
    302                 jump(pos);             
    303                
     321                int pos = Math.round(relTime/1000);//TODO ugly quick hack       
     322                jump(pos);                             
    304323        }
    305324       
    306325        //toggles walking along the track
    307326        public void play()
    308         {
     327        { /*
    309328                if (t==null)
    310329                {
     
    329348                        t.cancel();
    330349                        t=null;                                 
    331                 }
     350                }*/
    332351        }
    333352
     
    340359                this.autoCenter=b;
    341360        }
     361       
     362        public List<WayPoint> getTrack()
     363        {
     364                return ls;
     365        }
    342366
    343367
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PlayerObserver.java

    r21656 r21779  
    33//an Interface for communication for both players
    44public interface PlayerObserver {
    5         void paused();
    6         void start_playing();
    7         void jumping(long relTime);
    8         void changeSpeed(float ratio);
     5        void playing(long time);
     6        void jumping(long time);
    97
    108}
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java

    r21656 r21779  
    88import java.util.Collection;
    99import java.util.Date;
     10import java.util.HashSet;
    1011import java.util.Iterator;
    1112import java.util.LinkedList;
    1213import java.util.List;
    1314import java.util.ListIterator;
     15import java.util.Set;
    1416import java.util.Timer;
    1517import java.util.TimerTask;
     
    5355//Basic rendering and GPS layer interaction
    5456public class PositionLayer extends Layer implements MouseListener,MouseMotionListener {
     57        private static Set<PlayerObserver> observers = new HashSet<PlayerObserver>(); //we have to implement our own Observer pattern
    5558        private List<WayPoint> ls;
    5659        public GpsPlayer player;
     
    6770                this.ls=ls;
    6871                player= new GpsPlayer(ls);
    69 
    70                 icon=ImageProvider.get("videomapping.png");
     72                icon = new ImageIcon("images/videomapping.png");
    7173                mins = new SimpleDateFormat("hh:mm:ss:S");
    7274                ms= new SimpleDateFormat("mm:ss");
     
    8486        @Override
    8587        public Object getInfoComponent() {
    86                 return tr("{0} covers {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10);
     88                String temp;
     89                String sep=System.getProperty("line.separator");
     90                temp=tr("{0} {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10+sep);
     91                temp=temp+gps.getNativePlayerInfos();
     92                return temp;
    8793        }
    8894
     
    129135                        p = Main.map.mapView.getPoint(n.getEastNorth());
    130136                        g.drawOval(p.x - 2, p.y - 2, 4, 4);
    131                         }
    132                 //draw surrounding points
     137                }
     138                //draw synced points
     139                g.setColor(Color.ORANGE);
     140                for(WayPoint n: ls) {
     141                        if(n.attr.containsKey("synced"))
     142                        {
     143                                p = Main.map.mapView.getPoint(n.getEastNorth());
     144                                g.drawOval(p.x - 2, p.y - 2, 4, 4);
     145                        }
     146                }
     147                //draw current segment points
    133148                g.setColor(Color.YELLOW);
    134149                if(player.getPrev()!=null)
     
    176191        }
    177192       
     193        //finds the first waypoint that is nearby the given point
    178194        private WayPoint getNearestWayPoint(Point mouse)
    179195        {
     
    182198                Rectangle rect = new Rectangle(mouse.x-MAX/2,mouse.y-MAX/2,MAX,MAX);
    183199                //iterate through all possible notes
    184                 for(WayPoint n : ls) //TODO this is not very clever, what better way to find this WP?
     200                for(WayPoint n : ls) //TODO this is not very clever, what better way to find this WP? Hashmaps? Divide and Conquer?
    185201                {
    186202                        p = Main.map.mapView.getPoint(n.getEastNorth());
     
    228244                                        mouse=e.getPoint();
    229245                                        dragIcon=true;
    230                                         //ani.cancel();
    231246                                }
    232247                        }
     
    250265                                {
    251266                                        player.jump(wp);
    252                                         if(gps!=null) gps.notifyGPSClick();
     267                                        if(gps!=null) notifyObservers(player.getRelativeTime()); //call videoplayer to set rigth position
    253268                                }
    254269                        }
     
    290305               
    291306        }
     307       
     308        public static void addObserver(PlayerObserver observer) {
     309
     310        observers.add(observer);
     311
     312    }
     313
     314 
     315
     316    public static void removeObserver(PlayerObserver observer) {
     317
     318        observers.remove(observer);
     319
     320    }
     321
     322    private static void notifyObservers(long newTime) {
     323
     324        for (PlayerObserver o : observers) {
     325
     326            o.jumping(newTime);
     327
     328        }
     329
     330    }
    292331}
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java

    r21656 r21779  
    3838
    3939  /**
    40  * @author Matthias Meißer
     40 * @author Matthias Meißer (digi_c at arcor dot de)
    4141 * @ released under GPL
    4242 * This Plugin allows you to link a video against a GPS track and playback both synchronously
     
    4848          private GpxData GPSTrack;
    4949          private List<WayPoint> ls;
    50           private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vloop;
     50          private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vfaster,Vslower,Vloop;
    5151          private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
    5252          private JCheckBoxMenuItem VCenterIcon;
     
    5454          private GPSVideoPlayer player;
    5555          private PositionLayer layer;
     56          private final String VM_DEINTERLACER="videomapping.deinterlacer";
     57          private final String VM_MRU="videomapping.mru";
     58          private final String VM_AUTOCENTER="videomapping.autocenter";
     59          private final String VM_JUMPLENGTH="videomapping.jumplength";
     60          private final String VM_LOOPLENGTH="videomapping.looplength";
     61          private boolean autocenter;
     62          private String deinterlacer;
     63          private Integer jumplength,looplength;
     64          private String mru;
     65          //TODO What more to store during sessions? Size/Position
    5666         
    5767
    5868        public VideoMappingPlugin(PluginInformation info) {
    5969                super(info);
     70                MapView.addLayerChangeListener(this);
    6071                //Register for GPS menu
    6172                VMenu = Main.main.menu.addMenu(" Video", KeyEvent.VK_V, Main.main.menu.defaultMenuPos,ht("/Plugin/Videomapping"));//TODO no more ugly " video" hack
    6273                addMenuItems();
     74                enableControlMenus(true);
    6375                loadSettings();
    64                 enableControlMenus(false);
    65                 //setup
    66                 MapView.addLayerChangeListener(this);
     76                applySettings();               
    6777                //further plugin informations are provided by build.xml properties
    68         }       
     78        }
    6979                       
    7080        //only use with GPS and own layers
    7181        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
     82                System.out.println(newLayer);
    7283                if (newLayer instanceof GpxLayer)
    7384                {
     
    7788                }
    7889                else
    79                 {
     90                {/*
    8091                        VAdd.setEnabled(false);
    8192                        if(newLayer instanceof PositionLayer)
     
    8697                        {
    8798                                enableControlMenus(false);
    88                         }
     99                        }*/
    89100                }
    90101               
     
    100111        //register main controls
    101112        private void addMenuItems() {
    102                 VAdd= new JosmAction("Import Video","videomapping","Sync a video against this GPS track",null,false) {
     113                VAdd= new JosmAction(tr("Import Video"),"videomapping",tr("Sync a video against this GPS track"),null,false) {
    103114                        private static final long serialVersionUID = 1L;
    104115
    105                         public void actionPerformed(ActionEvent arg0) {
    106                                 copyGPSLayer();
    107                                 enableControlMenus(true);
    108                                 layer = new PositionLayer("test",ls);
    109                                 Main.main.addLayer(layer);
    110                                 /*JFileChooser fc = new JFileChooser("Open Video file");
    111                                 fc.getSelectedFile();*/
    112                                 player = new GPSVideoPlayer(new File("C:\\temp\\test.mpg"), layer.player);
    113                                 //TODO Check here if we can sync by hand
    114                                 layer.setGPSPlayer(player);
    115                                 VAdd.setEnabled(false);
    116                                 VRemove.setEnabled(true);                               
    117                         }                       
    118                 };
    119                 VRemove= new JosmAction("Remove Video","videomapping","Removes current video from Layer",null,false) {
     116                        public void actionPerformed(ActionEvent arg0) {                                 
     117                                        JFileChooser fc = new JFileChooser();
     118                                        //fc.setSelectedFile(new File(mru));
     119                                        fc.setSelectedFile(new File("C:\\TEMP"));
     120                                        if(fc.showOpenDialog(Main.main.parent)!=JFileChooser.CANCEL_OPTION)
     121                                        {
     122                                                saveSettings();
     123                                                ls=copyGPSLayer(GPSTrack);
     124                                                enableControlMenus(true);
     125                                                layer = new PositionLayer(fc.getSelectedFile().getName(),ls);
     126                                                Main.main.addLayer(layer);
     127                                                player = new GPSVideoPlayer(fc.getSelectedFile(), layer.player);
     128                                                //TODO Check here if we can sync by hand
     129                                                layer.setGPSPlayer(player);
     130                                                layer.addObserver(player);
     131                                                VAdd.setEnabled(false);
     132                                                VRemove.setEnabled(true);
     133                                        }
     134                                }
     135               
     136                };
     137                VRemove= new JosmAction(tr("Remove Video"),"videomapping",tr("removes current video from layer"),null,false) {
    120138                        private static final long serialVersionUID = 1L;
    121139
     
    124142                        }
    125143                };
    126                 VStart = new JosmAction("play/pause", "audio-playpause", "starts/pauses video playback",
     144                VStart = new JosmAction(tr("play/pause"), "audio-playpause", tr("starts/pauses video playback"),
    127145                                Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_DIRECT), false) {
    128146                       
    129147                        public void actionPerformed(ActionEvent e) {                                                           
    130                                 //video.play();                         
    131                                 //video.jump(605000);
    132                                 //layer.l.jump(9*60+20);
    133                                 //layer.pause();
    134                                 player.play((9*60+20)*1000);
    135                         }
    136                 };
    137                 Vbackward = new JosmAction("backward", "audio-prev", "jumps n sec back",
     148                                if(player.playing()) player.pause(); else player.play();
     149                        }
     150                };
     151                Vbackward = new JosmAction(tr("backward"), "audio-prev", tr("jumps n sec back"),
    138152                                Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_DIRECT), false) {
    139153                       
     
    143157                        }
    144158                };
    145                 Vforward= new JosmAction("forward", "audio-next", "jumps n sec forward",
     159                Vforward= new JosmAction(tr("forward"), "audio-next", tr("jumps n sec forward"),
    146160                                Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_DIRECT), false) {
    147161                       
     
    151165                        }
    152166                };
    153                 Vloop= new JosmAction("loop", "clock", "loops n sec around current position",
     167                Vfaster= new JosmAction(tr("faster"), "audio-faster", tr("faster playback"),
     168                                Shortcut.registerShortcut("videomapping:faster","",KeyEvent.VK_PLUS, Shortcut.GROUP_DIRECT), false) {
     169                       
     170                        public void actionPerformed(ActionEvent e) {
     171                                player.faster();
     172                                                       
     173                        }
     174                };
     175                Vslower= new JosmAction(tr("slower"), "audio-slower", tr("slower playback"),
     176                                Shortcut.registerShortcut("videomapping:slower","",KeyEvent.VK_MINUS, Shortcut.GROUP_DIRECT), false) {
     177                       
     178                        public void actionPerformed(ActionEvent e) {
     179                                player.slower();
     180                                                       
     181                        }
     182                };
     183                Vloop= new JosmAction(tr("loop"), "clock", tr("loops n sec around current position"),
    154184                                Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_DIRECT), false) {
    155185                       
     
    161191               
    162192                //now the options menu
    163                 VCenterIcon = new JCheckBoxMenuItem(new JosmAction("Keep centered", null, "Follows the video icon automaticly",null, false) {
    164                        
    165                         public void actionPerformed(ActionEvent e) {
    166                                 player.setAutoCenter(VCenterIcon.isSelected());
    167                                                        
    168                         }
    169                 });
    170                
    171                 VJumpLength = new JMenuItem(new JosmAction("Jump length", null, "Set the length of a jump",null, false) {
     193                VCenterIcon = new JCheckBoxMenuItem(new JosmAction(tr("Keep centered"), "cursor/crosshair", tr("follows the video icon automaticly"),null, false) {
     194                       
     195                        public void actionPerformed(ActionEvent e) {
     196                                autocenter=VCenterIcon.isSelected();
     197                                applySettings();
     198                                saveSettings();
     199                                                       
     200                        }
     201                });
     202               
     203                VJumpLength = new JMenuItem(new JosmAction(tr("Jump length"), null, tr("Set the length of a jump"),null, false) {
    172204                       
    173205                        public void actionPerformed(ActionEvent e) {
    174206                                Object[] possibilities = {"200", "500", "1000", "2000", "10000"};
    175                                 String s = (String)JOptionPane.showInputDialog(Main.parent,"Jump in video for x ms","Jump length",JOptionPane.QUESTION_MESSAGE,null,possibilities,"1000");
    176                                 player.setJumpLength(Integer.getInteger(s));
    177                                                        
    178                         }
    179                 });
    180                
    181                 VLoopLength = new JMenuItem(new JosmAction("Loop length", null, "Set the length around a looppoint",null, false) {
     207                                String s = (String)JOptionPane.showInputDialog(Main.parent,tr("Jump in video for x ms"),tr("Jump length"),JOptionPane.QUESTION_MESSAGE,null,possibilities,jumplength);
     208                                jumplength=Integer.getInteger(s);
     209                                applySettings();
     210                                saveSettings();                 
     211                        }
     212                });
     213               
     214                VLoopLength = new JMenuItem(new JosmAction(tr("Loop length"), null, tr("Set the length around a looppoint"),null, false) {
    182215                       
    183216                        public void actionPerformed(ActionEvent e) {
    184217                                Object[] possibilities = {"500", "1000", "3000", "5000", "10000"};
    185                                 String s = (String)JOptionPane.showInputDialog(Main.parent,"Jump in video for x ms","Loop length",JOptionPane.QUESTION_MESSAGE,null,possibilities,"5000");
    186                                 player.setLoopLength(Integer.getInteger(s));
     218                                String s = (String)JOptionPane.showInputDialog(Main.parent,tr("Jump in video for x ms"),tr("Loop length"),JOptionPane.QUESTION_MESSAGE,null,possibilities,looplength);
     219                                looplength=Integer.getInteger(s);
     220                                applySettings();
     221                                saveSettings();
    187222                                                       
    188223                        }
     
    190225               
    191226                VDeinterlacer= new JMenu("Deinterlacer");
    192                 VIntNone= new JRadioButtonMenuItem(new JosmAction("none", null, "no deinterlacing",null, false) {
    193                        
    194                         public void actionPerformed(ActionEvent e) {
    195                                 player.setDeinterlacer(null);
    196                         }
    197                 });
    198                 VIntBob= new JRadioButtonMenuItem(new JosmAction("bob", null, "deinterlacing using line doubling",null, false) {
    199                        
    200                         public void actionPerformed(ActionEvent e) {
    201                                 player.setDeinterlacer("bob");
    202                         }
    203                 });
    204                 VIntLinear= new JRadioButtonMenuItem(new JosmAction("linear", null, "deinterlacing using linear interpolation",null, false) {
    205                        
    206                         public void actionPerformed(ActionEvent e) {
    207                                 player.setDeinterlacer("bob");
     227                VIntNone= new JRadioButtonMenuItem(new JosmAction(tr("none"), null, tr("no deinterlacing"),null, false) {
     228                       
     229                        public void actionPerformed(ActionEvent e) {
     230                                deinterlacer=null;
     231                                applySettings();
     232                                saveSettings();
     233                        }
     234                });
     235                VIntBob= new JRadioButtonMenuItem(new JosmAction("bob", null, tr("deinterlacing using line doubling"),null, false) {
     236                       
     237                        public void actionPerformed(ActionEvent e) {
     238                                deinterlacer="bob";
     239                                applySettings();
     240                                saveSettings();
     241                        }
     242                });
     243                VIntLinear= new JRadioButtonMenuItem(new JosmAction("linear", null, tr("deinterlacing using linear interpolation"),null, false) {
     244                       
     245                        public void actionPerformed(ActionEvent e) {
     246                                deinterlacer="linear";
     247                                applySettings();
     248                                saveSettings();
    208249                        }
    209250                });
     
    216257                VMenu.add(Vbackward);
    217258                VMenu.add(Vforward);
     259                VMenu.add(Vfaster);
     260                VMenu.add(Vslower);
    218261                VMenu.add(Vloop);
    219262                VMenu.addSeparator();
     
    235278        }
    236279       
    237         //load all properties
     280        //load all properties or set defaults
    238281        private void loadSettings() {
     282                String temp;           
     283                temp=Main.pref.get(VM_AUTOCENTER);
     284                if((temp!=null)&&(temp.length()!=0))autocenter=Boolean.getBoolean(temp); else autocenter=false;
     285                temp=Main.pref.get(VM_DEINTERLACER);
     286                if((temp!=null)&&(temp.length()!=0)) deinterlacer=Main.pref.get(temp);
     287                temp=Main.pref.get(VM_JUMPLENGTH);
     288                if((temp!=null)&&(temp.length()!=0)) jumplength=Integer.valueOf(temp); else jumplength=1000;
     289                temp=Main.pref.get(VM_LOOPLENGTH);
     290                if((temp!=null)&&(temp.length()!=0)) looplength=Integer.valueOf(temp); else looplength=6000;
     291                temp=Main.pref.get(VM_MRU);
     292                if((temp!=null)&&(temp.length()!=0)) mru=Main.pref.get(VM_MRU);else mru=System.getProperty("user.home");
     293        }
     294       
     295        private void applySettings(){
     296                //Internals
     297                if(player!=null)
     298                {
     299                        player.setAutoCenter(autocenter);
     300                        player.setDeinterlacer(deinterlacer);
     301                        player.setJumpLength(jumplength);
     302                        player.setLoopLength(looplength);
     303                }
     304                //GUI
     305                VCenterIcon.setSelected(autocenter);
    239306                VIntNone.setSelected(true);
     307                if(deinterlacer=="bob")VIntBob.setSelected(true);
     308                if(deinterlacer=="linear")VIntLinear.setSelected(true);
     309               
     310        }
     311       
     312        private void saveSettings(){
     313                Main.pref.put(VM_AUTOCENTER, autocenter);
     314                Main.pref.put(VM_DEINTERLACER, deinterlacer);
     315                Main.pref.put(VM_JUMPLENGTH, jumplength.toString());
     316                Main.pref.put(VM_LOOPLENGTH, looplength.toString());
     317                Main.pref.put(VM_MRU, mru);
    240318        }
    241319       
    242320        //make a flat copy
    243         private void copyGPSLayer()
     321        private List<WayPoint> copyGPSLayer(GpxData route)
    244322        {
    245323                ls = new LinkedList<WayPoint>();
    246         for (GpxTrack trk : GPSTrack.tracks) {
     324        for (GpxTrack trk : route.tracks) {
    247325            for (GpxTrackSegment segment : trk.getSegments()) {
    248326                ls.addAll(segment.getWayPoints());
     
    250328        }
    251329        Collections.sort(ls); //sort basing upon time
     330        return ls;
    252331        }
    253332  }
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java

    r21656 r21779  
    99import javax.swing.JButton;
    1010
     11import org.openstreetmap.josm.data.gpx.WayPoint;
    1112import org.openstreetmap.josm.plugins.videomapping.GpsPlayer;
    12 
    13 //combines video and GPS playback
    14 public class GPSVideoPlayer{
     13import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
     14
     15//combines video and GPS playback, major control has the video player
     16public class GPSVideoPlayer implements PlayerObserver{
    1517        Timer t;
    1618        TimerTask syncGPSTrack;
     
    4244                                syncBtn.setBackground(Color.GREEN);
    4345                                synced=true;
     46                                markSyncedPoints();
    4447                                gps.play();
    4548                        }
     
    4750                setSyncMode(true);
    4851                video.addComponent(syncBtn);
     52                //allow sync
     53                SimpleVideoPlayer.addObserver(new PlayerObserver() {
     54
     55                        public void playing(long time) {
     56                                //sync the GPS back
     57                                if(synced) gps.jump(getGPSTime(time));
     58                               
     59                        }
     60
     61                        public void jumping(long time) {
     62                       
     63                        }
     64                       
     65                       
     66                });
    4967                t = new Timer();               
    5068        }
    5169       
     70        //marks all points that are covered by video AND GPS track
     71        private void markSyncedPoints() {
     72                long time;
     73                //TODO this is poor, a start/end calculation would be better
     74                for (WayPoint wp : gps.getTrack()) {
     75                        time=getVideoTime(gps.getRelativeTime(wp));
     76                        if(time>0) wp.attr.put("synced", "true");
     77                }
     78               
     79        }
     80
    5281        public void setSyncMode(boolean b)
    5382        {
     
    73102        public void play(long gpsstart)
    74103        {
     104                //video is already playing
    75105                jumpToGPSTime(gpsstart);
    76106                gps.jump(gpsstart);
    77                 gps.play();
     107                //gps.play();
     108        }
     109       
     110        public void play()
     111        {
     112                video.play();
     113        }
     114       
     115        public void pause()
     116        {
     117                video.pause();
    78118        }
    79119       
     
    96136        }
    97137
    98         //when we clicked on the layer, here we update the video position
    99         public void notifyGPSClick() {
    100                 if(synced) jumpToGPSTime(gps.getRelativeTime());
    101                
    102         }
     138       
    103139
    104140        public void setJumpLength(Integer integer) {
     
    151187
    152188       
     189        //not called by GPS
     190        public boolean playing() {
     191                return video.playing();
     192        }
     193
     194        //when we clicked on the layer, here we update the video position
     195        public void jumping(long time) {
     196                if(synced) jumpToGPSTime(gps.getRelativeTime());
     197               
     198        }
     199
     200        public String getNativePlayerInfos() {
     201                return video.getNativePlayerInfos();
     202        }
     203
     204        public void faster() {
     205                video.faster();
     206               
     207        }
     208
     209        public void slower() {
     210                video.slower();
     211               
     212        }
     213
     214        public void playing(long time) {
     215                // TODO Auto-generated method stub
     216               
     217        }
     218
     219       
    153220}
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java

    r21656 r21779  
    3737import org.openstreetmap.josm.Main;
    3838import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
     39import static org.openstreetmap.josm.tools.I18n.*;
    3940
    4041import uk.co.caprica.vlcj.binding.LibVlc;
     
    6061        private final String[] mediaOptions = {""};
    6162        private boolean syncTimeline=false;
    62         private SimpleDateFormat df;
    63         private static final Logger LOG = Logger.getLogger(SimpleVideoPlayer.class);
     63        private boolean looping=false;
     64        private SimpleDateFormat ms;
     65        private static final Logger LOG = Logger.getLogger(MediaPlayerFactory.class);
    6466        private int jumpLength=1000;
    6567        private int  loopLength=6000;
     
    8688                    mp.setStandardMediaOptions(standardMediaOptions);
    8789                    //setup GUI
    88                     setSize(400, 300);
     90                    setSize(400, 300); //later we resize
    8991                    setAlwaysOnTop(true);
    9092                    //setIconImage();
    91                     df = new SimpleDateFormat("hh:mm:ss:S");
     93                    ms = new SimpleDateFormat("hh:mm:ss:S");
    9294                    scr=new Canvas();
    9395                    timeline = new JSlider(0,100,0);
     
    9597                    timeline.setMajorTickSpacing(5);
    9698                    timeline.setPaintTicks(true);
    97                     play= new JButton("play");
     99                    play= new JButton(tr("play"));
    98100                    back= new JButton("<");
    99101                    forward= new JButton(">");
    100                     loop= new JToggleButton("loop");
     102                    loop= new JToggleButton(tr("loop"));
    101103                    speed = new JSlider(-200,200,0);
    102104                    speed.setMajorTickSpacing(100);
     
    127129                catch (NoClassDefFoundError e)
    128130                {
    129                         System.err.println("Unable to find JNA Java library!");
     131                        System.err.println(tr("Unable to find JNA Java library!"));
    130132                }
    131133                catch (UnsatisfiedLinkError e)
    132134                {
    133                         System.err.println("Unable to find native libvlc library!");
     135                        System.err.println(tr("Unable to find native libvlc library!"));
    134136                }
    135137               
     
    181183                       
    182184                        public void actionPerformed(ActionEvent arg0) {
    183                                 mp.setTime((long) (mp.getTime()-jumpLength));
    184                                 //jump(600000); //10,05
    185                                
     185                                backward();
    186186                        }
    187187                });
     
    190190                       
    191191                        public void actionPerformed(ActionEvent arg0) {
    192                                 mp.setTime((long) (mp.getTime()+jumpLength));
    193                                
     192                                forward();
    194193                        }
    195194                });
     
    198197
    199198                        public void actionPerformed(ActionEvent arg0) {
    200                         if(!loop.isSelected())
    201                         {
    202                                 t.cancel();
    203                         }
    204                         else                   
    205                         {
    206                                 final long resetpoint=(long) mp.getTime()-loopLength/2;
    207                                 TimerTask ani=new TimerTask() {
    208                                        
    209                                         @Override
    210                                         public void run() {
    211                                                 mp.setTime(resetpoint);
    212                                         }
    213                                 };
    214                                 t= new Timer();
    215                                 t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset
    216                                 }
     199                                loop();
    217200                        }
    218201                });
     
    330313                if(mp.isPlaying())
    331314                {
    332                         setTitle(df.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
     315                        setTitle(ms.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
    333316                        syncTimeline=true;
    334317                        timeline.setValue(Math.round(mp.getPosition()*100));
    335318                        syncTimeline=false;
     319                        notifyObservers(mp.getTime());
    336320                }
    337321        }
     
    363347        }
    364348
    365         public void loop() {           
    366                 loop.notifyAll();
     349        public void loop() {
     350                if(looping)
     351                {
     352                        t.cancel();
     353                        looping=false;
     354                }
     355                else                   
     356                {
     357                        final long resetpoint=(long) mp.getTime()-loopLength/2;
     358                        TimerTask ani=new TimerTask() {
     359                               
     360                                @Override
     361                                public void run() {
     362                                        mp.setTime(resetpoint);
     363                                }
     364                        };
     365                        t= new Timer();
     366                        t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset
     367                        looping=true;
     368                        }
     369               
    367370        }
    368371
    369372        public void forward() {
    370                 forward.notifyAll();   
     373                mp.setTime((long) (mp.getTime()+jumpLength));
    371374        }
    372375
    373376        public void backward() {
    374                 back.notifyAll();
     377                mp.setTime((long) (mp.getTime()-jumpLength));
    375378               
    376379        }
     
    396399            }
    397400
    398             private static void notifyObservers() {
     401            private static void notifyObservers(long newTime) {
    399402
    400403                for (PlayerObserver o : observers) {
    401404
    402                     o.changeSpeed(0.0f);
     405                    o.playing(newTime);
    403406
    404407                }
     
    406409            }
    407410
     411                public String getNativePlayerInfos() {
     412                        return "VLC "+LibVlc.INSTANCE.libvlc_get_version();
     413                }
     414
     415                public void faster() {
     416                        speed.setValue(speed.getValue()+100);
     417                       
     418                }
     419
     420                public void slower() {
     421                        speed.setValue(speed.getValue()-100);
     422                       
     423                }
     424
     425                public void pause() {
     426                        if (mp.isPlaying()) mp.pause();
     427                       
     428                }
     429
     430                public boolean playing() {
     431                        return mp.isPlaying();
     432                }
     433
    408434       
    409435
Note: See TracChangeset for help on using the changeset viewer.