Updated flv_tag to output DTSCv2

This commit is contained in:
Erik Zandvliet 2013-04-29 10:41:20 +02:00
parent 2c343b9db6
commit f14a4fb75e
5 changed files with 72 additions and 54 deletions

1
.gitignore vendored
View file

@ -26,3 +26,4 @@ libtool
*.flv *.flv
*.json *.json
*.pc *.pc
*.swp

View file

@ -769,9 +769,10 @@ void DTSC::File::seekNext(){
return; return;
} }
if (version == 2){ if (version == 2){
strbuffer.erase(0,12); jsonbuffer = JSON::fromDTMI2(strbuffer);
}else{
jsonbuffer = JSON::fromDTMI(strbuffer);
} }
jsonbuffer = JSON::fromDTMI(strbuffer);
if (jsonbuffer.isMember("keyframe")){ if (jsonbuffer.isMember("keyframe")){
if (frames[currframe] != lastreadpos){ if (frames[currframe] != lastreadpos){
currframe++; currframe++;

View file

@ -951,58 +951,58 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
if (tmp->getContentP("videocodecid")){ if (tmp->getContentP("videocodecid")){
switch ((unsigned int)tmp->getContentP("videocodecid")->NumValue()){ switch ((unsigned int)tmp->getContentP("videocodecid")->NumValue()){
case 2: case 2:
metadata["video"]["codec"] = "H263"; metadata["tracks"]["track1"]["codec"] = "H263";
break; break;
case 4: case 4:
metadata["video"]["codec"] = "VP6"; metadata["tracks"]["track1"]["codec"] = "VP6";
break; break;
case 7: case 7:
metadata["video"]["codec"] = "H264"; metadata["tracks"]["track1"]["codec"] = "H264";
break; break;
default: default:
metadata["video"]["codec"] = "?"; metadata["tracks"]["track1"]["codec"] = "?";
break; break;
} }
} }
if (tmp->getContentP("audiocodecid")){ if (tmp->getContentP("audiocodecid")){
switch ((unsigned int)tmp->getContentP("audiocodecid")->NumValue()){ switch ((unsigned int)tmp->getContentP("audiocodecid")->NumValue()){
case 2: case 2:
metadata["audio"]["codec"] = "MP3"; metadata["tracks"]["track2"]["codec"] = "MP3";
break; break;
case 10: case 10:
metadata["audio"]["codec"] = "AAC"; metadata["tracks"]["track2"]["codec"] = "AAC";
break; break;
default: default:
metadata["audio"]["codec"] = "?"; metadata["tracks"]["track2"]["codec"] = "?";
break; break;
} }
} }
if (tmp->getContentP("width")){ if (tmp->getContentP("width")){
metadata["video"]["width"] = (long long int)tmp->getContentP("width")->NumValue(); metadata["tracks"]["track1"]["width"] = (long long int)tmp->getContentP("width")->NumValue();
} }
if (tmp->getContentP("height")){ if (tmp->getContentP("height")){
metadata["video"]["height"] = (long long int)tmp->getContentP("height")->NumValue(); metadata["tracks"]["track1"]["height"] = (long long int)tmp->getContentP("height")->NumValue();
} }
if (tmp->getContentP("framerate")){ if (tmp->getContentP("framerate")){
metadata["video"]["fpks"] = (long long int)(tmp->getContentP("framerate")->NumValue() * 1000.0); metadata["tracks"]["track1"]["fpks"] = (long long int)(tmp->getContentP("framerate")->NumValue() * 1000.0);
} }
if (tmp->getContentP("videodatarate")){ if (tmp->getContentP("videodatarate")){
metadata["video"]["bps"] = (long long int)(tmp->getContentP("videodatarate")->NumValue() * 1024) / 8; metadata["tracks"]["track1"]["bps"] = (long long int)(tmp->getContentP("videodatarate")->NumValue() * 1024) / 8;
} }
if (tmp->getContentP("audiodatarate")){ if (tmp->getContentP("audiodatarate")){
metadata["audio"]["bps"] = (long long int)(tmp->getContentP("audiodatarate")->NumValue() * 1024) / 8; metadata["tracks"]["track2"]["bps"] = (long long int)(tmp->getContentP("audiodatarate")->NumValue() * 1024) / 8;
} }
if (tmp->getContentP("audiosamplerate")){ if (tmp->getContentP("audiosamplerate")){
metadata["audio"]["rate"] = (long long int)tmp->getContentP("audiosamplerate")->NumValue(); metadata["tracks"]["track2"]["rate"] = (long long int)tmp->getContentP("audiosamplerate")->NumValue();
} }
if (tmp->getContentP("audiosamplesize")){ if (tmp->getContentP("audiosamplesize")){
metadata["audio"]["size"] = (long long int)tmp->getContentP("audiosamplesize")->NumValue(); metadata["tracks"]["track2"]["size"] = (long long int)tmp->getContentP("audiosamplesize")->NumValue();
} }
if (tmp->getContentP("stereo")){ if (tmp->getContentP("stereo")){
if (tmp->getContentP("stereo")->NumValue() == 1){ if (tmp->getContentP("stereo")->NumValue() == 1){
metadata["audio"]["channels"] = 2; metadata["tracks"]["track2"]["channels"] = 2;
}else{ }else{
metadata["audio"]["channels"] = 1; metadata["tracks"]["track2"]["channels"] = 1;
} }
} }
for (int i = 0; i < tmp->hasContent(); ++i){ for (int i = 0; i < tmp->hasContent(); ++i){
@ -1022,27 +1022,27 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
pack_out["time"] = tagTime(); pack_out["time"] = tagTime();
} }
} }
if ( !metadata.isMember("length")){ if ( !metadata["tracks"]["track1"].isMember("length")){
metadata["length"] = 0; metadata["tracks"]["track1"]["length"] = 0;
} }
if (metadata.isMember("video")){ if (metadata["tracks"].isMember("track1")){
if ( !metadata["video"].isMember("width")){ if ( !metadata["tracks"]["track1"].isMember("width")){
metadata["video"]["width"] = 0; metadata["tracks"]["track1"]["width"] = 0;
} }
if ( !metadata["video"].isMember("height")){ if ( !metadata["tracks"]["track1"].isMember("height")){
metadata["video"]["height"] = 0; metadata["tracks"]["track1"]["height"] = 0;
} }
if ( !metadata["video"].isMember("fpks")){ if ( !metadata["tracks"]["track1"].isMember("fpks")){
metadata["video"]["fpks"] = 0; metadata["tracks"]["track1"]["fpks"] = 0;
} }
if ( !metadata["video"].isMember("bps")){ if ( !metadata["tracks"]["track1"].isMember("bps")){
metadata["video"]["bps"] = 0; metadata["tracks"]["track1"]["bps"] = 0;
} }
if ( !metadata["video"].isMember("keyms")){ if ( !metadata["tracks"]["track1"].isMember("keyms")){
metadata["video"]["keyms"] = 0; metadata["tracks"]["track1"]["keyms"] = 0;
} }
if ( !metadata["video"].isMember("keyvar")){ if ( !metadata["tracks"]["track1"].isMember("keyvar")){
metadata["video"]["keyvar"] = 0; metadata["tracks"]["track1"]["keyvar"] = 0;
} }
} }
return pack_out; //empty return pack_out; //empty
@ -1051,50 +1051,50 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
char audiodata = data[11]; char audiodata = data[11];
if (needsInitData() && isInitData()){ if (needsInitData() && isInitData()){
if ((audiodata & 0xF0) == 0xA0){ if ((audiodata & 0xF0) == 0xA0){
metadata["audio"]["init"] = std::string((char*)data + 13, (size_t)len - 17); metadata["tracks"]["track2"]["init"] = std::string((char*)data + 13, (size_t)len - 17);
}else{ }else{
metadata["audio"]["init"] = std::string((char*)data + 12, (size_t)len - 16); metadata["tracks"]["track2"]["init"] = std::string((char*)data + 12, (size_t)len - 16);
} }
return pack_out; //skip rest of parsing, get next tag. return pack_out; //skip rest of parsing, get next tag.
} }
pack_out["datatype"] = "audio"; pack_out["datatype"] = "audio";
pack_out["time"] = tagTime(); pack_out["time"] = tagTime();
if ( !metadata["audio"].isMember("codec") || metadata["audio"]["codec"].asString() == "?" || metadata["audio"]["codec"].asString() == ""){ if ( !metadata["tracks"]["track2"].isMember("codec") || metadata["tracks"]["track2"]["codec"].asString() == "?" || metadata["tracks"]["track2"]["codec"].asString() == ""){
metadata["audio"]["codec"] = getAudioCodec(); metadata["audio"]["codec"] = getAudioCodec();
} }
if ( !metadata["audio"].isMember("rate") || metadata["audio"]["rate"].asInt() < 1){ if ( !metadata["tracks"]["track2"].isMember("rate") || metadata["tracks"]["track2"]["rate"].asInt() < 1){
switch (audiodata & 0x0C){ switch (audiodata & 0x0C){
case 0x0: case 0x0:
metadata["audio"]["rate"] = 5512; metadata["tracks"]["track2"]["rate"] = 5512;
break; break;
case 0x4: case 0x4:
metadata["audio"]["rate"] = 11025; metadata["tracks"]["track2"]["rate"] = 11025;
break; break;
case 0x8: case 0x8:
metadata["audio"]["rate"] = 22050; metadata["tracks"]["track2"]["rate"] = 22050;
break; break;
case 0xC: case 0xC:
metadata["audio"]["rate"] = 44100; metadata["tracks"]["track2"]["rate"] = 44100;
break; break;
} }
} }
if ( !metadata["audio"].isMember("size") || metadata["audio"]["size"].asInt() < 1){ if ( !metadata["tracks"]["track2"].isMember("size") || metadata["tracks"]["track2"]["size"].asInt() < 1){
switch (audiodata & 0x02){ switch (audiodata & 0x02){
case 0x0: case 0x0:
metadata["audio"]["size"] = 8; metadata["tracks"]["track2"]["size"] = 8;
break; break;
case 0x2: case 0x2:
metadata["audio"]["size"] = 16; metadata["tracks"]["track2"]["size"] = 16;
break; break;
} }
} }
if ( !metadata["audio"].isMember("channels") || metadata["audio"]["channels"].asInt() < 1){ if ( !metadata["tracks"]["track2"].isMember("channels") || metadata["tracks"]["track2"]["channels"].asInt() < 1){
switch (audiodata & 0x01){ switch (audiodata & 0x01){
case 0x0: case 0x0:
metadata["audio"]["channels"] = 1; metadata["tracks"]["track2"]["channels"] = 1;
break; break;
case 0x1: case 0x1:
metadata["audio"]["channels"] = 2; metadata["tracks"]["track2"]["channels"] = 2;
break; break;
} }
} }
@ -1118,17 +1118,17 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
if (len < 21){ if (len < 21){
return JSON::Value(); return JSON::Value();
} }
metadata["video"]["init"] = std::string((char*)data + 16, (size_t)len - 20); metadata["tracks"]["track1"]["init"] = std::string((char*)data + 16, (size_t)len - 20);
}else{ }else{
if (len < 17){ if (len < 17){
return JSON::Value(); return JSON::Value();
} }
metadata["video"]["init"] = std::string((char*)data + 12, (size_t)len - 16); metadata["tracks"]["track1"]["init"] = std::string((char*)data + 12, (size_t)len - 16);
} }
return pack_out; //skip rest of parsing, get next tag. return pack_out; //skip rest of parsing, get next tag.
} }
if ( !metadata["video"].isMember("codec") || metadata["video"]["codec"].asString() == "?" || metadata["video"]["codec"].asString() == ""){ if ( !metadata["tracks"]["track1"].isMember("codec") || metadata["tracks"]["track1"]["codec"].asString() == "?" || metadata["tracks"]["track1"]["codec"].asString() == ""){
metadata["video"]["codec"] = getVideoCodec(); metadata["tracks"]["track1"]["codec"] = getVideoCodec();
} }
pack_out["datatype"] = "video"; pack_out["datatype"] = "video";
switch (videodata & 0xF0){ switch (videodata & 0xF0){

View file

@ -478,11 +478,12 @@ void JSON::Value::netPrepare(){
//insert proper header for this type of data //insert proper header for this type of data
int packID = -1; int packID = -1;
long long unsigned int time = objVal["time"].asInt(); long long unsigned int time = objVal["time"].asInt();
std::string dataType = objVal["datatype"].asString(); std::string dataType;
if (isMember("datatype")){ if (isMember("datatype")){
dataType = objVal["datatype"].asString();
if (isMember("trackid")){ if (isMember("trackid")){
packID = objVal["trackid"].asInt(); packID = objVal["trackid"].asInt();
}else{ }else{
if (objVal["datatype"].asString() == "video"){ if (objVal["datatype"].asString() == "video"){
packID = 1; packID = 1;
} }
@ -498,12 +499,15 @@ void JSON::Value::netPrepare(){
} }
removeMember("time"); removeMember("time");
removeMember("datatype"); removeMember("datatype");
removeMember("trackid");
packed = toPacked(); packed = toPacked();
objVal["time"] = (long long int)time; objVal["time"] = (long long int)time;
objVal["datatype"] = dataType; objVal["datatype"] = dataType;
objVal["trackid"] = packID;
strVal.resize(packed.size() + 20); strVal.resize(packed.size() + 20);
memcpy((void*)strVal.c_str(), "DTP2", 4); memcpy((void*)strVal.c_str(), "DTP2", 4);
}else{ }else{
packID = -1;
strVal.resize(packed.size() + 8); strVal.resize(packed.size() + 8);
memcpy((void*)strVal.c_str(), "DTSC", 4); memcpy((void*)strVal.c_str(), "DTSC", 4);
} }
@ -512,7 +516,7 @@ void JSON::Value::netPrepare(){
memcpy((void*)(strVal.c_str() + 4), (void*) &size, 4); memcpy((void*)(strVal.c_str() + 4), (void*) &size, 4);
//copy the rest of the string //copy the rest of the string
if (packID != -1){ if (packID != -1){
packID = htonl((int)packID); packID = htonl(packID);
memcpy((void*)(strVal.c_str() + 8), (void*) &packID, 4); memcpy((void*)(strVal.c_str() + 8), (void*) &packID, 4);
int tmpHalf = htonl((int)(time >> 32)); int tmpHalf = htonl((int)(time >> 32));
memcpy((void*)(strVal.c_str() + 12), (void*) &tmpHalf, 4); memcpy((void*)(strVal.c_str() + 12), (void*) &tmpHalf, 4);
@ -863,3 +867,14 @@ JSON::Value JSON::fromDTMI(std::string data){
unsigned int i = 0; unsigned int i = 0;
return fromDTMI((const unsigned char*)data.c_str(), data.size(), i); return fromDTMI((const unsigned char*)data.c_str(), data.size(), i);
} //fromDTMI } //fromDTMI
JSON::Value JSON::fromDTMI2(std::string data){
JSON::Value tmp = fromDTMI(data.substr(12));
long long int tmpTrackID = ntohl(((int*)(data.c_str()))[0]);
long long int tmpTime = ntohl(((int*)(data.c_str() + 4))[0]);
tmpTime << 32;
tmpTime += ntohl(((int*)(data.c_str() + 8))[0]);
tmp["time"] = tmpTime;
tmp["trackid"] = tmpTrackID;
return tmp;
}

View file

@ -93,6 +93,7 @@ namespace JSON {
void null(); void null();
}; };
Value fromDTMI2(std::string data);
Value fromDTMI(std::string data); Value fromDTMI(std::string data);
Value fromDTMI(const unsigned char * data, unsigned int len, unsigned int &i); Value fromDTMI(const unsigned char * data, unsigned int len, unsigned int &i);
Value fromString(std::string json); Value fromString(std::string json);