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
|
*.flv
|
||||||
*.json
|
*.json
|
||||||
*.pc
|
*.pc
|
||||||
|
*.swp
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
|
@ -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){
|
||||||
|
|
19
lib/json.cpp
19
lib/json.cpp
|
@ -478,8 +478,9 @@ 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{
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue