aboutsummaryrefslogtreecommitdiffstats
path: root/src/AVTInput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/AVTInput.cpp')
-rw-r--r--src/AVTInput.cpp261
1 files changed, 64 insertions, 197 deletions
diff --git a/src/AVTInput.cpp b/src/AVTInput.cpp
index 48b2de1..973ed7b 100644
--- a/src/AVTInput.cpp
+++ b/src/AVTInput.cpp
@@ -56,24 +56,25 @@ static uint32_t unpack2(const uint8_t* buf)
return (buf[0] << 8) | buf[1];
}
-AVTInput::AVTInput(const std::string& input_uri, const std::string& output_uri, uint32_t pad_port, size_t jitterBufferSize)
- : _input_uri(input_uri),
- _output_uri(output_uri),
- _pad_port(pad_port),
- _jitterBufferSize(jitterBufferSize),
-
- _output_packet(2048),
- _input_pad_packet(2048),
- _ordered(5000, _jitterBufferSize),
- _lastInfoFrameType(_typeCantExtract)
+AVTInput::AVTInput(const std::string& input_uri,
+ const std::string& output_uri,
+ uint32_t pad_port,
+ size_t jitterBufferSize) :
+ _input_uri(input_uri),
+ _output_uri(output_uri),
+ _pad_port(pad_port),
+ _jitterBufferSize(jitterBufferSize),
+
+ _output_packet(2048),
+ _input_pad_packet(2048),
+ _ordered(5000, _jitterBufferSize),
+ _lastInfoFrameType(_typeCantExtract)
{
}
int AVTInput::prepare(void)
{
- UdpSocket::init();
-
INFO("Open input socket\n");
int ret = _openSocketSrv(&_input_socket, _input_uri.c_str());
@@ -82,7 +83,7 @@ int AVTInput::prepare(void)
ret = _openSocketCli();
}
- if ( ret == 0 && _pad_port > 0) {
+ if (ret == 0 && _pad_port > 0) {
INFO("Open PAD Port %d\n", _pad_port);
char uri[50];
sprintf(uri, "udp://:%d", _pad_port);
@@ -105,13 +106,13 @@ int AVTInput::setDabPlusParameters(int bitrate, int channels, int sample_rate, b
return 1;
}
- if ( sample_rate != 48000 && sample_rate != 32000 ) {
+ if (sample_rate != 48000 && sample_rate != 32000) {
ERROR("Bad sample rate for DAB+ (32000,48000)");
return 1;
}
_dac = sample_rate == 48000 ? AVT_DAC_48 : AVT_DAC_32;
- if ( channels != 1 && channels != 2 ) {
+ if (channels != 1 && channels != 2) {
ERROR("Bad channel number for DAB+ (1,2)");
return 1;
}
@@ -169,7 +170,7 @@ bool AVTInput::_parseURI(const char* uri, std::string& address, long& port)
return true;
}
-int AVTInput::_openSocketSrv(UdpSocket* socket, const char* uri)
+int AVTInput::_openSocketSrv(Socket::UDPSocket* socket, const char* uri)
{
int returnCode = -1;
@@ -178,27 +179,13 @@ int AVTInput::_openSocketSrv(UdpSocket* socket, const char* uri)
if (_parseURI(uri, address, port)) {
returnCode = 0;
- if (socket->create(port) == -1) {
- fprintf(stderr, "can't set port %li on Udp input (%s: %s)\n",
- port, inetErrDesc, inetErrMsg);
- returnCode = -1;
- }
+ socket->reinit(port);
if (!address.empty()) {
- // joinGroup should accept const char*
- if (socket->joinGroup((char*)address.c_str()) == -1) {
- fprintf(stderr,
- "can't join multicast group %s (%s: %s)\n",
- address.c_str(), inetErrDesc, inetErrMsg);
- returnCode = -1;
- }
+ socket->joinGroup(address.c_str());
}
- if (socket->setBlocking(false) == -1) {
- fprintf(stderr, "can't set Udp input socket in non-blocking mode "
- "(%s: %s)\n", inetErrDesc, inetErrMsg);
- returnCode = -1;
- }
+ socket->setBlocking(false);
}
return returnCode;
@@ -216,74 +203,16 @@ int AVTInput::_openSocketCli()
return -1;
}
- if (_output_packet.getAddress().setAddress(address.c_str()) == -1) {
- fprintf(stderr, "Can't set address %s (%s: %s)\n", address.c_str(),
- inetErrDesc, inetErrMsg);
- return -1;
- }
-
- _output_packet.getAddress().setPort(port);
-
- if (_output_socket.create() == -1) {
- fprintf(stderr, "Can't create UDP socket (%s: %s)\n",
- inetErrDesc, inetErrMsg);
- return -1;
- }
-
+ _output_packet.address.resolveUdpDestination(address.c_str(), port);
return 0;
}
-/* ------------------------------------------------------------------
- * From ODR-Dabmux dabInputUdp::dabInputUdpRead
- */
-ssize_t AVTInput::_read(uint8_t* buf, size_t size, bool onlyOnePacket)
-{
- size_t nbBytes = 0;
-
- uint8_t* data = buf;
- UdpPacket _input_packet(2048);
-
- if (_input_packet.getLength() == 0) {
- _input_socket.receive(_input_packet);
- }
-
- while (nbBytes < size) {
- size_t freeSize = size - nbBytes;
- if (_input_packet.getLength() > freeSize) {
- // Not enought place in output
- memcpy(&data[nbBytes], _input_packet.getData(), freeSize);
- nbBytes = size;
- _input_packet.setOffset(_input_packet.getOffset() + freeSize);
- }
- else {
- size_t length = _input_packet.getLength();
- memcpy(&data[nbBytes], _input_packet.getData(), length);
- nbBytes += length;
- _input_packet.setOffset(0);
-
- _input_socket.receive(_input_packet);
- if (_input_packet.getLength() == 0 || onlyOnePacket) {
- break;
- }
- }
- }
- bzero(&data[nbBytes], size - nbBytes);
-
- return nbBytes;
-}
-
-/* ------------------------------------------------------------------
- *
- */
bool AVTInput::_isSTI(const uint8_t* buf)
{
return (memcmp(buf+1, STI_FSync0, sizeof(STI_FSync0)) == 0) ||
(memcmp(buf+1, STI_FSync1, sizeof(STI_FSync1)) == 0);
}
-/* ------------------------------------------------------------------
- *
- */
const uint8_t* AVTInput::_findDABFrameFromUDP(const uint8_t* buf, size_t size,
int32_t& frameNumber, size_t& dataSize)
{
@@ -362,19 +291,13 @@ const uint8_t* AVTInput::_findDABFrameFromUDP(const uint8_t* buf, size_t size,
void AVTInput::_sendCtrlMessage()
{
if (!_output_uri.empty()) {
- uint8_t data[50];
- uint32_t index = 0;
-
- data[index++] = 0xFD;
- data[index++] = 0x07;
- data[index++] = _subChannelIndex;
- data[index++] = _audioMode;
- data[index++] = _dac;
- data[index++] = _monoMode;
-
- _output_packet.setOffset(0);
- _output_packet.setLength(0);
- _output_packet.addData(data, index);
+ std::vector<uint8_t> buf({ 0xFD, 0x07,
+ static_cast<uint8_t>(_subChannelIndex),
+ static_cast<uint8_t>(_audioMode),
+ static_cast<uint8_t>(_dac),
+ static_cast<uint8_t>(_monoMode)});
+
+ _output_packet.buffer = buf;
_output_socket.send(_output_packet);
INFO("Send control packet to encoder\n");
@@ -390,28 +313,21 @@ void AVTInput::_sendCtrlMessage()
* : 1 Byte : Size of pad data
* Pad datas : X Bytes : In natural order, strating with FPAD bytes
*/
-void AVTInput::_sendPADFrame(UdpPacket* packet)
+void AVTInput::_sendPADFrame()
{
- if (packet && _padFrameQueue.size() > 0) {
+ if (_padFrameQueue.size() > 0) {
std::vector<uint8_t> frame(move(_padFrameQueue.front()));
_padFrameQueue.pop();
- uint8_t data[500];
- uint32_t index = 0;
-
- data[index++] = 0xFD;
- data[index++] = 0x18;
- data[index++] = frame.size()+2;
- data[index++] = 0xAD;
- data[index++] = frame.size();
- memcpy( data+index, frame.data(), frame.size());
- index += frame.size();
+ std::vector<uint8_t> buf({ 0xFD, 0x18,
+ static_cast<uint8_t>(frame.size()+2),
+ 0xAD,
+ static_cast<uint8_t>(frame.size())});
- packet->setOffset(0);
- packet->setLength(0);
- packet->addData(data, index);
-
- _input_pad_socket.send(*packet);
+ Socket::UDPPacket packet;
+ packet.buffer = buf;
+ copy(frame.begin(), frame.end(), back_inserter(packet.buffer));
+ _input_pad_socket.send(packet);
}
}
@@ -421,111 +337,71 @@ void AVTInput::_sendPADFrame(UdpPacket* packet)
* Command code : 1 Byte
* * 0x17 = Request for 1 PAD Frame
*/
-void AVTInput::_interpretMessage(const uint8_t* data, size_t size, UdpPacket* packet)
+void AVTInput::_interpretMessage(const uint8_t* data, size_t size)
{
if (size >= 2) {
if (data[0] == 0xFD) {
switch (data[1]) {
case 0x17:
- _sendPADFrame(packet);
+ _sendPADFrame();
break;
}
}
}
}
-/* ------------------------------------------------------------------
- *
- */
bool AVTInput::_checkMessage()
{
- bool dataRecevied = false;
-
- if (_input_pad_packet.getLength() == 0) {
- _input_pad_socket.receive(_input_pad_packet);
+ const auto packet = _input_pad_socket.receive(2048);
+ if (packet.buffer.empty()) {
+ return false;
}
- if (_input_pad_packet.getLength() > 0) {
- _interpretMessage((uint8_t*)_input_pad_packet.getData(), _input_pad_packet.getLength(),
- &_input_pad_packet);
- _input_pad_packet.setOffset(0);
- _input_pad_socket.receive(_input_pad_packet);
-
- dataRecevied = true;
- }
+ _interpretMessage(packet.buffer.data(), packet.buffer.size());
- return dataRecevied;
+ return true;
}
-/* ------------------------------------------------------------------
- *
- */
void AVTInput::_purgeMessages()
{
- bool dataRecevied;
int nb = 0;
- do {
- dataRecevied = false;
- if (_input_pad_packet.getLength() == 0) {
- _input_pad_socket.receive(_input_pad_packet);
- }
-
- if (_input_pad_packet.getLength() > 0) {
- nb++;
- _input_pad_packet.setOffset(0);
- _input_pad_socket.receive(_input_pad_packet);
-
- dataRecevied = true;
- }
- } while (dataRecevied);
+ while (not _input_pad_socket.receive(2048).buffer.empty()) {
+ nb++;
+ }
if (nb>0) DEBUG("%d messages purged\n", nb);
}
-/* ------------------------------------------------------------------
- *
- */
bool AVTInput::_readFrame()
{
- bool dataRecevied = false;
-
- uint8_t readBuf[MAX_AVT_FRAME_SIZE];
int32_t frameNumber;
const uint8_t* dataPtr = NULL;
size_t dataSize = 0;
- std::vector<uint8_t> data;
- size_t readBytes = _read(readBuf, sizeof(readBuf), true/*onlyOnePacket*/);
- if (readBytes > 0)
- {
- dataRecevied = true;
+ auto packet = _input_socket.receive(MAX_AVT_FRAME_SIZE);
+ const size_t readBytes = packet.buffer.size();
+
+ if (readBytes > 0) {
+ const uint8_t *readBuf = packet.buffer.data();
if (readBytes > _dab24msFrameSize) {
// Extract frame data and frame number from buf
dataPtr = _findDABFrameFromUDP(readBuf, readBytes, frameNumber, dataSize);
}
-// if (!data) {
-// // Assuming pure RAW data
-// data = buf;
-// dataSize = _dab24msFrameSize;
-// frameNumber = _dummyFrameNumber++;
-// }
- if (!dataPtr) {
- _info(_typeCantExtract, 0);
- }
+
if (dataPtr) {
- if (dataSize == _dab24msFrameSize ) {
- if( _frameAligned || frameNumber%5 == 0) {
+ if (dataSize == _dab24msFrameSize) {
+ if (_frameAligned or frameNumber%5 == 0) {
#if defined(DISTURB_INPUT)
// Duplicate a frame
- if(frameNumber%250==0) _ordered.push(frameNumber, dataPtr, dataSize);
+ if (frameNumber % 250 == 0) _ordered.push(frameNumber, dataPtr, dataSize);
// Invert 2 frames (content inverted, audio distrubed by this test))
- if( frameNumber % 200 == 0) frameNumber += 10;
- else if( (frameNumber-10) % 200 == 0) frameNumber -= 10;
+ if (frameNumber % 200 == 0) frameNumber += 10;
+ else if ((frameNumber-10) % 200 == 0) frameNumber -= 10;
// Remove a frame (audio distrubed, frame missing)
- if(frameNumber%300 > 5)
+ if (frameNumber % 300 > 5)
#endif
_ordered.push(frameNumber, dataPtr, dataSize);
_frameAligned = true;
@@ -533,14 +409,14 @@ bool AVTInput::_readFrame()
}
else ERROR("Wrong frame size from encoder %zu != %zu\n", dataSize, _dab24msFrameSize);
}
+ else {
+ _info(_typeCantExtract, 0);
+ }
}
- return dataRecevied;
+ return readBytes > 0;
}
-/* ------------------------------------------------------------------
- *
- */
ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf)
{
ssize_t nbBytes = 0;
@@ -577,9 +453,6 @@ ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf)
return nbBytes;
}
-/* ------------------------------------------------------------------
- *
- */
void AVTInput::pushPADFrame(const uint8_t* buf, size_t size)
{
if (_pad_port == 0) {
@@ -593,17 +466,11 @@ void AVTInput::pushPADFrame(const uint8_t* buf, size_t size)
}
}
-/* ------------------------------------------------------------------
- *
- */
bool AVTInput::padQueueFull()
{
return _padFrameQueue.size() >= MAX_PAD_FRAME_QUEUE_SIZE;
}
-/* ------------------------------------------------------------------
- *
- */
void AVTInput::_info(_frameType type, size_t size)
{
if (_lastInfoFrameType != type || _lastInfoSize != size) {