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