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