Fixed FMLE RTMP ingest.
This commit is contained in:
parent
7565b705ad
commit
89c4e766ed
2 changed files with 64 additions and 95 deletions
157
lib/flv_tag.cpp
157
lib/flv_tag.cpp
|
@ -115,6 +115,62 @@ bool FLV::Tag::isInitData(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * FLV::Tag::getVideoCodec(){
|
||||||
|
switch (data[11] & 0x0F){
|
||||||
|
case 1:
|
||||||
|
return "JPEG";
|
||||||
|
case 2:
|
||||||
|
return "H263";
|
||||||
|
case 3:
|
||||||
|
return "ScreenVideo1";
|
||||||
|
case 4:
|
||||||
|
return "VP6";
|
||||||
|
case 5:
|
||||||
|
return "VP6Alpha";
|
||||||
|
case 6:
|
||||||
|
return "ScreenVideo2";
|
||||||
|
case 7:
|
||||||
|
return "H264";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * FLV::Tag::getAudioCodec(){
|
||||||
|
switch (data[11] & 0xF0){
|
||||||
|
case 0x00:
|
||||||
|
return "linear PCM PE";
|
||||||
|
case 0x10:
|
||||||
|
return "ADPCM";
|
||||||
|
case 0x20:
|
||||||
|
return "MP3";
|
||||||
|
case 0x30:
|
||||||
|
return "linear PCM LE";
|
||||||
|
case 0x40:
|
||||||
|
return "Nelly16kHz";
|
||||||
|
case 0x50:
|
||||||
|
return "Nelly8kHz";
|
||||||
|
case 0x60:
|
||||||
|
return "Nelly";
|
||||||
|
case 0x70:
|
||||||
|
return "G711A-law";
|
||||||
|
case 0x80:
|
||||||
|
return "G711mu-law";
|
||||||
|
case 0x90:
|
||||||
|
return "reserved";
|
||||||
|
case 0xA0:
|
||||||
|
return "AAC";
|
||||||
|
case 0xB0:
|
||||||
|
return "Speex";
|
||||||
|
case 0xE0:
|
||||||
|
return "MP38kHz";
|
||||||
|
case 0xF0:
|
||||||
|
return "DeviceSpecific";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a std::string describing the tag in detail.
|
/// Returns a std::string describing the tag in detail.
|
||||||
/// The string includes information about whether the tag is
|
/// The string includes information about whether the tag is
|
||||||
/// audio, video or metadata, what encoding is used, and the details
|
/// audio, video or metadata, what encoding is used, and the details
|
||||||
|
@ -124,33 +180,7 @@ std::string FLV::Tag::tagType(){
|
||||||
R << len << " bytes of ";
|
R << len << " bytes of ";
|
||||||
switch (data[0]){
|
switch (data[0]){
|
||||||
case 0x09:
|
case 0x09:
|
||||||
switch (data[11] & 0x0F){
|
R << getVideoCodec() << " video ";
|
||||||
case 1:
|
|
||||||
R << "JPEG";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
R << "H263";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
R << "ScreenVideo1";
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
R << "VP6";
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
R << "VP6Alpha";
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
R << "ScreenVideo2";
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
R << "H264";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
R << "unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
R << " video ";
|
|
||||||
switch (data[11] & 0xF0){
|
switch (data[11] & 0xF0){
|
||||||
case 0x10:
|
case 0x10:
|
||||||
R << "keyframe";
|
R << "keyframe";
|
||||||
|
@ -183,53 +213,7 @@ std::string FLV::Tag::tagType(){
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x08:
|
case 0x08:
|
||||||
switch (data[11] & 0xF0){
|
R << getAudioCodec();
|
||||||
case 0x00:
|
|
||||||
R << "linear PCM PE";
|
|
||||||
break;
|
|
||||||
case 0x10:
|
|
||||||
R << "ADPCM";
|
|
||||||
break;
|
|
||||||
case 0x20:
|
|
||||||
R << "MP3";
|
|
||||||
break;
|
|
||||||
case 0x30:
|
|
||||||
R << "linear PCM LE";
|
|
||||||
break;
|
|
||||||
case 0x40:
|
|
||||||
R << "Nelly16kHz";
|
|
||||||
break;
|
|
||||||
case 0x50:
|
|
||||||
R << "Nelly8kHz";
|
|
||||||
break;
|
|
||||||
case 0x60:
|
|
||||||
R << "Nelly";
|
|
||||||
break;
|
|
||||||
case 0x70:
|
|
||||||
R << "G711A-law";
|
|
||||||
break;
|
|
||||||
case 0x80:
|
|
||||||
R << "G711mu-law";
|
|
||||||
break;
|
|
||||||
case 0x90:
|
|
||||||
R << "reserved";
|
|
||||||
break;
|
|
||||||
case 0xA0:
|
|
||||||
R << "AAC";
|
|
||||||
break;
|
|
||||||
case 0xB0:
|
|
||||||
R << "Speex";
|
|
||||||
break;
|
|
||||||
case 0xE0:
|
|
||||||
R << "MP38kHz";
|
|
||||||
break;
|
|
||||||
case 0xF0:
|
|
||||||
R << "DeviceSpecific";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
R << "unknown";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (data[11] & 0x0C){
|
switch (data[11] & 0x0C){
|
||||||
case 0x0:
|
case 0x0:
|
||||||
R << " 5.5kHz";
|
R << " 5.5kHz";
|
||||||
|
@ -1109,15 +1093,8 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
||||||
}
|
}
|
||||||
pack_out["datatype"] = "audio";
|
pack_out["datatype"] = "audio";
|
||||||
pack_out["time"] = tagTime();
|
pack_out["time"] = tagTime();
|
||||||
if ( !metadata["audio"].isMember("codec") || metadata["audio"]["size"].asString() == ""){
|
if ( !metadata["audio"].isMember("codec") || metadata["audio"]["codec"].asString() == "?" || metadata["audio"]["codec"].asString() == ""){
|
||||||
switch (audiodata & 0xF0){
|
metadata["audio"]["codec"] = getAudioCodec();
|
||||||
case 0x20:
|
|
||||||
metadata["audio"]["codec"] = "MP3";
|
|
||||||
break;
|
|
||||||
case 0xA0:
|
|
||||||
metadata["audio"]["codec"] = "AAC";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ( !metadata["audio"].isMember("rate") || metadata["audio"]["rate"].asInt() < 1){
|
if ( !metadata["audio"].isMember("rate") || metadata["audio"]["rate"].asInt() < 1){
|
||||||
switch (audiodata & 0x0C){
|
switch (audiodata & 0x0C){
|
||||||
|
@ -1184,18 +1161,8 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
|
||||||
}
|
}
|
||||||
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() == ""){
|
if ( !metadata["video"].isMember("codec") || metadata["video"]["codec"].asString() == "?" || metadata["video"]["codec"].asString() == ""){
|
||||||
switch (videodata & 0x0F){
|
metadata["video"]["codec"] = getVideoCodec();
|
||||||
case 2:
|
|
||||||
metadata["video"]["codec"] = "H263";
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata["video"]["codec"] = "VP6";
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
metadata["video"]["codec"] = "H264";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pack_out["datatype"] = "video";
|
pack_out["datatype"] = "video";
|
||||||
switch (videodata & 0xF0){
|
switch (videodata & 0xF0){
|
||||||
|
|
|
@ -32,6 +32,8 @@ namespace FLV {
|
||||||
char * data; ///< Pointer to tag buffer.
|
char * data; ///< Pointer to tag buffer.
|
||||||
bool needsInitData(); ///< True if this media type requires init data.
|
bool needsInitData(); ///< True if this media type requires init data.
|
||||||
bool isInitData(); ///< True if current tag is init data for this media type.
|
bool isInitData(); ///< True if current tag is init data for this media type.
|
||||||
|
const char * getAudioCodec(); ///< Returns a c-string with the audio codec name.
|
||||||
|
const char * getVideoCodec(); ///< Returns a c-string with the video codec name.
|
||||||
std::string tagType(); ///< Returns a std::string describing the tag in detail.
|
std::string tagType(); ///< Returns a std::string describing the tag in detail.
|
||||||
unsigned int tagTime(); ///< Returns the 32-bit timestamp of this tag.
|
unsigned int tagTime(); ///< Returns the 32-bit timestamp of this tag.
|
||||||
void tagTime(unsigned int T); ///< Sets the 32-bit timestamp of this tag.
|
void tagTime(unsigned int T); ///< Sets the 32-bit timestamp of this tag.
|
||||||
|
|
Loading…
Add table
Reference in a new issue