Added more ISO639 support (2-letter codes and conversions), improved audio/video/subtitle selection through HTTP connectors

This commit is contained in:
Thulinma 2017-11-17 11:26:03 +01:00
parent e09cd5308e
commit 307d14f901
7 changed files with 1332 additions and 607 deletions

View file

@ -20,6 +20,7 @@
#include <sys/socket.h>
#include <netdb.h>
#include <sys/stat.h>
#include <mist/langcodes.h>
/*LTS-END*/
namespace Mist{
@ -392,11 +393,81 @@ namespace Mist{
}
}
/*LTS-START*/
/// Selects a specific track or set of tracks of the given trackType, using trackVal to decide.
/// trackVal may be a comma-separated list of numbers, codecs or the word "all" or an asterisk.
/// Does not do any checks if the protocol supports these tracks, just selects blindly.
/// It is necessary to follow up with a selectDefaultTracks() call to strip unsupported codecs/combinations.
void Output::selectTrack(const std::string &trackType, const std::string &trackVal){
if (!trackVal.size() || trackVal == "0"){return;}//don't select anything in particular
if (trackVal.find(',') != std::string::npos){
//Comma-separated list, recurse.
std::stringstream ss(trackVal);
std::string item;
while (std::getline(ss, item, ',')){selectTrack(trackType, item);}
return;
}
long long trackNo = JSON::Value(trackVal).asInt();
if (trackVal == JSON::Value(trackNo).asString()){
//It's an integer number
if (!myMeta.tracks.count(trackNo)){
WARN_MSG("Track %lld does not exist in stream, cannot select", trackNo);
return;
}
const DTSC::Track & Trk = myMeta.tracks[trackNo];
if (Trk.type != trackType && Trk.codec != trackType){
WARN_MSG("Track %lld is not %s (%s/%s), cannot select", trackNo, trackType.c_str(), Trk.type.c_str(), Trk.codec.c_str());
return;
}
INFO_MSG("Selecting %s track %lld (%s/%s)", trackType.c_str(), trackNo, Trk.type.c_str(), Trk.codec.c_str());
selectedTracks.insert(trackNo);
return;
}
std::string trackLow = trackVal;
Util::stringToLower(trackLow);
if (trackLow == "all" || trackLow == "*"){
//select all tracks of this type
for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){
const DTSC::Track & Trk = it->second;
if (Trk.type == trackType || Trk.codec == trackType){
selectedTracks.insert(it->first);
INFO_MSG("Selecting %s track %lu (%s/%s)", trackType.c_str(), it->first, Trk.type.c_str(), Trk.codec.c_str());
}
}
return;
}
//attempt to do language/codec matching
//convert 2-character language codes into 3-character language codes
if (trackLow.size() == 2){trackLow = Encodings::ISO639::twoToThree(trackLow);}
for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){
const DTSC::Track & Trk = it->second;
if (Trk.type == trackType || Trk.codec == trackType){
std::string codecLow = Trk.codec;
Util::stringToLower(codecLow);
if (Trk.lang == trackLow || trackLow == codecLow){
selectedTracks.insert(it->first);
INFO_MSG("Selecting %s track %lu (%s/%s)", trackType.c_str(), it->first, Trk.type.c_str(), Trk.codec.c_str());
}
}
}
}
/*LTS-END*/
void Output::selectDefaultTracks(){
if (!isInitialized){
initialize();
return;
if (!isInitialized){return;}
}
//First, wipe the existing selections, if any.
selectedTracks.clear();
/*LTS-START*/
//Then, select the tracks we've been asked to select.
if (targetParams.count("audio")){selectTrack("audio", targetParams["audio"]);}
if (targetParams.count("video")){selectTrack("video", targetParams["video"]);}
if (targetParams.count("subtitle")){selectTrack("subtitle", targetParams["subtitle"]);}
/*LTS-END*/
//check which tracks don't actually exist
std::set<unsigned long> toRemove;
for (std::set<unsigned long>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
@ -494,7 +565,39 @@ namespace Mist{
}
}
}
/*LTS-START*/
//Finally, we strip anything unwanted that the above may have auto-selected.
toRemove.clear();
if (targetParams.count("subtitle") && targetParams["subtitle"] == "0"){
for (std::set<unsigned long>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks.at(*it).codec=="subtitle"){
toRemove.insert(*it);
}
}
}
if (targetParams.count("video") && targetParams["video"] == "0"){
for (std::set<unsigned long>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks.at(*it).type=="video"){
toRemove.insert(*it);
}
}
}
if (targetParams.count("audio") && targetParams["audio"] == "0"){
for (std::set<unsigned long>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks.at(*it).type=="audio"){
toRemove.insert(*it);
}
}
}
//remove those from selectedtracks
for (std::set<unsigned long>::iterator it = toRemove.begin(); it != toRemove.end(); it++){
selectedTracks.erase(*it);
}
/*LTS-END*/
if (Util::Config::printDebugLevel >= DLVL_MEDIUM){
//print the selected tracks
std::stringstream selected;