1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
25*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
26*b1cdbd2cSJim Jagielski import com.sun.star.uno.AnyConverter;
27*b1cdbd2cSJim Jagielski import com.sun.star.uno.IQueryInterface;
28*b1cdbd2cSJim Jagielski import com.sun.star.lang.XInitialization;
29*b1cdbd2cSJim Jagielski import com.sun.star.lang.XEventListener;
30*b1cdbd2cSJim Jagielski import com.sun.star.awt.*;
31*b1cdbd2cSJim Jagielski import com.sun.star.media.*;
32*b1cdbd2cSJim Jagielski import com.sun.star.graphic.*;
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski // -----------------
35*b1cdbd2cSJim Jagielski // - Player Window -
36*b1cdbd2cSJim Jagielski // -----------------
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski public class FrameGrabber implements com.sun.star.lang.XServiceInfo,
39*b1cdbd2cSJim Jagielski                                      com.sun.star.media.XFrameGrabber
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski     private com.sun.star.lang.XMultiServiceFactory maFactory = null;
42*b1cdbd2cSJim Jagielski     private javax.media.Player maPlayer = null;
43*b1cdbd2cSJim Jagielski     private javax.media.control.FrameGrabbingControl maFrameGrabbingControl = null;
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski     // -------------------------------------------------------------------------
46*b1cdbd2cSJim Jagielski 
FrameGrabber( com.sun.star.lang.XMultiServiceFactory aFactory, String aURL )47*b1cdbd2cSJim Jagielski     public FrameGrabber( com.sun.star.lang.XMultiServiceFactory aFactory, String aURL )
48*b1cdbd2cSJim Jagielski     {
49*b1cdbd2cSJim Jagielski         maFactory = aFactory;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski         try
52*b1cdbd2cSJim Jagielski         {
53*b1cdbd2cSJim Jagielski             maPlayer = javax.media.Manager.createRealizedPlayer( new java.net.URL( aURL ) );
54*b1cdbd2cSJim Jagielski         }
55*b1cdbd2cSJim Jagielski         catch( java.net.MalformedURLException e )
56*b1cdbd2cSJim Jagielski         {
57*b1cdbd2cSJim Jagielski         }
58*b1cdbd2cSJim Jagielski         catch( java.io.IOException e )
59*b1cdbd2cSJim Jagielski         {
60*b1cdbd2cSJim Jagielski         }
61*b1cdbd2cSJim Jagielski         catch( javax.media.NoPlayerException e )
62*b1cdbd2cSJim Jagielski         {
63*b1cdbd2cSJim Jagielski         }
64*b1cdbd2cSJim Jagielski         catch( javax.media.CannotRealizeException e )
65*b1cdbd2cSJim Jagielski         {
66*b1cdbd2cSJim Jagielski         }
67*b1cdbd2cSJim Jagielski         catch( java.lang.Exception e )
68*b1cdbd2cSJim Jagielski         {
69*b1cdbd2cSJim Jagielski         }
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski         if( maPlayer != null )
72*b1cdbd2cSJim Jagielski         {
73*b1cdbd2cSJim Jagielski             maFrameGrabbingControl = (javax.media.control.FrameGrabbingControl) maPlayer.getControl(
74*b1cdbd2cSJim Jagielski                                         "javax.media.control.FrameGrabbingControl" );
75*b1cdbd2cSJim Jagielski         }
76*b1cdbd2cSJim Jagielski     }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     // -------------------------------------------------------------------------
79*b1cdbd2cSJim Jagielski 
implImageToXGraphic( java.awt.Image aImage )80*b1cdbd2cSJim Jagielski     public com.sun.star.graphic.XGraphic implImageToXGraphic( java.awt.Image aImage )
81*b1cdbd2cSJim Jagielski     {
82*b1cdbd2cSJim Jagielski         com.sun.star.graphic.XGraphic aRet = null;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski         if( maFactory != null && aImage != null )
85*b1cdbd2cSJim Jagielski         {
86*b1cdbd2cSJim Jagielski             if( aImage instanceof java.awt.image.BufferedImage )
87*b1cdbd2cSJim Jagielski             {
88*b1cdbd2cSJim Jagielski                 java.io.File aTempFile = null;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski                 try
91*b1cdbd2cSJim Jagielski                 {
92*b1cdbd2cSJim Jagielski                     aTempFile = java.io.File.createTempFile( "sv0", ".png" );
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski                     if( aTempFile.canWrite() )
95*b1cdbd2cSJim Jagielski                     {
96*b1cdbd2cSJim Jagielski                         javax.imageio.ImageIO.write( (java.awt.image.BufferedImage) aImage, "png", aTempFile );
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski                         com.sun.star.graphic.XGraphicProvider aProvider =
99*b1cdbd2cSJim Jagielski                             (com.sun.star.graphic.XGraphicProvider) UnoRuntime.queryInterface(
100*b1cdbd2cSJim Jagielski                                 com.sun.star.graphic.XGraphicProvider.class,
101*b1cdbd2cSJim Jagielski                                 maFactory.createInstance("com.sun.star.graphic.GraphicProvider") );
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski                         if( aProvider != null )
104*b1cdbd2cSJim Jagielski                         {
105*b1cdbd2cSJim Jagielski                             com.sun.star.beans.PropertyValue[] aArgs = new com.sun.star.beans.PropertyValue[ 1 ];
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski                             aArgs[ 0 ] = new com.sun.star.beans.PropertyValue();
108*b1cdbd2cSJim Jagielski                             aArgs[ 0 ].Name = "URL";
109*b1cdbd2cSJim Jagielski                             aArgs[ 0 ].Value = "file://" + aTempFile.toString();
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski                             aRet = aProvider.queryGraphic( aArgs );
112*b1cdbd2cSJim Jagielski                         }
113*b1cdbd2cSJim Jagielski                     }
114*b1cdbd2cSJim Jagielski                 }
115*b1cdbd2cSJim Jagielski                 catch( java.lang.IllegalArgumentException aExcp )
116*b1cdbd2cSJim Jagielski                 {
117*b1cdbd2cSJim Jagielski                 }
118*b1cdbd2cSJim Jagielski                 catch( java.io.IOException aExcp )
119*b1cdbd2cSJim Jagielski                 {
120*b1cdbd2cSJim Jagielski                 }
121*b1cdbd2cSJim Jagielski                 catch( com.sun.star.uno.Exception aExcp )
122*b1cdbd2cSJim Jagielski                 {
123*b1cdbd2cSJim Jagielski                 }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski                 if( aTempFile != null )
126*b1cdbd2cSJim Jagielski                     aTempFile.delete();
127*b1cdbd2cSJim Jagielski             }
128*b1cdbd2cSJim Jagielski         }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski         return aRet;
131*b1cdbd2cSJim Jagielski     }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski     // -----------------
134*b1cdbd2cSJim Jagielski     // - XFrameGrabber -
135*b1cdbd2cSJim Jagielski     // -----------------
136*b1cdbd2cSJim Jagielski 
grabFrame( double fMediaTime )137*b1cdbd2cSJim Jagielski     public synchronized com.sun.star.graphic.XGraphic grabFrame( double fMediaTime )
138*b1cdbd2cSJim Jagielski     {
139*b1cdbd2cSJim Jagielski         com.sun.star.graphic.XGraphic aRet = null;
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski         if( maFrameGrabbingControl != null )
142*b1cdbd2cSJim Jagielski         {
143*b1cdbd2cSJim Jagielski             if( fMediaTime >= 0.0 && fMediaTime <= maPlayer.getDuration().getSeconds() )
144*b1cdbd2cSJim Jagielski             {
145*b1cdbd2cSJim Jagielski                 maPlayer.setMediaTime( new javax.media.Time( fMediaTime ) );
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski                 javax.media.Buffer aBuffer = maFrameGrabbingControl.grabFrame();
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski                 if( aBuffer != null && aBuffer.getFormat() instanceof javax.media.format.VideoFormat )
150*b1cdbd2cSJim Jagielski                 {
151*b1cdbd2cSJim Jagielski                     aRet = implImageToXGraphic( new javax.media.util.BufferToImage(
152*b1cdbd2cSJim Jagielski                                                     (javax.media.format.VideoFormat) aBuffer.getFormat() ).
153*b1cdbd2cSJim Jagielski                                                         createImage( aBuffer ) );
154*b1cdbd2cSJim Jagielski                 }
155*b1cdbd2cSJim Jagielski             }
156*b1cdbd2cSJim Jagielski         }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski         return aRet;
159*b1cdbd2cSJim Jagielski     }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski     // ----------------
162*b1cdbd2cSJim Jagielski     // - XServiceInfo -
163*b1cdbd2cSJim Jagielski     // ----------------
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     private static final String s_implName = "com.sun.star.comp.FrameGrabber_Java";
166*b1cdbd2cSJim Jagielski     private static final String s_serviceName = "com.sun.star.media.FrameGrabber_Java";
167*b1cdbd2cSJim Jagielski 
getImplementationName()168*b1cdbd2cSJim Jagielski     public synchronized String getImplementationName()
169*b1cdbd2cSJim Jagielski     {
170*b1cdbd2cSJim Jagielski         return s_implName;
171*b1cdbd2cSJim Jagielski     }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     // -------------------------------------------------------------------------
174*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()175*b1cdbd2cSJim Jagielski     public synchronized String [] getSupportedServiceNames()
176*b1cdbd2cSJim Jagielski     {
177*b1cdbd2cSJim Jagielski         return new String [] { s_serviceName };
178*b1cdbd2cSJim Jagielski     }
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     // -------------------------------------------------------------------------
181*b1cdbd2cSJim Jagielski 
supportsService( String serviceName )182*b1cdbd2cSJim Jagielski     public synchronized boolean supportsService( String serviceName )
183*b1cdbd2cSJim Jagielski     {
184*b1cdbd2cSJim Jagielski         return serviceName.equals( s_serviceName );
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski }
187