1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #include <stdio.h>
25
26 #include <avmedia/mediawindow.hxx>
27 #include "mediawindow_impl.hxx"
28 #include "mediamisc.hxx"
29 #include "mediawindow.hrc"
30 #include <tools/urlobj.hxx>
31 #include <vcl/msgbox.hxx>
32 #include <unotools/pathoptions.hxx>
33 #include <sfx2/filedlghelper.hxx>
34 #include <comphelper/processfactory.hxx>
35 #include <com/sun/star/media/XManager.hpp>
36 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
37
38 #define AVMEDIA_FRAMEGRABBER_DEFAULTFRAME_MEDIATIME 3.0
39
40 using namespace ::com::sun::star;
41
42 namespace avmedia {
43
44 // ---------------
45 // - MediaWindow -
46 // ---------------
47
MediaWindow(Window * parent,bool bInternalMediaControl)48 MediaWindow::MediaWindow( Window* parent, bool bInternalMediaControl ) :
49 mpImpl( new priv::MediaWindowImpl( parent, this, bInternalMediaControl ) )
50 {
51 mpImpl->Show();
52 }
53
54 // -------------------------------------------------------------------------
55
~MediaWindow()56 MediaWindow::~MediaWindow()
57 {
58 mpImpl->cleanUp();
59 delete mpImpl;
60 mpImpl = NULL;
61 }
62
63 // -------------------------------------------------------------------------
64
setURL(const::rtl::OUString & rURL)65 void MediaWindow::setURL( const ::rtl::OUString& rURL )
66 {
67 if( mpImpl )
68 mpImpl->setURL( rURL );
69 }
70
71 // -------------------------------------------------------------------------
72
getURL() const73 const ::rtl::OUString& MediaWindow::getURL() const
74 {
75 return mpImpl->getURL();
76 }
77
78 // -------------------------------------------------------------------------
79
isValid() const80 bool MediaWindow::isValid() const
81 {
82 return( mpImpl != NULL && mpImpl->isValid() );
83 }
84
85 // -------------------------------------------------------------------------
86
MouseMove(const MouseEvent &)87 void MediaWindow::MouseMove( const MouseEvent& /* rMEvt */ )
88 {
89 }
90
91 // ---------------------------------------------------------------------
92
MouseButtonDown(const MouseEvent &)93 void MediaWindow::MouseButtonDown( const MouseEvent& /* rMEvt */ )
94 {
95 }
96
97 // ---------------------------------------------------------------------
98
MouseButtonUp(const MouseEvent &)99 void MediaWindow::MouseButtonUp( const MouseEvent& /* rMEvt */ )
100 {
101 }
102
103 // -------------------------------------------------------------------------
104
KeyInput(const KeyEvent &)105 void MediaWindow::KeyInput( const KeyEvent& /* rKEvt */ )
106 {
107 }
108
109 // -------------------------------------------------------------------------
110
KeyUp(const KeyEvent &)111 void MediaWindow::KeyUp( const KeyEvent& /* rKEvt */ )
112 {
113 }
114
115 // -------------------------------------------------------------------------
116
Command(const CommandEvent &)117 void MediaWindow::Command( const CommandEvent& /* rCEvt */ )
118 {
119 }
120
121 // -------------------------------------------------------------------------
122
AcceptDrop(const AcceptDropEvent &)123 sal_Int8 MediaWindow::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
124 {
125 return 0;
126 }
127
128 // -------------------------------------------------------------------------
129
ExecuteDrop(const ExecuteDropEvent &)130 sal_Int8 MediaWindow::ExecuteDrop( const ExecuteDropEvent& /* rEvt */ )
131 {
132 return 0;
133 }
134
135 // -------------------------------------------------------------------------
136
StartDrag(sal_Int8,const Point &)137 void MediaWindow::StartDrag( sal_Int8 /* nAction */, const Point& /* rPosPixel */ )
138 {
139 }
140
141 // -------------------------------------------------------------------------
142
hasPreferredSize() const143 bool MediaWindow::hasPreferredSize() const
144 {
145 return( mpImpl != NULL && mpImpl->hasPreferredSize() );
146 }
147
148 // -------------------------------------------------------------------------
149
getPreferredSize() const150 Size MediaWindow::getPreferredSize() const
151 {
152 return mpImpl->getPreferredSize();
153 }
154
155 // -------------------------------------------------------------------------
156
setPosSize(const Rectangle & rNewRect)157 void MediaWindow::setPosSize( const Rectangle& rNewRect )
158 {
159 if( mpImpl )
160 {
161 mpImpl->setPosSize( rNewRect );
162 }
163 }
164
165 // -------------------------------------------------------------------------
166
getPosSize() const167 Rectangle MediaWindow::getPosSize() const
168 {
169 return Rectangle( mpImpl->GetPosPixel(), mpImpl->GetSizePixel() );
170 }
171
172 // -------------------------------------------------------------------------
173
setPointer(const Pointer & rPointer)174 void MediaWindow::setPointer( const Pointer& rPointer )
175 {
176 if( mpImpl )
177 mpImpl->setPointer( rPointer );
178 }
179
180 // -------------------------------------------------------------------------
181
getPointer() const182 const Pointer& MediaWindow::getPointer() const
183 {
184 return mpImpl->getPointer();
185 }
186
187 // -------------------------------------------------------------------------
188
setZoom(::com::sun::star::media::ZoomLevel eLevel)189 bool MediaWindow::setZoom( ::com::sun::star::media::ZoomLevel eLevel )
190 {
191 return( mpImpl != NULL && mpImpl->setZoom( eLevel ) );
192 }
193
194 // -------------------------------------------------------------------------
195
getZoom() const196 ::com::sun::star::media::ZoomLevel MediaWindow::getZoom() const
197 {
198 return mpImpl->getZoom();
199 }
200
201 // -------------------------------------------------------------------------
202
start()203 bool MediaWindow::start()
204 {
205 return( mpImpl != NULL && mpImpl->start() );
206 }
207
208 // -------------------------------------------------------------------------
209
stop()210 void MediaWindow::stop()
211 {
212 if( mpImpl )
213 mpImpl->stop();
214 }
215
216 // -------------------------------------------------------------------------
217
isPlaying() const218 bool MediaWindow::isPlaying() const
219 {
220 return( mpImpl != NULL && mpImpl->isPlaying() );
221 }
222
223 // -------------------------------------------------------------------------
224
getDuration() const225 double MediaWindow::getDuration() const
226 {
227 return mpImpl->getDuration();
228 }
229
230 // -------------------------------------------------------------------------
231
setMediaTime(double fTime)232 void MediaWindow::setMediaTime( double fTime )
233 {
234 if( mpImpl )
235 mpImpl->setMediaTime( fTime );
236 }
237
238 // -------------------------------------------------------------------------
239
getMediaTime() const240 double MediaWindow::getMediaTime() const
241 {
242 return mpImpl->getMediaTime();
243 }
244
245 // -------------------------------------------------------------------------
246
setStopTime(double fTime)247 void MediaWindow::setStopTime( double fTime )
248 {
249 if( mpImpl )
250 mpImpl->setStopTime( fTime );
251 }
252
253 // -------------------------------------------------------------------------
254
getStopTime() const255 double MediaWindow::getStopTime() const
256 {
257 return mpImpl->getStopTime();
258 }
259
260 // -------------------------------------------------------------------------
261
setRate(double fRate)262 void MediaWindow::setRate( double fRate )
263 {
264 if( mpImpl )
265 mpImpl->setRate( fRate );
266 }
267
268 // -------------------------------------------------------------------------
269
getRate() const270 double MediaWindow::getRate() const
271 {
272 return mpImpl->getRate();
273 }
274
275 // -------------------------------------------------------------------------
276
setPlaybackLoop(bool bSet)277 void MediaWindow::setPlaybackLoop( bool bSet )
278 {
279 if( mpImpl )
280 mpImpl->setPlaybackLoop( bSet );
281 }
282
283 // -------------------------------------------------------------------------
284
isPlaybackLoop() const285 bool MediaWindow::isPlaybackLoop() const
286 {
287 return mpImpl->isPlaybackLoop();
288 }
289
290 // -------------------------------------------------------------------------
291
setMute(bool bSet)292 void MediaWindow::setMute( bool bSet )
293 {
294 if( mpImpl )
295 mpImpl->setMute( bSet );
296 }
297
298 // -------------------------------------------------------------------------
299
isMute() const300 bool MediaWindow::isMute() const
301 {
302 return mpImpl->isMute();
303 }
304
305 // -------------------------------------------------------------------------
306
updateMediaItem(MediaItem & rItem) const307 void MediaWindow::updateMediaItem( MediaItem& rItem ) const
308 {
309 if( mpImpl )
310 mpImpl->updateMediaItem( rItem );
311 }
312
313 // -------------------------------------------------------------------------
314
executeMediaItem(const MediaItem & rItem)315 void MediaWindow::executeMediaItem( const MediaItem& rItem )
316 {
317 if( mpImpl )
318 mpImpl->executeMediaItem( rItem );
319 }
320
321 // -------------------------------------------------------------------------
322
show()323 void MediaWindow::show()
324 {
325 if( mpImpl )
326 mpImpl->Show();
327 }
328
329 // -------------------------------------------------------------------------
330
hide()331 void MediaWindow::hide()
332 {
333 if( mpImpl )
334 mpImpl->Hide();
335 }
336
337 // -------------------------------------------------------------------------
338
enable()339 void MediaWindow::enable()
340 {
341 if( mpImpl )
342 mpImpl->Enable();
343 }
344
345 // -------------------------------------------------------------------------
346
disable()347 void MediaWindow::disable()
348 {
349 if( mpImpl )
350 mpImpl->Disable();
351 }
352
353 // -------------------------------------------------------------------------
354
getWindow() const355 Window* MediaWindow::getWindow() const
356 {
357 return mpImpl;
358 }
359
360 // -------------------------------------------------------------------------
361
getMediaFilters(FilterNameVector & rFilterNameVector)362 void MediaWindow::getMediaFilters( FilterNameVector& rFilterNameVector )
363 {
364 static const char* pFilters[] = { "AIF Audio", "aif;aiff",
365 "AU Audio", "au",
366 "AVI", "avi",
367 "CD Audio", "cda",
368 "FLAC Audio", "flac",
369 "Flash Video", "flv",
370 "Matroska Media", "mkv",
371 "MIDI Audio", "mid;midi",
372 "MPEG Audio", "mp2;mp3;mpa;m4a",
373 "MPEG Video", "mpg;mpeg;mpv;mp4",
374 "Ogg bitstream", "ogg;oga;ogv",
375 "Quicktime Video", "mov",
376 "Vivo Video", "viv",
377 "WAVE Audio", "wav",
378 "Windows Media Video", "wmv" };
379
380 unsigned int i;
381 for( i = 0; i < ( sizeof( pFilters ) / sizeof( char* ) ); i += 2 )
382 {
383 rFilterNameVector.push_back( ::std::make_pair< ::rtl::OUString, ::rtl::OUString >(
384 ::rtl::OUString::createFromAscii( pFilters[ i ] ),
385 ::rtl::OUString::createFromAscii( pFilters[ i + 1 ] ) ) );
386 }
387 }
388
389 // -------------------------------------------------------------------------
390
executeMediaURLDialog(Window *,::rtl::OUString & rURL,bool bInsertDialog)391 bool MediaWindow::executeMediaURLDialog( Window* /* pParent */, ::rtl::OUString& rURL, bool bInsertDialog )
392 {
393 ::sfx2::FileDialogHelper aDlg( com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
394 static const ::rtl::OUString aWildcard( RTL_CONSTASCII_USTRINGPARAM( "*." ) );
395 FilterNameVector aFilters;
396 const ::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( ";" ) );
397 ::rtl::OUString aAllTypes;
398
399 aDlg.SetTitle( AVMEDIA_RESID( bInsertDialog ? AVMEDIA_STR_INSERTMEDIA_DLG : AVMEDIA_STR_OPENMEDIA_DLG ) );
400
401 getMediaFilters( aFilters );
402
403 unsigned int i;
404 for( i = 0; i < aFilters.size(); ++i )
405 {
406 for( sal_Int32 nIndex = 0; nIndex >= 0; )
407 {
408 if( !aAllTypes.isEmpty() )
409 aAllTypes += aSeparator;
410
411 ( aAllTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
412 }
413 }
414
415 // add filter for all media types
416 aDlg.AddFilter( AVMEDIA_RESID( AVMEDIA_STR_ALL_MEDIAFILES ), aAllTypes );
417
418 for( i = 0; i < aFilters.size(); ++i )
419 {
420 ::rtl::OUString aTypes;
421
422 for( sal_Int32 nIndex = 0; nIndex >= 0; )
423 {
424 if( !aTypes.isEmpty() )
425 aTypes += aSeparator;
426
427 ( aTypes += aWildcard ) += aFilters[ i ].second.getToken( 0, ';', nIndex );
428 }
429
430 // add single filters
431 aDlg.AddFilter( aFilters[ i ].first, aTypes );
432 }
433
434 // add filter for all types
435 aDlg.AddFilter( AVMEDIA_RESID( AVMEDIA_STR_ALL_FILES ), String( RTL_CONSTASCII_USTRINGPARAM( "*.*" ) ) );
436
437 if( aDlg.Execute() == ERRCODE_NONE )
438 {
439 const INetURLObject aURL( aDlg.GetPath() );
440 rURL = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
441 }
442 else if( !rURL.isEmpty() )
443 rURL = ::rtl::OUString();
444
445 return !rURL.isEmpty();
446 }
447
448 // -------------------------------------------------------------------------
449
executeFormatErrorBox(Window * pParent)450 void MediaWindow::executeFormatErrorBox( Window* pParent )
451 {
452 ErrorBox aErrBox( pParent, AVMEDIA_RESID( AVMEDIA_ERR_URL ) );
453
454 aErrBox.Execute();
455 }
456
457 // -------------------------------------------------------------------------
458
isMediaURL(const::rtl::OUString & rURL,bool bDeep,Size * pPreferredSizePixel)459 bool MediaWindow::isMediaURL( const ::rtl::OUString& rURL, bool bDeep, Size* pPreferredSizePixel )
460 {
461 const INetURLObject aURL( rURL );
462 bool bRet = false;
463
464 if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
465 {
466 if( bDeep || pPreferredSizePixel )
467 {
468 try
469 {
470 sal_Bool bIsJavaBasedMediaWindow;
471 uno::Reference< media::XPlayer > xPlayer( priv::MediaWindowImpl::createPlayer(
472 aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ),
473 bIsJavaBasedMediaWindow ) );
474
475 if( xPlayer.is() )
476 {
477 bRet = true;
478
479 if( pPreferredSizePixel )
480 {
481 const awt::Size aAwtSize( xPlayer->getPreferredPlayerWindowSize() );
482
483 pPreferredSizePixel->Width() = aAwtSize.Width;
484 pPreferredSizePixel->Height() = aAwtSize.Height;
485 }
486 }
487 }
488 catch( ... )
489 {
490 }
491 }
492 else
493 {
494 FilterNameVector aFilters;
495 const ::rtl::OUString aExt( aURL.getExtension() );
496
497 getMediaFilters( aFilters );
498
499 unsigned int i;
500 for( i = 0; ( i < aFilters.size() ) && !bRet; ++i )
501 {
502 for( sal_Int32 nIndex = 0; nIndex >= 0 && !bRet; )
503 {
504 if( aExt.equalsIgnoreAsciiCase( aFilters[ i ].second.getToken( 0, ';', nIndex ) ) )
505 bRet = true;
506 }
507 }
508 }
509 }
510
511 return bRet;
512 }
513
514 // -------------------------------------------------------------------------
515
createPlayer(const::rtl::OUString & rURL)516 uno::Reference< media::XPlayer > MediaWindow::createPlayer( const ::rtl::OUString& rURL )
517 {
518 sal_Bool bJavaBased = sal_False;
519 return priv::MediaWindowImpl::createPlayer( rURL, bJavaBased );
520 }
521
522 // -------------------------------------------------------------------------
523
grabFrame(const::rtl::OUString & rURL,bool bAllowToCreateReplacementGraphic,double fMediaTime)524 uno::Reference< graphic::XGraphic > MediaWindow::grabFrame( const ::rtl::OUString& rURL,
525 bool bAllowToCreateReplacementGraphic,
526 double fMediaTime )
527 {
528 uno::Reference< media::XPlayer > xPlayer( createPlayer( rURL ) );
529 uno::Reference< graphic::XGraphic > xRet;
530 ::std::auto_ptr< Graphic > apGraphic;
531
532 if( xPlayer.is() )
533 {
534 uno::Reference< media::XFrameGrabber > xGrabber( xPlayer->createFrameGrabber() );
535
536 if( xGrabber.is() )
537 {
538 if( AVMEDIA_FRAMEGRABBER_DEFAULTFRAME == fMediaTime )
539 fMediaTime = AVMEDIA_FRAMEGRABBER_DEFAULTFRAME_MEDIATIME;
540
541 if( fMediaTime >= xPlayer->getDuration() )
542 fMediaTime = ( xPlayer->getDuration() * 0.5 );
543
544 xRet = xGrabber->grabFrame( fMediaTime );
545 }
546
547 if( !xRet.is() && bAllowToCreateReplacementGraphic )
548 {
549 awt::Size aPrefSize( xPlayer->getPreferredPlayerWindowSize() );
550
551 if( !aPrefSize.Width && !aPrefSize.Height )
552 {
553 const BitmapEx aBmpEx( AVMEDIA_RESID( AVMEDIA_BMP_AUDIOLOGO ) );
554 apGraphic.reset( new Graphic( aBmpEx ) );
555 }
556 }
557 }
558
559 if( !xRet.is() && !apGraphic.get() && bAllowToCreateReplacementGraphic )
560 {
561 const BitmapEx aBmpEx( AVMEDIA_RESID( AVMEDIA_BMP_EMPTYLOGO ) );
562 apGraphic.reset( new Graphic( aBmpEx ) );
563 }
564
565 if( apGraphic.get() )
566 xRet = apGraphic->GetXGraphic();
567
568 return xRet;
569 }
570
571 } // namespace avmedia
572