xref: /AOO42X/main/avmedia/source/macavf/macavf_framegrabber.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
1e8649ecdSHerbert Dürr /**************************************************************
2e8649ecdSHerbert Dürr  *
3e8649ecdSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
4e8649ecdSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
5e8649ecdSHerbert Dürr  * distributed with this work for additional information
6e8649ecdSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
7e8649ecdSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
8e8649ecdSHerbert Dürr  * "License"); you may not use this file except in compliance
9e8649ecdSHerbert Dürr  * with the License.  You may obtain a copy of the License at
10e8649ecdSHerbert Dürr  *
11e8649ecdSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
12e8649ecdSHerbert Dürr  *
13e8649ecdSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
14e8649ecdSHerbert Dürr  * software distributed under the License is distributed on an
15e8649ecdSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16e8649ecdSHerbert Dürr  * KIND, either express or implied.  See the License for the
17e8649ecdSHerbert Dürr  * specific language governing permissions and limitations
18e8649ecdSHerbert Dürr  * under the License.
19e8649ecdSHerbert Dürr  *
20e8649ecdSHerbert Dürr  *************************************************************/
21e8649ecdSHerbert Dürr 
22e8649ecdSHerbert Dürr #include "macavf_framegrabber.hxx"
23e8649ecdSHerbert Dürr #include "macavf_player.hxx"
24e8649ecdSHerbert Dürr 
25e8649ecdSHerbert Dürr #include <tools/stream.hxx>
26e8649ecdSHerbert Dürr #include <vcl/graph.hxx>
27e8649ecdSHerbert Dürr #include <vcl/cvtgrf.hxx>
28e8649ecdSHerbert Dürr #include <unotools/localfilehelper.hxx>
29e8649ecdSHerbert Dürr 
30e8649ecdSHerbert Dürr using namespace ::com::sun::star;
31e8649ecdSHerbert Dürr 
32e8649ecdSHerbert Dürr namespace avmedia { namespace macavf {
33e8649ecdSHerbert Dürr 
34e8649ecdSHerbert Dürr // ----------------
35e8649ecdSHerbert Dürr // - FrameGrabber -
36e8649ecdSHerbert Dürr // ----------------
37e8649ecdSHerbert Dürr 
FrameGrabber(const uno::Reference<uno::XComponentContext> & rxContext)38*652e100fSDamjan Jovanovic FrameGrabber::FrameGrabber( const uno::Reference< uno::XComponentContext >& rxContext )
39*652e100fSDamjan Jovanovic :   mpImageGen( NULL ),
40*652e100fSDamjan Jovanovic     mxContext( rxContext )
41e8649ecdSHerbert Dürr {}
42e8649ecdSHerbert Dürr 
43e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
44e8649ecdSHerbert Dürr 
~FrameGrabber()45e8649ecdSHerbert Dürr FrameGrabber::~FrameGrabber()
46e8649ecdSHerbert Dürr {
47e8649ecdSHerbert Dürr     if( mpImageGen )
48e8649ecdSHerbert Dürr         CFRelease( mpImageGen );
49e8649ecdSHerbert Dürr }
50e8649ecdSHerbert Dürr 
51e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
52e8649ecdSHerbert Dürr 
create(const::rtl::OUString & rURL)53e8649ecdSHerbert Dürr bool FrameGrabber::create( const ::rtl::OUString& rURL )
54e8649ecdSHerbert Dürr {
55e8649ecdSHerbert Dürr     NSString* pNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
56e8649ecdSHerbert Dürr     NSURL* pNSURL = [NSURL URLWithString: [pNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
57e8649ecdSHerbert Dürr     AVAsset* pMovie = [AVURLAsset URLAssetWithURL:pNSURL options:nil];
58e8649ecdSHerbert Dürr     if( !pMovie )
59e8649ecdSHerbert Dürr     {
60e8649ecdSHerbert Dürr         OSL_TRACE( "AVGrabber::create() cannot load url=\"%s\"", [pNSStr UTF8String] );
61e8649ecdSHerbert Dürr         return false;
62e8649ecdSHerbert Dürr     }
6332322404SHerbert Dürr 
6432322404SHerbert Dürr     return create( pMovie );
6532322404SHerbert Dürr }
6632322404SHerbert Dürr 
6732322404SHerbert Dürr // ------------------------------------------------------------------------------
6832322404SHerbert Dürr 
create(AVAsset * pMovie)6932322404SHerbert Dürr bool FrameGrabber::create( AVAsset* pMovie )
7032322404SHerbert Dürr {
71e8649ecdSHerbert Dürr     if( [[pMovie tracksWithMediaType:AVMediaTypeVideo] count] == 0)
72e8649ecdSHerbert Dürr     {
7332322404SHerbert Dürr         OSL_TRACE( "AVGrabber::create() found no video content!" );
74e8649ecdSHerbert Dürr         return false;
75e8649ecdSHerbert Dürr     }
76e8649ecdSHerbert Dürr 
77e8649ecdSHerbert Dürr     mpImageGen = [AVAssetImageGenerator assetImageGeneratorWithAsset:pMovie];
78e8649ecdSHerbert Dürr     CFRetain( mpImageGen );
79e8649ecdSHerbert Dürr     return true;
80e8649ecdSHerbert Dürr }
81e8649ecdSHerbert Dürr 
82e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
83e8649ecdSHerbert Dürr 
grabFrame(double fMediaTime)84e8649ecdSHerbert Dürr uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMediaTime )
85e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
86e8649ecdSHerbert Dürr {
87e8649ecdSHerbert Dürr     uno::Reference< graphic::XGraphic > xRet;
88e8649ecdSHerbert Dürr     if( !mpImageGen )
89e8649ecdSHerbert Dürr         return xRet;
90e8649ecdSHerbert Dürr     OSL_TRACE( "AVPlayer::grabFrame( %.3fsec)", fMediaTime );
91e8649ecdSHerbert Dürr 
92e8649ecdSHerbert Dürr     // get the requested image from the movie
93e8649ecdSHerbert Dürr     CGImage* pCGImage = [mpImageGen copyCGImageAtTime:CMTimeMakeWithSeconds(fMediaTime,1000) actualTime:NULL error:NULL];
94e8649ecdSHerbert Dürr 
95e8649ecdSHerbert Dürr     // convert the image to a TIFF-formatted byte-array
96e8649ecdSHerbert Dürr     CFMutableDataRef pCFData = CFDataCreateMutable( kCFAllocatorDefault, 0 );
97e8649ecdSHerbert Dürr     CGImageDestination* pCGImgDest = CGImageDestinationCreateWithData( pCFData, kUTTypeTIFF, 1, 0 );
98e8649ecdSHerbert Dürr     CGImageDestinationAddImage( pCGImgDest, pCGImage, NULL );
99e8649ecdSHerbert Dürr     CGImageDestinationFinalize( pCGImgDest );
100e8649ecdSHerbert Dürr     CFRelease( pCGImgDest );
101e8649ecdSHerbert Dürr     const long nBitmapLen = CFDataGetLength( pCFData );
102e8649ecdSHerbert Dürr     void* pBitmapBytes = (void*)CFDataGetBytePtr( pCFData );
103e8649ecdSHerbert Dürr 
104e8649ecdSHerbert Dürr     // convert the image into the return-value type which is a graphic::XGraphic
105e8649ecdSHerbert Dürr     SvMemoryStream aMemStm( pBitmapBytes, nBitmapLen, STREAM_READ | STREAM_WRITE );
106e8649ecdSHerbert Dürr     Graphic aGraphic;
107e8649ecdSHerbert Dürr     if( GraphicConverter::Import( aMemStm, aGraphic, CVT_TIF ) == ERRCODE_NONE )
108e8649ecdSHerbert Dürr         xRet = aGraphic.GetXGraphic();
109e8649ecdSHerbert Dürr 
110e8649ecdSHerbert Dürr     // clean up resources
111e8649ecdSHerbert Dürr     CFRelease( pCFData );
112e8649ecdSHerbert Dürr     return xRet;
113e8649ecdSHerbert Dürr }
114e8649ecdSHerbert Dürr 
115e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
116e8649ecdSHerbert Dürr 
getImplementationName()117e8649ecdSHerbert Dürr ::rtl::OUString SAL_CALL FrameGrabber::getImplementationName(  )
118e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
119e8649ecdSHerbert Dürr {
120e8649ecdSHerbert Dürr     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_FRAMEGRABBER_IMPLEMENTATIONNAME ) );
121e8649ecdSHerbert Dürr }
122e8649ecdSHerbert Dürr 
123e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
124e8649ecdSHerbert Dürr 
supportsService(const::rtl::OUString & ServiceName)125e8649ecdSHerbert Dürr sal_Bool SAL_CALL FrameGrabber::supportsService( const ::rtl::OUString& ServiceName )
126e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
127e8649ecdSHerbert Dürr {
128e8649ecdSHerbert Dürr     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
129e8649ecdSHerbert Dürr }
130e8649ecdSHerbert Dürr 
131e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
132e8649ecdSHerbert Dürr 
getSupportedServiceNames()133e8649ecdSHerbert Dürr uno::Sequence< ::rtl::OUString > SAL_CALL FrameGrabber::getSupportedServiceNames(  )
134e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
135e8649ecdSHerbert Dürr {
136e8649ecdSHerbert Dürr     uno::Sequence< ::rtl::OUString > aRet(1);
137e8649ecdSHerbert Dürr     aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
138e8649ecdSHerbert Dürr 
139e8649ecdSHerbert Dürr     return aRet;
140e8649ecdSHerbert Dürr }
141e8649ecdSHerbert Dürr 
142e8649ecdSHerbert Dürr } // namespace macavf
143e8649ecdSHerbert Dürr } // namespace avmedia
144