Ignore:
Timestamp:
2010-06-11T19:43:03+02:00 (14 years ago)
Author:
guardian
Message:
 
Location:
applications/editors/josm/plugins/videomapping
Files:
1 added
7 edited

Legend:

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

    r21631 r21656  
    22
    33import java.awt.Point;
     4import java.io.File;
    45import java.sql.Time;
    56import java.text.SimpleDateFormat;
     
    2122        private Timer t;
    2223        private TimerTask ani; //for moving trough the list
     24        private boolean autoCenter;
    2325       
    2426
     
    314316                                public void run() {                             
    315317                                        next();
     318                                        if(autoCenter) Main.map.mapView.zoomTo(getCurr().getEastNorth());
    316319                                        Main.map.mapView.repaint();
    317320                                }
     
    328331                }
    329332        }
     333
     334        public long getLength() {
     335                return ls.size()*1000; //FIXME this is a poor hack
     336        }
     337       
     338        public void setAutoCenter(boolean b)
     339        {
     340                this.autoCenter=b;
     341        }
     342
     343
     344
    330345       
    331346}
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java

    r21631 r21656  
    3434
    3535import org.openstreetmap.josm.Main;
     36import org.openstreetmap.josm.actions.InfoAction;
    3637import org.openstreetmap.josm.data.Bounds;
    3738import org.openstreetmap.josm.data.gpx.GpxData;
     
    4849import org.openstreetmap.josm.tools.Shortcut;
    4950
     51import com.sun.jna.StringArray;
     52
    5053//Basic rendering and GPS layer interaction
    5154public class PositionLayer extends Layer implements MouseListener,MouseMotionListener {
     
    8184        @Override
    8285        public Object getInfoComponent() {
    83                 return null;
     86                return tr("{0} covers {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10);
    8487        }
    8588
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java

    r21631 r21656  
    44import java.awt.event.ActionEvent;
    55import java.awt.event.KeyEvent;
     6import java.beans.PropertyChangeListener;
    67import java.io.File;
    78import java.util.Collections;
     
    910import java.util.List;
    1011
     12import javax.swing.Action;
     13import javax.swing.JCheckBoxMenuItem;
     14import javax.swing.JFileChooser;
    1115import javax.swing.JMenu;
    1216import javax.swing.JMenuItem;
    1317import javax.swing.JOptionPane;
     18import javax.swing.JRadioButtonMenuItem;
    1419
    1520import org.openstreetmap.josm.Main;
     
    4045//Here we manage properties and start the other classes
    4146public class VideoMappingPlugin extends Plugin implements LayerChangeListener{
    42           private JMenu VMenu;
     47          private JMenu VMenu,VDeinterlacer;
    4348          private GpxData GPSTrack;
    4449          private List<WayPoint> ls;
    45           private JosmAction VAdd,VStart,Vbackward,Vforward,Vloop;
     50          private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vloop;
     51          private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
     52          private JCheckBoxMenuItem VCenterIcon;
     53          private JMenuItem VJumpLength,VLoopLength;
    4654          private GPSVideoPlayer player;
    4755          private PositionLayer layer;
     
    5159                super(info);
    5260                //Register for GPS menu
    53                 VMenu = Main.main.menu.addMenu(" Video", KeyEvent.VK_V, Main.main.menu.defaultMenuPos,ht("/Plugin/Videomapping"));//TODO no more ugly " video" hack             
     61                VMenu = Main.main.menu.addMenu(" Video", KeyEvent.VK_V, Main.main.menu.defaultMenuPos,ht("/Plugin/Videomapping"));//TODO no more ugly " video" hack
    5462                addMenuItems();
     63                loadSettings();
     64                enableControlMenus(false);
    5565                //setup
    5666                MapView.addLayerChangeListener(this);
     
    90100        //register main controls
    91101        private void addMenuItems() {
    92                 VAdd= new JosmAction("Sync Video","videomapping","Sync a video against this GPS track",null,false) {
    93 
    94                         /**
    95                          *
    96                          */
     102                VAdd= new JosmAction("Import Video","videomapping","Sync a video against this GPS track",null,false) {
    97103                        private static final long serialVersionUID = 1L;
    98104
     
    101107                                enableControlMenus(true);
    102108                                layer = new PositionLayer("test",ls);
    103                                 Main.main.addLayer(layer);                             
     109                                Main.main.addLayer(layer);
     110                                /*JFileChooser fc = new JFileChooser("Open Video file");
     111                                fc.getSelectedFile();*/
    104112                                player = new GPSVideoPlayer(new File("C:\\temp\\test.mpg"), layer.player);
     113                                //TODO Check here if we can sync by hand
    105114                                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) {
     120                        private static final long serialVersionUID = 1L;
     121
     122                        public void actionPerformed(ActionEvent arg0) {
     123                                player.removeVideo();
    106124                        }
    107125                };
    108126                VStart = new JosmAction("play/pause", "audio-playpause", "starts/pauses video playback",
    109                                 Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_MENU), false) {
     127                                Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_DIRECT), false) {
    110128                       
    111129                        public void actionPerformed(ActionEvent e) {                                                           
     
    118136                };
    119137                Vbackward = new JosmAction("backward", "audio-prev", "jumps n sec back",
    120                                 Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_MENU), false) {
    121                        
    122                         public void actionPerformed(ActionEvent e) {
    123                                 //layer.backward();
     138                                Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_DIRECT), false) {
     139                       
     140                        public void actionPerformed(ActionEvent e) {
     141                                player.backward();
    124142                                                       
    125143                        }
    126144                };
    127145                Vforward= new JosmAction("forward", "audio-next", "jumps n sec forward",
    128                                 Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_MENU), false) {
    129                        
    130                         public void actionPerformed(ActionEvent e) {
    131                                 //layer.forward();
     146                                Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_DIRECT), false) {
     147                       
     148                        public void actionPerformed(ActionEvent e) {
     149                                player.forward();
    132150                                                       
    133151                        }
    134152                };
    135153                Vloop= new JosmAction("loop", "clock", "loops n sec around current position",
    136                                 Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_MENU), false) {
    137                        
    138                         public void actionPerformed(ActionEvent e) {
    139                                 //layer.loop();
    140                                                        
    141                         }
    142                 };
    143                 VMenu.add(VAdd);
    144                 enableControlMenus(false);
     154                                Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_DIRECT), false) {
     155                       
     156                        public void actionPerformed(ActionEvent e) {
     157                                player.loop();
     158                                                       
     159                        }
     160                };
     161               
     162                //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) {
     172                       
     173                        public void actionPerformed(ActionEvent e) {
     174                                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) {
     182                       
     183                        public void actionPerformed(ActionEvent e) {
     184                                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));
     187                                                       
     188                        }
     189                });
     190               
     191                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");
     208                        }
     209                });
     210                VDeinterlacer.add(VIntNone);
     211                VDeinterlacer.add(VIntBob);
     212                VDeinterlacer.add(VIntLinear);
     213               
     214                VMenu.add(VAdd);               
    145215                VMenu.add(VStart);
    146216                VMenu.add(Vbackward);
    147217                VMenu.add(Vforward);
    148218                VMenu.add(Vloop);
     219                VMenu.addSeparator();
     220                VMenu.add(VCenterIcon);
     221                VMenu.add(VJumpLength);
     222                VMenu.add(VLoopLength);
     223                VMenu.add(VDeinterlacer);
    149224        }
    150225       
     
    158233                Vforward.setEnabled(enabled);
    159234                Vloop.setEnabled(enabled);
     235        }
     236       
     237        //load all properties
     238        private void loadSettings() {
     239                VIntNone.setSelected(true);
    160240        }
    161241       
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java

    r21631 r21656  
    99import javax.swing.JButton;
    1010
    11 import org.openstreetmap.josm.command.AddCommand;
    12 import org.openstreetmap.josm.data.gpx.WayPoint;
    1311import org.openstreetmap.josm.plugins.videomapping.GpsPlayer;
    1412
     
    103101               
    104102        }
     103
     104        public void setJumpLength(Integer integer) {
     105                video.setJumpLength(integer);
     106               
     107        }
     108
     109        public void setLoopLength(Integer integer) {
     110                video.setLoopLength(integer);
     111               
     112        }
     113
     114        public void loop() {
     115                video.loop();
     116               
     117        }
     118
     119        public void forward() {
     120                video.forward();
     121               
     122        }
     123
     124        public void backward() {
     125                video.backward();
     126               
     127        }
     128
     129        public void removeVideo() {
     130                video.removeVideo();
     131               
     132        }
     133
     134        public File getVideo() {
     135                return file;
     136        }
     137
     138        public float getCoverage() {
     139                return gps.getLength()/video.getLength();
     140        }
     141
     142        public void setDeinterlacer(String string) {
     143                video.setDeinterlacer(string);
     144               
     145        }
     146
     147        public void setAutoCenter(boolean selected) {
     148                gps.setAutoCenter(selected);
     149               
     150        }
     151
    105152       
    106153}
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java

    r21631 r21656  
    55import java.awt.BorderLayout;
    66import java.awt.Canvas;
     7import java.awt.Dimension;
    78import java.awt.FlowLayout;
    89import java.awt.event.ActionEvent;
     
    1415import java.text.SimpleDateFormat;
    1516import java.util.Date;
     17import java.util.HashSet;
     18import java.util.Hashtable;
     19import java.util.Set;
    1620import java.util.Timer;
    1721import java.util.TimerTask;
     
    2428import javax.swing.JComponent;
    2529import javax.swing.JFrame;
     30import javax.swing.JLabel;
    2631import javax.swing.JPanel;
    2732import javax.swing.JSlider;
     
    3136
    3237import org.openstreetmap.josm.Main;
     38import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
    3339
    3440import uk.co.caprica.vlcj.binding.LibVlc;
     
    5662        private SimpleDateFormat df;
    5763        private static final Logger LOG = Logger.getLogger(SimpleVideoPlayer.class);
     64        private int jumpLength=1000;
     65        private int  loopLength=6000;
     66        private static Set<PlayerObserver> observers = new HashSet<PlayerObserver>(); //we have to implement our own Observer pattern
    5867       
    5968        public SimpleVideoPlayer() {
     
    7887                    //setup GUI
    7988                    setSize(400, 300);
     89                    setAlwaysOnTop(true);
     90                    //setIconImage();
    8091                    df = new SimpleDateFormat("hh:mm:ss:S");
    8192                    scr=new Canvas();
    82                     timeline = new JSlider(0,100,0); //TODO better setup for ticks
     93                    timeline = new JSlider(0,100,0);
     94                    timeline.setMajorTickSpacing(10);
     95                    timeline.setMajorTickSpacing(5);
     96                    timeline.setPaintTicks(true);
    8397                    play= new JButton("play");
    8498                    back= new JButton("<");
    8599                    forward= new JButton(">");
    86100                    loop= new JToggleButton("loop");
    87                     speed = new JSlider(0,2,1);
    88                         speed.setPaintTicks(true);
    89                         speed.setMajorTickSpacing(5);
     101                    speed = new JSlider(-200,200,0);
     102                    speed.setMajorTickSpacing(100);
     103                        speed.setPaintTicks(true);                     
    90104                        speed.setOrientation(Adjustable.VERTICAL);
     105                        Hashtable labelTable = new Hashtable();
     106                        labelTable.put( new Integer( 0 ), new JLabel("1x") );
     107                        labelTable.put( new Integer( -200 ), new JLabel("-2x") );
     108                        labelTable.put( new Integer( 200 ), new JLabel("2x") );
     109                        speed.setLabelTable( labelTable );
     110                        speed.setPaintLabels(true);
     111
    91112                    setLayout();
    92113                        addListeners();
     
    137158        //add UI functionality
    138159        private void addListeners() {
    139                 final float JUMP_LENGTH=1000;
    140                 final int  LOOP_LENGTH=6000;
    141160                timeline.addChangeListener(new ChangeListener() {
    142161                        public void stateChanged(ChangeEvent e) {
     
    162181                       
    163182                        public void actionPerformed(ActionEvent arg0) {
    164                                 mp.setTime((long) (mp.getTime()-JUMP_LENGTH));
     183                                mp.setTime((long) (mp.getTime()-jumpLength));
    165184                                //jump(600000); //10,05
    166185                               
     
    171190                       
    172191                        public void actionPerformed(ActionEvent arg0) {
    173                                 mp.setTime((long) (mp.getTime()+JUMP_LENGTH));
     192                                mp.setTime((long) (mp.getTime()+jumpLength));
    174193                               
    175194                        }
     
    185204                        else                   
    186205                        {
    187                                 final long resetpoint=(long) mp.getTime()-LOOP_LENGTH/2;
     206                                final long resetpoint=(long) mp.getTime()-loopLength/2;
    188207                                TimerTask ani=new TimerTask() {
    189208                                       
     
    194213                                };
    195214                                t= new Timer();
    196                                 t.schedule(ani,LOOP_LENGTH/2,LOOP_LENGTH); //first run a half looptime till reset       
     215                                t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset
    197216                                }
    198217                        }
     
    202221                       
    203222                        public void stateChanged(ChangeEvent arg0) {
    204                                 // TODO change playback speed
     223                                if(!speed.getValueIsAdjusting()&&(mp.isPlaying()))
     224                                {
     225                                        int perc = speed.getValue();
     226                                        float ratio= (float) (perc/400f*1.75);
     227                                        ratio=ratio+(9/8);
     228                                        mp.setRate(ratio);
     229                                }
    205230                               
    206231                        }
     
    218243
    219244        public void metaDataAvailable(MediaPlayer arg0, VideoMetaData data) {
    220                 scr.setSize(data.getVideoDimension());
     245                final float perc = 0.5f;
     246                Dimension org=data.getVideoDimension();
     247                scr.setSize(new Dimension((int)(org.width*perc), (int)(org.height*perc)));
    221248                pack();
    222249
     
    293320        }
    294321       
     322        public boolean isPlaying()
     323        {
     324                return mp.isPlaying();
     325        }
     326       
    295327        //gets called by the Syncer to update all components
    296328        public void updateTime ()
     
    298330                if(mp.isPlaying())
    299331                {
    300                         setTitle(df.format(new Date(mp.getTime()))+" "+mp.getTime());
     332                        setTitle(df.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
    301333                        syncTimeline=true;
    302334                        timeline.setValue(Math.round(mp.getPosition()*100));
     
    311343                pack();
    312344        }
     345
     346        public long getLength() {               
     347                return mp.getLength();
     348        }
     349
     350        public void setDeinterlacer(String string) {
     351                mp.setDeinterlace(string);
     352               
     353        }
     354
     355        public void setJumpLength(Integer integer) {
     356                jumpLength=integer;
     357               
     358        }
     359
     360        public void setLoopLength(Integer integer) {
     361                loopLength = integer;
     362               
     363        }
     364
     365        public void loop() {           
     366                loop.notifyAll();
     367        }
     368
     369        public void forward() {
     370                forward.notifyAll();   
     371        }
     372
     373        public void backward() {
     374                back.notifyAll();
     375               
     376        }
     377
     378        public void removeVideo() {
     379                if (mp.isPlaying()) mp.stop();
     380                mp.release();
     381               
     382        }
     383
     384        public static void addObserver(PlayerObserver observer) {
     385
     386                observers.add(observer);
     387
     388            }
     389
     390         
     391
     392            public static void removeObserver(PlayerObserver observer) {
     393
     394                observers.remove(observer);
     395
     396            }
     397
     398            private static void notifyObservers() {
     399
     400                for (PlayerObserver o : observers) {
     401
     402                    o.changeSpeed(0.0f);
     403
     404                }
     405
     406            }
     407
    313408       
    314409
  • applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Syncer.java

    r21584 r21656  
    1919          //here we update
    2020        public void run() {
    21                 pl.updateTime();
    22 
     21                if (pl.isPlaying())     pl.updateTime(); //if the video is seeking we get a mess
    2322        }
    2423      });
     24     
    2525    }
    2626  }
  • applications/editors/josm/plugins/videomapping/test/videotest.java

    r21631 r21656  
    2828                sVP.setFile(new File("C:\\TEMP\\test.mpg"));
    2929                sVP.play(); //FIXME We have a bug so we get out of sync if we jump before the video is up (and this we CAN'T DETECT!!!)
     30                /*
    3031                JButton b = new JButton("jump");
    3132                b.addActionListener(new ActionListener() {
     
    3637                });
    3738                sVP.add(b);
    38 
     39                */
    3940        }
    4041
Note: See TracChangeset for help on using the changeset viewer.