Finally fixed long standing RTMP sync issue. Also added support for getting/setting FLV tag offsets.

This commit is contained in:
Thulinma 2013-11-14 12:24:11 +01:00
parent 01d008a56c
commit b78e9bc562
3 changed files with 29 additions and 10 deletions

View file

@ -262,6 +262,25 @@ std::string FLV::Tag::tagType(){
return R.str();
} //FLV::Tag::tagtype
/// Returns the 24-bit offset of this tag.
/// Returns 0 if the tag isn't H264
int FLV::Tag::offset(){
if (data[11] & 0x0F == 7){
return (((data[13] << 16) + (data[14] << 8) + data[15]) << 8) >> 8;
}else{
return 0;
}
} //offset getter
/// Sets the 24-bit offset of this tag.
/// Ignored if the tag isn't H264
void FLV::Tag::offset(int o){
if (data[11] & 0x0F != 7){return;}
data[13] = (o >> 16) & 0xFF;
data[14] = (o >> 8) & 0XFF;
data[15] = o & 0xFF;
} //offset setter
/// Returns the 32-bit timestamp of this tag.
unsigned int FLV::Tag::tagTime(){
return (data[4] << 16) + (data[5] << 8) + data[6] + (data[7] << 24);
@ -401,10 +420,7 @@ bool FLV::Tag::DTSCLoader(DTSC::Stream & S){
}else{
data[12] = 2;
}
int offset = S.getPacket()["offset"].asInt();
data[13] = (offset >> 16) & 0xFF;
data[14] = (offset >> 8) & 0XFF;
data[15] = offset & 0xFF;
offset(S.getPacket()["offset"].asInt());
}
data[11] = 0;
if (track.isMember("codec") && track["codec"].asStringRef() == "H264"){
@ -1174,9 +1190,7 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){
pack_out["nalu_end"] = 1;
break;
}
int offset = (data[13] << 16) + (data[14] << 8) + data[15];
offset = (offset << 8) >> 8;
pack_out["offset"] = offset;
pack_out["offset"] = offset();
if (len < 21){
return JSON::Value();
}

View file

@ -35,8 +35,10 @@ namespace FLV {
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.
unsigned int tagTime(); ///< Returns the 32-bit timestamp of this tag.
void tagTime(unsigned int T); ///< Sets the 32-bit timestamp of this tag.
unsigned int tagTime();
void tagTime(unsigned int T);
int offset();
void offset(int o);
Tag(); ///< Constructor for a new, empty, tag.
Tag(const Tag& O); ///< Copy constructor, copies the contents of an existing tag.
Tag & operator=(const Tag& O); ///< Assignment operator - works exactly like the copy constructor.

View file

@ -423,7 +423,10 @@ std::string & RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * d
/// \param tag FLV::Tag with media to send.
std::string & RTMPStream::SendMedia(FLV::Tag & tag){
static RTMPStream::Chunk ch;
ch.cs_id = ((unsigned char)tag.data[0]);
//Commented bit is more efficient and correct according to RTMP spec.
//Simply passing "4" is the only thing that actually plays correctly, though.
//Adobe, if you're ever reading this... wtf? Seriously.
ch.cs_id = 4;//((unsigned char)tag.data[0]);
ch.timestamp = tag.tagTime();
ch.len = tag.len - 15;
ch.real_len = tag.len - 15;