From f538bd0d93bcb82546bdb729903580886be3c825 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 20 Jun 2014 19:58:05 +0200 Subject: [PATCH] smil support by Oswald de Bruin --- src/connectors/conn_http.cpp | 51 +++++++++++++++++++++++++++++ src/output/output_rtmp.cpp | 63 ++++++++++++++++++++++++++++++++++++ src/output/output_rtmp.h | 1 + 3 files changed, 115 insertions(+) diff --git a/src/connectors/conn_http.cpp b/src/connectors/conn_http.cpp index 829ec1b0..134b75ae 100644 --- a/src/connectors/conn_http.cpp +++ b/src/connectors/conn_http.cpp @@ -309,6 +309,54 @@ namespace Connector_HTTP { return ret; } + // send smil MBR index + if (url.length() > 6 && url.substr(url.length() - 5, 5) == ".smil"){ + std::string streamname = url.substr(1, url.length() - 6); + Util::Stream::sanitizeName(streamname); + JSON::Value ServConf = JSON::fromFile(Util::getTmpFolder() + "streamlist"); + + std::string host = H.GetHeader("Host"); + if (host.find(':')){ + host.resize(host.find(':')); + } + + std::string port, url_rel; + + for (JSON::ArrIter it = ServConf["config"]["protocols"].ArrBegin(); it != ServConf["config"]["protocols"].ArrEnd(); it++){ + const std::string & cName = ( *it)["connector"].asStringRef(); + if (cName != "RTMP"){continue;} + //if we have the RTMP port, + if (capabilities.isMember(cName) && capabilities[cName].isMember("optional") && capabilities[cName]["optional"].isMember("port")){ + //get the default port if none is set + if (( *it)["port"].asInt() == 0){ + port = capabilities[cName]["optional"]["port"]["default"].asString(); + } + //extract url + if (capabilities[cName].isMember("url_rel")){ + url_rel = capabilities[cName]["url_rel"].asString(); + if (url_rel.find('$')){ + url_rel.resize(url_rel.find('$')); + } + } + } + } + + std::string trackSources;//this string contains all track sources for MBR smil + for (JSON::ObjIter it = ServConf["streams"][streamname]["meta"]["tracks"].ObjBegin(); it != ServConf["streams"][streamname]["meta"]["tracks"].ObjEnd(); it++){//for all tracks + if (it->second.isMember("type") && it->second["type"].asString() == "video"){ + trackSources += "