001package com.github.sarxos.webcam;
002
003import java.awt.BorderLayout;
004import java.awt.event.ItemEvent;
005import java.awt.event.ItemListener;
006import java.awt.event.WindowEvent;
007import java.awt.event.WindowListener;
008import java.lang.Thread.UncaughtExceptionHandler;
009
010import javax.swing.JFrame;
011import javax.swing.SwingUtilities;
012
013import org.slf4j.Logger;
014import org.slf4j.LoggerFactory;
015
016
017/**
018 * Just a simple webcam viewer.
019 * 
020 * @author Bartosz Firyn (SarXos)
021 */
022public class WebcamViewer extends JFrame implements Runnable, WebcamListener, WindowListener, UncaughtExceptionHandler, ItemListener {
023
024        private static final long serialVersionUID = 1L;
025
026        private static final Logger LOG = LoggerFactory.getLogger(WebcamViewer.class);
027
028        private Webcam webcam = null;
029        private WebcamPanel panel = null;
030        private WebcamPicker picker = null;
031
032        public WebcamViewer() {
033                SwingUtilities.invokeLater(this);
034        }
035
036        @Override
037        public void run() {
038
039                setTitle("Webcam Capture Viewer");
040                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
041                setLayout(new BorderLayout());
042
043                addWindowListener(this);
044
045                picker = new WebcamPicker();
046                picker.addItemListener(this);
047
048                webcam = picker.getSelectedWebcam();
049
050                if (webcam == null) {
051                        LOG.error("No webcams found");
052                        System.exit(1);
053                }
054
055                webcam.setViewSize(WebcamResolution.VGA.getSize());
056                webcam.addWebcamListener(WebcamViewer.this);
057
058                panel = new WebcamPanel(webcam, false);
059                panel.setFPSDisplayed(true);
060
061                add(picker, BorderLayout.NORTH);
062                add(panel, BorderLayout.CENTER);
063
064                pack();
065                setVisible(true);
066
067                Thread t = new Thread() {
068
069                        @Override
070                        public void run() {
071                                panel.start();
072                        }
073                };
074                t.setName("webcam-viewer-starter");
075                t.setDaemon(true);
076                t.setUncaughtExceptionHandler(this);
077                t.start();
078        }
079
080        @Override
081        public void webcamOpen(WebcamEvent we) {
082                LOG.info("Webcam open");
083        }
084
085        @Override
086        public void webcamClosed(WebcamEvent we) {
087                LOG.info("Webcam closed");
088        }
089
090        @Override
091        public void webcamDisposed(WebcamEvent we) {
092                LOG.info("Webcam disposed");
093        }
094
095        @Override
096        public void webcamImageObtained(WebcamEvent we) {
097                // do nothing
098        }
099
100        @Override
101        public void windowActivated(WindowEvent e) {
102        }
103
104        @Override
105        public void windowClosed(WindowEvent e) {
106                webcam.close();
107        }
108
109        @Override
110        public void windowClosing(WindowEvent e) {
111        }
112
113        @Override
114        public void windowOpened(WindowEvent e) {
115        }
116
117        @Override
118        public void windowDeactivated(WindowEvent e) {
119        }
120
121        @Override
122        public void windowDeiconified(WindowEvent e) {
123                LOG.info("Webcam viewer resumed");
124                panel.resume();
125        }
126
127        @Override
128        public void windowIconified(WindowEvent e) {
129                LOG.info("Webcam viewer paused");
130                panel.pause();
131        }
132
133        @Override
134        public void uncaughtException(Thread t, Throwable e) {
135                e.printStackTrace();
136                LOG.error(String.format("Exception in thread %s", t.getName()), e);
137        }
138
139        @Override
140        public void itemStateChanged(ItemEvent e) {
141
142                if (e.getItem() == webcam) {
143                        return;
144                }
145
146                if (webcam == null) {
147                        return;
148                }
149
150                final WebcamPanel tmp = panel;
151
152                remove(panel);
153
154                webcam.removeWebcamListener(this);
155
156                webcam = (Webcam) e.getItem();
157                webcam.setViewSize(WebcamResolution.VGA.getSize());
158                webcam.addWebcamListener(this);
159
160                System.out.println("selected " + webcam.getName());
161
162                panel = new WebcamPanel(webcam, false);
163
164                add(panel, BorderLayout.CENTER);
165
166                Thread t = new Thread() {
167
168                        @Override
169                        public void run() {
170                                tmp.stop();
171                                panel.start();
172                        }
173                };
174                t.setDaemon(true);
175                t.setUncaughtExceptionHandler(this);
176                t.start();
177
178        }
179}