vdr-plugin-satip/rtcp.c

109 lines
3.3 KiB
C
Raw Normal View History

/*
* rtcp.c: SAT>IP plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "config.h"
#include "common.h"
2014-12-05 22:14:40 +01:00
#include "log.h"
#include "rtcp.h"
cSatipRtcp::cSatipRtcp(cSatipTunerIf &tunerP)
2014-11-16 16:02:30 +01:00
: tunerM(tunerP),
bufferLenM(eApplicationMaxSizeB),
bufferM(MALLOC(unsigned char, bufferLenM))
{
debug1("%s [device %d]", __PRETTY_FUNCTION__, tunerM.GetId());
if (bufferM)
memset(bufferM, 0, bufferLenM);
else
error("Cannot create RTCP buffer! [device %d]", tunerM.GetId());
}
cSatipRtcp::~cSatipRtcp()
{
2014-12-06 16:02:45 +01:00
debug1("%s [device %d]", __PRETTY_FUNCTION__, tunerM.GetId());
2015-01-21 21:40:24 +01:00
FREE_POINTER(bufferM);
}
int cSatipRtcp::GetFd(void)
{
debug16("%s [device %d]", __PRETTY_FUNCTION__, tunerM.GetId());
return Fd();
}
2018-10-21 12:35:48 +02:00
int cSatipRtcp::GetApplicationOffset(unsigned char *bufferP, int *lengthP)
{
2015-08-16 00:38:03 +02:00
debug16("%s (%d) [device %d]", __PRETTY_FUNCTION__, lengthP ? *lengthP : -1, tunerM.GetId());
if (!lengthP)
return -1;
int offset = 0;
int total = *lengthP;
while (total > 0) {
// Version
2018-10-21 12:35:48 +02:00
unsigned int v = (bufferP[offset] >> 6) & 0x03;
// Padding
2018-10-21 12:35:48 +02:00
//unsigned int p = (bufferP[offset] >> 5) & 0x01;
// Subtype
2018-10-21 12:35:48 +02:00
//unsigned int st = bufferP[offset] & 0x1F;
// Payload type
2018-10-21 12:35:48 +02:00
unsigned int pt = bufferP[offset + 1] & 0xFF;
2015-01-14 16:58:13 +01:00
// Length
2018-10-21 12:35:48 +02:00
unsigned int length = ((bufferP[offset + 2] & 0xFF) << 8) | (bufferP[offset + 3] & 0xFF);
// Convert it to bytes
length = (length + 1) * 4;
// V=2, APP = 204
if ((v == 2) && (pt == 204)) {
// SSCR/CSCR
2018-10-21 12:35:48 +02:00
//unsigned int ssrc = ((bufferP[offset + 4] & 0xFF) << 24) | ((bufferP[offset + 5] & 0xFF) << 16) |
// ((bufferP[offset + 6] & 0xFF) << 8) | (bufferP[offset + 7] & 0xFF);
// Name
2018-10-21 12:35:48 +02:00
if ((bufferP[offset + 8] == 'S') && (bufferP[offset + 9] == 'E') &&
(bufferP[offset + 10] == 'S') && (bufferP[offset + 11] == '1')) {
// Identifier
2018-10-21 12:35:48 +02:00
//unsigned int id = ((bufferP[offset + 12] & 0xFF) << 8) | (bufferP[offset + 13] & 0xFF);
// String length
2018-10-21 12:35:48 +02:00
int string_length = ((bufferP[offset + 14] & 0xFF) << 8) | (bufferP[offset + 15] & 0xFF);
if (string_length > 0) {
*lengthP = string_length;
return (offset + 16);
}
}
}
offset += length;
total -= length;
}
*lengthP = 0;
return -1;
}
2014-11-25 21:04:34 +01:00
void cSatipRtcp::Process(void)
{
debug16("%s [device %d]", __PRETTY_FUNCTION__, tunerM.GetId());
if (bufferM) {
2014-11-29 14:37:21 +01:00
int length;
while ((length = Read(bufferM, bufferLenM)) > 0) {
2018-10-21 12:35:48 +02:00
int offset = GetApplicationOffset(bufferM, &length);
2014-11-29 14:37:21 +01:00
if (offset >= 0)
tunerM.ProcessApplicationData(bufferM + offset, length);
}
}
}
void cSatipRtcp::Process(unsigned char *dataP, int lengthP)
{
debug16("%s [device %d]", __PRETTY_FUNCTION__, tunerM.GetId());
if (dataP && lengthP > 0) {
2018-10-21 12:35:48 +02:00
int offset = GetApplicationOffset(dataP, &lengthP);
if (offset >= 0)
tunerM.ProcessApplicationData(dataP + offset, lengthP);
}
}
cString cSatipRtcp::ToString(void) const
{
return cString::sprintf("RTCP [device %d]", tunerM.GetId());
}