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
*.json
*.pc
*.swp

View file

@ -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);
}
jsonbuffer = JSON::fromDTMI(strbuffer);
if (jsonbuffer.isMember("keyframe")){
if (frames[currframe] != lastreadpos){
currframe++;

View file

@ -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){

View file

@ -478,11 +478,12 @@ 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{
}else{
if (objVal["datatype"].asString() == "video"){
packID = 1;
}
@ -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;
}

View file

@ -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);