Index: csrc/com/xuggle/xuggler/Container.cpp =================================================================== --- csrc/com/xuggle/xuggler/Container.cpp (revision 1008) +++ csrc/com/xuggle/xuggler/Container.cpp (working copy) @@ -249,6 +249,74 @@ return retval; } + int cb_check_packet(struct sockaddr *from, uint8_t *buf, int bufsize) { + // sockaddr_in seems to be IPv4 + // sockaddr_in6 seems to be IPv6 + // sockaddr seems to be the base structure, big enough for either, returned by recvfrom. + struct sockaddr_in *fromaddrv4; + struct sockaddr_in6 *fromaddrv6; + + // Received individual RTP packet; output its IP + printf("'Using' buf and bufsize to avoid C++ stupidly failing to build. %u %i", (unsigned int)buf, bufsize); + + uint8_t octet1; + uint8_t octet2; + uint8_t octet3; + uint8_t octet4; + switch (from->sa_family) { + case AF_INET: + // IPv4 + fromaddrv4 = (struct sockaddr_in *)from; + octet1 = (fromaddrv4->sin_addr.s_addr >> 0) & 255; + octet2 = (fromaddrv4->sin_addr.s_addr >> 8) & 255; + octet3 = (fromaddrv4->sin_addr.s_addr >> 16) & 255; + octet4 = (fromaddrv4->sin_addr.s_addr >> 24) & 255; + av_log(NULL, AV_LOG_ERROR, "Jez - IPv4 'from' address is: %u.%u.%u.%u\n", octet1, octet2, octet3, octet4); + //av_log(NULL, AV_LOG_ERROR, "Jez - len in rtpproto.c is %u", len); + // Accept only packets from the desired sender, or RTCP packets from localhost (these are vital, ffmpeg crashes + // if its own RRs are rejected...) + if ( + ( + octet1 != 86 || + octet2 != 161 || + octet3 != 7 || + octet4 != 247 + ) +// && +// !( +// is_rtcp_packet && +// octet1 == 127 || +// octet2 == 0 || +// octet3 == 0 || +// octet4 == 1 +// ) + ) { av_log(NULL, AV_LOG_ERROR, "Jez - INVALID IP, DROPPING PACKET."); //return AVERROR(EAGAIN); } + return 0; } + //} + break; + +// && +// !( +// is_rtcp_packet && +// octet1 == 127 || +// octet2 == 0 || +// octet3 == 0 || +// octet4 == 1 +// ) + + case AF_INET6: + // IPv6 + fromaddrv6 = (struct sockaddr_in6 *)from; + break; + + default: + // Something else; not supported + break; + } + + return 1; + } + int32_t Container :: openInputURL(const char *url, IContainerFormat* pContainerFormat, @@ -271,6 +339,8 @@ } else { inputFormat = 0; } + + mFormatContext->check_net_packet_callback = cb_check_packet; retval = av_open_input_file(&mFormatContext, url, inputFormat, mInputBufferLength, params); if (retval >= 0) { mIsOpened = true; Index: csrc/com/xuggle/xuggler/Container.h =================================================================== --- csrc/com/xuggle/xuggler/Container.h (revision 1008) +++ csrc/com/xuggle/xuggler/Container.h (working copy) @@ -26,6 +26,7 @@ #include #include #include +#include #include #include