Embedding of flash players

This commit is contained in:
Erik Zandvliet 2016-01-26 14:14:12 +01:00
parent 78d69673f3
commit 3c48a6c03c
9 changed files with 48618 additions and 7 deletions

View file

@ -286,7 +286,7 @@ void HTTP::Parser::SetBody(std::string s) {
/// Function that sets the body of a response or request, along with the correct Content-Length header. /// Function that sets the body of a response or request, along with the correct Content-Length header.
/// \param buffer The buffer data to set the body to. /// \param buffer The buffer data to set the body to.
/// \param len Length of the buffer data. /// \param len Length of the buffer data.
void HTTP::Parser::SetBody(char * buffer, int len) { void HTTP::Parser::SetBody(const char * buffer, int len) {
body = ""; body = "";
body.append(buffer, len); body.append(buffer, len);
SetHeader("Content-Length", len); SetHeader("Content-Length", len);

View file

@ -24,7 +24,7 @@ namespace HTTP {
void setCORSHeaders(); void setCORSHeaders();
void SetVar(std::string i, std::string v); void SetVar(std::string i, std::string v);
void SetBody(std::string s); void SetBody(std::string s);
void SetBody(char * buffer, int len); void SetBody(const char * buffer, int len);
std::string & BuildRequest(); std::string & BuildRequest();
std::string & BuildResponse(); std::string & BuildResponse();
std::string & BuildResponse(std::string code, std::string message); std::string & BuildResponse(std::string code, std::string message);

View file

@ -152,12 +152,15 @@ function mistembed(streamname) {
var flashplayer, var flashplayer,
url = encodeURIComponent(src.url) + '&controlBarMode=floating&initialBufferTime=0.5&expandedBufferTime=5&minContinuousPlaybackTime=3' + (vtype == 'live' ? "&streamType=live" : "") + (autoplay ? '&autoPlay=true' : ''); url = encodeURIComponent(src.url) + '&controlBarMode=floating&initialBufferTime=0.5&expandedBufferTime=5&minContinuousPlaybackTime=3' + (vtype == 'live' ? "&streamType=live" : "") + (autoplay ? '&autoPlay=true' : '');
/*
if( parseInt(maintype[1], 10) >= 10 ) { if( parseInt(maintype[1], 10) >= 10 ) {
flashplayer = 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback_101.swf'; flashplayer = 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback_101.swf';
} }
else { else {
flashplayer = 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf'; flashplayer = 'http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf';
} }
*/
flashplayer = src.player_url;
container.innerHTML += '<object width="' + videowidth + '" height="' + videoheight + '">' + container.innerHTML += '<object width="' + videowidth + '" height="' + videoheight + '">' +
'<param name="movie" value="' + flashplayer + '"></param>' + '<param name="movie" value="' + flashplayer + '"></param>' +
@ -297,4 +300,5 @@ function mistembed(streamname) {
} }
return (mistvideo[streamname].embedded ? mistvideo[streamname].embedded.type : false); return (mistvideo[streamname].embedded ? mistvideo[streamname].embedded.type : false);
//keep empty line at end of file
} }

24308
src/output/flashPlayer.h Normal file

File diff suppressed because it is too large Load diff

24270
src/output/oldFlashPlayer.h Normal file

File diff suppressed because it is too large Load diff

View file

@ -160,6 +160,7 @@ namespace Mist {
capa["methods"][0u]["handler"] = "http"; capa["methods"][0u]["handler"] = "http";
capa["methods"][0u]["type"] = "flash/11"; capa["methods"][0u]["type"] = "flash/11";
capa["methods"][0u]["priority"] = 7ll; capa["methods"][0u]["priority"] = 7ll;
capa["methods"][0u]["player_url"] = "/flashplayer.swf";
} }
void OutHDS::sendNext(){ void OutHDS::sendNext(){

View file

@ -1,6 +1,8 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "output_http_internal.h" #include "output_http_internal.h"
#include <mist/stream.h> #include <mist/stream.h>
#include "flashPlayer.h"
#include "oldFlashPlayer.h"
namespace Mist { namespace Mist {
OutHTTP::OutHTTP(Socket::Connection & conn) : HTTPOutput(conn){ OutHTTP::OutHTTP(Socket::Connection & conn) : HTTPOutput(conn){
@ -49,6 +51,8 @@ namespace Mist {
capa["url_match"].append("/info_$.js"); capa["url_match"].append("/info_$.js");
capa["url_match"].append("/json_$.js"); capa["url_match"].append("/json_$.js");
capa["url_match"].append("/embed_$.js"); capa["url_match"].append("/embed_$.js");
capa["url_match"].append("/flashplayer.swf");
capa["url_match"].append("/oldflashplayer.swf");
cfg->addConnectorOptions(8080, capa); cfg->addConnectorOptions(8080, capa);
} }
@ -87,18 +91,22 @@ namespace Mist {
} }
}; };
void addSource(const std::string & rel, std::set<JSON::Value, sourceCompare> & sources, std::string & host, const std::string & port, JSON::Value & conncapa, unsigned int most_simul, unsigned int total_matches){ void addSource(const std::string & rel, std::set<JSON::Value, sourceCompare> & sources, std::string & host, const std::string & port, JSON::Value & conncapa, unsigned int most_simul, unsigned int total_matches, const std::string & flvPlayerPrefix){
JSON::Value tmp; JSON::Value tmp;
tmp["type"] = conncapa["type"]; tmp["type"] = conncapa["type"];
tmp["relurl"] = rel; tmp["relurl"] = rel;
tmp["priority"] = conncapa["priority"]; tmp["priority"] = conncapa["priority"];
if (conncapa.isMember("player_url")){
tmp["player_url"] = flvPlayerPrefix + conncapa["player_url"].asStringRef();
}
tmp["simul_tracks"] = most_simul; tmp["simul_tracks"] = most_simul;
tmp["total_matches"] = total_matches; tmp["total_matches"] = total_matches;
tmp["url"] = conncapa["handler"].asStringRef() + "://" + host + ":" + port + rel; tmp["url"] = conncapa["handler"].asStringRef() + "://" + host + ":" + port + rel;
sources.insert(tmp); sources.insert(tmp);
} }
void addSources(std::string & streamname, const std::string & rel, std::set<JSON::Value, sourceCompare> & sources, std::string & host, const std::string & port, JSON::Value & conncapa, JSON::Value & strmMeta){
void addSources(std::string & streamname, const std::string & rel, std::set<JSON::Value, sourceCompare> & sources, std::string & host, const std::string & port, JSON::Value & conncapa, JSON::Value & strmMeta, const std::string httpHost){
unsigned int most_simul = 0; unsigned int most_simul = 0;
unsigned int total_matches = 0; unsigned int total_matches = 0;
if (conncapa.isMember("codecs") && conncapa["codecs"].size() > 0){ if (conncapa.isMember("codecs") && conncapa["codecs"].size() > 0){
@ -137,7 +145,7 @@ namespace Mist {
} }
jsonForEach(conncapa["methods"], it) { jsonForEach(conncapa["methods"], it) {
if (!strmMeta.isMember("live") || !it->isMember("nolive")){ if (!strmMeta.isMember("live") || !it->isMember("nolive")){
addSource(relurl, sources, host, port, *it, most_simul, total_matches); addSource(relurl, sources, host, port, *it, most_simul, total_matches, "http://" + httpHost);
} }
} }
} }
@ -164,6 +172,23 @@ namespace Mist {
return; return;
} //clientaccesspolicy.xml } //clientaccesspolicy.xml
if (H.url == "/flashplayer.swf"){
H.Clean();
H.SetHeader("Content-Type", "application/x-shockwave-flash");
H.SetHeader("Server", "MistServer/" PACKAGE_VERSION);
H.SetBody((const char*)FlashMediaPlayback_101_swf, FlashMediaPlayback_101_swf_len);
H.SendResponse("200", "OK", myConn);
return;
}
if (H.url == "/oldflashplayer.swf"){
H.Clean();
H.SetHeader("Content-Type", "application/x-shockwave-flash");
H.SetHeader("Server", "MistServer/" PACKAGE_VERSION);
H.SetBody((const char *)FlashMediaPlayback_swf, FlashMediaPlayback_swf_len);
H.SendResponse("200", "OK", myConn);
return;
}
// send logo icon // send logo icon
if (H.url.length() > 4 && H.url.substr(H.url.length() - 4, 4) == ".ico"){ if (H.url.length() > 4 && H.url.substr(H.url.length() - 4, 4) == ".ico"){
H.Clean(); H.Clean();
@ -240,6 +265,7 @@ namespace Mist {
} }
if ((H.url.length() > 9 && H.url.substr(0, 6) == "/info_" && H.url.substr(H.url.length() - 3, 3) == ".js") || (H.url.length() > 10 && H.url.substr(0, 7) == "/embed_" && H.url.substr(H.url.length() - 3, 3) == ".js") || (H.url.length() > 9 && H.url.substr(0, 6) == "/json_" && H.url.substr(H.url.length() - 3, 3) == ".js")){ if ((H.url.length() > 9 && H.url.substr(0, 6) == "/info_" && H.url.substr(H.url.length() - 3, 3) == ".js") || (H.url.length() > 10 && H.url.substr(0, 7) == "/embed_" && H.url.substr(H.url.length() - 3, 3) == ".js") || (H.url.length() > 9 && H.url.substr(0, 6) == "/json_" && H.url.substr(H.url.length() - 3, 3) == ".js")){
std::string fullHost = H.GetHeader("Host");
std::string response; std::string response;
std::string rURL = H.url; std::string rURL = H.url;
std::string host = H.GetHeader("Host"); std::string host = H.GetHeader("Host");
@ -336,7 +362,7 @@ namespace Mist {
//and a URL - then list the URL //and a URL - then list the URL
if (capa.getMember("url_rel")){ if (capa.getMember("url_rel")){
JSON::Value capa_json = capa.asJSON(); JSON::Value capa_json = capa.asJSON();
addSources(streamName, capa.getMember("url_rel").asString(), sources, host, port, capa_json, json_resp["meta"]); addSources(streamName, capa.getMember("url_rel").asString(), sources, host, port, capa_json, json_resp["meta"], fullHost);
} }
//check each enabled protocol separately to see if it depends on this connector //check each enabled protocol separately to see if it depends on this connector
DTSC::Scan capa_lst = DTSC::Scan(serverCfg.mapped, serverCfg.len).getMember("capabilities").getMember("connectors"); DTSC::Scan capa_lst = DTSC::Scan(serverCfg.mapped, serverCfg.len).getMember("capabilities").getMember("connectors");
@ -345,7 +371,7 @@ namespace Mist {
//if it depends on this connector and has a URL, list it //if it depends on this connector and has a URL, list it
if (conns.count(capa_lst.getIndiceName(j)) && (capa_lst.getIndice(j).getMember("deps").asString() == cName || capa_lst.getIndice(j).getMember("deps").asString() + ".exe" == cName) && capa_lst.getIndice(j).getMember("methods")){ if (conns.count(capa_lst.getIndiceName(j)) && (capa_lst.getIndice(j).getMember("deps").asString() == cName || capa_lst.getIndice(j).getMember("deps").asString() + ".exe" == cName) && capa_lst.getIndice(j).getMember("methods")){
JSON::Value capa_json = capa_lst.getIndice(j).asJSON(); JSON::Value capa_json = capa_lst.getIndice(j).asJSON();
addSources(streamName, capa_lst.getIndice(j).getMember("url_rel").asString(), sources, host, port, capa_json, json_resp["meta"]); addSources(streamName, capa_lst.getIndice(j).getMember("url_rel").asString(), sources, host, port, capa_json, json_resp["meta"], fullHost);
} }
} }
} }

View file

@ -28,6 +28,7 @@ namespace Mist {
capa["methods"][0u]["handler"] = "http"; capa["methods"][0u]["handler"] = "http";
capa["methods"][0u]["type"] = "flash/7"; capa["methods"][0u]["type"] = "flash/7";
capa["methods"][0u]["priority"] = 5ll; capa["methods"][0u]["priority"] = 5ll;
capa["methods"][0u]["player_url"] = "/oldflashplayer.swf";
} }
void OutProgressiveFLV::sendNext(){ void OutProgressiveFLV::sendNext(){

View file

@ -115,6 +115,7 @@ namespace Mist {
capa["methods"][0u]["handler"] = "rtmp"; capa["methods"][0u]["handler"] = "rtmp";
capa["methods"][0u]["type"] = "flash/10"; capa["methods"][0u]["type"] = "flash/10";
capa["methods"][0u]["priority"] = 6ll; capa["methods"][0u]["priority"] = 6ll;
capa["methods"][0u]["player_url"] = "/flashplayer.swf";
cfg->addConnectorOptions(1935, capa); cfg->addConnectorOptions(1935, capa);
config = cfg; config = cfg;
} }