diff --git a/lib/certificate.cpp b/lib/certificate.cpp index 3543b41a..a2c4d9d1 100644 --- a/lib/certificate.cpp +++ b/lib/certificate.cpp @@ -1,5 +1,7 @@ #include "certificate.h" #include "defines.h" +#include + Certificate::Certificate() : rsa_ctx(NULL){ memset((void *)&cert, 0x00, sizeof(cert)); diff --git a/lib/comms.cpp b/lib/comms.cpp index 5bd08276..5bfcaa72 100644 --- a/lib/comms.cpp +++ b/lib/comms.cpp @@ -5,6 +5,8 @@ #include "encode.h" #include "procs.h" #include "timing.h" +#include +#include namespace Comms{ Comms::Comms(){ diff --git a/lib/config.cpp b/lib/config.cpp index 28461b5e..9ade9ed8 100644 --- a/lib/config.cpp +++ b/lib/config.cpp @@ -38,8 +38,8 @@ bool Util::Config::is_active = false; bool Util::Config::is_restarting = false; static Socket::Server *serv_sock_pointer = 0; -uint32_t Util::Config::printDebugLevel = DEBUG; // -std::string Util::Config::streamName; +uint32_t Util::printDebugLevel = DEBUG; +std::string Util::streamName; char Util::exitReason[256] = {0}; void Util::logExitReason(const char *format, ...){ diff --git a/lib/config.h b/lib/config.h index 573519b5..5a860828 100644 --- a/lib/config.h +++ b/lib/config.h @@ -13,6 +13,8 @@ /// Contains utility code, not directly related to streaming media namespace Util{ + extern uint32_t printDebugLevel; + extern std::string streamName; ///< Used by debug messages to identify the stream name extern char exitReason[256]; void logExitReason(const char * format, ...); @@ -27,8 +29,6 @@ namespace Util{ // variables static bool is_active; ///< Set to true by activate(), set to false by the signal handler. static bool is_restarting; ///< Set to true when restarting, set to false on boot. - static uint32_t printDebugLevel; - static std::string streamName; ///< Used by debug messages to identify the stream name // functions Config(); Config(std::string cmd); diff --git a/lib/defines.h b/lib/defines.h index 850ac0c6..2568d047 100644 --- a/lib/defines.h +++ b/lib/defines.h @@ -23,11 +23,18 @@ #define APPIDENT APPNAME "/" PACKAGE_VERSION #define __STDC_FORMAT_MACROS 1 -#include "config.h" #include #include #include #include +#include + +//Declare as extern so we don't have to include the whole config.h header +namespace Util{ + extern uint32_t printDebugLevel; + extern std::string streamName; +} + static const char *DBG_LVL_LIST[] ={"NONE", "FAIL", "ERROR", "WARN", "INFO", "MEDIUM", "HIGH", "VERYHIGH", "EXTREME", "INSANE", "DONTEVEN"}; @@ -44,29 +51,29 @@ static const char *DBG_LVL_LIST[] ={"NONE", "FAIL", "ERROR", "WARN", "IN #if DEBUG >= DLVL_DEVEL #define DEBUG_MSG(lvl, msg, ...) \ - if (Util::Config::printDebugLevel >= lvl){\ + if (Util::printDebugLevel >= lvl){\ fprintf(stderr, "%s|%s|%d|%s:%d|%s|" msg "\n", DBG_LVL_LIST[lvl], program_invocation_short_name, \ - getpid(), __FILE__, __LINE__, Util::Config::streamName.c_str(), ##__VA_ARGS__); \ + getpid(), __FILE__, __LINE__, Util::streamName.c_str(), ##__VA_ARGS__); \ } #else #define DEBUG_MSG(lvl, msg, ...) \ - if (Util::Config::printDebugLevel >= lvl){\ + if (Util::printDebugLevel >= lvl){\ fprintf(stderr, "%s|%s|%d||%s|" msg "\n", DBG_LVL_LIST[lvl], program_invocation_short_name, \ - getpid(), Util::Config::streamName.c_str(), ##__VA_ARGS__); \ + getpid(), Util::streamName.c_str(), ##__VA_ARGS__); \ } #endif #else #if DEBUG >= DLVL_DEVEL #define DEBUG_MSG(lvl, msg, ...) \ - if (Util::Config::printDebugLevel >= lvl){\ + if (Util::printDebugLevel >= lvl){\ fprintf(stderr, "%s|MistProcess|%d|%s:%d|%s|" msg "\n", DBG_LVL_LIST[lvl], getpid(), __FILE__, \ - __LINE__, Util::Config::streamName.c_str(), ##__VA_ARGS__); \ + __LINE__, Util::streamName.c_str(), ##__VA_ARGS__); \ } #else #define DEBUG_MSG(lvl, msg, ...) \ - if (Util::Config::printDebugLevel >= lvl){\ + if (Util::printDebugLevel >= lvl){\ fprintf(stderr, "%s|MistProcess|%d||%s|" msg "\n", DBG_LVL_LIST[lvl], getpid(), \ - Util::Config::streamName.c_str(), ##__VA_ARGS__); \ + Util::streamName.c_str(), ##__VA_ARGS__); \ } #endif #endif diff --git a/lib/dtls_srtp_handshake.cpp b/lib/dtls_srtp_handshake.cpp index 0c8e9e53..ea092d13 100644 --- a/lib/dtls_srtp_handshake.cpp +++ b/lib/dtls_srtp_handshake.cpp @@ -1,6 +1,7 @@ #include "defines.h" #include "dtls_srtp_handshake.h" #include +#include /* Write mbedtls into a log file. */ #define LOG_TO_FILE 0 diff --git a/lib/http_parser.cpp b/lib/http_parser.cpp index 6fb277ce..d8c7a259 100644 --- a/lib/http_parser.cpp +++ b/lib/http_parser.cpp @@ -8,6 +8,7 @@ #include "timing.h" #include "url.h" #include "util.h" +#include "json.h" #include #include diff --git a/lib/procs.cpp b/lib/procs.cpp index 08557f82..1374cc3b 100644 --- a/lib/procs.cpp +++ b/lib/procs.cpp @@ -13,6 +13,7 @@ #include #endif #include "timing.h" +#include "json.h" #include #include #include diff --git a/lib/riff.cpp b/lib/riff.cpp index cb06df96..d576ec23 100644 --- a/lib/riff.cpp +++ b/lib/riff.cpp @@ -1,4 +1,5 @@ #include "riff.h" +#include namespace RIFF{ diff --git a/lib/riff.h b/lib/riff.h index 23092d34..9c4288ea 100644 --- a/lib/riff.h +++ b/lib/riff.h @@ -2,6 +2,7 @@ #include "bitfields.h" #include "defines.h" #include +#include namespace RIFF{ diff --git a/lib/shared_memory.cpp b/lib/shared_memory.cpp index cfaef807..54200e02 100644 --- a/lib/shared_memory.cpp +++ b/lib/shared_memory.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #if defined(__CYGWIN__) || defined(_WIN32) diff --git a/lib/shared_memory.h b/lib/shared_memory.h index 5be61915..502db889 100644 --- a/lib/shared_memory.h +++ b/lib/shared_memory.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include "defines.h" #include "timing.h" diff --git a/lib/socket.cpp b/lib/socket.cpp index 8ce1db4b..e6c99dfd 100644 --- a/lib/socket.cpp +++ b/lib/socket.cpp @@ -5,6 +5,7 @@ #include "defines.h" #include "socket.h" #include "timing.h" +#include "json.h" #include #include #include @@ -114,7 +115,7 @@ bool Socket::isLocal(const std::string &remotehost){ /// Helper function that matches two binary-format IPv6 addresses with prefix bits of prefix. bool Socket::matchIPv6Addr(const std::string &A, const std::string &B, uint8_t prefix){ if (!prefix){prefix = 128;} - if (Util::Config::printDebugLevel >= DLVL_MEDIUM){ + if (Util::printDebugLevel >= DLVL_MEDIUM){ std::string Astr, Bstr; Socket::hostBytesToStr(A.data(), 16, Astr); Socket::hostBytesToStr(B.data(), 16, Bstr); @@ -1572,17 +1573,56 @@ Socket::UDPConnection::UDPConnection(bool nonblock){ sock = socket(AF_INET, SOCK_DGRAM, 0); family = AF_INET; } - if (sock == -1){FAIL_MSG("Could not create UDP socket: %s", strerror(errno));} + if (sock == -1){ + FAIL_MSG("Could not create UDP socket: %s", strerror(errno)); + }else{ + if (nonblock){setBlocking(!nonblock);} + checkRecvBuf(); + } up = 0; down = 0; destAddr = 0; destAddr_size = 0; - data = 0; - data_size = 0; - data_len = 0; - if (nonblock){setBlocking(!nonblock);} + data.allocate(2048); }// Socket::UDPConnection UDP Contructor +///Checks if the UDP receive buffer is at least 1 mbyte, attempts to increase and warns user through log message on failure. +void Socket::UDPConnection::checkRecvBuf(){ + if (sock == -1){return;} + int recvbuf = 0; + int origbuf = 0; + socklen_t slen = sizeof(recvbuf); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, &slen); + origbuf = recvbuf; + if (recvbuf < 1024*1024){ + recvbuf = 1024*1024; + setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, sizeof(recvbuf)); + slen = sizeof(recvbuf); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, &slen); + if (recvbuf < 1024*1024){ + recvbuf = 1024*1024; + setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, (void*)&recvbuf, sizeof(recvbuf)); + slen = sizeof(recvbuf); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, &slen); + } + if (recvbuf < 200*1024){ + recvbuf = 200*1024; + setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, sizeof(recvbuf)); + slen = sizeof(recvbuf); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, &slen); + if (recvbuf < 200*1024){ + recvbuf = 200*1024; + setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, (void*)&recvbuf, sizeof(recvbuf)); + slen = sizeof(recvbuf); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&recvbuf, &slen); + } + } + if (recvbuf < 200*1024){ + WARN_MSG("Your UDP receive buffer is set < 200 kbyte (%db) and the kernel denied our request for an increase. It's recommended to set your net.core.rmem_max setting to at least 200 kbyte for best results.", origbuf); + } + } +} + /// Copies a UDP socket, re-allocating local copies of any needed structures. /// The data/data_size/data_len variables are *not* copied over. Socket::UDPConnection::UDPConnection(const UDPConnection &o){ @@ -1594,6 +1634,7 @@ Socket::UDPConnection::UDPConnection(const UDPConnection &o){ family = AF_INET; } if (sock == -1){FAIL_MSG("Could not create UDP socket: %s", strerror(errno));} + checkRecvBuf(); up = 0; down = 0; if (o.destAddr && o.destAddr_size){ @@ -1604,13 +1645,7 @@ Socket::UDPConnection::UDPConnection(const UDPConnection &o){ destAddr = 0; destAddr_size = 0; } - data = (char *)malloc(1024); - if (data){ - data_size = 1024; - }else{ - data_size = 0; - } - data_len = 0; + data.allocate(2048); } /// Close the UDP socket @@ -1629,10 +1664,6 @@ Socket::UDPConnection::~UDPConnection(){ free(destAddr); destAddr = 0; } - if (data){ - free(data); - data = 0; - } } /// Stores the properties of the receiving end of this UDP socket. @@ -1674,6 +1705,7 @@ void Socket::UDPConnection::SetDestination(std::string destIp, uint32_t port){ close(); family = rp->ai_family; sock = socket(family, SOCK_DGRAM, 0); + checkRecvBuf(); if (boundPort){ INFO_MSG("Rebinding to %s:%d %s", boundAddr.c_str(), boundPort, boundMulti.c_str()); bind(boundPort, boundAddr, boundMulti); @@ -1815,6 +1847,7 @@ uint16_t Socket::UDPConnection::bind(int port, std::string iface, const std::str for (rp = addr_result; rp != NULL; rp = rp->ai_next){ sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (sock == -1){continue;} + checkRecvBuf(); char human_addr[INET6_ADDRSTRLEN]; char human_port[16]; getnameinfo(rp->ai_addr, rp->ai_addrlen, human_addr, INET6_ADDRSTRLEN, human_port, 16, @@ -1964,36 +1997,23 @@ uint16_t Socket::UDPConnection::bind(int port, std::string iface, const std::str bool Socket::UDPConnection::Receive(){ if (sock == -1){return false;} #ifdef __CYGWIN__ - if (data_size != SOCKETSIZE){ - data = (char *)realloc(data, SOCKETSIZE); - data_size = SOCKETSIZE; - } + data.allocate((SOCKETSIZE); #endif - int r = recvfrom(sock, data, data_size, MSG_PEEK | MSG_TRUNC | MSG_DONTWAIT, 0, 0); + data.truncate(0); + socklen_t destsize = destAddr_size; + int r = recvfrom(sock, data, data.rsize(), MSG_TRUNC | MSG_DONTWAIT, (sockaddr *)destAddr, &destsize); if (r == -1){ if (errno != EAGAIN){INFO_MSG("UDP receive: %d (%s)", errno, strerror(errno));} - data_len = 0; return false; } - if (data_size < (unsigned int)r){ - char *tmp = (char *)realloc(data, r); - if (tmp){ - data = tmp; - data_size = r; - }else{ - FAIL_MSG("Could not resize socket buffer to %d bytes!", r); - return false; - } + data.append(0, r); + down += r; + //Handle UDP packets that are too large + if (data.rsize() < (unsigned int)r){ + INFO_MSG("Doubling UDP socket buffer from %" PRIu32 " to %" PRIu32, data.rsize(), data.rsize()*2); + data.allocate(data.rsize()*2); } - socklen_t destsize = destAddr_size; - r = recvfrom(sock, data, data_size, 0, (sockaddr *)destAddr, &destsize); - if (r > 0){ - down += r; - data_len = r; - return true; - } - data_len = 0; - return false; + return (r > 0); } int Socket::UDPConnection::getSock(){ diff --git a/lib/socket.h b/lib/socket.h index ebc52595..108357c0 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -15,6 +15,7 @@ #include #include #include +#include "util.h" #ifdef SSL #include "mbedtls/ctr_drbg.h" @@ -195,14 +196,13 @@ namespace Socket{ unsigned int destAddr_size; ///< Size of the destination address pointer. unsigned int up; ///< Amount of bytes transferred up. unsigned int down; ///< Amount of bytes transferred down. - unsigned int data_size; ///< The size in bytes of the allocated space in the data pointer. int family; ///< Current socket address family std::string boundAddr, boundMulti; int boundPort; + void checkRecvBuf(); public: - char *data; ///< Holds the last received packet. - unsigned int data_len; ///< The size in bytes of the last received packet. + Util::ResizeablePointer data; UDPConnection(const UDPConnection &o); UDPConnection(bool nonblock = false); ~UDPConnection(); diff --git a/lib/srtp.cpp b/lib/srtp.cpp index 7f2c5fe6..117a094e 100644 --- a/lib/srtp.cpp +++ b/lib/srtp.cpp @@ -1,6 +1,7 @@ #include "defines.h" #include "srtp.h" #include +#include /* --------------------------------------- */ diff --git a/lib/srtp.h b/lib/srtp.h index e3575a1a..e92a44d9 100644 --- a/lib/srtp.h +++ b/lib/srtp.h @@ -3,6 +3,7 @@ #include #include #include +#include #define SRTP_PARSER_MASTER_KEY_LEN 16 #define SRTP_PARSER_MASTER_SALT_LEN 14 diff --git a/lib/stream.cpp b/lib/stream.cpp index 3428977c..275f8f58 100644 --- a/lib/stream.cpp +++ b/lib/stream.cpp @@ -407,8 +407,8 @@ bool Util::startInput(std::string streamname, std::string filename, bool forkFir (char *)filename.c_str()}; int argNum = 3; std::string debugLvl; - if (Util::Config::printDebugLevel != DEBUG && !str_args.count("--debug")){ - debugLvl = JSON::Value(Util::Config::printDebugLevel).asString(); + if (Util::printDebugLevel != DEBUG && !str_args.count("--debug")){ + debugLvl = JSON::Value(Util::printDebugLevel).asString(); argv[++argNum] = (char *)"--debug"; argv[++argNum] = (char *)debugLvl.c_str(); } @@ -563,7 +563,7 @@ pid_t Util::startPush(const std::string &streamname, std::string &target, int de // Set original target string in environment setenv("MST_ORIG_TARGET", target.c_str(), 1); //If no debug level set, default to level of starting process - if (debugLvl < 0){debugLvl = Util::Config::printDebugLevel;} + if (debugLvl < 0){debugLvl = Util::printDebugLevel;} // The target can hold variables like current time etc streamVariables(target, streamname); @@ -1285,7 +1285,7 @@ std::set Util::wouldSelect(const DTSC::Meta &M, const std::map= DLVL_MEDIUM){ + if (Util::printDebugLevel >= DLVL_MEDIUM){ // print the selected tracks std::stringstream selected; for (std::set::iterator it = result.begin(); it != result.end(); it++){ diff --git a/lib/stun.cpp b/lib/stun.cpp index f5878dab..10af5ef6 100644 --- a/lib/stun.cpp +++ b/lib/stun.cpp @@ -1,6 +1,7 @@ #include "checksum.h" // for crc32 #include "defines.h" #include "stun.h" +#include "socket.h" /* --------------------------------------- */ diff --git a/lib/triggers.cpp b/lib/triggers.cpp index 14a276d6..d206634b 100644 --- a/lib/triggers.cpp +++ b/lib/triggers.cpp @@ -24,6 +24,7 @@ #include "timing.h" #include "triggers.h" #include "util.h" +#include "json.h" #include //for strncmp namespace Triggers{ diff --git a/src/controller/controller.cpp b/src/controller/controller.cpp index 7de1210f..900bed63 100644 --- a/src/controller/controller.cpp +++ b/src/controller/controller.cpp @@ -265,7 +265,7 @@ int main_loop(int argc, char **argv){ } if (Controller::Storage.isMember("config") && Controller::Storage["config"].isMember("debug") && Controller::Storage["config"]["debug"].isInt()){ - Util::Config::printDebugLevel = Controller::Storage["config"]["debug"].asInt(); + Util::printDebugLevel = Controller::Storage["config"]["debug"].asInt(); } // check for port, interface and username in arguments // if they are not there, take them from config file, if there diff --git a/src/controller/controller_api.cpp b/src/controller/controller_api.cpp index e9155fe5..4b8ad984 100644 --- a/src/controller/controller_api.cpp +++ b/src/controller/controller_api.cpp @@ -443,8 +443,8 @@ void Controller::handleUDPAPI(void *np){ uSock.SetDestination(UDP_API_HOST, UDP_API_PORT); while (Controller::conf.is_active){ if (uSock.Receive()){ - MEDIUM_MSG("UDP API: %s", uSock.data); - JSON::Value Request = JSON::fromString(uSock.data, uSock.data_len); + MEDIUM_MSG("UDP API: %s", (const char*)uSock.data); + JSON::Value Request = JSON::fromString(uSock.data, uSock.data.size()); Request["minimal"] = true; JSON::Value Response; if (Request.isObject()){ @@ -454,7 +454,7 @@ void Controller::handleUDPAPI(void *np){ Response.removeMember("authorize"); uSock.SendNow(Response.toString()); }else{ - WARN_MSG("Invalid API command received over UDP: %s", uSock.data); + WARN_MSG("Invalid API command received over UDP: %s", (const char*)uSock.data); } }else{ Util::sleep(500); @@ -515,9 +515,9 @@ void Controller::handleAPICommands(JSON::Value &Request, JSON::Value &Response){ JSON::Value &out = Controller::Storage["config"]; if (in.isMember("debug")){ out["debug"] = in["debug"]; - if (Util::Config::printDebugLevel != (out["debug"].isInt() ? out["debug"].asInt() : DEBUG)){ - Util::Config::printDebugLevel = (out["debug"].isInt() ? out["debug"].asInt() : DEBUG); - INFO_MSG("Debug level set to %u", Util::Config::printDebugLevel); + if (Util::printDebugLevel != (out["debug"].isInt() ? out["debug"].asInt() : DEBUG)){ + Util::printDebugLevel = (out["debug"].isInt() ? out["debug"].asInt() : DEBUG); + INFO_MSG("Debug level set to %u", Util::printDebugLevel); } } if (in.isMember("protocols")){ diff --git a/src/controller/controller_connectors.cpp b/src/controller/controller_connectors.cpp index e5db39de..8f16ee6c 100644 --- a/src/controller/controller_connectors.cpp +++ b/src/controller/controller_connectors.cpp @@ -116,9 +116,9 @@ namespace Controller{ argarr[argnum++] = (char *)(p[it.key()].c_str()); }else{ if (it.key() == "debug"){ - if (Util::Config::printDebugLevel != DEBUG){ + if (Util::printDebugLevel != DEBUG){ static std::string debugLvlStr; - debugLvlStr = JSON::Value(Util::Config::printDebugLevel).asString(); + debugLvlStr = JSON::Value(Util::printDebugLevel).asString(); argarr[argnum++] = (char *)((*it)["option"].asStringRef().c_str()); argarr[argnum++] = (char *)debugLvlStr.c_str(); } diff --git a/src/input/input.cpp b/src/input/input.cpp index 1412fd88..15ef2e01 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -306,7 +306,7 @@ namespace Mist{ int Input::boot(int argc, char *argv[]){ if (!(config->parseArgs(argc, argv))){return 1;} streamName = config->getString("streamname"); - Util::Config::streamName = streamName; + Util::streamName = streamName; if (config->getBool("json")){ capa["version"] = PACKAGE_VERSION; diff --git a/src/input/input_rtsp.cpp b/src/input/input_rtsp.cpp index 2d69b487..71d9a554 100644 --- a/src/input/input_rtsp.cpp +++ b/src/input/input_rtsp.cpp @@ -373,8 +373,8 @@ namespace Mist{ // // wrong sending port, ignore packet // continue; //} - tcpCon.addDown(s.data_len); - RTP::Packet pack(s.data, s.data_len); + tcpCon.addDown(s.data.size()); + RTP::Packet pack(s.data, s.data.size()); if (!it->second.theirSSRC){it->second.theirSSRC = pack.getSSRC();} it->second.sorter.addPacket(pack); } diff --git a/src/input/input_ts.cpp b/src/input/input_ts.cpp index f0e58ba9..4ba2a703 100644 --- a/src/input/input_ts.cpp +++ b/src/input/input_ts.cpp @@ -512,7 +512,7 @@ namespace Mist{ std::string leftData; bool received = false; while (udpCon.Receive()){ - downCounter += udpCon.data_len; + downCounter += udpCon.data.size(); received = true; if (!gettingData){ gettingData = true; @@ -521,20 +521,20 @@ namespace Mist{ size_t offset = 0; // Try to read full TS Packets // Watch out! We push here to a global, in order for threads to be able to access it. - while (offset < udpCon.data_len){ + while (offset < udpCon.data.size()){ if (udpCon.data[offset] == 0x47){// check for sync byte - if (offset + 188 <= udpCon.data_len){ + if (offset + 188 <= udpCon.data.size()){ tsBuf.FromPointer(udpCon.data + offset); liveStream.add(tsBuf); if (!liveStream.isDataTrack(tsBuf.getPID())){liveStream.parse(tsBuf.getPID());} leftData.clear(); }else{ - leftData.append(udpCon.data + offset, udpCon.data_len - offset); + leftData.append(udpCon.data + offset, udpCon.data.size() - offset); } offset += 188; }else{ uint32_t maxBytes = - std::min((uint32_t)(188 - leftData.size()), (uint32_t)(udpCon.data_len - offset)); + std::min((uint32_t)(188 - leftData.size()), (uint32_t)(udpCon.data.size() - offset)); uint32_t numBytes = maxBytes; VERYHIGH_MSG("%" PRIu32 " bytes of non-sync-byte data received", numBytes); if (leftData.size()){ diff --git a/src/output/output.cpp b/src/output/output.cpp index 356dc46b..6f778475 100644 --- a/src/output/output.cpp +++ b/src/output/output.cpp @@ -80,7 +80,7 @@ namespace Mist{ // If we have a streamname option, set internal streamname to that option if (!streamName.size() && config->hasOption("streamname")){ streamName = config->getString("streamname"); - Util::Config::streamName = streamName; + Util::streamName = streamName; } /*LTS-START*/ @@ -321,7 +321,7 @@ namespace Mist{ JSON::Value strCnf = Util::getStreamConfig(streamName); if (strCnf && strCnf["fallback_stream"].asStringRef().size()){ streamName = strCnf["fallback_stream"].asStringRef(); - Util::Config::streamName = streamName; + Util::streamName = streamName; INFO_MSG("Switching to configured fallback stream '%s'", streamName.c_str()); reconnect(); return; @@ -352,7 +352,7 @@ namespace Mist{ newStrm.c_str()); std::string origStream = streamName; streamName = newStrm; - Util::Config::streamName = streamName; + Util::streamName = streamName; if (!Util::startInput(streamName, "", true, isPushing())){ onFail("Stream open failed (fallback stream for '" + origStream + "')", true); return; diff --git a/src/output/output_dtsc.cpp b/src/output/output_dtsc.cpp index 96f5aba3..a4235bdb 100644 --- a/src/output/output_dtsc.cpp +++ b/src/output/output_dtsc.cpp @@ -223,7 +223,7 @@ namespace Mist{ void OutDTSC::handlePlay(DTSC::Scan &dScan){ streamName = dScan.getMember("stream").asString(); Util::sanitizeName(streamName); - Util::Config::streamName = streamName; + Util::streamName = streamName; parseData = true; INFO_MSG("Handled play for stream %s", streamName.c_str()); setBlocking(false); @@ -233,7 +233,7 @@ namespace Mist{ streamName = dScan.getMember("stream").asString(); std::string passString = dScan.getMember("password").asString(); Util::sanitizeName(streamName); - Util::Config::streamName = streamName; + Util::streamName = streamName; if (!allowPush(passString)){ onFail("Push not allowed - stream and/or password incorrect", true); return; diff --git a/src/output/output_http.cpp b/src/output/output_http.cpp index 1b848073..42fcb607 100644 --- a/src/output/output_http.cpp +++ b/src/output/output_http.cpp @@ -397,7 +397,7 @@ namespace Mist{ int argnum = 0; argarr[argnum++] = (char *)tmparg.c_str(); std::string temphost = getConnectedHost(); - std::string debuglevel = JSON::Value(Util::Config::printDebugLevel).asString(); + std::string debuglevel = JSON::Value(Util::printDebugLevel).asString(); argarr[argnum++] = (char *)"--ip"; argarr[argnum++] = (char *)(temphost.c_str()); argarr[argnum++] = (char *)"--stream"; @@ -405,7 +405,7 @@ namespace Mist{ argarr[argnum++] = (char *)"--prequest"; argarr[argnum++] = (char *)(tmpPrequest.c_str()); // set the debug level if non-default - if (Util::Config::printDebugLevel != DEBUG){ + if (Util::printDebugLevel != DEBUG){ argarr[argnum++] = (char *)"--debug"; argarr[argnum++] = (char *)(debuglevel.c_str()); } diff --git a/src/output/output_http_internal.cpp b/src/output/output_http_internal.cpp index bc17bc24..867435bb 100644 --- a/src/output/output_http_internal.cpp +++ b/src/output/output_http_internal.cpp @@ -441,7 +441,7 @@ namespace Mist{ INFO_MSG("Falling back to default stream '%s' -> '%s'", defStrm.c_str(), newStrm.c_str()); origStreamName = streamName; streamName = newStrm; - Util::Config::streamName = streamName; + Util::streamName = streamName; reconnect(); return getStatusJSON(reqHost, useragent); } diff --git a/src/output/output_jpg.cpp b/src/output/output_jpg.cpp index 4259fc73..2a894a04 100644 --- a/src/output/output_jpg.cpp +++ b/src/output/output_jpg.cpp @@ -216,7 +216,7 @@ namespace Mist{ char ffcmd[256]; ffcmd[255] = 0; // ensure there is an ending null byte snprintf(ffcmd, 255, "ffmpeg %s -f h264 -i - %s -vframes 1 -f mjpeg -", - (Util::Config::printDebugLevel >= DLVL_MEDIUM ? "" : "-v quiet"), + (Util::printDebugLevel >= DLVL_MEDIUM ? "" : "-v quiet"), config->getString("ffopts").c_str()); HIGH_MSG("Starting JPG command: %s", ffcmd); diff --git a/src/output/output_rtmp.cpp b/src/output/output_rtmp.cpp index ab46b17e..78709c20 100644 --- a/src/output/output_rtmp.cpp +++ b/src/output/output_rtmp.cpp @@ -828,11 +828,11 @@ namespace Mist{ if (streamName.find('?') != std::string::npos){ std::string tmpVars = streamName.substr(streamName.find('?') + 1); streamName = streamName.substr(0, streamName.find('?')); - Util::Config::streamName = streamName; + Util::streamName = streamName; HTTP::parseVars(tmpVars, targetParams); } - Util::Config::streamName = streamName; + Util::streamName = streamName; reqUrl += "/" + streamName; // LTS /*LTS-START*/ @@ -850,17 +850,17 @@ namespace Mist{ size_t lSlash = newUrl.rfind('/'); if (lSlash != std::string::npos){ streamName = newUrl.substr(lSlash + 1); - Util::Config::streamName = streamName; + Util::streamName = streamName; }else{ streamName = newUrl; - Util::Config::streamName = streamName; + Util::streamName = streamName; } } /*LTS-END*/ if (streamName.find('/')){ streamName = streamName.substr(0, streamName.find('/')); - Util::Config::streamName = streamName; + Util::streamName = streamName; } size_t colonPos = streamName.find(':'); @@ -871,7 +871,7 @@ namespace Mist{ }else{ streamName = oldName.substr(colonPos + 1) + std::string(".") + oldName.substr(0, colonPos); } - Util::Config::streamName = streamName; + Util::streamName = streamName; } Util::sanitizeName(streamName); @@ -922,14 +922,14 @@ namespace Mist{ int8_t playMessageType = messageType; int32_t playStreamId = streamId; streamName = Encodings::URL::decode(amfData.getContentP(3)->StrValue()); - Util::Config::streamName = streamName; + Util::streamName = streamName; reqUrl += "/" + streamName; // LTS // handle variables if (streamName.find('?') != std::string::npos){ std::string tmpVars = streamName.substr(streamName.find('?') + 1); streamName = streamName.substr(0, streamName.find('?')); - Util::Config::streamName = streamName; + Util::streamName = streamName; HTTP::parseVars(tmpVars, targetParams); } @@ -941,7 +941,7 @@ namespace Mist{ }else{ streamName = oldName.substr(colonPos + 1) + std::string(".") + oldName.substr(0, colonPos); } - Util::Config::streamName = streamName; + Util::streamName = streamName; } Util::sanitizeName(streamName); diff --git a/src/output/output_rtsp.cpp b/src/output/output_rtsp.cpp index 2d1bd91d..1f4d6f39 100644 --- a/src/output/output_rtsp.cpp +++ b/src/output/output_rtsp.cpp @@ -485,8 +485,8 @@ namespace Mist{ continue; } lastRecv = Util::bootSecs(); // prevent disconnect of idle TCP connection when using UDP - myConn.addDown(s.data_len); - RTP::Packet pack(s.data, s.data_len); + myConn.addDown(s.data.size()); + RTP::Packet pack(s.data, s.data.size()); if (!it->second.theirSSRC){it->second.theirSSRC = pack.getSSRC();} it->second.sorter.addPacket(pack); } diff --git a/src/output/output_webrtc.cpp b/src/output/output_webrtc.cpp index d8784233..6b7a1fc6 100644 --- a/src/output/output_webrtc.cpp +++ b/src/output/output_webrtc.cpp @@ -910,7 +910,7 @@ namespace Mist{ bool hadPack = false; while (udp.Receive()){ hadPack = true; - myConn.addDown(udp.data_len); + myConn.addDown(udp.data.size()); uint8_t fb = (uint8_t)udp.data[0]; @@ -936,7 +936,7 @@ namespace Mist{ size_t nparsed = 0; StunMessage stun_msg; - if (stunReader.parse((uint8_t *)udp.data, udp.data_len, nparsed, stun_msg) != 0){ + if (stunReader.parse((uint8_t *)(char*)udp.data, udp.data.size(), nparsed, stun_msg) != 0){ FAIL_MSG("Failed to parse a stun message."); return; } @@ -1006,7 +1006,7 @@ namespace Mist{ return; } - if (dtlsHandshake.parse((const uint8_t *)udp.data, udp.data_len) != 0){ + if (dtlsHandshake.parse((const uint8_t *)(const char*)udp.data, udp.data.size()) != 0){ FAIL_MSG("Failed to parse a DTLS packet."); return; } @@ -1049,7 +1049,7 @@ namespace Mist{ if ((pt < 64) || (pt >= 96)){ - RTP::Packet rtp_pkt((const char *)udp.data, (unsigned int)udp.data_len); + RTP::Packet rtp_pkt((const char *)udp.data, (unsigned int)udp.data.size()); uint16_t currSeqNum = rtp_pkt.getSequence(); size_t idx = M.trackIDToIndex(rtp_pkt.getPayloadType(), getpid()); @@ -1071,8 +1071,8 @@ namespace Mist{ WebRTCTrack &rtcTrack = webrtcTracks[idx]; // Decrypt the SRTP to RTP - int len = (int)udp.data_len; - if (srtpReader.unprotectRtp((uint8_t *)udp.data, &len) != 0){ + int len = udp.data.size(); + if (srtpReader.unprotectRtp((uint8_t *)(char*)udp.data, &len) != 0){ if (packetLog.is_open()){packetLog << "[" << Util::bootMS() << "]" << "RTP decrypt failure" << std::endl;} FAIL_MSG("Failed to unprotect a RTP packet."); return; @@ -1102,8 +1102,8 @@ namespace Mist{ }else{ //Decrypt feedback packet - int len = udp.data_len; - if (srtpReader.unprotectRtcp((uint8_t *)udp.data, &len) != 0){ + int len = udp.data.size(); + if (srtpReader.unprotectRtcp((uint8_t *)(char*)udp.data, &len) != 0){ if (packetLog.is_open()){packetLog << "[" << Util::bootMS() << "]" << "RTCP decrypt failure" << std::endl;} FAIL_MSG("Failed to unprotect RTCP."); return; diff --git a/src/process/process_exec.h b/src/process/process_exec.h index ae806e40..17acb831 100644 --- a/src/process/process_exec.h +++ b/src/process/process_exec.h @@ -46,7 +46,7 @@ namespace Mist{ streamName = opt["sink"].asString(); if (!streamName.size()){streamName = opt["source"].asString();} Util::streamVariables(streamName, opt["source"].asString()); - Util::Config::streamName = opt["source"].asString() + "→" + streamName; + Util::streamName = opt["source"].asString() + "→" + streamName; } bool needsLock(){return false;} bool isSingular(){return false;} diff --git a/src/process/process_ffmpeg.cpp b/src/process/process_ffmpeg.cpp index 4f95e332..44b42524 100644 --- a/src/process/process_ffmpeg.cpp +++ b/src/process/process_ffmpeg.cpp @@ -389,7 +389,7 @@ namespace Mist{ streamName = opt["sink"].asString(); if (!streamName.size()){streamName = opt["source"].asString();} Util::streamVariables(streamName, opt["source"].asString()); - Util::Config::streamName = opt["source"].asString() + "→" + streamName; + Util::streamName = opt["source"].asString() + "→" + streamName; } std::string EncodeOutputEBML::getTrackType(int tid){return M.getType(tid);} diff --git a/src/process/process_livepeer.cpp b/src/process/process_livepeer.cpp index 4ec8ab3e..21fb8896 100644 --- a/src/process/process_livepeer.cpp +++ b/src/process/process_livepeer.cpp @@ -227,7 +227,7 @@ namespace Mist{ streamName = opt["sink"].asString(); if (!streamName.size()){streamName = opt["source"].asString();} Util::streamVariables(streamName, opt["source"].asString()); - Util::Config::streamName = opt["source"].asString() + "→" + streamName; + Util::streamName = opt["source"].asString() + "→" + streamName; preRun(); }; virtual bool needsLock(){return false;} diff --git a/test/urireader.cpp b/test/urireader.cpp index 62b60398..f66b2026 100644 --- a/test/urireader.cpp +++ b/test/urireader.cpp @@ -1,4 +1,5 @@ #include "../lib/urireader.cpp" +#include "../lib/config.cpp" #include class URITest : public Util::DataCallback{