--- /dev/null	2006-08-13 17:52:05.000000000 +0200
+++ avmedia/source/gstreamer/gstframegrabber.cxx	2006-08-22 11:38:56.000000000 +0200
@@ -0,0 +1,244 @@
+/*************************************************************************
+ *
+ *  OpenOffice.org - a multi-platform office productivity suite
+ *
+ *  $RCSfile: avmedia-source-gstreamer-gstframegrabber.cxx.diff,v $
+ *
+ *  $Revision: 1.1 $
+ *
+ *  last change: $Author: rodo $ $Date: 2006/09/19 08:24:25 $
+ *
+ *  The Contents of this file are made available subject to
+ *  the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ *    GNU Lesser General Public License Version 2.1
+ *    =============================================
+ *    Copyright 2005 by Sun Microsystems, Inc.
+ *    901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License version 2.1, as published by the Free Software Foundation.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ *
+ *    You should have received a copy of the GNU Lesser General Public
+ *    License along with this library; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *    MA  02111-1307  USA
+ *
+ ************************************************************************/
+
+#include <tools/prewin.h>
+#include <windows.h>
+#include <objbase.h>
+#include <strmif.h>
+#include <Amvideo.h>
+#include <Qedit.h>
+#include <uuids.h>
+#include <tools/postwin.h>
+
+#include "framegrabber.hxx"
+#include "player.hxx"
+
+#include <tools/stream.hxx>
+#include <vcl/graph.hxx>
+#include <unotools/localfilehelper.hxx>
+
+#define AVMEDIA_GST_FRAMEGRABBER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.FrameGrabber_GStreamer"
+#define AVMEDIA_GST_FRAMEGRABBER_SERVICENAME "com.sun.star.media.FrameGrabber_GStreamer"
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace gstreamer {
+
+// ----------------
+// - FrameGrabber -
+// ----------------
+
+FrameGrabber::FrameGrabber( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
+    mxMgr( rxMgr )
+{
+    ::CoInitialize( NULL );
+}
+
+// ------------------------------------------------------------------------------
+
+FrameGrabber::~FrameGrabber()
+{
+    ::CoUninitialize();
+}
+
+// ------------------------------------------------------------------------------
+
+IMediaDet* FrameGrabber::implCreateMediaDet( const ::rtl::OUString& rURL ) const
+{
+    IMediaDet* pDet = NULL;
+
+    if( SUCCEEDED( CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &pDet ) ) )
+    {
+		String aLocalStr;
+		
+		if( ::utl::LocalFileHelper::ConvertURLToPhysicalName( rURL, aLocalStr ) && aLocalStr.Len() )
+		{
+            if( !SUCCEEDED( pDet->put_Filename( ::SysAllocString( aLocalStr.GetBuffer() ) ) ) )
+            {
+                pDet->Release();
+                pDet = NULL;
+            }
+        }
+    }
+    
+    return pDet;
+}
+
+// ------------------------------------------------------------------------------
+
+bool FrameGrabber::create( const ::rtl::OUString& rURL )
+{
+    // just check if a MediaDet interface can be created with the given URL
+    IMediaDet*  pDet = implCreateMediaDet( rURL );
+   
+    if( pDet )
+    {
+        maURL = rURL;
+        pDet->Release();
+        pDet = NULL;
+    }
+    else
+        maURL = ::rtl::OUString();
+
+    return( maURL.getLength() > 0 );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMediaTime )
+    throw (uno::RuntimeException)
+{
+    uno::Reference< graphic::XGraphic > xRet;
+    IMediaDet*                          pDet = implCreateMediaDet( maURL );
+   
+    if( pDet )
+    {
+        double  fLength;
+        long    nStreamCount;
+        bool    bFound = false;
+    
+        if( SUCCEEDED( pDet->get_OutputStreams( &nStreamCount ) ) )
+        {
+            for( long n = 0; ( n < nStreamCount ) && !bFound; ++n )
+            {
+                GUID aMajorType;
+                
+                if( SUCCEEDED( pDet->put_CurrentStream( n ) )  &&
+                    SUCCEEDED( pDet->get_StreamType( &aMajorType ) ) &&
+                    ( aMajorType == MEDIATYPE_Video ) )
+                {
+                    bFound = true;
+                }
+            }
+        }
+        
+        if( bFound &&
+            ( S_OK == pDet->get_StreamLength( &fLength ) ) &&
+            ( fLength > 0.0 ) && ( fMediaTime >= 0.0 ) && ( fMediaTime <= fLength ) )
+        {
+            AM_MEDIA_TYPE   aMediaType;
+            long            nWidth = 0, nHeight = 0, nSize = 0; 
+            
+            if( SUCCEEDED( pDet->get_StreamMediaType( &aMediaType ) ) )
+            {
+                if( ( aMediaType.formattype == FORMAT_VideoInfo ) && 
+                    ( aMediaType.cbFormat >= sizeof( VIDEOINFOHEADER ) ) )
+                {
+                    VIDEOINFOHEADER* pVih = reinterpret_cast< VIDEOINFOHEADER* >( aMediaType.pbFormat );
+                    
+                    nWidth = pVih->bmiHeader.biWidth;
+                    nHeight = pVih->bmiHeader.biHeight;
+                
+                    if( nHeight < 0 )
+                        nHeight *= -1;
+                }
+
+                if( aMediaType.cbFormat != 0 )
+                {
+                    ::CoTaskMemFree( (PVOID) aMediaType.pbFormat );
+                    aMediaType.cbFormat = 0;
+                    aMediaType.pbFormat = NULL;
+                }
+                
+                if( aMediaType.pUnk != NULL )
+                {
+                    aMediaType.pUnk->Release();
+                    aMediaType.pUnk = NULL;
+                }            
+            }
+            
+            if( ( nWidth > 0 ) && ( nHeight > 0 ) &&
+                SUCCEEDED( pDet->GetBitmapBits( 0, &nSize, NULL, nWidth, nHeight ) ) &&
+                ( nSize > 0  ) )
+            {
+                char* pBuffer = new char[ nSize ];
+
+                try 
+                {
+                    if( SUCCEEDED( pDet->GetBitmapBits( fMediaTime, NULL, pBuffer, nWidth, nHeight ) ) )
+                    {
+                        SvMemoryStream  aMemStm( pBuffer, nSize, STREAM_READ | STREAM_WRITE );
+                        Bitmap          aBmp;
+                        
+                        if( aBmp.Read( aMemStm, false ) && !aBmp.IsEmpty() )
+                        {
+                            const Graphic aGraphic( aBmp );
+                            xRet = aGraphic.GetXGraphic();
+                        }
+                    }
+                }
+                catch( ... )
+                {
+                }
+
+                delete [] pBuffer;
+            }
+        }
+
+        pDet->Release();
+    }
+    
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL FrameGrabber::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_GST_FRAMEGRABBER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL FrameGrabber::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_GST_FRAMEGRABBER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL FrameGrabber::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_GST_FRAMEGRABBER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace gstreamer
+} // namespace avmedia
