OSDN Git Service

Merge branch 'git-svn'
[nyartoolkit-and/nyartoolkit-and.git] / branches / arc / sample / jmf / jp / nyatla / nyartoolkit / jmf / utils / JmfCameraCapture.java
1 /**\r
2  * JMFお手軽キャプチャクラス\r
3  * (c)2008 A虎@nyatla.jp\r
4  * airmail@ebony.plala.or.jp\r
5  * http://nyatla.jp/\r
6  */\r
7 package jp.nyatla.nyartoolkit.jmf.utils;\r
8 \r
9 \r
10 \r
11 import javax.media.*;\r
12 import javax.media.protocol.*;\r
13 import javax.media.control.*;\r
14 import javax.media.format.*;\r
15 import java.awt.*;\r
16 import java.util.*;\r
17 import javax.media.protocol.DataSource;\r
18 \r
19 import jp.nyatla.nyartoolkit.NyARException;\r
20 \r
21 \r
22 \r
23 \r
24 \r
25 public class JmfCameraCapture\r
26 {\r
27     private Dimension image_size;\r
28     private JmfCaptureListener capture_listener;\r
29     private DataSource jmf_data_source;\r
30     private MonitorStream jmf_monitor_stream;\r
31     private Processor jmf_processor;\r
32     private VideoFormat jmf_video_format;\r
33     \r
34     private Buffer read_buf=new Buffer();\r
35     public static final String PIXEL_FORMAT_RGB="RGB";\r
36     public JmfCameraCapture(int i_width,int i_height,float i_rate,String i_pixcel_format)\r
37     {\r
38         String encoding = i_pixcel_format;//comboEncoding.getSelectedItem();\r
39         image_size = new Dimension(i_width,i_height);\r
40         jmf_video_format = new VideoFormat(encoding, image_size, Format.NOT_SPECIFIED,null,i_rate);\r
41     }\r
42     public Dimension getSize()\r
43     {\r
44         return image_size;\r
45     }\r
46     public javax.media.Buffer readBuffer() throws NyARException\r
47     {\r
48         if(jmf_monitor_stream==null){\r
49             throw new NyARException();\r
50         }\r
51         try{\r
52             jmf_monitor_stream.read(read_buf);\r
53         }catch(Exception e){\r
54             throw new NyARException(e);\r
55         }\r
56         return read_buf;\r
57     }\r
58     public void setCaptureListener(JmfCaptureListener i_listener) throws NyARException\r
59     {\r
60         if(jmf_processor!=null){\r
61             throw new NyARException();\r
62         }\r
63         capture_listener=i_listener;\r
64         \r
65     }\r
66     public void start() throws NyARException\r
67     {\r
68         \r
69         DataSource ds=getCaptureDS(jmf_video_format);\r
70         VideoFormat[] formats=new VideoFormat[]{new VideoFormat(null)};\r
71         ProcessorModel pm = new ProcessorModel(ds,formats,null);//, formats, ftd);\r
72         Processor processor;\r
73         try {\r
74             processor = Manager.createRealizedProcessor(pm);\r
75         } catch (Exception e){\r
76             // Make sure the capture devices are released\r
77             ds.disconnect();\r
78             throw new NyARException(e);\r
79         }\r
80         // Get the monitor control:\r
81         // Since there are more than one MonitorControl objects\r
82         // exported by the DataSource, we get the specific one\r
83         // that is also the MonitorStream object.\r
84         jmf_monitor_stream=(MonitorStream)ds.getControl("jmfsample.MonitorStream");\r
85         jmf_monitor_stream.setCaptureListener(capture_listener);\r
86         jmf_data_source=ds;\r
87         jmf_processor=processor;\r
88         jmf_processor.start();\r
89     }\r
90     public void stop()\r
91     {\r
92         jmf_processor.stop();\r
93         jmf_processor.close();\r
94         jmf_processor = null;\r
95         \r
96     }\r
97     protected void finalize()\r
98     {\r
99         if(jmf_processor!=null){\r
100         jmf_processor.stop();\r
101         jmf_processor.close();\r
102         jmf_processor = null;\r
103         }\r
104     }\r
105     private static DataSource getCaptureDS(VideoFormat vf) {\r
106         DataSource dsVideo = null;\r
107         DataSource ds = null;\r
108 \r
109         // Create a capture DataSource for the video\r
110         // If there is no video capture device, then exit with null\r
111         if (vf != null) {\r
112             dsVideo = createDataSource(vf);\r
113             if (dsVideo == null)\r
114                 return null;\r
115         }\r
116 \r
117 \r
118         // Create the monitoring datasource wrapper\r
119         if (dsVideo != null) {\r
120             dsVideo = new MonitorCDS(dsVideo);\r
121             return dsVideo;\r
122         }\r
123 \r
124         // Merge the data sources, if both audio and video are available\r
125         try {\r
126             ds = Manager.createMergingDataSource(new DataSource[]{dsVideo});\r
127         } catch (IncompatibleSourceException ise){\r
128             return null;\r
129         }\r
130 \r
131         return ds;\r
132     }\r
133 \r
134     private static DataSource createDataSource(Format format) {\r
135         DataSource ds;\r
136         Vector devices;\r
137         CaptureDeviceInfo cdi;\r
138         MediaLocator ml;\r
139 \r
140         // Find devices for format\r
141         devices = CaptureDeviceManager.getDeviceList(format);\r
142         if (devices.size() < 1) {\r
143             System.err.println("! No Devices for " + format);\r
144             return null;\r
145         }\r
146         // Pick the first device\r
147         cdi = (CaptureDeviceInfo) devices.elementAt(0);\r
148 \r
149         ml = cdi.getLocator();\r
150 \r
151         try {\r
152             ds = Manager.createDataSource(ml);\r
153             ds.connect();\r
154             if (ds instanceof CaptureDevice)\r
155             {\r
156                 setCaptureFormat((CaptureDevice) ds, format);\r
157             }\r
158         } catch (Exception e) {\r
159             System.err.println(e);\r
160             return null;\r
161         }\r
162         return ds;\r
163     }\r
164 \r
165     private static void setCaptureFormat(CaptureDevice cdev, Format format) {\r
166         FormatControl [] fcs = cdev.getFormatControls();\r
167         if (fcs.length < 1){\r
168             return;\r
169         }\r
170         FormatControl fc = fcs[0];\r
171         Format [] formats = fc.getSupportedFormats();\r
172         for (int i = 0; i < formats.length; i++) {\r
173             if (formats[i].matches(format)){\r
174                 format = formats[i].intersects(format);\r
175                 fc.setFormat(format);\r
176                 break;\r
177             }\r
178         }\r
179     }\r
180 }