mirror of
https://github.com/rofafor/vdr-plugin-iptv.git
synced 2023-10-10 13:37:03 +02:00
Tweaked reading from UDP sockets.
This commit is contained in:
parent
06506c41f6
commit
c7cbde301b
4
HISTORY
4
HISTORY
@ -172,3 +172,7 @@ VDR Plugin 'iptv' Revision History
|
|||||||
2012-04-26: Version 0.5.2
|
2012-04-26: Version 0.5.2
|
||||||
|
|
||||||
- Fixed connection problems in HTTP protocol.
|
- Fixed connection problems in HTTP protocol.
|
||||||
|
|
||||||
|
2012-xx-xx: Version 0.5.3
|
||||||
|
|
||||||
|
- Tweaked reading from UDP sockets.
|
||||||
|
2
iptv.c
2
iptv.c
@ -21,7 +21,7 @@
|
|||||||
#define GITVERSION ""
|
#define GITVERSION ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char VERSION[] = "0.5.2" GITVERSION;
|
const char VERSION[] = "0.5.3" GITVERSION;
|
||||||
static const char DESCRIPTION[] = trNOOP("Experience the IPTV");
|
static const char DESCRIPTION[] = trNOOP("Experience the IPTV");
|
||||||
|
|
||||||
class cPluginIptv : public cPlugin {
|
class cPluginIptv : public cPlugin {
|
||||||
|
66
socket.c
66
socket.c
@ -180,45 +180,43 @@ int cIptvUdpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
|
|||||||
}
|
}
|
||||||
else if (len > 0) {
|
else if (len > 0) {
|
||||||
// Process auxiliary received data and validate source address
|
// Process auxiliary received data and validate source address
|
||||||
for (cmsg = CMSG_FIRSTHDR(&msgh); (streamAddr != INADDR_ANY) && (cmsg != NULL); cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
|
for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
|
||||||
if ((cmsg->cmsg_level == SOL_IP) && (cmsg->cmsg_type == IP_PKTINFO)) {
|
if ((cmsg->cmsg_level == SOL_IP) && (cmsg->cmsg_type == IP_PKTINFO)) {
|
||||||
struct in_pktinfo *i = (struct in_pktinfo *)CMSG_DATA(cmsg);
|
struct in_pktinfo *i = (struct in_pktinfo *)CMSG_DATA(cmsg);
|
||||||
if (i->ipi_addr.s_addr != streamAddr) {
|
if ((i->ipi_addr.s_addr == streamAddr) || (INADDR_ANY == streamAddr)) {
|
||||||
//debug("Discard packet due to invalid source address: %s", inet_ntoa(i->ipi_addr));
|
if (BufferAddr[0] == TS_SYNC_BYTE)
|
||||||
return 0;
|
return len;
|
||||||
|
else if (len > 3) {
|
||||||
|
// http://www.networksorcery.com/enp/rfc/rfc2250.txt
|
||||||
|
// version
|
||||||
|
unsigned int v = (BufferAddr[0] >> 6) & 0x03;
|
||||||
|
// extension bit
|
||||||
|
unsigned int x = (BufferAddr[0] >> 4) & 0x01;
|
||||||
|
// cscr count
|
||||||
|
unsigned int cc = BufferAddr[0] & 0x0F;
|
||||||
|
// payload type: MPEG2 TS = 33
|
||||||
|
//unsigned int pt = readBuffer[1] & 0x7F;
|
||||||
|
// header lenght
|
||||||
|
unsigned int headerlen = (3 + cc) * (unsigned int)sizeof(uint32_t);
|
||||||
|
// check if extension
|
||||||
|
if (x) {
|
||||||
|
// extension header length
|
||||||
|
unsigned int ehl = (((BufferAddr[headerlen + 2] & 0xFF) << 8) |
|
||||||
|
(BufferAddr[headerlen + 3] & 0xFF));
|
||||||
|
// update header length
|
||||||
|
headerlen += (ehl + 1) * (unsigned int)sizeof(uint32_t);
|
||||||
|
}
|
||||||
|
// Check that rtp is version 2 and payload contains multiple of TS packet data
|
||||||
|
if ((v == 2) && (((len - headerlen) % TS_SIZE) == 0) &&
|
||||||
|
(BufferAddr[headerlen] == TS_SYNC_BYTE)) {
|
||||||
|
// Set argument point to payload in read buffer
|
||||||
|
memmove(BufferAddr, &BufferAddr[headerlen], (len - headerlen));
|
||||||
|
return (len - headerlen);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (BufferAddr[0] == TS_SYNC_BYTE)
|
|
||||||
return len;
|
|
||||||
else if (len > 3) {
|
|
||||||
// http://www.networksorcery.com/enp/rfc/rfc2250.txt
|
|
||||||
// version
|
|
||||||
unsigned int v = (BufferAddr[0] >> 6) & 0x03;
|
|
||||||
// extension bit
|
|
||||||
unsigned int x = (BufferAddr[0] >> 4) & 0x01;
|
|
||||||
// cscr count
|
|
||||||
unsigned int cc = BufferAddr[0] & 0x0F;
|
|
||||||
// payload type: MPEG2 TS = 33
|
|
||||||
//unsigned int pt = readBuffer[1] & 0x7F;
|
|
||||||
// header lenght
|
|
||||||
unsigned int headerlen = (3 + cc) * (unsigned int)sizeof(uint32_t);
|
|
||||||
// check if extension
|
|
||||||
if (x) {
|
|
||||||
// extension header length
|
|
||||||
unsigned int ehl = (((BufferAddr[headerlen + 2] & 0xFF) << 8) |
|
|
||||||
(BufferAddr[headerlen + 3] & 0xFF));
|
|
||||||
// update header length
|
|
||||||
headerlen += (ehl + 1) * (unsigned int)sizeof(uint32_t);
|
|
||||||
}
|
|
||||||
// Check that rtp is version 2 and payload contains multiple of TS packet data
|
|
||||||
if ((v == 2) && (((len - headerlen) % TS_SIZE) == 0) &&
|
|
||||||
(BufferAddr[headerlen] == TS_SYNC_BYTE)) {
|
|
||||||
// Set argument point to payload in read buffer
|
|
||||||
memmove(BufferAddr, &BufferAddr[headerlen], (len - headerlen));
|
|
||||||
return (len - headerlen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user