Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.1:Update
vdr-plugin-xineliboutput
xineliboutput-2.1.0...977ff0.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xineliboutput-2.1.0...977ff0.diff of Package vdr-plugin-xineliboutput
diff --git a/config.c b/config.c index 8851646..3cf1734 100644 --- a/config.c +++ b/config.c @@ -815,7 +815,7 @@ bool config_t::ProcessArgs(int argc, char *argv[]) case 'h': //ProcessArg("Fullscreen", "0"); ProcessArg("X11.WindowHeight", optarg); break; - case 'g': { + case 'g': if (optarg) { int _width = width, _height = height, _xpos = 0, _ypos = 0; sscanf (optarg, "%dx%d+%d+%d", &_width, &_height, &_xpos, &_ypos); ProcessArg("X11.WindowWidth", *cString::sprintf("%d", _width)); @@ -832,7 +832,7 @@ bool config_t::ProcessArgs(int argc, char *argv[]) break; //case 'm': ProcessArg("Modeline", optarg); // break; - case 'r': if(strcmp(optarg, "none")) { + case 'r': if (optarg && strcmp(optarg, "none")) { if(strchr(optarg, ':')) { char *tmp = strdup(optarg); char *pt = strchr(tmp,':'); @@ -851,7 +851,7 @@ bool config_t::ProcessArgs(int argc, char *argv[]) break; case 'V': ProcessArg("Video.Driver", optarg); break; - case 'A': if(strchr(optarg,':')) { + case 'A': if (optarg && strchr(optarg,':')) { char *tmp = strdup(optarg); char *pt = strchr(tmp,':'); *pt = 0; @@ -865,7 +865,10 @@ bool config_t::ProcessArgs(int argc, char *argv[]) post_plugins = strcatrealloc(post_plugins, ";"); post_plugins = strcatrealloc(post_plugins, optarg); break; - case 'C': config_file = strdup(optarg); + case 'C': if (optarg) { + free(config_file); + config_file = strdup(optarg); + } break; case 'p': ProcessArg("ForcePrimaryDevice", "1"); break; diff --git a/frontend_local.c b/frontend_local.c index fd834ed..530d469 100644 --- a/frontend_local.c +++ b/frontend_local.c @@ -256,7 +256,6 @@ int cXinelibLocal::Xine_Control(const char *cmd) frontend_t *cXinelibLocal::load_frontend(const char *fe_name) { Dl_info info; - struct stat statbuffer; char libname[4096]=""; void *lib = NULL; fe_creator_f *fe_creator = NULL; @@ -285,14 +284,15 @@ frontend_t *cXinelibLocal::load_frontend(const char *fe_name) do { strncat(libname, xc.s_frontend_files[fe_ind], 64); LOGDBG("Probing %s", libname); - +#if 0 + struct stat statbuffer; if (stat(libname, &statbuffer)) { LOGERR("load_frontend: can't stat %s", libname); } else if((statbuffer.st_mode & S_IFMT) != S_IFREG) { LOGMSG("load_frontend: %s not regular file ! trying to load anyway ...", libname); } - +#endif if ( !(lib = dlopen (libname, RTLD_LAZY | RTLD_GLOBAL))) { LOGERR("load_frontend: cannot dlopen file %s: %s", libname, dlerror()); diff --git a/frontend_svr.c b/frontend_svr.c index 46f3619..d783586 100644 --- a/frontend_svr.c +++ b/frontend_svr.c @@ -65,9 +65,13 @@ #undef MIN #define MIN(a,b) ( (a) < (b) ? (a) : (b)) -typedef struct { +typedef struct grab_result { int Size; uchar *Data; + grab_result() { + Size = 0; + Data = NULL; + } } grab_result_t; class cStcFuture : public cFuture<int64_t> {}; @@ -823,9 +827,9 @@ int cXinelibServer::PlayFileCtrl(const char *Cmd, int TimeoutMs) } int result; - bool bPlayfile = false; - if((!strncmp(Cmd, "PLAYFILE", 8) && (bPlayfile=true)) || - (!strncmp(Cmd, "GET", 3) )) { // GETPOS, GETLENGTH, ... + bool bPlayfile = !strncmp(Cmd, "PLAYFILE", 8); + if (bPlayfile || + !strncmp(Cmd, "GET", 3)) { // GETPOS, GETLENGTH, ... if(TimeoutMs < 0) TimeoutMs = bPlayfile ? PLAYFILE_TIMEOUT : PLAYFILE_CTRL_TIMEOUT; @@ -870,18 +874,21 @@ bool cXinelibServer::Listen(int listen_port) CLOSESOCKET(fd_listen); int iReuse = 1; - struct sockaddr_in name; - memset(&name, 0, sizeof(name)); - name.sin_family = AF_INET; - name.sin_addr.s_addr = htonl(INADDR_ANY); - name.sin_port = htons(m_Port); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + memset(&addr, 0, sizeof(addr)); + addr.in.sin_family = AF_INET; + addr.in.sin_addr.s_addr = htonl(INADDR_ANY); + addr.in.sin_port = htons(m_Port); if(xc.remote_local_ip[0]) { uint32_t ip = inet_addr(xc.remote_local_ip); if(ip != INADDR_NONE) { char txt[128]; - name.sin_addr.s_addr = ip; - LOGDBG("Binding server to %s", cxSocket::ip2txt(name.sin_addr.s_addr, htons(m_Port), txt)); + addr.in.sin_addr.s_addr = ip; + LOGDBG("Binding server to %s", cxSocket::ip2txt(addr.in.sin_addr.s_addr, htons(m_Port), txt)); } else { LOGERR("Local interface address %s is invalid !", xc.remote_local_ip); } @@ -894,7 +901,7 @@ bool cXinelibServer::Listen(int listen_port) LOGERR("cXinelibServer: error setting REUSE for listen socket"); } - if (bind(fd_listen, (struct sockaddr *)&name, sizeof(name)) < 0) { + if (bind(fd_listen, &addr.sa, sizeof(addr)) < 0) { LOGERR("cXinelibServer: bind error %s port %d: %s", xc.remote_local_ip[0] ? xc.remote_local_ip : "", m_Port, strerror(errno)); @@ -1544,15 +1551,18 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) else if(!strcmp(m_State[cli]->Name(), "DESCRIBE")) { cHeader *accept = m_State[cli]->Header("Accept"); if(accept && strstr(accept->Value(), "application/sdp")) { - struct sockaddr_in sin; - socklen_t len = sizeof(sin); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + socklen_t len = sizeof(addr); char buf[64]; uint32_t payload_type = VDRVERSNUM > 10702 ? SDP_PAYLOAD_MPEG_TS : SDP_PAYLOAD_MPEG_PES; - if (fd_control[cli].getsockname((struct sockaddr *)&sin, &len) < 0) { + if (fd_control[cli].getsockname(&addr.sa, &len) < 0) { LOGERR("Error getting control socket address"); } - cString sdp_descr = vdr_sdp_description(cxSocket::ip2txt(sin.sin_addr.s_addr, - sin.sin_port, buf), + cString sdp_descr = vdr_sdp_description(cxSocket::ip2txt(addr.in.sin_addr.s_addr, + addr.in.sin_port, buf), 2001, xc.listen_port, xc.remote_rtp_addr, @@ -1582,9 +1592,9 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) cHeader *transport = m_State[cli]->Header("Transport"); int urtp=0, mrtp=0, tcp=0; if(transport && - ( (strstr(transport->Value(), "RTP/AVP;multicast") && (mrtp=1)) || - (strstr(transport->Value(), "RTP/AVP;unicast") && (urtp=1)) || - (strstr(transport->Value(), "RTP/AVP;interleaved") && (tcp=1)))) { + ( (mrtp = !!strstr(transport->Value(), "RTP/AVP;multicast")) || + (urtp = !!strstr(transport->Value(), "RTP/AVP;unicast")) || + (tcp = !!strstr(transport->Value(), "RTP/AVP;interleaved")))) { //if(!mrtp) // sprintf(buf, "RTSP/1.0 461 Unsupported transport\r\n" RTSP_H_CSEQ RTSP_OK_FIN); //else @@ -1779,25 +1789,28 @@ void cXinelibServer::Read_Control(int cli) void cXinelibServer::Handle_ClientConnected(int fd) { char buf[64]; - struct sockaddr_in sin; - socklen_t len = sizeof(sin); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + socklen_t len = sizeof(addr); int cli; for(cli=0; cli<MAXCLIENTS; cli++) if(!fd_control[cli].open()) break; - if(getpeername(fd, (struct sockaddr *)&sin, &len)) { + if (getpeername(fd, &addr.sa, &len) < 0) { LOGERR("getpeername() failed, dropping new incoming connection %d", cli); CLOSESOCKET(fd); return; } LOGMSG("Client %d connected: %s", cli, - cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf)); + cxSocket::ip2txt(addr.in.sin_addr.s_addr, addr.in.sin_port, buf)); cAllowedHosts AllowedHosts(m_AllowedHostsFile); - if (!AllowedHosts.Acceptable(sin.sin_addr.s_addr)) { + if (!AllowedHosts.Acceptable(addr.in.sin_addr.s_addr)) { const char *msg = "Access denied.\r\n"; ssize_t len = strlen(msg); LOGMSG("Address not allowed to connect (%s)", *m_AllowedHostsFile); diff --git a/menu.c b/menu.c index 1ec2144..e928a34 100644 --- a/menu.c +++ b/menu.c @@ -200,8 +200,8 @@ char *cMenuBrowseFiles::GetLastDir(void) switch (m_Mode) { case ShowMusic: return xc.browse_music_dir; case ShowImages: return xc.browse_images_dir; - default: case ShowFiles: return xc.browse_files_dir; + default: break; } return xc.browse_files_dir; } diff --git a/tools/backgroundwriter.c b/tools/backgroundwriter.c index 79f0610..cd7ef3e 100644 --- a/tools/backgroundwriter.c +++ b/tools/backgroundwriter.c @@ -353,6 +353,13 @@ void cRawWriter::Action(void) LOGMSG("cBackgroundWriter @NextHeaderPos: Count < header size !"); int packlen = DATA_IS_TS(Data) ? TS_SIZE : pes_packet_len(Data, Count); + if (packlen < 1) { + LOGMSG("cBackgroundWriter: garbage in input ? clearing buffer"); + Lock(); + m_DiscardEnd = m_PutPos; + Unlock(); + continue; + } if (Count < packlen) ;//LOGMSG("Count = %d < %d", Count, diff --git a/tools/cxsocket.c b/tools/cxsocket.c index c3c0a62..43be3df 100644 --- a/tools/cxsocket.c +++ b/tools/cxsocket.c @@ -33,11 +33,16 @@ bool cxSocket::connect(struct sockaddr *addr, socklen_t len) bool cxSocket::connect(const char *ip, int port) { - struct sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = inet_addr(ip); - return connect((struct sockaddr *)&sin, sizeof(sin)); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + + addr.in.sin_family = AF_INET; + addr.in.sin_port = htons(port); + addr.in.sin_addr.s_addr = inet_addr(ip); + + return connect(&addr.sa, sizeof(addr)); } bool cxSocket::set_blocking(bool state) @@ -347,11 +352,14 @@ uint32_t cxSocket::get_local_address(char *ip_address) struct ifreq buf[3]; unsigned int n; - struct sockaddr_in sin; - socklen_t len = sizeof(sin); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + socklen_t len = sizeof(addr); - if(!getsockname((struct sockaddr *)&sin, &len)) { - local_addr = sin.sin_addr.s_addr; + if (!getsockname(&addr.sa, &len)) { + local_addr = addr.in.sin_addr.s_addr; } else { //LOGERR("getsockname failed"); diff --git a/tools/cxsocket.h b/tools/cxsocket.h index de63904..f7f8acf 100644 --- a/tools/cxsocket.h +++ b/tools/cxsocket.h @@ -149,16 +149,19 @@ static inline void set_socket_buffers(int s, int txbuf, int rxbuf) // static inline int sock_connect(int fd_control, int port, int type) { - struct sockaddr_in sin; - socklen_t len = sizeof(sin); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + socklen_t len = sizeof(addr); int s, one = 1; - if(getpeername(fd_control, (struct sockaddr *)&sin, &len)) { + if (getpeername(fd_control, &addr.sa, &len) < 0) { LOGERR("sock_connect: getpeername failed"); return -1; } - uint32_t tmp = ntohl(sin.sin_addr.s_addr); + uint32_t tmp = ntohl(addr.in.sin_addr.s_addr); LOGMSG("Client address: %d.%d.%d.%d", ((tmp>>24)&0xff), ((tmp>>16)&0xff), ((tmp>>8)&0xff), ((tmp)&0xff)); @@ -181,10 +184,10 @@ static inline int sock_connect(int fd_control, int port, int type) if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)) < 0) LOGERR("sock_connect: setsockopt(SO_REUSEADDR) failed"); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); + addr.in.sin_family = AF_INET; + addr.in.sin_port = htons(port); - if (connect(s, (struct sockaddr *)&sin, sizeof(sin))==-1 && + if (connect(s, &addr.sa, sizeof(addr)) < 0 && errno != EINPROGRESS) { LOGERR("connect() failed"); CLOSESOCKET(s); diff --git a/tools/future.h b/tools/future.h index e5c5414..43d998d 100644 --- a/tools/future.h +++ b/tools/future.h @@ -28,6 +28,7 @@ class cFuture { cFuture() { m_Ready = false; + memset(&m_Value, 0, sizeof(m_Value)); } void Reset(void) diff --git a/tools/pes.h b/tools/pes.h index 73229cc..00da267 100644 --- a/tools/pes.h +++ b/tools/pes.h @@ -99,14 +99,23 @@ static inline int pes_is_mpeg1(const uint8_t *header) static inline int pes_packet_len(const uint8_t *data, const int len) { if (IS_VIDEO_PACKET(data) || IS_AUDIO_PACKET(data)) { + if (len < 6) + return 0; return 6 + (data[4] << 8 | data[5]); } else if (data[3] == PADDING_STREAM) { + if (len < 6) + return 0; return 6 + (data[4] << 8 | data[5]); } else if (data[3] == 0xBA) { + if (len < 5) + return 0; if ((data[4] & 0x40) == 0) /* mpeg1 */ return 12; - else /* mpeg 2 */ + else { /* mpeg 2 */ + if (len < 14) + return 0; return 14 + (data[0xD] & 0x07); + } } else if (data[3] <= 0xB9) { return -3; } diff --git a/tools/rle.c b/tools/rle.c index bddd6ac..2c944c7 100644 --- a/tools/rle.c +++ b/tools/rle.c @@ -262,8 +262,11 @@ size_t rle_compress_argbrle(uint8_t **rle_data, const uint32_t *data, *rle_data = NULL; *num_rle = 0; - assert(h > 0); - assert(w <= 0x3fff); + assert(w > 0); /* avoid overreading data */ + assert(w <= 0x3fff); /* larger value does not fit in codeword */ + + if (w < 1 || h < 1) + return 0; for (y = 0; y < h; y++) { @@ -442,11 +445,15 @@ size_t rle_compress_hdmv(uint8_t **rle_data, const uint8_t *data, unsigned w, un size_t rle_size = 0; uint8_t *rle = NULL; - assert(w <= 0x3fff); + assert(w > 0); /* avoid overreading data */ + assert(w <= 0x3fff); /* larger value does not fit in codeword */ *rle_data = NULL; *num_rle = 0; + if (w < 1 || h < 1) + return 0; + for (y = 0; y < h; y++) { /* grow buffer ? */ diff --git a/tools/sap.h b/tools/sap.h index 212b8d4..43379e5 100644 --- a/tools/sap.h +++ b/tools/sap.h @@ -146,13 +146,16 @@ static inline int sap_send_pdu(int *pfd, sap_pdu_t *pdu, uint32_t dst_ip) } // Connect to multicast address - struct sockaddr_in sin; - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(SAP_UDP_PORT); - sin.sin_addr.s_addr = dst_ip ? dst_ip : inet_addr(SAP_IP_ADDRESS_GLOBAL); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + memset(&addr, 0, sizeof(addr)); + addr.in.sin_family = AF_INET; + addr.in.sin_port = htons(SAP_UDP_PORT); + addr.in.sin_addr.s_addr = dst_ip ? dst_ip : inet_addr(SAP_IP_ADDRESS_GLOBAL); - if(connect(fd, (struct sockaddr *)&sin, sizeof(sin))==-1) + if (connect(fd, &addr.sa, sizeof(addr)) == -1) LOGERR("UDP/SAP multicast connect() failed."); // Set to non-blocking mode diff --git a/tools/ts.c b/tools/ts.c index e769ae1..67e013e 100644 --- a/tools/ts.c +++ b/tools/ts.c @@ -634,7 +634,7 @@ ts_state_t *ts_state_init(size_t buffer_size) if (buffer_size < 8 * TS_SIZE) buffer_size = 8 * TS_SIZE; if (buffer_size > 4*1024*1024) { - LOGMSG("ERROR: ts_state_init(%zd)", buffer_size); + LOGMSG("ERROR: ts_state_init(%zu)", buffer_size); buffer_size = 4*1024*1024; } @@ -677,6 +677,11 @@ static size_t ts_add_payload(ts_state_t *ts, const uint8_t *data) ts->buf_len = 0; } + if (ts->buf_size < 2*TS_SIZE) { + LOGMSG("ts_add_payload(): assertion failed: buf_size < 2*TS_SIZE"); + return 0; + } + if (ts->buf_len >= ts->buf_size - TS_SIZE) { LOGDBG("ts_add_payload: buffer full"); ts->buf_len -= TS_SIZE; diff --git a/tools/udp_pes_scheduler.c b/tools/udp_pes_scheduler.c index 1ea970c..5a6dec9 100644 --- a/tools/udp_pes_scheduler.c +++ b/tools/udp_pes_scheduler.c @@ -184,14 +184,17 @@ bool cUdpScheduler::AddRtp(void) } if(xc.remote_local_ip[0]) { - struct sockaddr_in name; - memset(&name, 0, sizeof(name)); - name.sin_family = AF_INET; - name.sin_addr.s_addr = inet_addr(xc.remote_local_ip); - if(name.sin_addr.s_addr == INADDR_NONE) + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + memset(&addr, 0, sizeof(addr)); + addr.in.sin_family = AF_INET; + addr.in.sin_addr.s_addr = inet_addr(xc.remote_local_ip); + if(addr.in.sin_addr.s_addr == INADDR_NONE) LOGERR("Local address %s is invalid", xc.remote_local_ip); - name.sin_port = htons(xc.remote_rtp_port); - if (bind(m_fd_rtp.handle(), (struct sockaddr *)&name, sizeof(name)) < 0) + addr.in.sin_port = htons(xc.remote_rtp_port); + if (bind(m_fd_rtp.handle(), &addr.sa, sizeof(addr)) < 0) LOGERR("bind(%s:%d) failed for udp/rtp multicast", xc.remote_local_ip, xc.remote_rtp_port); #if 0 struct ip_mreqn mreqn; @@ -226,12 +229,15 @@ bool cUdpScheduler::AddRtp(void) m_fd_rtcp.close(); if(xc.remote_local_ip[0]) { - struct sockaddr_in name; - memset(&name, 0, sizeof(name)); - name.sin_family = AF_INET; - name.sin_addr.s_addr = inet_addr(xc.remote_local_ip); - name.sin_port = htons(xc.remote_rtp_port+1); - if (bind(m_fd_rtcp.handle(), (struct sockaddr *)&name, sizeof(name)) < 0) + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + memset(&addr, 0, sizeof(addr)); + addr.in.sin_family = AF_INET; + addr.in.sin_addr.s_addr = inet_addr(xc.remote_local_ip); + addr.in.sin_port = htons(xc.remote_rtp_port+1); + if (bind(m_fd_rtcp.handle(), &addr.sa, sizeof(addr)) < 0) LOGERR("bind(%s:%d) failed for udp/rtp multicast", xc.remote_local_ip, xc.remote_rtp_port); #if 0 struct ip_mreqn mreqn; @@ -585,7 +591,7 @@ void cUdpScheduler::Send_RTCP(void) msg->hdr.length = htons(1 + 1 + ((it->length - 2) + 3) / 4); content += sizeof(rtcp_common_t) + 4*ntohs(msg->hdr.length); - msg = (rtcp_packet_t *)content; + //msg = (rtcp_packet_t *)content; // Send #ifndef LOG_RTCP @@ -887,7 +893,9 @@ void cUdpScheduler::ReSend(int fd, uint64_t Pos, int Seq1, int Seq2) snprintf(udp_ctrl.payload, sizeof(udp_ctrl.payload), "UDP MISSING %d-%d %" PRIu64, Seq1, (Seq2 & UDP_BUFFER_MASK), Pos); - send(fd, &udp_ctrl, sizeof(udp_ctrl), 0); + if (send(fd, &udp_ctrl, sizeof(udp_ctrl), 0) != sizeof(udp_ctrl)) { + LOGERR("cUdpScheduler: UDP/RTP re-send() failed !"); + } return; } @@ -906,12 +914,13 @@ void cUdpScheduler::ReSend(int fd, uint64_t Pos, int Seq1, int Seq2) if(frame) { if(priv_ntohull(frame->hdr_ext.pos) - Pos < 100000) { - send(fd, - RTP_UDP_PAYLOAD(frame), - m_BackLog->PayloadSize(Seq1) + sizeof(stream_udp_header_t), - 0); - LOGRESEND("cUdpScheduler::ReSend: %d (%d bytes) @%lld sent", - Seq1, m_BackLog->PayloadSize(Seq1), Pos); + ssize_t pac_len = m_BackLog->PayloadSize(Seq1) + sizeof(stream_udp_header_t); + if (send(fd, RTP_UDP_PAYLOAD(frame), pac_len, 0) != pac_len) { + LOGERR("cUdpScheduler: UDP/RTP re-send() failed !"); + } else { + LOGRESEND("cUdpScheduler::ReSend: %d (%d bytes) @%lld sent", + Seq1, m_BackLog->PayloadSize(Seq1), Pos); + } Pos = priv_ntohull(frame->hdr_ext.pos) + m_BackLog->PayloadSize(Seq1); continue; } else { @@ -939,6 +948,8 @@ void cUdpScheduler::ReSend(int fd, uint64_t Pos, int Seq1, int Seq2) "UDP MISSING %d-%d %" PRIu64, Seq0, (Seq1 & UDP_BUFFER_MASK), Pos); - send(fd, &udp_ctrl, sizeof(udp_ctrl), 0); + if (send(fd, &udp_ctrl, sizeof(udp_ctrl), 0) != sizeof(udp_ctrl)) { + LOGERR("cUdpScheduler: UDP/RTP control send() failed !"); + } } } diff --git a/tools/vdrdiscovery.c b/tools/vdrdiscovery.c index a4d67a1..80eb3d9 100644 --- a/tools/vdrdiscovery.c +++ b/tools/vdrdiscovery.c @@ -60,7 +60,10 @@ static inline int discovery_init(int port) { int fd_discovery = -1; int iBroadcast = 1, iReuse = 1; - struct sockaddr_in sin; + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; if ((fd_discovery = socket(PF_INET, SOCK_DGRAM, 0/*IPPROTO_TCP*/)) < 0) { LOGERR("discovery_init: socket() failed"); @@ -73,11 +76,11 @@ static inline int discovery_init(int port) if (setsockopt(fd_discovery, SOL_SOCKET, SO_REUSEADDR, &iReuse, sizeof(int)) < 0) LOGERR("discovery_init: setsockopt(SO_REUSEADDR) failed"); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); + addr.in.sin_family = AF_INET; + addr.in.sin_port = htons(port); + addr.in.sin_addr.s_addr = htonl(INADDR_BROADCAST); - if (bind(fd_discovery, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + if (bind(fd_discovery, &addr.sa, sizeof(addr)) < 0) { LOGERR("discovery_init: bind() failed"); close(fd_discovery); return -1; @@ -93,15 +96,17 @@ int udp_discovery_init(void) static inline int udp_discovery_send(int fd_discovery, int port, char *msg) { - struct sockaddr_in sin; + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; int len = strlen(msg); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = INADDR_BROADCAST; + addr.in.sin_family = AF_INET; + addr.in.sin_port = htons(port); + addr.in.sin_addr.s_addr = INADDR_BROADCAST; - if(len != sendto(fd_discovery, msg, len, 0, - (struct sockaddr *)&sin, sizeof(sin))) { + if (len != sendto(fd_discovery, msg, len, 0, &addr.sa, sizeof(addr))) { LOGERR("UDP broadcast send failed (discovery)"); return -1; } diff --git a/xine/demux_xvdr.c b/xine/demux_xvdr.c index 40001c3..533b3b2 100644 --- a/xine/demux_xvdr.c +++ b/xine/demux_xvdr.c @@ -654,7 +654,7 @@ static int32_t parse_pes_for_pts(demux_xvdr_t *this, uint8_t *p, buf_element_t * this->pts |= (p[ 2] & 0xFE) << 14 ; this->pts |= p[ 3] << 7 ; this->pts |= (p[ 4] & 0xFE) >> 1 ; - p += 5; + //p += 5; header_len+= 5; this->packet_len -=5; return header_len; @@ -671,12 +671,12 @@ static int32_t parse_pes_for_pts(demux_xvdr_t *this, uint8_t *p, buf_element_t * this->dts |= p[ 8] << 7 ; this->dts |= (p[ 9] & 0xFE) >> 1 ; - p += 10; + //p += 10; header_len += 10; this->packet_len -= 10; return header_len; } else { - p++; + //p++; header_len++; this->packet_len--; return header_len; diff --git a/xine/post.c b/xine/post.c index 70004ef..921223d 100644 --- a/xine/post.c +++ b/xine/post.c @@ -308,6 +308,21 @@ static post_element_t **pplugin_parse_and_load(fe_t *fe, return post_elements; } +static void strcat_n(size_t sz, char *dst, const char *src) +{ + size_t len = strlen(dst) + strlen(src); + if (sz < 1) + return; + if (len + 6 > sz) { + while (len + 1 < sz) { + dst[len++] = '.'; + } + dst[sz-1] = 0; + return; + } + strcat(dst, src); +} + static void pplugin_parse_and_store_post(fe_t *fe, int plugin_type, const char *post_chain) @@ -364,12 +379,12 @@ void pplugin_parse_and_store_post(fe_t *fe, int plugin_type, if((*_post_elements)[i]) if(((*_post_elements)[i])->post) { if(((*_post_elements)[i])->enable) - strcat(s, "*"); + strcat_n(sizeof(s), s, "*"); if(((*_post_elements)[i])->name) - strcat(s, ((*_post_elements)[i])->name); + strcat_n(sizeof(s), s, ((*_post_elements)[i])->name); else - strcat(s, "<no name!>"); - strcat(s, " "); + strcat_n(sizeof(s), s, "<no name!>"); + strcat_n(sizeof(s), s, " "); } LOGDBG(" loaded plugins (type %d.%d): %s", (plugin_type>>16), (plugin_type&0xffff), s); diff --git a/xine_fbfe_frontend.c b/xine_fbfe_frontend.c index 254087e..c5977b1 100644 --- a/xine_fbfe_frontend.c +++ b/xine_fbfe_frontend.c @@ -76,7 +76,7 @@ static void update_DFBARGS(const char *fb_dev) const char *env_old = getenv("DFBARGS"); char *env_new = NULL; - if (env_old) { + if (env_old && env_old[0]) { char *env_tmp = strdup(env_old); char *head = strstr(env_tmp, "fbdev="); @@ -92,7 +92,7 @@ static void update_DFBARGS(const char *fb_dev) return; } } else { - if(asprintf(&env_new, "fbdev=%s%s%s", fb_dev, env_tmp ? "," : "", env_tmp ?: "") < 0) { + if (asprintf(&env_new, "fbdev=%s,%s", fb_dev, env_tmp) < 0) { free(env_tmp); return; } diff --git a/xine_frontend.c b/xine_frontend.c index 6902f3f..0bf30bf 100644 --- a/xine_frontend.c +++ b/xine_frontend.c @@ -686,6 +686,14 @@ static int fe_xine_init(frontend_t *this_gen, const char *audio_driver, "also increased latency and memory " "consumption."), 20, NULL, NULL); + x_reg_num ("engine.buffers.audio_num_buffers", + 500, + _("number of audio buffers"), + _("The number of audio buffers (each is 8k in size) " + "xine uses in its internal queue. Higher values " + "mean smoother playback for unreliable inputs, but " + "also increased latency and memory consumption."), + 20, NULL, NULL); x_reg_bool("gui.osd_use_unscaled", 0, _("Use unscaled OSD"), diff --git a/xine_frontend_lirc.c b/xine_frontend_lirc.c index e227c51..67038b5 100644 --- a/xine_frontend_lirc.c +++ b/xine_frontend_lirc.c @@ -64,7 +64,10 @@ extern int gui_hotkeys; static void lircd_connect(void) { - struct sockaddr_un addr; + union { + struct sockaddr sa; + struct sockaddr_un un; + } addr; if (fd_lirc >= 0) { close(fd_lirc); @@ -76,16 +79,16 @@ static void lircd_connect(void) return; } - addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, (char*)lirc_device_name, sizeof(addr.sun_path)); - addr.sun_path[sizeof(addr.sun_path)-1] = 0; + addr.un.sun_family = AF_UNIX; + strncpy(addr.un.sun_path, (char*)lirc_device_name, sizeof(addr.un.sun_path)); + addr.un.sun_path[sizeof(addr.un.sun_path)-1] = 0; if ((fd_lirc = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { LOGERR("lirc error: socket() < 0"); return; } - if (connect(fd_lirc, (struct sockaddr *)&addr, sizeof(addr))) { + if (connect(fd_lirc, &addr.sa, sizeof(addr))) { LOGERR("lirc error: connect(%s) < 0", lirc_device_name); close(fd_lirc); fd_lirc = -1; diff --git a/xine_frontend_main.c b/xine_frontend_main.c index 42a6c39..c3d8355 100644 --- a/xine_frontend_main.c +++ b/xine_frontend_main.c @@ -399,9 +399,11 @@ int main(int argc, char *argv[]) PRINTF("Buffers: %d\n", pes_buffers); break; case 'T': tty = optarg; +#if 0 if (access(tty, R_OK | W_OK) < 0) { EXIT("Can't access terminal: %s\n", tty); } +#endif PRINTF("Terminal: %s\n", tty); break; case 'n': scale_video = 0; @@ -503,7 +505,14 @@ int main(int argc, char *argv[]) /* claim new controlling terminal */ stdin = freopen(tty, "r", stdin); stdout = freopen(tty, "w", stdout); + if (!stdin || !stdout) { + EXIT("Can't access terminal: %s\n", tty); + } stderr = freopen(tty, "w", stderr); + if (!stderr) { + printf("Error reopening stderr\n"); + exit(-1); + } } #if 1 @@ -530,8 +539,10 @@ int main(int argc, char *argv[]) if (mrl) { char *tmp = mrl; mrl = NULL; - if (asprintf(&mrl, "%s//%s:%d", tmp, address, port) < 0) + if (asprintf(&mrl, "%s//%s:%d", tmp, address, port) < 0) { + free(tmp); return -1; + } free(tmp); } else if (asprintf(&mrl, MRL_ID "://%s:%d", address, port) < 0) @@ -545,13 +556,14 @@ int main(int argc, char *argv[]) } } - if (mrl && - strncmp(mrl, MRL_ID ":", MRL_ID_LEN+1) && + if (strncmp(mrl, MRL_ID ":", MRL_ID_LEN+1) && strncmp(mrl, MRL_ID "+", MRL_ID_LEN+1)) { char *mrl2 = mrl; PRINTF("WARNING: MRL does not start with \'" MRL_ID ":\' (%s)\n", mrl); - if (asprintf(&mrl, MRL_ID "://%s", mrl) < 0) + if (asprintf(&mrl, MRL_ID "://%s", mrl) < 0) { + free(mrl2); return -1; + } free(mrl2); } @@ -582,6 +594,7 @@ int main(int argc, char *argv[]) fe = (*fe_creator)(); if (!fe) { fprintf(stderr, "Error initializing frontend\n"); + free(mrl); return -3; } @@ -592,6 +605,7 @@ int main(int argc, char *argv[]) aspect_controller, window_id)) { fprintf(stderr, "Error opening display\n"); fe->fe_free(fe); + free(mrl); return -4; } @@ -601,6 +615,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error initializing xine\n"); list_xine_plugins(fe, SysLogLevel>2); fe->fe_free(fe); + free(mrl); return -5; } if (power_off_cmd) { diff --git a/xine_input_vdr.c b/xine_input_vdr.c index 31a5bf6..3ebc6e6 100644 --- a/xine_input_vdr.c +++ b/xine_input_vdr.c @@ -883,6 +883,22 @@ static void create_timeout_time(struct timespec *abstime, int timeout_ms) /**************************** socket I/O *********************************/ +int io_set_nonblock(int fd) +{ + int flags, result; + + flags = fcntl (fd, F_GETFL); + if (flags < 0) { + LOGERR("fcntl(F_GETFL) failed"); + return flags; + } + result = fcntl (fd, F_SETFL, flags | O_NONBLOCK); + if (result < 0) { + LOGERR("Failed setting fd to non-blocking mode"); + } + return result; +} + /* * io_select_rd() * @@ -935,7 +951,7 @@ static int io_select_rd (int fd) */ static ssize_t write_control_data(vdr_input_plugin_t *this, const void *str, size_t len) { - size_t ret, result = len; + size_t result = len; while (len > 0) { @@ -968,7 +984,7 @@ static ssize_t write_control_data(vdr_input_plugin_t *this, const void *str, siz } errno = 0; - ret = send (this->fd_control, str, len, 0); + ssize_t ret = send (this->fd_control, str, len, 0); if (ret <= 0) { if (ret == 0) { @@ -2319,15 +2335,17 @@ static void dvd_set_speed(const char *device, int speed) if (!device) return; if (!speed) return; - if (stat(device, &st) == -1) return; - - if (!S_ISBLK(st.st_mode)) return; /* not a block device */ - if ((fd = open(device, O_RDWR | O_NONBLOCK)) == -1) { LOGMSG("set_dvd_speed: error opening DVD device %s for read/write", device); return; } + if (fstat(fd, &st) < 0 || + !S_ISBLK(st.st_mode)) { + close(fd); + return; /* not a block device */ + } + memset(&sghdr, 0, sizeof(sghdr)); memset(buffer, 0, sizeof(buffer)); memset(sense, 0, sizeof(sense)); @@ -2528,10 +2546,9 @@ static int handle_control_playfile(vdr_input_plugin_t *this, const char *cmd) if(sub) *sub = 0; sprintf(mrl, "%s%s", mrlbase, filename + is_file_mrl); if(sub) { + size_t len = strlen(mrl); sub += 10; /*strlen("#subtitle:");*/ - strcat(mrl, "#subtitle:"); - strcat(mrl, mrlbase); - strcat(mrl, sub); + snprintf(mrl + len, sizeof(mrl) - len, "#subtitle:%s%s", mrlbase, sub); } LOGMSG(" -> trying to stream from server (%s) ...", mrl); strn0cpy(filename, mrl, sizeof(filename)); @@ -2711,6 +2728,16 @@ static int handle_control_playfile(vdr_input_plugin_t *this, const char *cmd) * grab */ +static void _send_grab_data(vdr_input_plugin_t *this, const grab_data_t *data) +{ + char s[128]; + sprintf(s, "GRAB %d %lu\r\n", this->token, (unsigned long)data->size); + mutex_lock_cancellable (&this->fd_control_lock); + write_control_data(this, s, strlen(s)); + write_control_data(this, data->data, data->size); + mutex_unlock_cancellable (&this->fd_control_lock); +} + static int handle_control_grab(vdr_input_plugin_t *this, const char *cmd) { int quality, width, height, jpeg; @@ -2732,12 +2759,7 @@ static int handle_control_grab(vdr_input_plugin_t *this, const char *cmd) data = (grab_data_t*)(this->funcs.fe_control(this->funcs.fe_handle, cmd)); if(data && data->size>0 && data->data) { - char s[128]; - sprintf(s, "GRAB %d %lu\r\n", this->token, (unsigned long)data->size); - mutex_lock_cancellable (&this->fd_control_lock); - write_control_data(this, s, strlen(s)); - write_control_data(this, data->data, data->size); - mutex_unlock_cancellable (&this->fd_control_lock); + _send_grab_data(this, data); } else { /* failed */ printf_control(this, "GRAB %d 0\r\n", this->token); @@ -2814,6 +2836,10 @@ static int handle_osdcmd(vdr_input_plugin_t *this, int fd) LOGMSG("error reading OSDCMD data length"); return CONTROL_DISCONNECTED; } + if (osdcmd.size < 2) { /* avoid integer overflow when calculating todo */ + LOGMSG("invalid OSDCMD data length"); + return CONTROL_DISCONNECTED; + } pt += sizeof(osdcmd.size); expect -= sizeof(osdcmd.size); todo = osdcmd.size - sizeof(osdcmd.size); @@ -4281,13 +4307,15 @@ static buf_element_t *read_socket_udp(vdr_input_plugin_t *this) /* * Receive frame from socket and check for errors */ - - struct sockaddr_in server_address; + union { + struct sockaddr sa; + struct sockaddr_in in; + } server_address; socklen_t address_len = sizeof(server_address); ssize_t n = recvfrom(this->fd_data, read_buffer->mem, read_buffer->max_size, MSG_TRUNC, - &server_address, &address_len); + &server_address.sa, &address_len); if (n <= 0) { if (!n || (errno != EINTR && errno != EAGAIN)) { LOGERR("read_socket_udp(): recvfrom() failed"); @@ -4302,11 +4330,11 @@ static buf_element_t *read_socket_udp(vdr_input_plugin_t *this) * check source address */ - if ((server_address.sin_addr.s_addr != + if ((server_address.in.sin_addr.s_addr != udp->server_address.sin_addr.s_addr) || - server_address.sin_port != udp->server_address.sin_port) { + server_address.in.sin_port != udp->server_address.sin_port) { #ifdef LOG_UDP - uint32_t tmp_ip = ntohl(server_address.sin_addr.s_addr); + uint32_t tmp_ip = ntohl(server_address.in.sin_addr.s_addr); LOGUDP("Received data from unknown sender: %d.%d.%d.%d:%d", ((tmp_ip>>24)&0xff), ((tmp_ip>>16)&0xff), ((tmp_ip>>8)&0xff), ((tmp_ip)&0xff), @@ -5167,14 +5195,18 @@ static void vdr_plugin_dispose (input_plugin_t *this_gen) if(fc >= 0) { LOGDBG("Shutdown control"); - setsockopt(fc, SOL_SOCKET, SO_LINGER, &l, sizeof(struct linger)); - shutdown(fc, SHUT_RDWR); + if (setsockopt(fc, SOL_SOCKET, SO_LINGER, &l, sizeof(struct linger)) < 0) + LOGDBG("setsockopt(control, SO_LINGER) failed"); + if (shutdown(fc, SHUT_RDWR) < 0) + LOGDBG("shutdown(control) failed"); } if(fd >= 0 && this->tcp) { LOGDBG("Shutdown data"); - setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(struct linger)); - shutdown(fd, SHUT_RDWR); + if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(struct linger)) < 0) + LOGDBG("setsockopt(data, SO_LINGER) failed"); + if (shutdown(fd, SHUT_RDWR) < 0) + LOGDBG("shutdown(data) failed"); } } @@ -5378,17 +5410,21 @@ static void set_recv_buffer_size(int fd, unsigned max_buf) /*}*/ max_buf = 256; /* not going to send anything, so shrink send buffer ... */ - setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &max_buf, sizeof(int)); + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &max_buf, sizeof(int)) < 0) + LOGDBG("Shrinking data socket buffer failed"); } static int alloc_udp_data_socket(int firstport, int trycount, int *port) { int fd, one = 1; - struct sockaddr_in name; + union { + struct sockaddr sa; + struct sockaddr_in in; + } name; - name.sin_family = AF_INET; - name.sin_port = htons(firstport); - name.sin_addr.s_addr = htonl(INADDR_ANY); + name.in.sin_family = AF_INET; + name.in.sin_port = htons(firstport); + name.in.sin_addr.s_addr = htonl(INADDR_ANY); fd = socket(PF_INET, SOCK_DGRAM, 0/*IPPROTO_UDP*/); if (fd < 0) { @@ -5400,18 +5436,18 @@ static int alloc_udp_data_socket(int firstport, int trycount, int *port) if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)) < 0) LOGERR("UDP data stream: setsockopt(SO_REUSEADDR) failed"); - while(bind(fd, (struct sockaddr *)&name, sizeof(name)) < 0) { + while (bind(fd, &name.sa, sizeof(name)) < 0) { if(!--trycount) { LOGMSG("UDP Data stream: bind error, no free port found"); close(fd); return -1; } LOGERR("UDP Data stream: bind error, port %d: %s", - name.sin_port, strerror(errno)); - name.sin_port = htons(++firstport); + name.in.sin_port, strerror(errno)); + name.in.sin_port = htons(++firstport); } - *port = ntohs(name.sin_port); + *port = ntohs(name.in.sin_port); return fd; } @@ -5484,11 +5520,12 @@ static int connect_control_stream(vdr_input_plugin_t *this, const char *host, } /* set socket to non-blocking mode */ - fcntl (fd_control, F_SETFL, fcntl (fd_control, F_GETFL) | O_NONBLOCK); + io_set_nonblock(fd_control); /* set control socket to deliver data immediately instead of waiting for full TCP segments */ - setsockopt(fd_control, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(int)); + if (setsockopt(fd_control, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(int)) < 0) + LOGERR("Failed setting control socket TCP_NODELAY"); this->fd_control = saved_fd; return fd_control; @@ -5500,14 +5537,16 @@ static int connect_rtp_data_stream(vdr_input_plugin_t *this) char cmd[256]; unsigned int ip0, ip1, ip2, ip3, port; int fd=-1, one = 1, retries = 0; - struct sockaddr_in multicastAddress; struct ip_mreq mreq; - struct sockaddr_in server_address, sin; + union { + struct sockaddr sa; + struct sockaddr_in in; + } multicastAddress, server_address, sin; socklen_t len = sizeof(sin); stream_rtp_header_impl_t tmp_rtp; /* get server IP address */ - if(getpeername(this->fd_control, (struct sockaddr *)&server_address, &len)) { + if (getpeername(this->fd_control, &server_address.sa, &len)) { LOGERR("getpeername(fd_control) failed"); /* close(fd); */ return -1; @@ -5537,9 +5576,9 @@ static int connect_rtp_data_stream(vdr_input_plugin_t *this) LOGMSG("Connecting (data) to rtp://@%u.%u.%u.%u:%u ...", ip0, ip1, ip2, ip3, port); - multicastAddress.sin_family = AF_INET; - multicastAddress.sin_port = htons(port); - multicastAddress.sin_addr.s_addr = htonl((ip0<<24)|(ip1<<16)|(ip2<<8)|ip3); + multicastAddress.in.sin_family = AF_INET; + multicastAddress.in.sin_port = htons(port); + multicastAddress.in.sin_addr.s_addr = htonl((ip0<<24)|(ip1<<16)|(ip2<<8)|ip3); if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { LOGERR("socket() failed"); @@ -5553,8 +5592,7 @@ static int connect_rtp_data_stream(vdr_input_plugin_t *this) return -1; } - if(bind(fd, (struct sockaddr *)&multicastAddress, - sizeof(multicastAddress)) < 0) { + if (bind(fd, &multicastAddress.sa, sizeof(multicastAddress)) < 0) { LOGERR("bind() to multicast address failed"); close(fd); return -1; @@ -5563,7 +5601,7 @@ static int connect_rtp_data_stream(vdr_input_plugin_t *this) /* Join to multicast group */ memset(&mreq, 0, sizeof(mreq)); - mreq.imr_multiaddr.s_addr = multicastAddress.sin_addr.s_addr; + mreq.imr_multiaddr.s_addr = multicastAddress.in.sin_addr.s_addr; mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*mreq.imr_ifindex = 0;*/ if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) { @@ -5596,16 +5634,16 @@ retry_recvfrom: /* check sender address */ - if (recvfrom(fd, &tmp_rtp, sizeof(tmp_rtp), 0, &sin, &len) < 0) { + if (recvfrom(fd, &tmp_rtp, sizeof(tmp_rtp), 0, &sin.sa, &len) < 0) { LOGERR("RTP recvrom() failed"); return -1; } - if(sin.sin_addr.s_addr != server_address.sin_addr.s_addr) { - uint32_t tmp_ip = ntohl(sin.sin_addr.s_addr); + if (sin.in.sin_addr.s_addr != server_address.in.sin_addr.s_addr) { + uint32_t tmp_ip = ntohl(sin.in.sin_addr.s_addr); LOGMSG("Received UDP/RTP multicast from unknown sender: %d.%d.%d.%d:%d", ((tmp_ip>>24)&0xff), ((tmp_ip>>16)&0xff), ((tmp_ip>>8)&0xff), ((tmp_ip)&0xff), - sin.sin_port); + sin.in.sin_port); if(XIO_READY == _x_io_select(this->stream, fd, XIO_READ_READY, 0)) goto retry_recvfrom; @@ -5630,19 +5668,22 @@ retry_recvfrom: static int connect_udp_data_stream(vdr_input_plugin_t *this) { char cmd[256]; - struct sockaddr_in server_address, sin; + union { + struct sockaddr sa; + struct sockaddr_in in; + } server_address, sin; socklen_t len = sizeof(sin); uint32_t tmp_ip; stream_udp_header_t tmp_udp; int retries = 0, port = -1, fd = -1; /* get server IP address */ - if(getpeername(this->fd_control, (struct sockaddr *)&server_address, &len)) { + if (getpeername(this->fd_control, &server_address.sa, &len)) { LOGERR("getpeername(fd_control) failed"); /* close(fd); */ return -1; } - tmp_ip = ntohl(server_address.sin_addr.s_addr); + tmp_ip = ntohl(server_address.in.sin_addr.s_addr); LOGDBG("VDR server address: %d.%d.%d.%d", ((tmp_ip>>24)&0xff), ((tmp_ip>>16)&0xff), @@ -5690,16 +5731,16 @@ retry_recvfrom: /* check sender address */ - if (recvfrom(fd, &tmp_udp, sizeof(tmp_udp), 0, &sin, &len) < 0) { + if (recvfrom(fd, &tmp_udp, sizeof(tmp_udp), 0, &sin.sa, &len) < 0) { LOGERR("UDP recvrom() failed"); return -1; } - if(sin.sin_addr.s_addr != server_address.sin_addr.s_addr) { - tmp_ip = ntohl(sin.sin_addr.s_addr); + if (sin.in.sin_addr.s_addr != server_address.in.sin_addr.s_addr) { + tmp_ip = ntohl(sin.in.sin_addr.s_addr); LOGMSG("Received UDP packet from unknown sender: %d.%d.%d.%d:%d", ((tmp_ip>>24)&0xff), ((tmp_ip>>16)&0xff), ((tmp_ip>>8)&0xff), ((tmp_ip)&0xff), - sin.sin_port); + sin.in.sin_port); if(XIO_READY == _x_io_select(this->stream, fd, XIO_READ_READY, 0)) goto retry_recvfrom; @@ -5719,12 +5760,15 @@ retry_recvfrom: return fd; } -static int connect_tcp_data_stream(vdr_input_plugin_t *this, const char *host, - int port) +static int connect_tcp_data_stream(vdr_input_plugin_t *this, const char *host, + int port) { static const char ackmsg[] = {'D','A','T','A','\r','\n'}; - struct sockaddr_in sinc; - socklen_t len = sizeof(sinc); + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr; + socklen_t len = sizeof(addr); uint32_t ipc; char tmpbuf[256]; int fd_data; @@ -5744,13 +5788,17 @@ static int connect_tcp_data_stream(vdr_input_plugin_t *this, const char *host, /* request data connection */ - getsockname(this->fd_control, (struct sockaddr *)&sinc, &len); - ipc = ntohl(sinc.sin_addr.s_addr); + if (getsockname(this->fd_control, &addr.sa, &len) < 0) { + LOGERR("getsockname(fd_control) failed"); + close(fd_data); + return -1; + } + ipc = ntohl(addr.in.sin_addr.s_addr); sprintf(tmpbuf, "DATA %d 0x%x:%u %d.%d.%d.%d\r\n", this->client_id, (unsigned int)ipc, - (unsigned int)ntohs(sinc.sin_port), + (unsigned int)ntohs(addr.in.sin_port), ((ipc>>24)&0xff), ((ipc>>16)&0xff), ((ipc>>8)&0xff), ((ipc)&0xff) ); if(_x_io_tcp_write(this->stream, fd_data, tmpbuf, strlen(tmpbuf)) < 0) { @@ -5765,7 +5813,7 @@ static int connect_tcp_data_stream(vdr_input_plugin_t *this, const char *host, } else { /* succeed */ /* set socket to non-blocking mode */ - fcntl (fd_data, F_SETFL, fcntl (fd_data, F_GETFL) | O_NONBLOCK); + io_set_nonblock(fd_data); return fd_data; } @@ -5779,14 +5827,19 @@ static int connect_pipe_data_stream(vdr_input_plugin_t *this) /* check if IP address matches */ if(!strstr(this->mrl, "127.0.0.1")) { - struct sockaddr_in sinc; - struct sockaddr_in sins; - socklen_t len = sizeof(sinc); - getsockname(this->fd_control, &sinc, &len); - getpeername(this->fd_control, &sins, &len); - if(sinc.sin_addr.s_addr != sins.sin_addr.s_addr) { + union { + struct sockaddr sa; + struct sockaddr_in in; + } addr_cli, addr_svr; + socklen_t lenc = sizeof(addr_cli); + socklen_t lens = sizeof(addr_svr); + if (getsockname(this->fd_control, &addr_cli.sa, &lenc) < 0) + LOGERR("getsockname(fd_control) failed"); + else if (getpeername(this->fd_control, &addr_svr.sa, &lens) < 0) + LOGERR("getpeername(fd_control) failed"); + else if (addr_cli.in.sin_addr.s_addr != addr_svr.in.sin_addr.s_addr) { LOGMSG("connect_pipe_data_stream: client ip=0x%x != server ip=0x%x !", - (unsigned int)sinc.sin_addr.s_addr, (unsigned int)sins.sin_addr.s_addr); + (unsigned int)addr_cli.in.sin_addr.s_addr, (unsigned int)addr_svr.in.sin_addr.s_addr); #if 0 return -1; #endif @@ -5812,7 +5865,7 @@ static int connect_pipe_data_stream(vdr_input_plugin_t *this) if (_x_io_tcp_write(this->stream, this->fd_control, "PIPE OPEN\r\n", 11) == 11 && readline_control(this, tmpbuf, sizeof(tmpbuf)-1, 4) >6 && !strncmp(tmpbuf, "PIPE OK", 7)) { - fcntl (fd_data, F_SETFL, fcntl (fd_data, F_GETFL) | O_NONBLOCK); + io_set_nonblock(fd_data); return fd_data; } LOGMSG("Data stream connection failed (PIPE)"); @@ -5834,9 +5887,9 @@ static int vdr_plugin_open_net (input_plugin_t *this_gen) if(strchr(this->mrl, '#')) *strchr(this->mrl, '#') = 0; - if((!strncasecmp(this->mrl, MRL_ID "+tcp://", MRL_ID_LEN+7) && (this->tcp=1)) || - (!strncasecmp(this->mrl, MRL_ID "+udp://", MRL_ID_LEN+7) && (this->udp=1)) || - (!strncasecmp(this->mrl, MRL_ID "+rtp://", MRL_ID_LEN+7) && (this->rtp=1)) || + if((this->tcp = !strncasecmp(this->mrl, MRL_ID "+tcp://", MRL_ID_LEN+7)) || + (this->udp = !strncasecmp(this->mrl, MRL_ID "+udp://", MRL_ID_LEN+7)) || + (this->rtp = !strncasecmp(this->mrl, MRL_ID "+rtp://", MRL_ID_LEN+7)) || (!strncasecmp(this->mrl, MRL_ID "+pipe://", MRL_ID_LEN+8)) || (!strncasecmp(this->mrl, MRL_ID "://", MRL_ID_LEN+3))) { @@ -5861,7 +5914,8 @@ static int vdr_plugin_open_net (input_plugin_t *this_gen) LOGERR("Can't connect to tcp://%s:%d", host, iport); return 0; } - setsockopt(this->fd_control, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(int)); + if (setsockopt(this->fd_control, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(int)) < 0) + LOGERR("Failed setting TCP_NODELAY for control socket"); LOGMSG("Connected (control) to tcp://%s:%d", host, iport); diff --git a/xine_post_swscale.c b/xine_post_swscale.c index de6ecfe..ccc5f8f 100644 --- a/xine_post_swscale.c +++ b/xine_post_swscale.c @@ -376,8 +376,8 @@ static void init_tables_yuy2(int newwidth, int newheight, int oldwidth, int oldh k = j>>8; wY2 = j - (k << 8); /* luma weight of right pixel */ wY1 = 256 - wY2; /* luma weight of left pixel */ - wUV2 = (k%2) ? 128 + (wY2 >> 1) : wY2 >> 1; - wUV1 = 256 - wUV2; + //wUV2 = (k%2) ? 128 + (wY2 >> 1) : wY2 >> 1; + //wUV1 = 256 - wUV2; if (k > oldwidth - 2) { hControl[i*3+5] = oldwidth - 1; /* point to last byte */ diff --git a/xine_sxfe_frontend.c b/xine_sxfe_frontend.c index 8a2f870..db8cb6b 100644 --- a/xine_sxfe_frontend.c +++ b/xine_sxfe_frontend.c @@ -884,7 +884,7 @@ static void hud_osd_draw(sxfe_t *this, const struct osd_command_s *cmd) XDouble scale_x = (XDouble)this->x.width / (XDouble)this->osd_width; XDouble scale_y = (XDouble)this->x.height / (XDouble)this->osd_height; - int mask_changed; + int mask_changed = 0; #ifdef HAVE_XSHAPE Xrender_Surf *dst_surf = this->surf_back_img ? this->surf_back_img : this->surf_win; @@ -2214,6 +2214,29 @@ static void *opengl_draw_frame_thread(void *arg) return NULL; } +static void _opengl_cleanup(sxfe_t *this) +{ + free(this->opengl_osd_texture_img); + pthread_cond_destroy(&this->opengl_redraw_cv); + pthread_cond_destroy(&this->opengl_redraw_finished_cv); + pthread_mutex_destroy(&this->opengl_redraw_mutex); + pthread_mutex_destroy(&this->opengl_osd_texture_img_mutex); +} + +static void opengl_stop(sxfe_t *this) +{ + if (this->opengl_always || this->opengl_hud) { + void *status; + this->opengl_deinit = 1; + opengl_trigger_drawing_thread(this); + if (pthread_join(this->opengl_drawing_thread, &status)) { + LOGERR("sxfe_display_close: can not join opengl drawing thread!"); + } + + _opengl_cleanup(this); + } +} + static int opengl_start(sxfe_t *this) { LOGDBG("sxfe_display_open: starting opengl drawing thread"); @@ -2250,6 +2273,7 @@ static int opengl_start(sxfe_t *this) pthread_attr_destroy(&attr); LOGERR("sxfe_display_open: can not start OpenGL drawing thread"); this->opengl_always = this->opengl_hud = 0; /* avoid pthread_join segfault */ + _opengl_cleanup(this); return 0; } pthread_attr_destroy(&attr); @@ -3125,15 +3149,7 @@ static void sxfe_display_close(frontend_t *this_gen) if(this->display) { #ifdef HAVE_OPENGL - if (this->opengl_always || this->opengl_hud) { - void *status; - this->opengl_deinit = 1; - opengl_trigger_drawing_thread(this); - if (pthread_join(this->opengl_drawing_thread, &status)) { - LOGERR("sxfe_display_close: can not join opengl drawing thread!"); - } - free(this->opengl_osd_texture_img); - } + opengl_stop(this); #endif #ifdef HAVE_XRENDER
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor