Working DTSC2 -> FLV
This commit is contained in:
parent
1449e9e73e
commit
64c97d15a3
3 changed files with 54 additions and 56 deletions
69
lib/dtsc.cpp
69
lib/dtsc.cpp
|
@ -85,9 +85,6 @@ bool DTSC::Stream::parsePacket(std::string & buffer){
|
||||||
}
|
}
|
||||||
if (version == 2){
|
if (version == 2){
|
||||||
buffers.front() = JSON::fromDTMI2(buffer.substr(8));
|
buffers.front() = JSON::fromDTMI2(buffer.substr(8));
|
||||||
if (!buffers.front().isMember("datatype")){
|
|
||||||
buffers.front()["datatype"] = metadata["tracks"][trackMapping[buffers.front()["trackid"].asInt()]]["type"];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
datapointertype = INVALID;
|
datapointertype = INVALID;
|
||||||
if (buffers.front().isMember("data")){
|
if (buffers.front().isMember("data")){
|
||||||
|
@ -95,20 +92,24 @@ bool DTSC::Stream::parsePacket(std::string & buffer){
|
||||||
}else{
|
}else{
|
||||||
datapointer = 0;
|
datapointer = 0;
|
||||||
}
|
}
|
||||||
|
std::string tmp = "";
|
||||||
|
if (buffers.front().isMember("trackid")){
|
||||||
|
tmp = getTrackById(buffers.front()["trackid"].asInt())["type"].asString();
|
||||||
|
}
|
||||||
if (buffers.front().isMember("datatype")){
|
if (buffers.front().isMember("datatype")){
|
||||||
std::string tmp = buffers.front()["datatype"].asString();
|
tmp = buffers.front()["datatype"].asString();
|
||||||
if (tmp == "video"){
|
}
|
||||||
datapointertype = VIDEO;
|
if (tmp == "video"){
|
||||||
}
|
datapointertype = VIDEO;
|
||||||
if (tmp == "audio"){
|
}
|
||||||
datapointertype = AUDIO;
|
if (tmp == "audio"){
|
||||||
}
|
datapointertype = AUDIO;
|
||||||
if (tmp == "meta"){
|
}
|
||||||
datapointertype = META;
|
if (tmp == "meta"){
|
||||||
}
|
datapointertype = META;
|
||||||
if (tmp == "pause_marker"){
|
}
|
||||||
datapointertype = PAUSEMARK;
|
if (tmp == "pause_marker"){
|
||||||
}
|
datapointertype = PAUSEMARK;
|
||||||
}
|
}
|
||||||
buffer.erase(0, len + 8);
|
buffer.erase(0, len + 8);
|
||||||
while (buffers.size() > buffercount){
|
while (buffers.size() > buffercount){
|
||||||
|
@ -189,9 +190,6 @@ bool DTSC::Stream::parsePacket(Socket::Buffer & buffer){
|
||||||
}
|
}
|
||||||
if (version == 2){
|
if (version == 2){
|
||||||
buffers.front() = JSON::fromDTMI2(wholepacket.substr(8));
|
buffers.front() = JSON::fromDTMI2(wholepacket.substr(8));
|
||||||
if (!buffers.front().isMember("datatype")){
|
|
||||||
buffers.front()["datatype"] = metadata["tracks"][trackMapping[buffers.front()["trackid"].asInt()]]["type"];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
datapointertype = INVALID;
|
datapointertype = INVALID;
|
||||||
if (buffers.front().isMember("data")){
|
if (buffers.front().isMember("data")){
|
||||||
|
@ -199,20 +197,24 @@ bool DTSC::Stream::parsePacket(Socket::Buffer & buffer){
|
||||||
}else{
|
}else{
|
||||||
datapointer = 0;
|
datapointer = 0;
|
||||||
}
|
}
|
||||||
|
std::string tmp = "";
|
||||||
|
if (buffers.front().isMember("trackid")){
|
||||||
|
tmp = getTrackById(buffers.front()["trackid"].asInt())["type"].asString();
|
||||||
|
}
|
||||||
if (buffers.front().isMember("datatype")){
|
if (buffers.front().isMember("datatype")){
|
||||||
std::string tmp = buffers.front()["datatype"].asString();
|
tmp = buffers.front()["datatype"].asString();
|
||||||
if (tmp == "video"){
|
}
|
||||||
datapointertype = VIDEO;
|
if (tmp == "video"){
|
||||||
}
|
datapointertype = VIDEO;
|
||||||
if (tmp == "audio"){
|
}
|
||||||
datapointertype = AUDIO;
|
if (tmp == "audio"){
|
||||||
}
|
datapointertype = AUDIO;
|
||||||
if (tmp == "meta"){
|
}
|
||||||
datapointertype = META;
|
if (tmp == "meta"){
|
||||||
}
|
datapointertype = META;
|
||||||
if (tmp == "pause_marker"){
|
}
|
||||||
datapointertype = PAUSEMARK;
|
if (tmp == "pause_marker"){
|
||||||
}
|
datapointertype = PAUSEMARK;
|
||||||
}
|
}
|
||||||
while (buffers.size() > buffercount){
|
while (buffers.size() > buffercount){
|
||||||
buffers.pop_back();
|
buffers.pop_back();
|
||||||
|
@ -795,9 +797,6 @@ void DTSC::File::seekNext(){
|
||||||
}
|
}
|
||||||
if (version == 2){
|
if (version == 2){
|
||||||
jsonbuffer = JSON::fromDTMI2(strbuffer);
|
jsonbuffer = JSON::fromDTMI2(strbuffer);
|
||||||
if (!jsonbuffer.isMember("datatype")){
|
|
||||||
jsonbuffer["datatype"] = metadata["tracks"][trackMapping[jsonbuffer["trackid"].asInt()]]["type"];
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
jsonbuffer = JSON::fromDTMI(strbuffer);
|
jsonbuffer = JSON::fromDTMI(strbuffer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,19 +350,20 @@ FLV::Tag & FLV::Tag::operator=(const FLV::Tag& O){
|
||||||
/// Takes the DTSC data and makes it into FLV.
|
/// Takes the DTSC data and makes it into FLV.
|
||||||
bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
|
bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
|
||||||
std::string meta_str;
|
std::string meta_str;
|
||||||
|
JSON::Value & track = S.getTrackById(S.getPacket()["trackid"].asInt());
|
||||||
switch (S.lastType()){
|
switch (S.lastType()){
|
||||||
case DTSC::VIDEO:
|
case DTSC::VIDEO:
|
||||||
len = S.lastData().length() + 16;
|
len = S.lastData().length() + 16;
|
||||||
if (S.metadata.isMember("video") && S.metadata["video"].isMember("codec")){
|
if (track && track.isMember("codec")){
|
||||||
if (S.metadata["video"]["codec"].asString() == "H264"){
|
if (track["codec"].asString() == "H264"){
|
||||||
len += 4;
|
len += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DTSC::AUDIO:
|
case DTSC::AUDIO:
|
||||||
len = S.lastData().length() + 16;
|
len = S.lastData().length() + 16;
|
||||||
if (S.metadata.isMember("audio") && S.metadata["audio"].isMember("codec")){
|
if (track && track.isMember("codec")){
|
||||||
if (S.metadata["audio"]["codec"].asString() == "AAC"){
|
if (track["codec"].asString() == "AAC"){
|
||||||
len += 1;
|
len += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -406,10 +407,10 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
|
||||||
data[15] = offset & 0xFF;
|
data[15] = offset & 0xFF;
|
||||||
}
|
}
|
||||||
data[11] = 0;
|
data[11] = 0;
|
||||||
if (S.metadata["video"]["codec"].asString() == "H264"){
|
if (track.isMember("codec") && track["codec"].asString() == "H264"){
|
||||||
data[11] += 7;
|
data[11] += 7;
|
||||||
}
|
}
|
||||||
if (S.metadata["video"]["codec"].asString() == "H263"){
|
if (track.isMember("codec") && track["codec"].asString() == "H263"){
|
||||||
data[11] += 2;
|
data[11] += 2;
|
||||||
}
|
}
|
||||||
if (S.getPacket().isMember("keyframe")){
|
if (S.getPacket().isMember("keyframe")){
|
||||||
|
@ -430,13 +431,13 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
|
||||||
data[12] = 1; //raw AAC data, not sequence header
|
data[12] = 1; //raw AAC data, not sequence header
|
||||||
}
|
}
|
||||||
data[11] = 0;
|
data[11] = 0;
|
||||||
if (S.metadata["audio"]["codec"].asString() == "AAC"){
|
if (track.isMember("codec") && track["codec"].asString() == "AAC"){
|
||||||
data[11] += 0xA0;
|
data[11] += 0xA0;
|
||||||
}
|
}
|
||||||
if (S.metadata["audio"]["codec"].asString() == "MP3"){
|
if (track.isMember("codec") && track["codec"].asString() == "MP3"){
|
||||||
data[11] += 0x20;
|
data[11] += 0x20;
|
||||||
}
|
}
|
||||||
unsigned int datarate = S.metadata["audio"]["rate"].asInt();
|
unsigned int datarate = track["rate"].asInt();
|
||||||
if (datarate >= 44100){
|
if (datarate >= 44100){
|
||||||
data[11] += 0x0C;
|
data[11] += 0x0C;
|
||||||
}else if (datarate >= 22050){
|
}else if (datarate >= 22050){
|
||||||
|
@ -444,10 +445,10 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
|
||||||
}else if (datarate >= 11025){
|
}else if (datarate >= 11025){
|
||||||
data[11] += 0x04;
|
data[11] += 0x04;
|
||||||
}
|
}
|
||||||
if (S.metadata["audio"]["size"].asInt() == 16){
|
if (track["size"].asInt() == 16){
|
||||||
data[11] += 0x02;
|
data[11] += 0x02;
|
||||||
}
|
}
|
||||||
if (S.metadata["audio"]["channels"].asInt() > 1){
|
if (track["channels"].asInt() > 1){
|
||||||
data[11] += 0x01;
|
data[11] += 0x01;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -594,9 +595,7 @@ bool FLV::Tag::DTSCAudioInit(JSON::Value & audio){
|
||||||
/// FLV metadata loader function from DTSC.
|
/// FLV metadata loader function from DTSC.
|
||||||
/// Takes the DTSC metadata and makes it into FLV.
|
/// Takes the DTSC metadata and makes it into FLV.
|
||||||
/// Assumes metadata is available - so check before calling!
|
/// Assumes metadata is available - so check before calling!
|
||||||
bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string audName){
|
bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, JSON::Value & videoRef, JSON::Value & audioRef){
|
||||||
JSON::Value & videoRef = S.metadata["tracks"][vidName];
|
|
||||||
JSON::Value & audioRef = S.metadata["tracks"][audName];
|
|
||||||
//Unknown? Assume AAC.
|
//Unknown? Assume AAC.
|
||||||
if (audioRef["codec"].asString() == "?"){
|
if (audioRef["codec"].asString() == "?"){
|
||||||
audioRef["codec"] = "AAC";
|
audioRef["codec"] = "AAC";
|
||||||
|
@ -617,10 +616,10 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string a
|
||||||
keys.addContent(AMF::Object("filepositions", AMF::AMF0_STRICT_ARRAY));
|
keys.addContent(AMF::Object("filepositions", AMF::AMF0_STRICT_ARRAY));
|
||||||
keys.addContent(AMF::Object("times", AMF::AMF0_STRICT_ARRAY));
|
keys.addContent(AMF::Object("times", AMF::AMF0_STRICT_ARRAY));
|
||||||
int total_byterate = 0;
|
int total_byterate = 0;
|
||||||
if (vidName != ""){
|
if (videoRef){
|
||||||
total_byterate += videoRef["bps"].asInt();
|
total_byterate += videoRef["bps"].asInt();
|
||||||
}
|
}
|
||||||
if (audName != ""){
|
if (audioRef){
|
||||||
total_byterate += audioRef["bps"].asInt();
|
total_byterate += audioRef["bps"].asInt();
|
||||||
}
|
}
|
||||||
for (int i = 0; i < S.metadata["length"].asInt(); ++i){ //for each second in the file
|
for (int i = 0; i < S.metadata["length"].asInt(); ++i){ //for each second in the file
|
||||||
|
@ -629,7 +628,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string a
|
||||||
}
|
}
|
||||||
amfdata.getContentP(1)->addContent(keys);
|
amfdata.getContentP(1)->addContent(keys);
|
||||||
}
|
}
|
||||||
if (vidName != ""){
|
if (videoRef){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("hasVideo", 1, AMF::AMF0_BOOL));
|
amfdata.getContentP(1)->addContent(AMF::Object("hasVideo", 1, AMF::AMF0_BOOL));
|
||||||
if (videoRef["codec"].asString() == "H264"){
|
if (videoRef["codec"].asString() == "H264"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", (std::string)"avc1"));
|
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", (std::string)"avc1"));
|
||||||
|
@ -653,7 +652,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string a
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videodatarate", (double)videoRef["bps"].asInt() * 128.0, AMF::AMF0_NUMBER));
|
amfdata.getContentP(1)->addContent(AMF::Object("videodatarate", (double)videoRef["bps"].asInt() * 128.0, AMF::AMF0_NUMBER));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (audName != ""){
|
if (audioRef){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL));
|
amfdata.getContentP(1)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL));
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("audiodelay", 0, AMF::AMF0_NUMBER));
|
amfdata.getContentP(1)->addContent(AMF::Object("audiodelay", 0, AMF::AMF0_NUMBER));
|
||||||
if (audioRef["codec"].asString() == "AAC"){
|
if (audioRef["codec"].asString() == "AAC"){
|
||||||
|
@ -677,7 +676,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string a
|
||||||
}
|
}
|
||||||
AMF::Object trinfo = AMF::Object("trackinfo", AMF::AMF0_STRICT_ARRAY);
|
AMF::Object trinfo = AMF::Object("trackinfo", AMF::AMF0_STRICT_ARRAY);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (audName != ""){
|
if (audioRef){
|
||||||
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
||||||
trinfo.getContentP(i)->addContent(
|
trinfo.getContentP(i)->addContent(
|
||||||
AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)audioRef["rate"].asInt()), AMF::AMF0_NUMBER));
|
AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)audioRef["rate"].asInt()), AMF::AMF0_NUMBER));
|
||||||
|
@ -691,7 +690,7 @@ bool FLV::Tag::DTSCMetaInit(DTSC::Stream & S, std::string vidName, std::string a
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
if (vidName != ""){
|
if (videoRef){
|
||||||
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
||||||
trinfo.getContentP(i)->addContent(
|
trinfo.getContentP(i)->addContent(
|
||||||
AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)videoRef["fkps"].asInt() / 1000.0), AMF::AMF0_NUMBER));
|
AMF::Object("length", ((double)S.metadata["length"].asInt()) * ((double)videoRef["fkps"].asInt() / 1000.0), AMF::AMF0_NUMBER));
|
||||||
|
|
|
@ -49,7 +49,7 @@ namespace FLV {
|
||||||
bool DTSCVideoInit(JSON::Value & video);
|
bool DTSCVideoInit(JSON::Value & video);
|
||||||
bool DTSCAudioInit(DTSC::Stream & S);
|
bool DTSCAudioInit(DTSC::Stream & S);
|
||||||
bool DTSCAudioInit(JSON::Value & audio);
|
bool DTSCAudioInit(JSON::Value & audio);
|
||||||
bool DTSCMetaInit(DTSC::Stream & S, std::string vidName = "", std::string audName = "");
|
bool DTSCMetaInit(DTSC::Stream & S, JSON::Value & videoRef, JSON::Value & audioRef);
|
||||||
JSON::Value toJSON(JSON::Value & metadata);
|
JSON::Value toJSON(JSON::Value & metadata);
|
||||||
bool MemLoader(char * D, unsigned int S, unsigned int & P);
|
bool MemLoader(char * D, unsigned int S, unsigned int & P);
|
||||||
bool FileLoader(FILE * f);
|
bool FileLoader(FILE * f);
|
||||||
|
|
Loading…
Add table
Reference in a new issue