Some RTMP timestamp issues found and fixed, as well as some RTMP Parser fixes (but now segfaults? Needs more testing...)
This commit is contained in:
parent
d6f8dfa24e
commit
693b9e47e5
2 changed files with 9 additions and 6 deletions
|
@ -42,6 +42,7 @@ std::string RTMPStream::Chunk::Pack(){
|
||||||
unsigned int tmpi;
|
unsigned int tmpi;
|
||||||
unsigned char chtype = 0x00;
|
unsigned char chtype = 0x00;
|
||||||
timestamp -= firsttime;
|
timestamp -= firsttime;
|
||||||
|
if (timestamp < prev.timestamp){timestamp = prev.timestamp;}
|
||||||
if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){
|
if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){
|
||||||
if (msg_stream_id == prev.msg_stream_id){
|
if (msg_stream_id == prev.msg_stream_id){
|
||||||
chtype = 0x40;//do not send msg_stream_id
|
chtype = 0x40;//do not send msg_stream_id
|
||||||
|
@ -215,7 +216,7 @@ std::string RTMPStream::SendUSR(unsigned char type, unsigned int data){
|
||||||
ch.msg_type_id = 4;
|
ch.msg_type_id = 4;
|
||||||
ch.msg_stream_id = 0;
|
ch.msg_stream_id = 0;
|
||||||
ch.data.resize(6);
|
ch.data.resize(6);
|
||||||
*(unsigned int*)((char*)ch.data.c_str()+2) = htonl(data);
|
*(unsigned int*)(((char*)ch.data.c_str())+2) = htonl(data);
|
||||||
ch.data[0] = 0;
|
ch.data[0] = 0;
|
||||||
ch.data[1] = type;
|
ch.data[1] = type;
|
||||||
return ch.Pack();
|
return ch.Pack();
|
||||||
|
@ -232,8 +233,8 @@ std::string RTMPStream::SendUSR(unsigned char type, unsigned int data, unsigned
|
||||||
ch.msg_type_id = 4;
|
ch.msg_type_id = 4;
|
||||||
ch.msg_stream_id = 0;
|
ch.msg_stream_id = 0;
|
||||||
ch.data.resize(10);
|
ch.data.resize(10);
|
||||||
*(unsigned int*)((char*)ch.data.c_str()+2) = htonl(data);
|
*(unsigned int*)(((char*)ch.data.c_str())+2) = htonl(data);
|
||||||
*(unsigned int*)((char*)ch.data.c_str()+6) = htonl(data2);
|
*(unsigned int*)(((char*)ch.data.c_str())+6) = htonl(data2);
|
||||||
ch.data[0] = 0;
|
ch.data[0] = 0;
|
||||||
ch.data[1] = type;
|
ch.data[1] = type;
|
||||||
return ch.Pack();
|
return ch.Pack();
|
||||||
|
@ -274,7 +275,8 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
RTMPStream::Chunk prev = lastrecv[cs_id];
|
RTMPStream::Chunk prev = lastrecv[cs_id];
|
||||||
|
|
||||||
//process the rest of the header, for each chunk type
|
//process the rest of the header, for each chunk type
|
||||||
switch (chunktype & 0xC0){
|
headertype = chunktype & 0xC0;
|
||||||
|
switch (headertype){
|
||||||
case 0x00:
|
case 0x00:
|
||||||
if (indata.size() < i+11) return false; //can't read whole header
|
if (indata.size() < i+11) return false; //can't read whole header
|
||||||
timestamp = indata[i++]*256*256;
|
timestamp = indata[i++]*256*256;
|
||||||
|
@ -296,7 +298,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
timestamp = indata[i++]*256*256;
|
timestamp = indata[i++]*256*256;
|
||||||
timestamp += indata[i++]*256;
|
timestamp += indata[i++]*256;
|
||||||
timestamp += indata[i++];
|
timestamp += indata[i++];
|
||||||
timestamp += prev.timestamp;
|
if (timestamp != 0x00ffffff){timestamp += prev.timestamp;}
|
||||||
len = indata[i++]*256*256;
|
len = indata[i++]*256*256;
|
||||||
len += indata[i++]*256;
|
len += indata[i++]*256;
|
||||||
len += indata[i++];
|
len += indata[i++];
|
||||||
|
@ -310,7 +312,7 @@ bool RTMPStream::Chunk::Parse(std::string & indata){
|
||||||
timestamp = indata[i++]*256*256;
|
timestamp = indata[i++]*256*256;
|
||||||
timestamp += indata[i++]*256;
|
timestamp += indata[i++]*256;
|
||||||
timestamp += indata[i++];
|
timestamp += indata[i++];
|
||||||
timestamp += prev.timestamp;
|
if (timestamp != 0x00ffffff){timestamp += prev.timestamp;}
|
||||||
len = prev.len;
|
len = prev.len;
|
||||||
len_left = prev.len_left;
|
len_left = prev.len_left;
|
||||||
msg_type_id = prev.msg_type_id;
|
msg_type_id = prev.msg_type_id;
|
||||||
|
|
|
@ -30,6 +30,7 @@ namespace RTMPStream{
|
||||||
/// Holds a single RTMP chunk, either send or receive direction.
|
/// Holds a single RTMP chunk, either send or receive direction.
|
||||||
class Chunk{
|
class Chunk{
|
||||||
public:
|
public:
|
||||||
|
unsigned char headertype; ///< For input chunks, the type of header. This is calculated automatically for output chunks.
|
||||||
unsigned int cs_id; ///< ContentStream ID
|
unsigned int cs_id; ///< ContentStream ID
|
||||||
unsigned int timestamp; ///< Timestamp of this chunk.
|
unsigned int timestamp; ///< Timestamp of this chunk.
|
||||||
unsigned int len; ///< Length of the complete chunk.
|
unsigned int len; ///< Length of the complete chunk.
|
||||||
|
|
Loading…
Add table
Reference in a new issue