Commit 80d4ae8d authored by Tristan Matthews's avatar Tristan Matthews

* #8357: daemon now builds with video enabled

parent 8cc2cb0f
......@@ -163,7 +163,8 @@ AS_IF([test "x$enable_video" != "xno"], [
dnl Check for libavutil development package - name: libavutil-dev
PKG_CHECK_MODULES(LIBAVUTIL, libavutil >= 51.7.0,, AC_MSG_ERROR([Missing libavutil package: libavutil-dev]))
]);
AM_CONDITIONAL(SFL_VIDEO, test x"$enable_video" = xyes)
AM_CONDITIONAL(SFL_VIDEO, test "x$enable_video" != "xno")
LIBCCGNU2_MIN_VERSION=1.3.1
PKG_CHECK_MODULES(CCGNU2, libccgnu2 >= ${LIBCCGNU2_MIN_VERSION},, AC_MSG_ERROR([Missing common cpp development package: libcommoncpp2-dev]))
......
......@@ -3,13 +3,12 @@ include ../globals.mak
libexecdir=$(libdir)/sflphone
libexec_PROGRAMS = sflphoned
# all: indent
SUBDIRS = dbus audio config hooks history sip iax im
if SFL_VIDEO
SUBDIRS += video
SFL_VIDEO_SUBDIR = video
endif
SUBDIRS = dbus audio config hooks history sip iax im $(SFL_VIDEO_SUBDIR)
sflphoned_SOURCES = main.cpp
# Redefine the USE_IAX variable here, so that it could be used in managerimpl
......@@ -53,6 +52,10 @@ noinst_HEADERS = \
fileutils.h \
noncopyable.h
if SFL_VIDEO
SFL_VIDEO_LIB=./video/libvideo.la
endif
libsflphone_la_LIBADD = \
$(top_builddir)/libs/utilspp/libutilspp.la \
$(top_builddir)/libs/iax2/libiax2.la \
......@@ -63,10 +66,7 @@ libsflphone_la_LIBADD = \
./dbus/libdbus.la \
./config/libconfig.la \
./hooks/libhooks.la \
./history/libhistory.la
if SFL_VIDEO
libsflphone_la_LIBADD += ./video/libvideo.la
endif
./history/libhistory.la $(SFL_VIDEO_LIB)
libsflphone_la_LDFLAGS = \
@CCGNU2_LIBS@ \
......
......@@ -86,15 +86,15 @@ void Account::loadDefaultCodecs()
codecList.push_back("112");
setActiveCodecs(codecList);
#if SFL_VIDEO
setActiveVideoCodecs(sfl_video::getVideoCodecList());
#ifdef SFL_VIDEO
setActiveVideoCodecs(sfl_video::getCodecList());
#endif
}
#if SFL_VIDEO
#ifdef SFL_VIDEO
void Account::setActiveVideoCodecs (const std::vector <std::string> &list)
{
videoCodecList_ = !list.empty() ? list : sfl_video::getVideoCodecList();
videoCodecList_ = !list.empty() ? list : sfl_video::getCodecList();
}
#endif
......@@ -105,9 +105,8 @@ void Account::setActiveCodecs(const std::vector <std::string> &list)
// list contains the ordered payload of active codecs picked by the user for this account
// we used the CodecList vector to save the order.
for (std::vector<std::string>::const_iterator iter = list.begin(); iter != list.end();
++iter) {
int payload = std::atoi(iter->c_str());
for (std::vector<std::string>::const_iterator i = list.begin(); i != list.end(); ++i) {
int payload = std::atoi(i->c_str());
codecList_.push_back(static_cast<int>(payload));
}
......
......@@ -35,9 +35,13 @@
#include <string>
#include <vector>
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include "global.h"
#include "noncopyable.h"
#include "config/config.h"
#include "config/sfl_config.h"
#include "config/serializable.h"
class VoIPLink;
......
noinst_LTLIBRARIES = libconfig.la
libconfig_la_SOURCES = \
config.cpp \
sfl_config.cpp \
yamlemitter.cpp \
yamlparser.cpp \
yamlnode.cpp
noinst_HEADERS = \
config.h \
sfl_config.h \
serializable.h \
yamlemitter.h \
yamlparser.h \
......
......@@ -29,7 +29,7 @@
* as that of the covered work.
*/
#include "config.h"
#include "sfl_config.h"
#include "../global.h"
#include <fstream>
#include <cstdlib>
......
......@@ -28,8 +28,12 @@
* as that of the covered work.
*/
#ifndef __YAMLEMITTER_H__
#define __YAMLEMITTER_H__
#ifndef YAMLEMITTER_H_
#define YAMLEMITTER_H_
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <yaml.h>
#include <stdexcept>
......@@ -129,4 +133,4 @@ class YamlEmitter {
};
}
#endif
#endif // YAMLEMITTER_H_
......@@ -31,6 +31,10 @@
#ifndef __YAMLPARSER_H__
#define __YAMLPARSER_H__
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "yamlnode.h"
#include <yaml.h>
#include <cstdio>
......
......@@ -9,6 +9,8 @@ BUILT_SOURCES= \
if SFL_VIDEO
BUILT_SOURCES+=video_controls-glue.h
video_controls-glue.h: video_controls-introspec.xml Makefile.am
dbusxx-xml2cpp $< --adaptor=$@
endif
# Rule to generate the binding headers
......
......@@ -40,8 +40,12 @@
#include "manager.h"
namespace {
const char* SERVER_PATH = "/org/sflphone/SFLphone/CallManager";
}
CallManager::CallManager(DBus::Connection& connection)
: DBus::ObjectAdaptor(connection, "/org/sflphone/SFLphone/CallManager")
: DBus::ObjectAdaptor(connection, SERVER_PATH)
{}
void CallManager::placeCall(const std::string& accountID,
......@@ -71,10 +75,10 @@ void CallManager::placeCallFirstAccount(const std::string& callID,
if (accountList.empty())
accountList = Manager::instance().getAccountList();
for (vector<string>::const_iterator iter = accountList.begin(); iter != accountList.end(); ++iter) {
if ((*iter != IP2IP_PROFILE) && Manager::instance().getAccount(*iter)->isEnabled()) {
Manager::instance().outgoingCall(*iter, callID, to);
return;
for (vector<string>::const_iterator i = accountList.begin(); i != accountList.end(); ++i) {
if ((*i != IP2IP_PROFILE) && Manager::instance().getAccount(*i)->isEnabled()) {
Manager::instance().outgoingCall(*i, callID, to);
break;
}
}
}
......@@ -129,9 +133,9 @@ void CallManager::attendedTransfer(const std::string& transferID, const std::str
void CallManager::setVolume(const std::string& device, const double& value)
{
if (device == "speaker")
Manager::instance().setSpkrVolume((int)(value * 100.0));
Manager::instance().setSpkrVolume(value * 100.0);
else if (device == "mic")
Manager::instance().setMicVolume((int)(value * 100.0));
Manager::instance().setMicVolume(value * 100.0);
volumeChanged(device, value);
}
......@@ -195,19 +199,19 @@ CallManager::unholdConference(const std::string& confID)
Manager::instance().unHoldConference(confID);
}
std::map< std::string, std::string >
std::map<std::string, std::string>
CallManager::getConferenceDetails(const std::string& callID)
{
return Manager::instance().getConferenceDetails(callID);
}
std::vector< std::string >
std::vector<std::string>
CallManager::getConferenceList()
{
return Manager::instance().getConferenceList();
}
std::vector< std::string >
std::vector<std::string>
CallManager::getParticipantList(const std::string& confID)
{
return Manager::instance().getParticipantList(confID);
......@@ -239,7 +243,7 @@ CallManager::getIsRecording(const std::string& callID)
std::string CallManager::getCurrentAudioCodecName(const std::string& callID)
{
return Manager::instance().getCurrentCodecName(callID).c_str();
return Manager::instance().getCurrentCodecName(callID);
}
std::map<std::string, std::string>
......@@ -307,27 +311,23 @@ CallManager::setSASVerified(const std::string& callID)
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
zSession->SASVerified();
} catch (...) {
}
} catch (...) {}
}
void
CallManager::resetSASVerified(const std::string& callID)
{
try {
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID);
zSession->resetSASVerified();
} catch (...) {
}
} catch (...) {}
}
void
CallManager::setConfirmGoClear(const std::string& callID)
{
try {
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID);
zSession->goClearOk();
} catch (...) {}
}
......@@ -335,33 +335,27 @@ CallManager::setConfirmGoClear(const std::string& callID)
void CallManager::requestGoClear(const std::string& callID)
{
try {
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID);
zSession->requestGoClear();
} catch (...) {
}
} catch (...) {}
}
void
CallManager::acceptEnrollment(const std::string& callID, const bool& accepted)
{
try {
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID);
zSession->acceptEnrollment(accepted);
} catch (...) {
}
} catch (...) {}
}
void
CallManager::setPBXEnrollment(const std::string& callID, const bool& yesNo)
{
try {
sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID);
sfl::AudioZrtpSession * zSession = getAudioZrtpSession(callID);
zSession->setPBXEnrollment(yesNo);
} catch (...) {
}
} catch (...) {}
}
void
......
......@@ -57,17 +57,16 @@ class CallManagerException: public std::runtime_error {
};
namespace sfl {
class AudioZrtpSession;
class AudioZrtpSession;
}
class CallManager
: public org::sflphone::SFLphone::CallManager_adaptor,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor {
class CallManager : public org::sflphone::SFLphone::CallManager_adaptor,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor {
public:
CallManager(DBus::Connection& connection);
static const char* SERVER_PATH;
/* methods exported by this interface,
* you will have to implement them in your ObjectAdaptor
......@@ -83,13 +82,13 @@ class CallManager
void hold(const std::string& callID);
void unhold(const std::string& callID);
void transfer(const std::string& callID, const std::string& to);
void attendedTransfer(const std::string& transferID, const std::string& targetID);
std::map< std::string, std::string > getCallDetails(const std::string& callID);
std::vector< std::string > getCallList();
void attendedTransfer(const std::string& transferID, const std::string &targetID);
std::map<std::string, std::string> getCallDetails(const std::string &callID);
std::vector<std::string> getCallList();
/* Conference related methods */
void joinParticipant(const std::string& sel_callID, const std::string& drag_callID);
void createConfFromParticipantList(const std::vector< std::string >& participants);
void joinParticipant(const std::string& sel_callID, const std::string &drag_callID);
void createConfFromParticipantList(const std::vector<std::string> &participants);
void addParticipant(const std::string& callID, const std::string& confID);
void addMainParticipant(const std::string& confID);
void detachParticipant(const std::string& callID);
......@@ -97,9 +96,9 @@ class CallManager
void hangUpConference(const std::string& confID);
void holdConference(const std::string& confID);
void unholdConference(const std::string& confID);
std::vector< std::string > getConferenceList();
std::vector< std::string > getParticipantList(const std::string& confID);
std::map< std::string, std::string > getConferenceDetails(const std::string& callID);
std::vector<std::string> getConferenceList();
std::vector<std::string> getParticipantList(const std::string& confID);
std::map<std::string, std::string> getConferenceDetails(const std::string& callID);
/* File Playback methods */
bool startRecordedFilePlayback(const std::string& filepath);
......
......@@ -40,8 +40,9 @@
#include "account.h"
#include "sip/sipaccount.h"
const char* ConfigurationManager::SERVER_PATH =
"/org/sflphone/SFLphone/ConfigurationManager";
namespace {
const char* SERVER_PATH = "/org/sflphone/SFLphone/ConfigurationManager";
}
ConfigurationManager::ConfigurationManager(DBus::Connection& connection) :
DBus::ObjectAdaptor(connection, SERVER_PATH)
......
......@@ -56,11 +56,9 @@ class ConfigurationManager
: public org::sflphone::SFLphone::ConfigurationManager_adaptor,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor {
public:
public:
ConfigurationManager(DBus::Connection& connection);
static const char* SERVER_PATH;
std::map< std::string, std::string > getAccountDetails(const std::string& accountID);
void setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details);
std::string addAccount(const std::map< std::string, std::string >& details);
......
......@@ -38,6 +38,10 @@
#include "configurationmanager.h"
#include "networkmanager.h"
#ifdef SFL_VIDEO
#include "dbus/video_controls.h"
#endif
DBusManager::DBusManager() : callManager_(0)
, configurationManager_(0)
, instanceManager_(0)
......
......@@ -31,6 +31,9 @@
#ifndef __DBUSMANAGERIMPL_H__
#define __DBUSMANAGERIMPL_H__
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "dbus_cpp.h"
#include "noncopyable.h"
......@@ -38,6 +41,7 @@ class ConfigurationManager;
class CallManager;
class NetworkManager;
class Instance;
class VideoControls;
class DBusManager {
public:
......@@ -46,10 +50,15 @@ class DBusManager {
CallManager * getCallManager() {
return callManager_;
};
}
ConfigurationManager * getConfigurationManager() {
return configurationManager_;
};
}
#ifdef SFL_VIDEO
VideoControls* getVideoControls() {
return videoControls_;
}
#endif
void exec();
void exit();
......
......@@ -62,5 +62,4 @@ class Instance
};
#endif//INSTANCE_H
#endif // INSTANCE_H
......@@ -3,13 +3,13 @@
<interface name="org.sflphone.SFLphone.VideoControls">
<!-- Video device methods -->
<method name="getVideoInputDeviceList" tp:name-for-bindings="getVideoInputDeviceList">
<method name="getInputDeviceList" tp:name-for-bindings="getInputDeviceList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="list" direction="out">
</arg>
</method>
<method name="getVideoInputDeviceChannelList" tp:name-for-bindings="getVideoInputDeviceChannelList">
<method name="getInputDeviceChannelList" tp:name-for-bindings="getInputDeviceChannelList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="s" name="device" direction="in">
</arg>
......@@ -17,7 +17,7 @@
</arg>
</method>
<method name="getVideoInputDeviceSizeList" tp:name-for-bindings="getVideoInputDeviceSizeList">
<method name="getInputDeviceSizeList" tp:name-for-bindings="getInputDeviceSizeList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="s" name="device" direction="in">
</arg>
......@@ -27,7 +27,7 @@
</arg>
</method>
<method name="getVideoInputDeviceRateList" tp:name-for-bindings="getVideoInputDeviceRateList">
<method name="getInputDeviceRateList" tp:name-for-bindings="getInputDeviceRateList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="s" name="device" direction="in">
</arg>
......@@ -39,55 +39,55 @@
</arg>
</method>
<method name="getVideoInputDevice" tp:name-for-bindings="getVideoInputDevice">
<method name="getInputDevice" tp:name-for-bindings="getInputDevice">
<arg type="s" name="device" direction="out">
</arg>
</method>
<method name="getVideoInputDeviceChannel" tp:name-for-bindings="getVideoInputDeviceChannel">
<method name="getInputDeviceChannel" tp:name-for-bindings="getInputDeviceChannel">
<arg type="s" name="channel" direction="out">
</arg>
</method>
<method name="getVideoInputDeviceSize" tp:name-for-bindings="getVideoInputDeviceSize">
<method name="getInputDeviceSize" tp:name-for-bindings="getInputDeviceSize">
<arg type="s" name="size" direction="out">
</arg>
</method>
<method name="getVideoInputDeviceRate" tp:name-for-bindings="getVideoInputDeviceRate">
<method name="getInputDeviceRate" tp:name-for-bindings="getInputDeviceRate">
<arg type="s" name="rate" direction="out">
</arg>
</method>
<method name="setVideoInputDevice" tp:name-for-bindings="setVideoInputDevice">
<method name="setInputDevice" tp:name-for-bindings="setInputDevice">
<arg type="s" name="device" direction="in">
</arg>
</method>
<method name="setVideoInputDeviceChannel" tp:name-for-bindings="setVideoInputDeviceChannel">
<method name="setInputDeviceChannel" tp:name-for-bindings="setInputDeviceChannel">
<arg type="s" name="channel" direction="in">
</arg>
</method>
<method name="setVideoInputDeviceSize" tp:name-for-bindings="setVideoInputDeviceSize">
<method name="setInputDeviceSize" tp:name-for-bindings="setInputDeviceSize">
<arg type="s" name="size" direction="in">
</arg>
</method>
<method name="setVideoInputDeviceRate" tp:name-for-bindings="setVideoInputDeviceRate">
<method name="setInputDeviceRate" tp:name-for-bindings="setInputDeviceRate">
<arg type="s" name="rate" direction="in">
</arg>
</method>
<!-- Video Codec related methods -->
<method name="getVideoCodecList" tp:name-for-bindings="getVideoCodecList">
<method name="getCodecList" tp:name-for-bindings="getCodecList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="list" direction="out">
</arg>
</method>
<method name="getVideoCodecDetails" tp:name-for-bindings="getVideoCodecDetails">
<method name="getCodecDetails" tp:name-for-bindings="getCodecDetails">
<arg type="s" name="codec" direction="in">
</arg>
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
......@@ -95,7 +95,7 @@
</arg>
</method>
<method name="getActiveVideoCodecList" tp:name-for-bindings="getActiveVideoCodecList">
<method name="getActiveCodecList" tp:name-for-bindings="getActiveCodecList">
<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="s" name="accountID" direction="in">
</arg>
......@@ -103,7 +103,7 @@
</arg>
</method>
<method name="setActiveVideoCodecList" tp:name-for-bindings="setActiveVideoCodecList">
<method name="setActiveCodecList" tp:name-for-bindings="setActiveCodecList">
<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="VectorString"/>
<arg type="as" name="list" direction="in">
</arg>
......@@ -111,7 +111,7 @@
</arg>
</method>
<method name="startVideoPreview" tp:name-for-bindings="startVideoPreview">
<method name="startPreview" tp:name-for-bindings="startPreview">
<arg type="i" name="width" direction="out">
</arg>
<arg type="i" name="height" direction="out">
......@@ -124,18 +124,13 @@
</arg>
</method>
<method name="stopVideoPreview" tp:name-for-bindings="stopVideoPreview">
<method name="stopPreview" tp:name-for-bindings="stopPreview">
</method>
<signal name="videoDeviceEvent" tp:name-for-bindings="videoDeviceEvent">
<signal name="deviceEvent" tp:name-for-bindings="deviceEvent">
</signal>
<method name="getCurrentVideoCodecName" tp:name-for-bindings="getCurrentVideoCodecName">
<arg type="s" name="callID" direction="in"/>
<arg type="s" name="codecName" direction="out"/>
</method>
<signal name="receivingVideoEvent" tp:name-for-bindings="receivingVideoEvent">
<signal name="receivingEvent" tp:name-for-bindings="receivingEvent">
<arg type="i" name="shmKey">
</arg>
<arg type="i" name="semKey">
......@@ -148,7 +143,7 @@
</arg>
</signal>
<signal name="stoppedReceivingVideoEvent" tp:name-for-bindings="stoppedReceivingVideoEvent">
<signal name="stoppedReceivingEvent" tp:name-for-bindings="stoppedReceivingEvent">
<arg type="i" name="shmKey">
</arg>
<arg type="i" name="semKey">
......
......@@ -34,11 +34,15 @@
#include "video/libav_utils.h"
#include "video/video_endpoint.h"
#include "video/video_preview.h"
#include "account.h"
#include "manager.h"
const char* VideoControls::SERVER_PATH = "/org/sflphone/SFLphone/VideoControls";
namespace {
const char * const SERVER_PATH = "/org/sflphone/SFLphone/VideoControls";
}
VideoControls::VideoControls(DBus::Connection& connection) :
DBus::ObjectAdaptor(connection, SERVER_PATH), preview_()
DBus::ObjectAdaptor(connection, SERVER_PATH), preview_(), videoPreference_()
{
// initialize libav libraries
libav_utils::sfl_avcodec_init();
......@@ -65,7 +69,7 @@ VideoControls::getActiveCodecList(const std::string& accountID)
Account *acc = Manager::instance().getAccount(accountID);
if (acc != NULL)
v = acc->getActiveCodecs();
v = acc->getActiveVideoCodecs();
return v;
......@@ -123,27 +127,32 @@ std::string VideoControls::getInputDeviceRate()
return videoPreference_.getRate();
}
void VideoControls::setVideoInputDevice(const std::string& api)
void VideoControls::setInputDevice(const std::string& api)
{
videoPreference_.setDevice(api);
}
void VideoControls::setVideoInputDeviceChannel(const std::string& api)
void VideoControls::setInputDeviceChannel(const std::string& api)
{
videoPreference_.setChannel(api);
}
void VideoControls::setVideoInputDeviceSize(const std::string& api)
void VideoControls::setInputDeviceSize(const std::string& api)
{
videoPreference_.setSize(api);
}
void VideoControls::setVideoInputDeviceRate(const std::string& api)
void VideoControls::setInputDeviceRate(const std::string& api)
{
videoPreference_.setRate(api);
}
void VideoControls::startVideoPreview(int32_t &width, int32_t &height, int32_t &shmKey, int32_t &semKey, int32_t &videoBufferSize)
std::map<std::string, std::string>
VideoControls::getSettings() const {
return videoPreference_.getSettings();
}
void VideoControls::startPreview(int32_t &width, int32_t &height, int32_t &shmKey, int32_t &semKey, int32_t &videoBufferSize)
{
if (preview_.get()) {
ERROR("Video preview was already started!");
......@@ -156,7 +165,7 @@ void VideoControls::startVideoPreview(int32_t &width, int32_t &height, int32_t &
using std::map;
using std::string;
map<string, string> args(Manager::instance().videoPreference.getVideoSettings());
map<string, string> args(videoPreference_.getSettings());
preview_.reset(new sfl_video::VideoPreview(args));
preview_->start();
......@@ -167,7 +176,7 @@ void VideoControls::startVideoPreview(int32_t &width, int32_t &height, int32_t &
videoBufferSize = preview_->getVideoBufferSize();
}
void VideoControls::stopVideoPreview()
void VideoControls::stopPreview()
{
if (preview_.get()) {
DEBUG("Stopping video preview");
......
......@@ -31,47 +31,47 @@
#define VIDEO_CONTROLS_H_
#include "dbus_cpp.h"
#include "video_controls-glue.h"
#include <tr1/memory> // for shared_ptr
#include "video/video_preferences.h"
namespace sfl_video {
class VideoPreview;
}
class VideoControls
: public org::sflphone::SFLphone::ConfigurationManager_adaptor,
class VideoControls : public org::sflphone::SFLphone::VideoControls_adaptor,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor {
private:
std::tr1::shared_ptr<sfl_video::VideoPreview> preview_;
VideoPreference videoPreference;
VideoPreference videoPreference_;
public:
VideoControls(DBus::Connection& connection);
static const char* SERVER_PATH;
std::vector< std::string > getVideoCodecList();
std::vector< std::string > getVideoCodecDetails(