Author: hyc Date: Thu Nov 12 12:45:40 2009 New Revision: 47 Log: Fixed pause/resume synch Modified: rtmp.cpp rtmp.h Modified: rtmp.cpp ============================================================================== --- rtmp.cpp Wed Nov 11 11:24:55 2009 (r46) +++ rtmp.cpp Thu Nov 12 12:45:40 2009 (r47) @@ -426,10 +426,12 @@ int CRTMP::GetNextMediaPacket(RTMPPacket if (!bHasMediaPacket) { packet.FreePacket(); - } - if (m_bPausing == 3) { - if (packet.m_nTimeStamp <= m_pauseStamp) { - bHasMediaPacket = false; + } else if (m_bPausing == 3) { + if (packet.m_nTimeStamp <= m_mediaStamp) { + bHasMediaPacket = 0; +#ifdef _DEBUG + Log(LOGDEBUG, "Skipped type: %02X, size: %d, TS: %d ms, abs TS: %d, pause: %d ms", packet.m_packetType, packet.m_nBodySize, packet.m_nTimeStamp, packet.m_hasAbsTimestamp, m_mediaStamp); +#endif continue; } m_bPausing = 0; @@ -438,11 +440,6 @@ int CRTMP::GetNextMediaPacket(RTMPPacket if (bHasMediaPacket) m_bPlaying = true; -/* - else if (m_bTimedout) { - m_pauseStamp = m_channelTimestamp[m_mediaChannel]; - m_bPausing = 3; - } */ return bHasMediaPacket; } @@ -483,6 +480,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack bHasMediaPacket = 1; if (!m_mediaChannel) m_mediaChannel = packet.m_nChannel; + if (!m_bPausing) + m_mediaStamp = packet.m_nTimeStamp; break; case 0x09: @@ -492,6 +491,8 @@ int CRTMP::HandlePacket(RTMPPacket &pack bHasMediaPacket = 1; if (!m_mediaChannel) m_mediaChannel = packet.m_nChannel; + if (!m_bPausing) + m_mediaStamp = packet.m_nTimeStamp; break; case 0x0F: // flex stream send @@ -545,6 +546,7 @@ int CRTMP::HandlePacket(RTMPPacket &pack { // go through FLV packets and handle metadata packets unsigned int pos=0; + uint32_t nTimeStamp = packet.m_nTimeStamp; while(pos+11 < packet.m_nBodySize) { uint32_t dataSize = CRTMP::ReadInt24(packet.m_body+pos+1); // size without header (11) and prevTagSize (4) @@ -555,10 +557,15 @@ int CRTMP::HandlePacket(RTMPPacket &pack } if(packet.m_body[pos] == 0x12) { HandleMetadata(packet.m_body+pos+11, dataSize); + } else if (packet.m_body[pos] == 8 || packet.m_body[pos] == 9) { + nTimeStamp = CRTMP::ReadInt24(packet.m_body+pos+4); + nTimeStamp |= (packet.m_body[pos+7]<<24); } pos += (11+dataSize+4); } - + if (!m_bPausing) + m_mediaStamp = nTimeStamp; + // FLV tag(s) //Log(LOGDEBUG, "%s, received: FLV tag(s) %lu bytes", __FUNCTION__, packet.m_nBodySize); bHasMediaPacket = 1; Modified: rtmp.h ============================================================================== --- rtmp.h Wed Nov 11 11:24:55 2009 (r46) +++ rtmp.h Thu Nov 12 12:45:40 2009 (r47) @@ -213,16 +213,17 @@ class CRTMP int m_nBWCheckCounter; int m_nBytesIn; int m_nBytesInSent; - bool m_bPlaying; int m_nBufferMS; int m_stream_id; // returned in _result from invoking createStream int m_mediaChannel; + uint32_t m_mediaStamp; uint32_t m_pauseStamp; - bool m_bTimedout; int m_bPausing; + int m_nServerBW; int m_nClientBW; uint8_t m_nClientBW2; - int m_nServerBW; + bool m_bPlaying; + bool m_bTimedout; //std::string m_strPlayer; //std::string m_strPageUrl;
participants (1)
-
hyc