Author: hyc Date: Tue Nov 10 03:37:24 2009 New Revision: 38 Log: Experimental retry: use pause/unpause when buffer is empty Modified: rtmp.cpp rtmp.h Modified: rtmp.cpp ============================================================================== --- rtmp.cpp Tue Nov 10 03:36:55 2009 (r37) +++ rtmp.cpp Tue Nov 10 03:37:24 2009 (r38) @@ -103,6 +103,7 @@ CRTMP::CRTMP() : m_socket(0) m_fAudioCodecs = 3191.0; m_fVideoCodecs = 252.0; m_bTimedout = false; + m_bPausing = 0; } CRTMP::~CRTMP() @@ -250,6 +251,7 @@ bool CRTMP::Connect() { Close(); m_bTimedout = false; + m_bPausing = 0; m_fDuration = 0.0; sockaddr_in service; @@ -460,6 +462,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack //Log(LOGDEBUG, "%s, received: audio %lu bytes", __FUNCTION__, packet.m_nBodySize); HandleAudio(packet); bHasMediaPacket = 1; + if (!m_mediaChannel) + m_mediaChannel = packet.m_nChannel; break; case 0x09: @@ -467,6 +471,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack //Log(LOGDEBUG, "%s, received: video %lu bytes", __FUNCTION__, packet.m_nBodySize); HandleVideo(packet); bHasMediaPacket = 1; + if (!m_mediaChannel) + m_mediaChannel = packet.m_nChannel; break; case 0x0F: // flex stream send @@ -823,7 +829,7 @@ bool CRTMP::SendPause(bool DoPause, doub *enc = 0x05; // NULL enc++; enc += EncodeBoolean(enc, DoPause); - enc += EncodeNumber(enc, (double)dTime/1000); + enc += EncodeNumber(enc, (double)dTime); packet.m_nBodySize = enc - packet.m_body; @@ -1303,11 +1309,14 @@ void CRTMP::HandleCtrl(const RTMPPacket case 0: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream Begin %d", __FUNCTION__, tmp); + m_bPausing = 0; break; case 1: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream EOF %d", __FUNCTION__, tmp); + if (m_bPausing == 1) + m_bPausing = 2; break; case 2: @@ -1329,6 +1338,13 @@ void CRTMP::HandleCtrl(const RTMPPacket case 31: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream BufferEmpty %d", __FUNCTION__, tmp); + if (!m_bPausing) { + SendPause(true, m_channelTimestamp[m_mediaChannel]); + m_bPausing = 1; + } else if (m_bPausing == 2) { + SendPause(false, m_channelTimestamp[m_mediaChannel]); + m_bPausing = 3; + } break; case 32: Modified: rtmp.h ============================================================================== --- rtmp.h Tue Nov 10 03:36:55 2009 (r37) +++ rtmp.h Tue Nov 10 03:37:24 2009 (r38) @@ -216,7 +216,9 @@ class CRTMP bool m_bPlaying; int m_nBufferMS; int m_stream_id; // returned in _result from invoking createStream + int m_mediaChannel; bool m_bTimedout; + int m_bPausing; int m_nClientBW; uint8_t m_nClientBW2; int m_nServerBW;
hyc wrote:
Author: hyc Date: Tue Nov 10 03:37:24 2009 New Revision: 38
Log: Experimental retry: use pause/unpause when buffer is empty
This seems to get around the server hangs, but the pause/resume point isn't clean. Testing/feedback would be appreciated.
Modified: rtmp.cpp rtmp.h
Modified: rtmp.cpp ============================================================================== --- rtmp.cpp Tue Nov 10 03:36:55 2009 (r37) +++ rtmp.cpp Tue Nov 10 03:37:24 2009 (r38) @@ -103,6 +103,7 @@ CRTMP::CRTMP() : m_socket(0) m_fAudioCodecs = 3191.0; m_fVideoCodecs = 252.0; m_bTimedout = false; + m_bPausing = 0; }
CRTMP::~CRTMP() @@ -250,6 +251,7 @@ bool CRTMP::Connect() { Close();
m_bTimedout = false; + m_bPausing = 0; m_fDuration = 0.0;
sockaddr_in service; @@ -460,6 +462,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack //Log(LOGDEBUG, "%s, received: audio %lu bytes", __FUNCTION__, packet.m_nBodySize); HandleAudio(packet); bHasMediaPacket = 1; + if (!m_mediaChannel) + m_mediaChannel = packet.m_nChannel; break;
case 0x09: @@ -467,6 +471,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack //Log(LOGDEBUG, "%s, received: video %lu bytes", __FUNCTION__, packet.m_nBodySize); HandleVideo(packet); bHasMediaPacket = 1; + if (!m_mediaChannel) + m_mediaChannel = packet.m_nChannel; break;
case 0x0F: // flex stream send @@ -823,7 +829,7 @@ bool CRTMP::SendPause(bool DoPause, doub *enc = 0x05; // NULL enc++; enc += EncodeBoolean(enc, DoPause); - enc += EncodeNumber(enc, (double)dTime/1000); + enc += EncodeNumber(enc, (double)dTime);
packet.m_nBodySize = enc - packet.m_body;
@@ -1303,11 +1309,14 @@ void CRTMP::HandleCtrl(const RTMPPacket case 0: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream Begin %d", __FUNCTION__, tmp); + m_bPausing = 0; break;
case 1: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream EOF %d", __FUNCTION__, tmp); + if (m_bPausing == 1) + m_bPausing = 2; break;
case 2: @@ -1329,6 +1338,13 @@ void CRTMP::HandleCtrl(const RTMPPacket case 31: tmp = ReadInt32(packet.m_body + 2); Log(LOGDEBUG, "%s, Stream BufferEmpty %d", __FUNCTION__, tmp); + if (!m_bPausing) { + SendPause(true, m_channelTimestamp[m_mediaChannel]); + m_bPausing = 1; + } else if (m_bPausing == 2) { + SendPause(false, m_channelTimestamp[m_mediaChannel]); + m_bPausing = 3; + } break;
case 32:
Modified: rtmp.h ============================================================================== --- rtmp.h Tue Nov 10 03:36:55 2009 (r37) +++ rtmp.h Tue Nov 10 03:37:24 2009 (r38) @@ -216,7 +216,9 @@ class CRTMP bool m_bPlaying; int m_nBufferMS; int m_stream_id; // returned in _result from invoking createStream + int m_mediaChannel; bool m_bTimedout; + int m_bPausing; int m_nClientBW; uint8_t m_nClientBW2; int m_nServerBW;
participants (2)
-
Howard Chu -
hyc