xref: /AOO41X/main/avmedia/source/macavf/macavf_framegrabber.cxx (revision 6a7d45efb49169f8345719aa163722d8b8f2c22f)
14ba16609SHerbert Dürr /**************************************************************
24ba16609SHerbert Dürr  *
34ba16609SHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
44ba16609SHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
54ba16609SHerbert Dürr  * distributed with this work for additional information
64ba16609SHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
74ba16609SHerbert Dürr  * to you under the Apache License, Version 2.0 (the
84ba16609SHerbert Dürr  * "License"); you may not use this file except in compliance
94ba16609SHerbert Dürr  * with the License.  You may obtain a copy of the License at
104ba16609SHerbert Dürr  *
114ba16609SHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
124ba16609SHerbert Dürr  *
134ba16609SHerbert Dürr  * Unless required by applicable law or agreed to in writing,
144ba16609SHerbert Dürr  * software distributed under the License is distributed on an
154ba16609SHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
164ba16609SHerbert Dürr  * KIND, either express or implied.  See the License for the
174ba16609SHerbert Dürr  * specific language governing permissions and limitations
184ba16609SHerbert Dürr  * under the License.
194ba16609SHerbert Dürr  *
204ba16609SHerbert Dürr  *************************************************************/
214ba16609SHerbert Dürr 
224ba16609SHerbert Dürr #include "macavf_framegrabber.hxx"
234ba16609SHerbert Dürr #include "macavf_player.hxx"
244ba16609SHerbert Dürr 
254ba16609SHerbert Dürr #include <tools/stream.hxx>
264ba16609SHerbert Dürr #include <vcl/graph.hxx>
274ba16609SHerbert Dürr #include <vcl/cvtgrf.hxx>
284ba16609SHerbert Dürr #include <unotools/localfilehelper.hxx>
294ba16609SHerbert Dürr 
304ba16609SHerbert Dürr using namespace ::com::sun::star;
314ba16609SHerbert Dürr 
324ba16609SHerbert Dürr namespace avmedia { namespace macavf {
334ba16609SHerbert Dürr 
344ba16609SHerbert Dürr // ----------------
354ba16609SHerbert Dürr // - FrameGrabber -
364ba16609SHerbert Dürr // ----------------
374ba16609SHerbert Dürr 
FrameGrabber(const uno::Reference<lang::XMultiServiceFactory> &)384ba16609SHerbert Dürr FrameGrabber::FrameGrabber( const uno::Reference< lang::XMultiServiceFactory >& /*rxMgr*/ )
394ba16609SHerbert Dürr :   mpImageGen( NULL )
404ba16609SHerbert Dürr {}
414ba16609SHerbert Dürr 
424ba16609SHerbert Dürr // ------------------------------------------------------------------------------
434ba16609SHerbert Dürr 
~FrameGrabber()444ba16609SHerbert Dürr FrameGrabber::~FrameGrabber()
454ba16609SHerbert Dürr {
464ba16609SHerbert Dürr     if( mpImageGen )
474ba16609SHerbert Dürr         CFRelease( mpImageGen );
484ba16609SHerbert Dürr }
494ba16609SHerbert Dürr 
504ba16609SHerbert Dürr // ------------------------------------------------------------------------------
514ba16609SHerbert Dürr 
create(const::rtl::OUString & rURL)524ba16609SHerbert Dürr bool FrameGrabber::create( const ::rtl::OUString& rURL )
534ba16609SHerbert Dürr {
544ba16609SHerbert Dürr     NSString* pNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
554ba16609SHerbert Dürr     NSURL* pNSURL = [NSURL URLWithString: [pNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
564ba16609SHerbert Dürr     AVAsset* pMovie = [AVURLAsset URLAssetWithURL:pNSURL options:nil];
574ba16609SHerbert Dürr     if( !pMovie )
584ba16609SHerbert Dürr     {
594ba16609SHerbert Dürr         OSL_TRACE( "AVGrabber::create() cannot load url=\"%s\"", [pNSStr UTF8String] );
604ba16609SHerbert Dürr         return false;
614ba16609SHerbert Dürr     }
62*6a7d45efSHerbert Dürr 
63*6a7d45efSHerbert Dürr     return create( pMovie );
64*6a7d45efSHerbert Dürr }
65*6a7d45efSHerbert Dürr 
66*6a7d45efSHerbert Dürr // ------------------------------------------------------------------------------
67*6a7d45efSHerbert Dürr 
create(AVAsset * pMovie)68*6a7d45efSHerbert Dürr bool FrameGrabber::create( AVAsset* pMovie )
69*6a7d45efSHerbert Dürr {
704ba16609SHerbert Dürr     if( [[pMovie tracksWithMediaType:AVMediaTypeVideo] count] == 0)
714ba16609SHerbert Dürr     {
72*6a7d45efSHerbert Dürr         OSL_TRACE( "AVGrabber::create() found no video content!" );
734ba16609SHerbert Dürr         return false;
744ba16609SHerbert Dürr     }
754ba16609SHerbert Dürr 
764ba16609SHerbert Dürr     mpImageGen = [AVAssetImageGenerator assetImageGeneratorWithAsset:pMovie];
774ba16609SHerbert Dürr     CFRetain( mpImageGen );
784ba16609SHerbert Dürr     return true;
794ba16609SHerbert Dürr }
804ba16609SHerbert Dürr 
814ba16609SHerbert Dürr // ------------------------------------------------------------------------------
824ba16609SHerbert Dürr 
grabFrame(double fMediaTime)834ba16609SHerbert Dürr uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMediaTime )
844ba16609SHerbert Dürr     throw (uno::RuntimeException)
854ba16609SHerbert Dürr {
864ba16609SHerbert Dürr     uno::Reference< graphic::XGraphic > xRet;
874ba16609SHerbert Dürr     if( !mpImageGen )
884ba16609SHerbert Dürr         return xRet;
894ba16609SHerbert Dürr     OSL_TRACE( "AVPlayer::grabFrame( %.3fsec)", fMediaTime );
904ba16609SHerbert Dürr 
914ba16609SHerbert Dürr     // get the requested image from the movie
924ba16609SHerbert Dürr     CGImage* pCGImage = [mpImageGen copyCGImageAtTime:CMTimeMakeWithSeconds(fMediaTime,1000) actualTime:NULL error:NULL];
934ba16609SHerbert Dürr 
944ba16609SHerbert Dürr     // convert the image to a TIFF-formatted byte-array
954ba16609SHerbert Dürr     CFMutableDataRef pCFData = CFDataCreateMutable( kCFAllocatorDefault, 0 );
964ba16609SHerbert Dürr     CGImageDestination* pCGImgDest = CGImageDestinationCreateWithData( pCFData, kUTTypeTIFF, 1, 0 );
974ba16609SHerbert Dürr     CGImageDestinationAddImage( pCGImgDest, pCGImage, NULL );
984ba16609SHerbert Dürr     CGImageDestinationFinalize( pCGImgDest );
994ba16609SHerbert Dürr     CFRelease( pCGImgDest );
1004ba16609SHerbert Dürr     const long nBitmapLen = CFDataGetLength( pCFData );
1014ba16609SHerbert Dürr     void* pBitmapBytes = (void*)CFDataGetBytePtr( pCFData );
1024ba16609SHerbert Dürr 
1034ba16609SHerbert Dürr     // convert the image into the return-value type which is a graphic::XGraphic
1044ba16609SHerbert Dürr     SvMemoryStream aMemStm( pBitmapBytes, nBitmapLen, STREAM_READ | STREAM_WRITE );
1054ba16609SHerbert Dürr     Graphic aGraphic;
1064ba16609SHerbert Dürr     if( GraphicConverter::Import( aMemStm, aGraphic, CVT_TIF ) == ERRCODE_NONE )
1074ba16609SHerbert Dürr         xRet = aGraphic.GetXGraphic();
1084ba16609SHerbert Dürr 
1094ba16609SHerbert Dürr     // clean up resources
1104ba16609SHerbert Dürr     CFRelease( pCFData );
1114ba16609SHerbert Dürr     return xRet;
1124ba16609SHerbert Dürr }
1134ba16609SHerbert Dürr 
1144ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1154ba16609SHerbert Dürr 
getImplementationName()1164ba16609SHerbert Dürr ::rtl::OUString SAL_CALL FrameGrabber::getImplementationName(  )
1174ba16609SHerbert Dürr     throw (uno::RuntimeException)
1184ba16609SHerbert Dürr {
1194ba16609SHerbert Dürr     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_FRAMEGRABBER_IMPLEMENTATIONNAME ) );
1204ba16609SHerbert Dürr }
1214ba16609SHerbert Dürr 
1224ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1234ba16609SHerbert Dürr 
supportsService(const::rtl::OUString & ServiceName)1244ba16609SHerbert Dürr sal_Bool SAL_CALL FrameGrabber::supportsService( const ::rtl::OUString& ServiceName )
1254ba16609SHerbert Dürr     throw (uno::RuntimeException)
1264ba16609SHerbert Dürr {
1274ba16609SHerbert Dürr     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
1284ba16609SHerbert Dürr }
1294ba16609SHerbert Dürr 
1304ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1314ba16609SHerbert Dürr 
getSupportedServiceNames()1324ba16609SHerbert Dürr uno::Sequence< ::rtl::OUString > SAL_CALL FrameGrabber::getSupportedServiceNames(  )
1334ba16609SHerbert Dürr     throw (uno::RuntimeException)
1344ba16609SHerbert Dürr {
1354ba16609SHerbert Dürr     uno::Sequence< ::rtl::OUString > aRet(1);
1364ba16609SHerbert Dürr     aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
1374ba16609SHerbert Dürr 
1384ba16609SHerbert Dürr     return aRet;
1394ba16609SHerbert Dürr }
1404ba16609SHerbert Dürr 
1414ba16609SHerbert Dürr } // namespace macavf
1424ba16609SHerbert Dürr } // namespace avmedia
1434ba16609SHerbert Dürr 
144