Updated flv_tag to output DTSCv2
This commit is contained in:
parent
2c343b9db6
commit
f14a4fb75e
5 changed files with 72 additions and 54 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -26,3 +26,4 @@ libtool
|
|||
*.flv
|
||||
*.json
|
||||
*.pc
|
||||
*.swp
|
||||
|
|
|
@ -769,9 +769,10 @@ void DTSC::File::seekNext(){
|
|||
return;
|
||||
}
|
||||
if (version == 2){
|
||||
strbuffer.erase(0,12);
|
||||
}
|
||||
jsonbuffer = JSON::fromDTMI2(strbuffer);
|
||||
}else{
|
||||
jsonbuffer = JSON::fromDTMI(strbuffer);
|
||||
}
|
||||
if (jsonbuffer.isMember("keyframe")){
|
||||
if (frames[currframe] != lastreadpos){
|
||||
currframe++;
|
||||
|
|
|
@ -951,58 +951,58 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
|||
if (tmp->getContentP("videocodecid")){
|
||||
switch ((unsigned int)tmp->getContentP("videocodecid")->NumValue()){
|
||||
case 2:
|
||||
metadata["video"]["codec"] = "H263";
|
||||
metadata["tracks"]["track1"]["codec"] = "H263";
|
||||
break;
|
||||
case 4:
|
||||
metadata["video"]["codec"] = "VP6";
|
||||
metadata["tracks"]["track1"]["codec"] = "VP6";
|
||||
break;
|
||||
case 7:
|
||||
metadata["video"]["codec"] = "H264";
|
||||
metadata["tracks"]["track1"]["codec"] = "H264";
|
||||
break;
|
||||
default:
|
||||
metadata["video"]["codec"] = "?";
|
||||
metadata["tracks"]["track1"]["codec"] = "?";
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tmp->getContentP("audiocodecid")){
|
||||
switch ((unsigned int)tmp->getContentP("audiocodecid")->NumValue()){
|
||||
case 2:
|
||||
metadata["audio"]["codec"] = "MP3";
|
||||
metadata["tracks"]["track2"]["codec"] = "MP3";
|
||||
break;
|
||||
case 10:
|
||||
metadata["audio"]["codec"] = "AAC";
|
||||
metadata["tracks"]["track2"]["codec"] = "AAC";
|
||||
break;
|
||||
default:
|
||||
metadata["audio"]["codec"] = "?";
|
||||
metadata["tracks"]["track2"]["codec"] = "?";
|
||||
break;
|
||||
}
|
||||
}
|
||||
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")){
|
||||
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")){
|
||||
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")){
|
||||
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")){
|
||||
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")){
|
||||
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")){
|
||||
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")->NumValue() == 1){
|
||||
metadata["audio"]["channels"] = 2;
|
||||
metadata["tracks"]["track2"]["channels"] = 2;
|
||||
}else{
|
||||
metadata["audio"]["channels"] = 1;
|
||||
metadata["tracks"]["track2"]["channels"] = 1;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < tmp->hasContent(); ++i){
|
||||
|
@ -1022,27 +1022,27 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
|||
pack_out["time"] = tagTime();
|
||||
}
|
||||
}
|
||||
if ( !metadata.isMember("length")){
|
||||
metadata["length"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("length")){
|
||||
metadata["tracks"]["track1"]["length"] = 0;
|
||||
}
|
||||
if (metadata.isMember("video")){
|
||||
if ( !metadata["video"].isMember("width")){
|
||||
metadata["video"]["width"] = 0;
|
||||
if (metadata["tracks"].isMember("track1")){
|
||||
if ( !metadata["tracks"]["track1"].isMember("width")){
|
||||
metadata["tracks"]["track1"]["width"] = 0;
|
||||
}
|
||||
if ( !metadata["video"].isMember("height")){
|
||||
metadata["video"]["height"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("height")){
|
||||
metadata["tracks"]["track1"]["height"] = 0;
|
||||
}
|
||||
if ( !metadata["video"].isMember("fpks")){
|
||||
metadata["video"]["fpks"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("fpks")){
|
||||
metadata["tracks"]["track1"]["fpks"] = 0;
|
||||
}
|
||||
if ( !metadata["video"].isMember("bps")){
|
||||
metadata["video"]["bps"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("bps")){
|
||||
metadata["tracks"]["track1"]["bps"] = 0;
|
||||
}
|
||||
if ( !metadata["video"].isMember("keyms")){
|
||||
metadata["video"]["keyms"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("keyms")){
|
||||
metadata["tracks"]["track1"]["keyms"] = 0;
|
||||
}
|
||||
if ( !metadata["video"].isMember("keyvar")){
|
||||
metadata["video"]["keyvar"] = 0;
|
||||
if ( !metadata["tracks"]["track1"].isMember("keyvar")){
|
||||
metadata["tracks"]["track1"]["keyvar"] = 0;
|
||||
}
|
||||
}
|
||||
return pack_out; //empty
|
||||
|
@ -1051,50 +1051,50 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
|||
char audiodata = data[11];
|
||||
if (needsInitData() && isInitData()){
|
||||
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{
|
||||
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.
|
||||
}
|
||||
pack_out["datatype"] = "audio";
|
||||
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();
|
||||
}
|
||||
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){
|
||||
case 0x0:
|
||||
metadata["audio"]["rate"] = 5512;
|
||||
metadata["tracks"]["track2"]["rate"] = 5512;
|
||||
break;
|
||||
case 0x4:
|
||||
metadata["audio"]["rate"] = 11025;
|
||||
metadata["tracks"]["track2"]["rate"] = 11025;
|
||||
break;
|
||||
case 0x8:
|
||||
metadata["audio"]["rate"] = 22050;
|
||||
metadata["tracks"]["track2"]["rate"] = 22050;
|
||||
break;
|
||||
case 0xC:
|
||||
metadata["audio"]["rate"] = 44100;
|
||||
metadata["tracks"]["track2"]["rate"] = 44100;
|
||||
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){
|
||||
case 0x0:
|
||||
metadata["audio"]["size"] = 8;
|
||||
metadata["tracks"]["track2"]["size"] = 8;
|
||||
break;
|
||||
case 0x2:
|
||||
metadata["audio"]["size"] = 16;
|
||||
metadata["tracks"]["track2"]["size"] = 16;
|
||||
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){
|
||||
case 0x0:
|
||||
metadata["audio"]["channels"] = 1;
|
||||
metadata["tracks"]["track2"]["channels"] = 1;
|
||||
break;
|
||||
case 0x1:
|
||||
metadata["audio"]["channels"] = 2;
|
||||
metadata["tracks"]["track2"]["channels"] = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1118,17 +1118,17 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
|||
if (len < 21){
|
||||
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{
|
||||
if (len < 17){
|
||||
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.
|
||||
}
|
||||
if ( !metadata["video"].isMember("codec") || metadata["video"]["codec"].asString() == "?" || metadata["video"]["codec"].asString() == ""){
|
||||
metadata["video"]["codec"] = getVideoCodec();
|
||||
if ( !metadata["tracks"]["track1"].isMember("codec") || metadata["tracks"]["track1"]["codec"].asString() == "?" || metadata["tracks"]["track1"]["codec"].asString() == ""){
|
||||
metadata["tracks"]["track1"]["codec"] = getVideoCodec();
|
||||
}
|
||||
pack_out["datatype"] = "video";
|
||||
switch (videodata & 0xF0){
|
||||
|
|
19
lib/json.cpp
19
lib/json.cpp
|
@ -478,8 +478,9 @@ void JSON::Value::netPrepare(){
|
|||
//insert proper header for this type of data
|
||||
int packID = -1;
|
||||
long long unsigned int time = objVal["time"].asInt();
|
||||
std::string dataType = objVal["datatype"].asString();
|
||||
std::string dataType;
|
||||
if (isMember("datatype")){
|
||||
dataType = objVal["datatype"].asString();
|
||||
if (isMember("trackid")){
|
||||
packID = objVal["trackid"].asInt();
|
||||
}else{
|
||||
|
@ -498,12 +499,15 @@ void JSON::Value::netPrepare(){
|
|||
}
|
||||
removeMember("time");
|
||||
removeMember("datatype");
|
||||
removeMember("trackid");
|
||||
packed = toPacked();
|
||||
objVal["time"] = (long long int)time;
|
||||
objVal["datatype"] = dataType;
|
||||
objVal["trackid"] = packID;
|
||||
strVal.resize(packed.size() + 20);
|
||||
memcpy((void*)strVal.c_str(), "DTP2", 4);
|
||||
}else{
|
||||
packID = -1;
|
||||
strVal.resize(packed.size() + 8);
|
||||
memcpy((void*)strVal.c_str(), "DTSC", 4);
|
||||
}
|
||||
|
@ -512,7 +516,7 @@ void JSON::Value::netPrepare(){
|
|||
memcpy((void*)(strVal.c_str() + 4), (void*) &size, 4);
|
||||
//copy the rest of the string
|
||||
if (packID != -1){
|
||||
packID = htonl((int)packID);
|
||||
packID = htonl(packID);
|
||||
memcpy((void*)(strVal.c_str() + 8), (void*) &packID, 4);
|
||||
int tmpHalf = htonl((int)(time >> 32));
|
||||
memcpy((void*)(strVal.c_str() + 12), (void*) &tmpHalf, 4);
|
||||
|
@ -863,3 +867,14 @@ JSON::Value JSON::fromDTMI(std::string data){
|
|||
unsigned int i = 0;
|
||||
return fromDTMI((const unsigned char*)data.c_str(), data.size(), i);
|
||||
} //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;
|
||||
}
|
||||
|
|
|
@ -93,6 +93,7 @@ namespace JSON {
|
|||
void null();
|
||||
};
|
||||
|
||||
Value fromDTMI2(std::string data);
|
||||
Value fromDTMI(std::string data);
|
||||
Value fromDTMI(const unsigned char * data, unsigned int len, unsigned int &i);
|
||||
Value fromString(std::string json);
|
||||
|
|
Loading…
Add table
Reference in a new issue