move fec codec factory registry to NormSessionMgr

pull/102/head
Joseph Calderon 2026-07-12 20:19:06 -07:00
parent fe495011fa
commit c7d943aea8
3 changed files with 40 additions and 43 deletions

View File

@ -75,6 +75,9 @@ class NormController
const NormFecLayout* fec_layouts[256];
}; // end class NormController
typedef class NormEncoder* (*NormEncoderFactory)();
typedef class NormDecoder* (*NormDecoderFactory)();
class NormSessionMgr
{
friend class NormSession;
@ -117,6 +120,12 @@ class NormSessionMgr
NormDataObject::DataFreeFunctionHandle GetDataFreeFunction() const
{return data_free_func;}
// FEC codec factory registry (shared by all sessions this manager owns)
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;
@ -126,10 +135,11 @@ class NormSessionMgr
class NormSession* top_session; // top of NormSession list
}; // end class NormSessionMgr
NormEncoderFactory encoder_factories[256];
NormDecoderFactory decoder_factories[256];
bool is_rateless_codec[256];
typedef class NormEncoder* (*NormEncoderFactory)();
typedef class NormDecoder* (*NormDecoderFactory)();
}; // end class NormSessionMgr
class NormSession : public NormTelemetryContext
{
@ -473,10 +483,11 @@ class NormSession : public NormTelemetryContext
void SenderSetExtraParity(UINT16 extraParity)
{extra_parity = extraParity;}
void RegisterFecCoder(UINT8 fecId, NormEncoderFactory encoderFactory, NormDecoderFactory decoderFactory, bool isRateless);
NormEncoderFactory GetEncoderFactory(UINT8 fecId) const;
NormDecoderFactory GetDecoderFactory(UINT8 fecId) const;
bool IsRatelessFec(UINT8 fecId) const { return is_rateless_codec[fecId]; }
// FEC codec factories are registered/owned by the NormSessionMgr so a
// single registry is shared across all sessions of a NORM API instance.
NormEncoderFactory GetEncoderFactory(UINT8 fecId) const {return session_mgr.GetEncoderFactory(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; }
@ -817,9 +828,6 @@ class NormSession : public NormTelemetryContext
NormBlockPool block_pool;
NormSegmentPool segment_pool;
NormEncoder* encoder;
NormEncoderFactory encoder_factories[256];
NormDecoderFactory decoder_factories[256];
bool is_rateless_codec[256];
UINT8 fec_id;
UINT8 fec_m;
INT32 fec_block_mask;

View File

@ -1689,7 +1689,7 @@ bool NormRegisterFecCoder(NormSessionHandle sessionHandle,
NormSession* session = (NormSession*)sessionHandle;
if (session)
{
session->RegisterFecCoder(fecId, encoderFactory, decoderFactory, isRateless);
session->GetSessionMgr().RegisterFecCoder(fecId, encoderFactory, decoderFactory, isRateless);
instance->dispatcher.ResumeThread();
return true;
}

View File

@ -133,11 +133,6 @@ NormSession::NormSession(NormSessionMgr &sessionMgr, NormNodeId localNodeId)
user_timer.SetListener(this, &NormSession::OnUserTimeout);
user_timer.SetInterval(0.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()
@ -152,23 +147,6 @@ NormSession::~NormSession()
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()
{
ASSERT(address.IsValid());
@ -5841,8 +5819,19 @@ NormSessionMgr::NormSessionMgr(ProtoTimerMgr &timerMgr,
: timer_mgr(timerMgr), socket_notifier(socketNotifier), channel_notifier(channelNotifier),
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()
{
Destroy();