move fec codec factory registry to NormSessionMgr
parent
fe495011fa
commit
c7d943aea8
|
|
@ -75,6 +75,9 @@ class NormController
|
||||||
const NormFecLayout* fec_layouts[256];
|
const NormFecLayout* fec_layouts[256];
|
||||||
}; // end class NormController
|
}; // end class NormController
|
||||||
|
|
||||||
|
typedef class NormEncoder* (*NormEncoderFactory)();
|
||||||
|
typedef class NormDecoder* (*NormDecoderFactory)();
|
||||||
|
|
||||||
class NormSessionMgr
|
class NormSessionMgr
|
||||||
{
|
{
|
||||||
friend class NormSession;
|
friend class NormSession;
|
||||||
|
|
@ -116,20 +119,27 @@ class NormSessionMgr
|
||||||
{data_free_func = freeFunc;}
|
{data_free_func = freeFunc;}
|
||||||
NormDataObject::DataFreeFunctionHandle GetDataFreeFunction() const
|
NormDataObject::DataFreeFunctionHandle GetDataFreeFunction() const
|
||||||
{return data_free_func;}
|
{return data_free_func;}
|
||||||
|
|
||||||
private:
|
|
||||||
ProtoTimerMgr& timer_mgr;
|
|
||||||
ProtoSocket::Notifier& socket_notifier;
|
|
||||||
ProtoChannel::Notifier* channel_notifier;
|
|
||||||
NormController* controller;
|
|
||||||
NormDataObject::DataFreeFunctionHandle data_free_func;
|
|
||||||
|
|
||||||
class NormSession* top_session; // top of NormSession list
|
|
||||||
|
|
||||||
}; // end class NormSessionMgr
|
|
||||||
|
|
||||||
typedef class NormEncoder* (*NormEncoderFactory)();
|
// FEC codec factory registry (shared by all sessions this manager owns)
|
||||||
typedef class NormDecoder* (*NormDecoderFactory)();
|
void RegisterFecCoder(UINT8 fecId, NormEncoderFactory encoderFactory, NormDecoderFactory decoderFactory, bool isRateless);
|
||||||
|
NormEncoderFactory GetEncoderFactory(UINT8 fecId) const {return encoder_factories[fecId];}
|
||||||
|
NormDecoderFactory GetDecoderFactory(UINT8 fecId) const {return decoder_factories[fecId];}
|
||||||
|
bool IsRatelessFec(UINT8 fecId) const {return is_rateless_codec[fecId];}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ProtoTimerMgr& timer_mgr;
|
||||||
|
ProtoSocket::Notifier& socket_notifier;
|
||||||
|
ProtoChannel::Notifier* channel_notifier;
|
||||||
|
NormController* controller;
|
||||||
|
NormDataObject::DataFreeFunctionHandle data_free_func;
|
||||||
|
|
||||||
|
class NormSession* top_session; // top of NormSession list
|
||||||
|
|
||||||
|
NormEncoderFactory encoder_factories[256];
|
||||||
|
NormDecoderFactory decoder_factories[256];
|
||||||
|
bool is_rateless_codec[256];
|
||||||
|
|
||||||
|
}; // end class NormSessionMgr
|
||||||
|
|
||||||
class NormSession : public NormTelemetryContext
|
class NormSession : public NormTelemetryContext
|
||||||
{
|
{
|
||||||
|
|
@ -473,10 +483,11 @@ class NormSession : public NormTelemetryContext
|
||||||
void SenderSetExtraParity(UINT16 extraParity)
|
void SenderSetExtraParity(UINT16 extraParity)
|
||||||
{extra_parity = extraParity;}
|
{extra_parity = extraParity;}
|
||||||
|
|
||||||
void RegisterFecCoder(UINT8 fecId, NormEncoderFactory encoderFactory, NormDecoderFactory decoderFactory, bool isRateless);
|
// FEC codec factories are registered/owned by the NormSessionMgr so a
|
||||||
NormEncoderFactory GetEncoderFactory(UINT8 fecId) const;
|
// single registry is shared across all sessions of a NORM API instance.
|
||||||
NormDecoderFactory GetDecoderFactory(UINT8 fecId) const;
|
NormEncoderFactory GetEncoderFactory(UINT8 fecId) const {return session_mgr.GetEncoderFactory(fecId);}
|
||||||
bool IsRatelessFec(UINT8 fecId) const { return is_rateless_codec[fecId]; }
|
NormDecoderFactory GetDecoderFactory(UINT8 fecId) const {return session_mgr.GetDecoderFactory(fecId);}
|
||||||
|
bool IsRatelessFec(UINT8 fecId) const {return session_mgr.IsRatelessFec(fecId);}
|
||||||
|
|
||||||
NormEncoder* GetEncoder() const { return encoder; }
|
NormEncoder* GetEncoder() const { return encoder; }
|
||||||
|
|
||||||
|
|
@ -817,9 +828,6 @@ class NormSession : public NormTelemetryContext
|
||||||
NormBlockPool block_pool;
|
NormBlockPool block_pool;
|
||||||
NormSegmentPool segment_pool;
|
NormSegmentPool segment_pool;
|
||||||
NormEncoder* encoder;
|
NormEncoder* encoder;
|
||||||
NormEncoderFactory encoder_factories[256];
|
|
||||||
NormDecoderFactory decoder_factories[256];
|
|
||||||
bool is_rateless_codec[256];
|
|
||||||
UINT8 fec_id;
|
UINT8 fec_id;
|
||||||
UINT8 fec_m;
|
UINT8 fec_m;
|
||||||
INT32 fec_block_mask;
|
INT32 fec_block_mask;
|
||||||
|
|
|
||||||
|
|
@ -1689,7 +1689,7 @@ bool NormRegisterFecCoder(NormSessionHandle sessionHandle,
|
||||||
NormSession* session = (NormSession*)sessionHandle;
|
NormSession* session = (NormSession*)sessionHandle;
|
||||||
if (session)
|
if (session)
|
||||||
{
|
{
|
||||||
session->RegisterFecCoder(fecId, encoderFactory, decoderFactory, isRateless);
|
session->GetSessionMgr().RegisterFecCoder(fecId, encoderFactory, decoderFactory, isRateless);
|
||||||
instance->dispatcher.ResumeThread();
|
instance->dispatcher.ResumeThread();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -133,11 +133,6 @@ NormSession::NormSession(NormSessionMgr &sessionMgr, NormNodeId localNodeId)
|
||||||
user_timer.SetListener(this, &NormSession::OnUserTimeout);
|
user_timer.SetListener(this, &NormSession::OnUserTimeout);
|
||||||
user_timer.SetInterval(0.0);
|
user_timer.SetInterval(0.0);
|
||||||
user_timer.SetRepeat(0);
|
user_timer.SetRepeat(0);
|
||||||
|
|
||||||
memset(encoder_factories, 0, sizeof(encoder_factories));
|
|
||||||
memset(decoder_factories, 0, sizeof(decoder_factories));
|
|
||||||
memset(is_rateless_codec, 0, sizeof(is_rateless_codec));
|
|
||||||
is_rateless_codec[NormPayloadId::RL] = true; // Built-in RL codec
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NormSession::~NormSession()
|
NormSession::~NormSession()
|
||||||
|
|
@ -152,23 +147,6 @@ NormSession::~NormSession()
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NormSession::RegisterFecCoder(UINT8 fecId, NormEncoderFactory encoderFactory, NormDecoderFactory decoderFactory, bool isRateless)
|
|
||||||
{
|
|
||||||
encoder_factories[fecId] = encoderFactory;
|
|
||||||
decoder_factories[fecId] = decoderFactory;
|
|
||||||
is_rateless_codec[fecId] = isRateless;
|
|
||||||
}
|
|
||||||
|
|
||||||
NormEncoderFactory NormSession::GetEncoderFactory(UINT8 fecId) const
|
|
||||||
{
|
|
||||||
return encoder_factories[fecId];
|
|
||||||
}
|
|
||||||
|
|
||||||
NormDecoderFactory NormSession::GetDecoderFactory(UINT8 fecId) const
|
|
||||||
{
|
|
||||||
return decoder_factories[fecId];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NormSession::Open()
|
bool NormSession::Open()
|
||||||
{
|
{
|
||||||
ASSERT(address.IsValid());
|
ASSERT(address.IsValid());
|
||||||
|
|
@ -5841,8 +5819,19 @@ NormSessionMgr::NormSessionMgr(ProtoTimerMgr &timerMgr,
|
||||||
: timer_mgr(timerMgr), socket_notifier(socketNotifier), channel_notifier(channelNotifier),
|
: timer_mgr(timerMgr), socket_notifier(socketNotifier), channel_notifier(channelNotifier),
|
||||||
controller(NULL), data_free_func(NULL), top_session(NULL)
|
controller(NULL), data_free_func(NULL), top_session(NULL)
|
||||||
{
|
{
|
||||||
|
memset(encoder_factories, 0, sizeof(encoder_factories));
|
||||||
|
memset(decoder_factories, 0, sizeof(decoder_factories));
|
||||||
|
memset(is_rateless_codec, 0, sizeof(is_rateless_codec));
|
||||||
|
is_rateless_codec[NormPayloadId::RL] = true; // Built-in RL codec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NormSessionMgr::RegisterFecCoder(UINT8 fecId, NormEncoderFactory encoderFactory, NormDecoderFactory decoderFactory, bool isRateless)
|
||||||
|
{
|
||||||
|
encoder_factories[fecId] = encoderFactory;
|
||||||
|
decoder_factories[fecId] = decoderFactory;
|
||||||
|
is_rateless_codec[fecId] = isRateless;
|
||||||
|
} // end NormSessionMgr::RegisterFecCoder()
|
||||||
|
|
||||||
NormSessionMgr::~NormSessionMgr()
|
NormSessionMgr::~NormSessionMgr()
|
||||||
{
|
{
|
||||||
Destroy();
|
Destroy();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue