Commit 7d5c2e63 authored by Éloi Bail's avatar Éloi Bail Committed by Guillaume Roguez

media: codec layer refactoring

* Implement a centralized system media codec information view
* Implement media codec container to manage audio/video codecs
* Instantiate set of codecs per account
* Provide D-Bus API to retrives codecs information from client side
* Provide a SIP account (any) access to AV codecs

Important notes:
* IAX account usability is disabled until we provide a new implementation (see redmine Refs #66805)
* Some unittest are disabled until we provide a correct implementation
* Some part of code are disabled until SDP refactoring patchset is merged (Gerrit #1185)
* Some cleanup are also included

Refs #66619

Change-Id: I233889e47860b9362281d9ab3cdb506ce86ec997
Signed-off-by: Guillaume Roguez's avatarGuillaume Roguez <guillaume.roguez@savoirfairelinux.com>
parent d9dfb64c
......@@ -370,12 +370,12 @@
<method name="getAudioCodecList" tp:name-for-bindings="getAudioCodecList">
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorInt"/>
<arg type="ai" name="list" direction="out">
<arg type="au" name="list" direction="out">
</arg>
</method>
<method name="getAudioCodecDetails" tp:name-for-bindings="getAudioCodecDetails">
<arg type="i" name="payload" direction="in">
<arg type="u" name="codecId" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="details" direction="out">
......@@ -386,7 +386,7 @@
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorInt"/>
<arg type="s" name="accountID" direction="in">
</arg>
<arg type="ai" name="list" direction="out">
<arg type="au" name="list" direction="out">
</arg>
</method>
......
......@@ -116,9 +116,9 @@ DBusConfigurationManager::getSupportedCiphers(const std::string& accountID) -> d
}
auto
DBusConfigurationManager::getAudioCodecDetails(const int32_t& payload) -> decltype(DRing::getAudioCodecDetails(payload))
DBusConfigurationManager::getAudioCodecDetails(const unsigned& codecId) -> decltype(DRing::getAudioCodecDetails(codecId))
{
return DRing::getAudioCodecDetails(payload);
return DRing::getAudioCodecDetails(codecId);
}
auto
......
......@@ -76,10 +76,10 @@ class DBusConfigurationManager :
void registerAllAccounts(void);
std::map<std::string, std::string> getTlsDefaultSettings();
std::vector<std::string> getSupportedCiphers(const std::string& accountID);
std::vector<int32_t> getAudioCodecList();
std::vector<unsigned> getAudioCodecList();
std::vector<std::string> getSupportedTlsMethod();
std::vector<std::string> getAudioCodecDetails(const int32_t& payload);
std::vector<int32_t> getActiveAudioCodecList(const std::string& accountID);
std::vector<std::string> getAudioCodecDetails(const unsigned& codecId);
std::vector<unsigned> getActiveAudioCodecList(const std::string& accountID);
void setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID);
std::vector<std::string> getAudioPluginList();
void setAudioPlugin(const std::string& audioPlugin);
......
......@@ -29,8 +29,6 @@
*/
#include "dbusvideomanager.h"
#include "managerimpl.h"
#include "manager.h"
#include "client/videomanager.h"
DBusVideoManager::DBusVideoManager(DBus::Connection& connection)
......@@ -38,15 +36,21 @@ DBusVideoManager::DBusVideoManager(DBus::Connection& connection)
{}
auto
DBusVideoManager::getCodecs(const std::string& accountID) -> decltype(DRing::getCodecs(accountID))
DBusVideoManager::getVideoCodecList(const std::string& accountID) -> decltype(DRing::getVideoCodecList(accountID))
{
return DRing::getCodecs(accountID);
return DRing::getVideoCodecList(accountID);
}
auto
DBusVideoManager::getVideoCodecDetails(const unsigned& codecId) -> decltype(DRing::getVideoCodecDetails(codecId))
{
return DRing::getVideoCodecDetails(codecId);
}
void
DBusVideoManager::setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details)
DBusVideoManager::setVideoCodecList(const std::string& accountID, const std::vector<unsigned> &list)
{
DRing::setCodecs(accountID, details);
DRing::setVideoCodecList(accountID, list);
}
auto
......
......@@ -57,13 +57,13 @@ class DBusVideoManager :
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor
{
public:
DBusVideoManager(DBus::Connection& connection);
// Methods
std::vector<std::map<std::string, std::string>> getCodecs(const std::string& accountID);
void setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details);
std::vector<unsigned > getVideoCodecList(const std::string& accountID);
std::vector<std::string> getVideoCodecDetails(const unsigned& codecId);
void setVideoCodecList(const std::string& accountID, const std::vector<unsigned>& list);
std::vector<std::string> getDeviceList();
std::map<std::string, std::map<std::string, std::vector<std::string>>> getCapabilities(const std::string& name);
std::map<std::string, std::string> getSettings(const std::string& name);
......
......@@ -49,24 +49,31 @@
<!-- Video Codec related methods -->
<method name="getCodecs" tp:name-for-bindings="getCodecs">
<tp:docstring>Gets the hashtable describing all the codecs and their parameters for a given account</tp:docstring>
<method name="getVideoCodecList" tp:name-for-bindings="getVideoCodecList">
<arg type="s" name="accountID" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorMapStringString"/>
<arg type="aa{ss}" name="details" direction="out">
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorInt"/>
<arg type="au" name="list" direction="out">
</arg>
</method>
<method name="setCodecs" tp:name-for-bindings="setCodecs">
<tp:docstring>Sets a vector of hashtables describing codecs and their parameters for a given account, one hashtable per codec</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="VectorMapStringString"/>
<arg type="aa{ss}" name="details" direction="in">
</arg>
<method name="getVideoCodecDetails" tp:name-for-bindings="getVideoCodecDetails">
<arg type="u" name="codecid" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/>
<arg type="as" name="details" direction="out">
</arg>
</method>
<method name="setVideoCodecList" tp:name-for-bindings="setVideoCodecList">
<tp:docstring>Sets a vector of hashtables describing codecs and their parameters for a given account, one hashtable per codec</tp:docstring>
<arg type="s" name="accountID" direction="in">
</arg>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="VectorInt"/>
<arg type="au" name="list" direction="in">
</arg>
</method>
<method name="startCamera" tp:name-for-bindings="startCamera">
<tp:docstring> Starts the video camera, which renders the active v4l2 device's video to shared memory. Useful for testing/debugging camera settings</tp:docstring>
</method>
......
This diff is collapsed.
......@@ -41,6 +41,7 @@
#include "config/serializable.h"
#include "registration_states.h"
#include "ip_utils.h"
#include "media_codec.h"
#include <functional>
#include <string>
......@@ -55,18 +56,20 @@
namespace ring { namespace upnp {
class Controller;
}}
}} // namespace ring::upnp
namespace YAML {
class Emitter;
class Node;
}
} // namespace YAML
namespace ring {
class Call;
class SystemCodecContainer;
class VoipLinkException : public std::runtime_error {
class VoipLinkException : public std::runtime_error
{
public:
VoipLinkException(const std::string &str = "") :
std::runtime_error("VoipLinkException occured: " + str) {}
......@@ -79,8 +82,8 @@ class VoipLinkException : public std::runtime_error {
* It contains account, configuration, VoIP Link and Calls (inside the VoIPLink)
*/
class Account : public Serializable, public std::enable_shared_from_this<Account> {
class Account : public Serializable, public std::enable_shared_from_this<Account>
{
public:
constexpr static const char *TRUE_STR = "true";
constexpr static const char *FALSE_STR = "false";
......@@ -153,7 +156,7 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
* This is why no newIncomingCall() method exist here.
*/
std::vector<std::shared_ptr<Call> > getCalls();
std::vector<std::shared_ptr<Call>> getCalls();
/**
* Tell if the account is enable or not.
......@@ -194,31 +197,27 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
alias_ = alias;
}
std::vector<std::map<std::string, std::string> >
getAllVideoCodecs() const;
std::vector<std::map<std::string, std::string> >
getActiveVideoCodecs() const;
std::vector<unsigned> getAllVideoCodecsId() const;
std::vector<unsigned> getActiveVideoCodecs() const;
static std::vector<int> getDefaultAudioCodecs();
static std::vector<unsigned> getDefaultAudioCodecs();
/* Accessor to data structures
* @return The list that reflects the user's choice
*/
std::vector<int> getActiveAudioCodecs() const {
return audioCodecList_;
}
std::vector<unsigned> getActiveAudioCodecs() const;
/**
* Update both the codec order structure and the codec string used for
* SDP offer and configuration respectively
*/
void setActiveAudioCodecs(const std::vector<std::string>& list);
void setVideoCodecs(const std::vector<std::map<std::string, std::string> > &codecs);
void setVideoCodecs(const std::vector<unsigned> &codecs);
std::string getRingtonePath() const {
return ringtonePath_;
}
void setRingtonePath(const std::string &path) {
ringtonePath_ = path;
}
......@@ -246,7 +245,6 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
}
void attachCall(const std::string& id);
void detachCall(const std::string& id);
static const char * const VIDEO_CODEC_ENABLED;
......@@ -277,13 +275,14 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
/**
* Set of call's ID attached to the account.
*/
std::set<std::string> callIDSet_ = {{}};
std::set<std::string> callIDSet_;
protected:
static void parseString(const std::map<std::string, std::string> &details, const char *key, std::string &s);
static void parseBool(const std::map<std::string, std::string> &details, const char *key, bool &b);
friend class ConfigurationTest;
// General configuration keys for accounts
static const char * const AUDIO_CODECS_KEY;
static const char * const VIDEO_CODECS_KEY;
......@@ -348,18 +347,21 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
/**
* Vector containing the order of the codecs
*/
std::vector<int> audioCodecList_;
std::shared_ptr<SystemCodecContainer> systemCodecContainer_;
std::vector<unsigned> audioCodecList_;
std::vector<std::shared_ptr<AccountCodecInfo>> accountCodecInfoList_;
/**
* Vector containing the video codecs in order
*/
std::vector<std::map<std::string, std::string> > videoCodecList_;
std::vector<unsigned> videoCodecList_;
/**
* List of audio codecs obtained when parsing configuration and used
* to generate codec order list
*/
std::string audioCodecStr_;
std::string videoCodecStr_;
/**
* Ringtone .au file used for this account
......@@ -410,6 +412,17 @@ class Account : public Serializable, public std::enable_shared_from_this<Account
* flag which determines if this account is set to use UPnP.
*/
std::atomic_bool upnpEnabled_ {false};
/**
* private account codec searching functions
*/
std::shared_ptr<AccountCodecInfo> searchCodecById(unsigned codecId, MediaType mediaType);
std::shared_ptr<AccountCodecInfo> searchCodecByName(std::string name, MediaType mediaType);
std::shared_ptr<AccountCodecInfo> searchCodecByPayload(unsigned payload, MediaType mediaType);
std::vector<unsigned> getAccountCodecInfoIdList(MediaType mediaType) const;
std::vector<unsigned> getActiveAccountCodecInfoIdList(MediaType mediaType) const;
void desactivateAllMedia(MediaType mediaType);
std::vector<std::shared_ptr<AccountCodecInfo>> getActiveAccountCodecInfoList(MediaType mediaType);
};
} // namespace ring
......
......@@ -47,6 +47,7 @@
#include "sip/sipaccount.h"
#include "security_const.h"
#include "audio/audiolayer.h"
#include "system_codec_container.h"
#include "client/signal.h"
#include <dirent.h>
......@@ -91,14 +92,12 @@ getIp2IpDetails()
return std::map<std::string, std::string>();
}
std::map<std::string, std::string>
getAccountDetails(const std::string& accountID)
{
return ring::Manager::instance().getAccountDetails(accountID);
}
std::map<std::string, std::string>
getVolatileAccountDetails(const std::string& accountID)
{
......@@ -231,10 +230,10 @@ getAccountList()
* Send the list of all codecs loaded to the client through DBus.
* Can stay global, as only the active codecs will be set per accounts
*/
std::vector<int32_t>
std::vector<unsigned>
getAudioCodecList()
{
std::vector<int32_t> list {ring::Manager::instance().audioCodecFactory.getCodecList()};
std::vector<unsigned> list {ring::getSystemCodecContainer()->getSystemCodecInfoIdList(ring::MEDIA_AUDIO)};
if (list.empty())
ring::emitSignal<ConfigurationSignal::Error>(CODECS_NOT_LOADED);
return list;
......@@ -258,15 +257,16 @@ getSupportedCiphers(const std::string& accountID)
}
std::vector<std::string>
getAudioCodecDetails(int32_t payload)
getAudioCodecDetails(unsigned codecId)
{
std::vector<std::string> result {ring::Manager::instance().audioCodecFactory.getCodecSpecifications(payload)};
if (result.empty())
ring::emitSignal<ConfigurationSignal::Error>(CODECS_NOT_LOADED);
return result;
auto codec = ring::getSystemCodecContainer()->searchCodecById(codecId, ring::MEDIA_AUDIO);
if (auto foundCodec = std::static_pointer_cast<ring::SystemAudioCodecInfo>(codec))
return foundCodec->getCodecSpecifications();
ring::emitSignal<ConfigurationSignal::Error>(CODECS_NOT_LOADED);
return {};
}
std::vector<int32_t>
std::vector<unsigned>
getActiveAudioCodecList(const std::string& accountID)
{
if (auto acc = ring::Manager::instance().getAccount(accountID))
......
......@@ -38,6 +38,7 @@
#include "account.h"
#include "logger.h"
#include "manager.h"
#include "system_codec_container.h"
#include "client/signal.h"
namespace DRing {
......@@ -60,21 +61,29 @@ registerVideoHandlers(const std::map<std::string,
}
}
std::vector<std::map<std::string, std::string>>
getCodecs(const std::string& accountID)
std::vector<unsigned>
getVideoCodecList(const std::string& accountID)
{
if (auto acc = ring::Manager::instance().getAccount(accountID))
return acc->getAllVideoCodecs();
return acc->getAllVideoCodecsId();
return {};
}
std::vector<std::string>
getVideoCodecDetails(unsigned codecId)
{
auto codec = ring::getSystemCodecContainer()->searchCodecById(codecId, ring::MEDIA_VIDEO);
if (auto foundCodec = std::static_pointer_cast<ring::SystemVideoCodecInfo>(codec))
return foundCodec->getCodecSpecifications();
return {};
}
void
setCodecs(const std::string& accountID,
const std::vector<std::map<std::string, std::string>>& details)
setVideoCodecList(const std::string& accountID,
const std::vector<unsigned>& list)
{
if (auto acc = ring::Manager::instance().getAccount(accountID)) {
acc->setVideoCodecs(details);
acc->setVideoCodecs(list);
ring::Manager::instance().saveConfig();
}
}
......
......@@ -43,7 +43,6 @@
#include "video/video_base.h"
#include "video/video_input.h"
namespace ring {
struct VideoManager
......
......@@ -100,11 +100,11 @@ void registerAllAccounts(void);
std::map<std::string, std::string> getTlsDefaultSettings();
std::vector<int32_t> getAudioCodecList();
std::vector<unsigned> getAudioCodecList();
std::vector<std::string> getSupportedTlsMethod();
std::vector<std::string> getSupportedCiphers(const std::string& accountID);
std::vector<std::string> getAudioCodecDetails(int32_t payload);
std::vector<int32_t> getActiveAudioCodecList(const std::string& accountID);
std::vector<std::string> getAudioCodecDetails(unsigned codecId);
std::vector<unsigned> getActiveAudioCodecList(const std::string& accountID);
void setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID);
......
......@@ -64,8 +64,9 @@ struct VideoSignal {
void registerVideoHandlers(const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&);
std::vector<std::map<std::string, std::string>> getCodecs(const std::string& accountID);
void setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details);
std::vector<unsigned> getVideoCodecList(const std::string& accountID);
std::vector<std::string> getVideoCodecDetails(unsigned codecId);
void setVideoCodecList(const std::string& accountID, const std::vector<unsigned>& list);
std::vector<std::string> getDeviceList();
VideoCapabilities getCapabilities(const std::string& name);
std::map<std::string, std::string> getSettings(const std::string& name);
......
......@@ -81,15 +81,15 @@ IAXCall::IAXCall(IAXAccount& account, const std::string& id, Call::CallType type
ringbuffer_ = Manager::instance().getRingBufferPool().createRingBuffer(getCallId());
}
int IAXCall::getSupportedFormat(const std::string &accountID) const
int
IAXCall::getSupportedFormat(const std::string &accountID) const
{
using std::vector;
const auto account = Manager::instance().getAccount(accountID);
int format_mask = 0;
if (account) {
vector<int> codecs(account->getActiveAudioCodecs());
std::vector<unsigned> codecs{account->getActiveAudioCodecs()};
for (const auto &i : codecs)
format_mask |= codecToASTFormat(i);
......@@ -99,13 +99,13 @@ int IAXCall::getSupportedFormat(const std::string &accountID) const
return format_mask;
}
int IAXCall::getFirstMatchingFormat(int needles, const std::string &accountID) const
int
IAXCall::getFirstMatchingFormat(int needles, const std::string &accountID) const
{
using std::vector;
const auto account = Manager::instance().getAccount(accountID);
if (account != NULL) {
vector<int> codecs(account->getActiveAudioCodecs());
std::vector<unsigned> codecs{account->getActiveAudioCodecs()};
for (const auto &i : codecs) {
int format_mask = codecToASTFormat(i);
......@@ -120,7 +120,8 @@ int IAXCall::getFirstMatchingFormat(int needles, const std::string &accountID) c
return 0;
}
int IAXCall::getAudioCodec() const
int
IAXCall::getAudioCodecPayload() const
{
switch (format) {
case AST_FORMAT_ULAW:
......
......@@ -86,7 +86,7 @@ class IAXCall : public Call
*/
int getFirstMatchingFormat(int needles, const std::string &accountID) const;
int getAudioCodec() const;
int getAudioCodecPayload() const;
int format;
iax_session* session;
......
......@@ -47,6 +47,8 @@
#include "map_utils.h"
#include "call_factory.h"
#include "ring_types.h"
#include "system_codec_container.h"
#include "intrin.h" // for UNUSED
namespace ring {
......@@ -152,13 +154,13 @@ IAXVoIPLink::sendAudioFromMic()
if (currentCall->getState() != Call::ACTIVE)
continue;
int codecType = currentCall->getAudioCodec();
auto audioCodec = Manager::instance().audioCodecFactory.getCodec(codecType).get();
int codecType = currentCall->getAudioCodecPayload();
auto codec = getSystemCodecContainer()->searchCodecByPayload(codecType, MEDIA_AUDIO);
auto audioCodec = std::static_pointer_cast<SystemAudioCodecInfo>(codec);
if (!audioCodec)
continue;
Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate());
Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->sampleRate);
unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate();
......@@ -173,10 +175,10 @@ IAXVoIPLink::sendAudioFromMic()
rawBuffer_.resize(samples);
samples = Manager::instance().getRingBufferPool().getData(rawBuffer_, currentCall->getCallId());
int compSize;
unsigned int audioRate = audioCodec->getClockRate();
int compSize = 0;
unsigned int audioRate = audioCodec->sampleRate;
int outSamples;
AudioBuffer *in;
UNUSED AudioBuffer *in;
if (audioRate != mainBufferSampleRate) {
rawBuffer_.setSampleRate(audioRate);
......@@ -189,12 +191,21 @@ IAXVoIPLink::sendAudioFromMic()
in = &rawBuffer_;
}
/*
* TODO ebail : *
* IAX use old codec API (based on audiocodec wrapper)
* It does not use libav API
* We disable it for the moment
*/
#if 0
compSize = audioCodec->encode(in->getData(), encodedData_, RAW_BUFFER_SIZE);
#endif
if (currentCall->session and samples > 0) {
std::lock_guard<std::mutex> lock(mutexIAX);
if (iax_send_voice(currentCall->session, currentCall->format, encodedData_, compSize, outSamples) == -1)
if (iax_send_voice(currentCall->session, currentCall->format,
encodedData_, compSize, outSamples) == -1)
RING_ERR("IAX: Error sending voice data.");
}
}
......@@ -329,27 +340,35 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall& call)
if (!event->datalen)
return;
auto audioCodec = Manager::instance().audioCodecFactory.getCodec(call.getAudioCodec()).get();
auto codec = getSystemCodecContainer()->searchCodecByPayload(call.getAudioCodecPayload(), MEDIA_AUDIO);
auto audioCodec = std::dynamic_pointer_cast<SystemAudioCodecInfo>(codec);
if (!audioCodec)
return;
Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate());
Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->sampleRate);
unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate();
if (event->subclass)
call.format = event->subclass;
unsigned char *data = (unsigned char*) event->data;
unsigned int size = event->datalen;
unsigned int max = audioCodec->getClockRate() * 20 / 1000;
unsigned int max = audioCodec->sampleRate * 20 / 1000;
if (size > max)
size = max;
/*
* TODO ebail : *
* IAX use old codec API (based on audiocodec wrapper)
* It does not use libav API
* We disable it for the moment
*/
#if 0
unsigned char *data = (unsigned char*) event->data;
audioCodec->decode(rawBuffer_.getData(), data , size);
#endif
AudioBuffer *out = &rawBuffer_;
unsigned int audioRate = audioCodec->getClockRate();
unsigned int audioRate = audioCodec->sampleRate;
if (audioRate != mainBufferSampleRate) {
rawBuffer_.setSampleRate(mainBufferSampleRate);
......
......@@ -157,7 +157,7 @@ ManagerImpl::ManagerImpl() :
pluginManager_(new PluginManager)
, preferences(), voipPreferences(),
hookPreference(), audioPreference(), shortcutPreferences(),
hasTriedToRegister_(false), audioCodecFactory(*pluginManager_),
hasTriedToRegister_(false),
currentCallMutex_(), dtmfKey_(), dtmfBuf_(0, AudioFormat::MONO()),
toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(),
waitingCalls_(), waitingCallsMutex_(), path_()
......
......@@ -56,7 +56,6 @@
#include "audio/audiolayer.h"
#include "audio/sound/tone.h" // for Tone::TONEID declaration
#include "audio/codecs/audiocodecfactory.h"
#include "preferences.h"
#include "history/history.h"
......@@ -743,8 +742,6 @@ class ManagerImpl {
*/
std::vector<std::string> loadAccountOrder() const;
// map of codec (for configlist request)
const AudioCodecFactory audioCodecFactory;
private:
void removeAccounts();
......
......@@ -10,18 +10,22 @@ endif
libmedia_la_SOURCES = \
libav_utils.cpp \
socket_pair.cpp \
media_decoder.cpp \
media_encoder.cpp \
media_io_handle.cpp
socket_pair.cpp \
media_decoder.cpp \
media_encoder.cpp \
media_io_handle.cpp \
media_codec.cpp \
system_codec_container.cpp
noinst_HEADERS = \
libav_utils.h \
libav_deps.h \
socket_pair.h \
media_decoder.h \
media_encoder.h \
media_io_handle.h
media_decoder.h \
media_encoder.h \
media_io_handle.h \
media_codec.h \
system_codec_container.h
libmedia_la_LIBADD = \
./audio/libaudio.la
......
......@@ -51,6 +51,7 @@
#include <stdexcept>
#include <sstream>
#if 0
namespace ring {
AudioCodecFactory::AudioCodecFactory(PluginManager& pluginManager)
......@@ -336,3 +337,5 @@ AudioCodecFactory::getCodecSpecifications(const int32_t& payload) const
}
} // namespace ring
#endif
......@@ -38,6 +38,7 @@
#include <map>
#include <vector>
#if 0
namespace ring {
class PluginManager;
......@@ -173,4 +174,6 @@ class AudioCodecFactory {
} // namespace ring
#endif
#endif // __CODEC_DESCRIPTOR_H__
......@@ -45,36 +45,6 @@
namespace ring { namespace libav_utils {
std::map<std::string, std::string> encoders_;
#ifdef RING_VIDEO