Fixed RTMP desync bug with Windows clients.
This commit is contained in:
parent
ae057d3e78
commit
19c7081685
3 changed files with 7 additions and 11 deletions
|
@ -13,7 +13,7 @@ std::string RTMPStream::handshake_out;///< Output for the handshake.
|
|||
unsigned int RTMPStream::getNowMS(){
|
||||
timeval t;
|
||||
gettimeofday(&t, 0);
|
||||
return t.tv_sec + t.tv_usec/1000;
|
||||
return t.tv_sec * 1000 + t.tv_usec/1000;
|
||||
}//RTMPStream::getNowMS
|
||||
|
||||
|
||||
|
@ -27,7 +27,6 @@ unsigned int RTMPStream::rec_cnt = 0;
|
|||
unsigned int RTMPStream::snd_cnt = 0;
|
||||
|
||||
timeval RTMPStream::lastrec;
|
||||
unsigned int RTMPStream::firsttime;
|
||||
|
||||
/// Holds the last sent chunk for every msg_id.
|
||||
std::map<unsigned int, RTMPStream::Chunk> RTMPStream::Chunk::lastsend;
|
||||
|
@ -42,7 +41,6 @@ std::string RTMPStream::Chunk::Pack(){
|
|||
RTMPStream::Chunk prev = lastsend[cs_id];
|
||||
unsigned int tmpi;
|
||||
unsigned char chtype = 0x00;
|
||||
//timestamp -= firsttime;
|
||||
if ((prev.msg_type_id > 0) && (prev.cs_id == cs_id)){
|
||||
if (msg_stream_id == prev.msg_stream_id){
|
||||
chtype = 0x40;//do not send msg_stream_id
|
||||
|
|
|
@ -30,7 +30,6 @@ namespace RTMPStream{
|
|||
extern unsigned int snd_cnt; ///< Counter for total data sent, in bytes.
|
||||
|
||||
extern timeval lastrec; ///< Timestamp of last time data was received.
|
||||
extern unsigned int firsttime; ///< Timestamp of first time a chunk was sent.
|
||||
|
||||
/// Holds a single RTMP chunk, either send or receive direction.
|
||||
class Chunk{
|
||||
|
|
|
@ -42,9 +42,6 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
|
|||
DTSC::Stream Strm;
|
||||
bool stream_inited = false;//true if init data for audio/video was sent
|
||||
|
||||
//first timestamp set
|
||||
RTMPStream::firsttime = RTMPStream::getNowMS();
|
||||
|
||||
RTMPStream::handshake_in.reserve(1537);
|
||||
Socket.read((char*)RTMPStream::handshake_in.c_str(), 1537);
|
||||
RTMPStream::rec_cnt += 1537;
|
||||
|
@ -96,22 +93,24 @@ int Connector_RTMP::Connector_RTMP(Socket::Connection conn){
|
|||
}
|
||||
}
|
||||
if (SS.spool()){
|
||||
if (Strm.parsePacket(SS.Received())){
|
||||
while (Strm.parsePacket(SS.Received())){
|
||||
//sent init data if needed
|
||||
if (!stream_inited){
|
||||
init_tag.DTSCMetaInit(Strm);
|
||||
Socket.Send(RTMPStream::SendMedia(init_tag));
|
||||
if (Strm.metadata.getContentP("audio") && Strm.metadata.getContentP("audio")->getContentP("init")){
|
||||
init_tag.DTSCAudioInit(Strm);
|
||||
Socket.write(RTMPStream::SendMedia(init_tag));
|
||||
Socket.Send(RTMPStream::SendMedia(init_tag));
|
||||
}
|
||||
if (Strm.metadata.getContentP("video") && Strm.metadata.getContentP("video")->getContentP("init")){
|
||||
init_tag.DTSCVideoInit(Strm);
|
||||
Socket.write(RTMPStream::SendMedia(init_tag));
|
||||
Socket.Send(RTMPStream::SendMedia(init_tag));
|
||||
}
|
||||
stream_inited = true;
|
||||
}
|
||||
//sent a tag
|
||||
tag.DTSCLoader(Strm);
|
||||
Socket.write(RTMPStream::SendMedia(tag));
|
||||
Socket.Send(RTMPStream::SendMedia(tag));
|
||||
#if DEBUG >= 8
|
||||
fprintf(stderr, "Sent tag to %i: [%u] %s\n", Socket.getSocket(), tag.tagTime(), tag.tagType().c_str());
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue