More work on T38.

git-svn-id: http://voip.null.ro/svn/yate@1015 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2006-09-03 18:37:00 +00:00
parent 141e3bbb64
commit 1337a6cbad
1 changed files with 34 additions and 6 deletions

View File

@ -49,7 +49,8 @@ using namespace TelEngine;
namespace { // anonymous
#define DATA_CHUNK 320
#define FAX_DATA_CHUNK 320
#define T38_DATA_CHUNK 160
class FaxWrapper;
@ -138,9 +139,19 @@ public:
virtual void run();
virtual void rxData(const DataBlock& data, unsigned long tStamp);
private:
int txData(const void* buf, int len, int seq, int count);
static int txHandler(t38_core_state_t* t38s, void* userData,
const uint8_t* buf, int len, int count);
t38_terminal_state_t m_t38;
};
// A gateway between analogic and digital fax
class T38Gatway : public FaxWrapper
{
private:
t38_gateway_state_t m_t38;
};
// A channel (terminal) that sends or receives a local TIFF file
class FaxChan : public Channel
{
@ -420,9 +431,9 @@ int FaxTerminal::txBlock()
if (m_lastr < 0)
return m_lastr;
DataBlock data(0,DATA_CHUNK);
DataBlock data(0,FAX_DATA_CHUNK);
int r = 2*fax_tx(&m_fax, (int16_t *) data.data(),data.length()/2);
if (r != DATA_CHUNK && r != m_lastr)
if (r != FAX_DATA_CHUNK && r != m_lastr)
Debug(this,DebugNote,"Generated %d bytes! [%p]",r,this);
m_lastr = r;
lock.drop();
@ -446,8 +457,8 @@ void FaxTerminal::rxData(const DataBlock& data, unsigned long tStamp)
{
// feed the decoder with small chunks of data (16 bytes/ms)
int len = data.length() - pos;
if (len > DATA_CHUNK)
len = DATA_CHUNK;
if (len > FAX_DATA_CHUNK)
len = FAX_DATA_CHUNK;
rxBlock(((char *)data.data())+pos, len);
pos += len;
}
@ -461,7 +472,8 @@ T38Terminal::T38Terminal(const char *file, const char *ident, bool sender, bool
(iscaller ? "caller" : "called"),
(sender ? "transmit" : "receive"),
file,this);
t38_terminal_init(&m_t38,iscaller,NULL,this);
t38_terminal_init(&m_t38,iscaller,txHandler,this);
t38_set_t38_version(&m_t38.t38,1);
init(&m_t38.t30_state,ident,file,sender);
}
@ -474,12 +486,28 @@ T38Terminal::~T38Terminal()
void T38Terminal::run()
{
Debug(this,DebugStub,"Please implement T38Terminal::run()");
t38_terminal_send_timeout(&m_t38,T38_DATA_CHUNK);
}
// Static callback that sends out T.38 data
int T38Terminal::txHandler(t38_core_state_t* t38s, void* userData,
const uint8_t* buf, int len, int count)
{
if (!(t38s && userData))
return 1;
return static_cast<T38Terminal*>(userData)->txData(buf,len,t38s->tx_seq_no,count);
}
// Handle received digital data
void T38Terminal::rxData(const DataBlock& data, unsigned long tStamp)
{
Debug(this,DebugStub,"Please implement T38Terminal::rxData()");
t38_core_rx_ifp_packet(&m_t38.t38,tStamp,(uint8_t*)data.data(),data.length());
}
int T38Terminal::txData(const void* buf, int len, int seq, int count)
{
Debug(this,DebugStub,"Please implement T38Terminal::txData()");
}