001 package com.github.sarxos.webcam;
002
003 import java.awt.BorderLayout;
004 import java.awt.event.ItemEvent;
005 import java.awt.event.ItemListener;
006 import java.awt.event.WindowEvent;
007 import java.awt.event.WindowListener;
008 import java.lang.Thread.UncaughtExceptionHandler;
009
010 import javax.swing.JFrame;
011 import javax.swing.SwingUtilities;
012
013 import org.slf4j.Logger;
014 import org.slf4j.LoggerFactory;
015
016
017 /**
018 * Just a simple webcam viewer.
019 *
020 * @author Bartosz Firyn (SarXos)
021 */
022 public 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.setDaemon(true);
075 t.setUncaughtExceptionHandler(this);
076 t.start();
077 }
078
079 @Override
080 public void webcamOpen(WebcamEvent we) {
081 LOG.info("Webcam open");
082 }
083
084 @Override
085 public void webcamClosed(WebcamEvent we) {
086 LOG.info("Webcam closed");
087 }
088
089 @Override
090 public void webcamDisposed(WebcamEvent we) {
091 LOG.info("Webcam disposed");
092 }
093
094 @Override
095 public void webcamImageObtained(WebcamEvent we) {
096 // do nothing
097 }
098
099 @Override
100 public void windowActivated(WindowEvent e) {
101 }
102
103 @Override
104 public void windowClosed(WindowEvent e) {
105 webcam.close();
106 }
107
108 @Override
109 public void windowClosing(WindowEvent e) {
110 }
111
112 @Override
113 public void windowOpened(WindowEvent e) {
114 }
115
116 @Override
117 public void windowDeactivated(WindowEvent e) {
118 }
119
120 @Override
121 public void windowDeiconified(WindowEvent e) {
122 LOG.info("Webcam viewer resumed");
123 panel.resume();
124 }
125
126 @Override
127 public void windowIconified(WindowEvent e) {
128 LOG.info("Webcam viewer paused");
129 panel.pause();
130 }
131
132 @Override
133 public void uncaughtException(Thread t, Throwable e) {
134 LOG.error(String.format("Exception in thread %s", t.getName()), e);
135 }
136
137 @Override
138 public void itemStateChanged(ItemEvent e) {
139
140 if (e.getItem() == webcam) {
141 return;
142 }
143
144 if (webcam == null) {
145 return;
146 }
147
148 final WebcamPanel tmp = panel;
149
150 remove(panel);
151
152 webcam.removeWebcamListener(this);
153
154 webcam = (Webcam) e.getItem();
155 webcam.setViewSize(WebcamResolution.VGA.getSize());
156 webcam.addWebcamListener(this);
157
158 System.out.println("selected " + webcam.getName());
159
160 panel = new WebcamPanel(webcam, false);
161
162 add(panel, BorderLayout.CENTER);
163
164 Thread t = new Thread() {
165
166 @Override
167 public void run() {
168 tmp.stop();
169 panel.start();
170 }
171 };
172 t.setDaemon(true);
173 t.setUncaughtExceptionHandler(this);
174 t.start();
175
176 }
177 }