summaryrefslogtreecommitdiff
path: root/avmedia/source/vlc/vlcmanager.cxx
blob: bb916013ef4f3edcfedbbb34f5b4434b2afddb71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <com/sun/star/uno/Exception.hpp>
#include <cppuhelper/supportsservice.hxx>
#include <sal/log.hxx>
#include "vlcmanager.hxx"
#include "vlcplayer.hxx"
#include <wrapper/Instance.hxx>
#include <wrapper/EventManager.hxx>
#include <wrapper/Media.hxx>
#include <wrapper/Player.hxx>
#include <wrapper/Common.hxx>
#include <officecfg/Office/Common.hxx>

using namespace ::com::sun::star;

namespace avmedia::vlc {

namespace
{
    const char * const VLC_ARGS[] = {
        "--demux",
        "ffmpeg",
        "--no-mouse-events",
        "--verbose=-1"
    };
}

Manager::Manager()
    : mEventHandler()
{
    using namespace wrapper;
    static bool success = Instance::LoadSymbols() && EventManager::LoadSymbols()
                          && Media::LoadSymbols() && Player::LoadSymbols()
                          && Common::LoadSymbols();

    m_is_vlc_found = success;
    if (m_is_vlc_found)
    {
        mInstance.reset(new Instance( SAL_N_ELEMENTS(VLC_ARGS), VLC_ARGS ));
        //Check VLC version
        std::vector<std::string> verComponents;
        const std::string str(Common::Version());

        boost::split(verComponents,
                     str,
                     boost::is_any_of(". "));
        if (verComponents.size() < 3
            || boost::lexical_cast<int>(verComponents[0]) < 2
            || (boost::lexical_cast<int>(verComponents[1]) == 0
                && boost::lexical_cast<int>(verComponents[2]) < 8))
        {
            SAL_WARN("avmedia", "VLC version '" << str << "' is too old");
            m_is_vlc_found = false;
        }
        else
            SAL_INFO("avmedia", "VLC version '" << str << "' is acceptable");
    }
    else
        SAL_WARN("avmedia", "Cannot load symbols");

    if (m_is_vlc_found)
    {
        mEventHandler.create();
    }
}

Manager::~Manager()
{
    mEventHandler.stop();
}

uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const OUString& rURL )
{
    if ( !m_is_vlc_found )
        throw uno::RuntimeException("VLC not found", nullptr);

    if ( !rURL.isEmpty() )
    {
        if (mURL == rURL)
            return mPlayer;

        mURL = rURL;
    }
    else
        return mPlayer;

    VLCPlayer* pPlayer( new VLCPlayer( mURL,
                                       *mInstance,
                                       mEventHandler /*, mxMgr */ ) );
    mPlayer.set( pPlayer );

    return mPlayer;
}

OUString SAL_CALL Manager::getImplementationName()
{
    return "com.sun.star.comp.avmedia.Manager_VLC";
}

sal_Bool SAL_CALL Manager::supportsService( const OUString& serviceName )
{
    return cppu::supportsService(this, serviceName);
}

uno::Sequence< OUString > SAL_CALL Manager::getSupportedServiceNames()
{
    return {  "com.sun.star.media.Manager_VLC" };
}

} // end namespace


extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
com_sun_star_comp_media_Manager_VLC_get_implementation(
    css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
{
    // Experimental for now - code is neither elegant nor well tested.
    if (!officecfg::Office::Common::Misc::ExperimentalMode::get(context))
        return nullptr;
    static uno::Reference< uno::XInterface > manager( *new ::avmedia::vlc::Manager );
    manager->acquire();
    return manager.get();
}


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */