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]; 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;

View File

@ -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;
} }

View File

@ -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();