[prev in list] [next in list] [prev in thread] [next in thread]
List: helix-server-cvs
Subject: [Server-cvs]
From: svaidhya () helixcommunity ! org
Date: 2008-12-12 1:44:58
Message-ID: 200812120145.mBC1jfbO021808 () mailer ! progressive-comp ! com
[Download RAW message or body]
Update of /cvsroot/server/broadcast/transport/rtp/recv
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv19301
Modified Files:
Tag: SERVER_12_1
qtstream.cpp
Log Message:
Synopsis
========
Implementation of IHXRTPPacketInfo and related changed in QTStream::ReadDone
Branches: SERVER_CURRENT, SERVER_12_1
Reviewer(s): Jamie, Chytanya
Description
===========
- Implemented the IHXRTPPacketInfo (only required ones)
- Modified the Common Class Factory to include IHXRTPPacketInfo in the CreateInstance Method
It also sets the variable "m_bEnableIHXRTPPacketInfo" in ServerPacket to allow QI'ing
IHXRTPPacketInfo from either IHXPcket ot IHXRTPPacket.
- QTStream::ReadDone method
- RTPPacketBase::unpack method to extract the various field in the pkt
- Create Instance of IHXRTPPacketInfo and set the values using its Get/Set methods
- Finally create IHXPacket and add it to the Packet Queue of QTBCStreamsObject.
Chytanya's Review Comments
==========================
- Remove a AddRef to StreamHeader in ReadDone Method
Files Affected
==========
/server/common/struct/servpckt.cpp
/server/common/struct/pub/servpckt.h
/common/include/ihxpckts.h
/server/broadcast/transport/rtp/recv/qtstream.cpp
/server/broadcast/transport/rtp/recv/qtstream.h
Testing Performed
=================
Unit Tests:
None.
Integration Tests:
- Tested for single rate Streams
Leak Tests:
None.
Performance Tests:
None.
Platforms Tested: : win32-i386-vc7
Build verified: linux-rhel4-i686, win32-i386-vc7
Index: qtstream.cpp
===================================================================
RCS file: /cvsroot/server/broadcast/transport/rtp/recv/qtstream.cpp,v
retrieving revision 1.28.2.1.6.1
retrieving revision 1.28.2.1.6.2
diff -u -d -r1.28.2.1.6.1 -r1.28.2.1.6.2
--- qtstream.cpp 24 Apr 2008 22:09:23 -0000 1.28.2.1.6.1
+++ qtstream.cpp 12 Dec 2008 01:44:55 -0000 1.28.2.1.6.2
@@ -582,9 +582,11 @@
ULONG32 ulAddr,
UINT16 nPort)
{
- UINT8 uiFlags = 0;
UINT32 ulPktInfo = 0;
+ UINT32 ulStartRecvTime = 0;
+ UINT32 ulDeliveryTime = 0;
+
if (m_bStreamDone)
{
return HXR_OK;
@@ -601,14 +603,22 @@
return HXR_OK;
}
- // extract the SSRC
- UINT8* pSSRC = (UINT8*) pBuffer->GetBuffer() + 8;
- UINT32 ulSSRC = pSSRC[0] << 24 | pSSRC[1] << 16 | pSSRC[2] << 8 | pSSRC[3];
+ RTPPacketBase rtpPktBase;
+
+ UINT8* puBuf = (UINT8*) pBuffer->GetBuffer();
+ rtpPktBase.unpack(puBuf, pBuffer->GetSize());
+
+ UINT32 ulSSRC = rtpPktBase.ssrc;
+ UINT16 uRTPSeqNo = rtpPktBase.seq_no;
HX_ASSERT(m_pStreamsObj);
if (m_bFirstPkt)
{
+
+ //Time first packet is received
+ ulStartRecvTime = HX_GET_TICKCOUNT();
+
m_bFirstPkt = FALSE;
m_ulEncoderAddr = ulAddr;
@@ -623,17 +633,10 @@
m_pStreamsObj->FirstPacketReceived(ulAddr, nPort);
- /* for BW calculation */
+ // for BW calculation
m_ulReferenceTick = HX_GET_TICKCOUNT();
- BYTE* pRTPPkt = (BYTE*)pBuffer->GetBuffer();
- UINT8 uRTPPT;
- UINT16 uRTPSeqNo;
-
- PacketSkimmer::GetRTPSequence(pRTPPkt, pBuffer->GetSize(),
- uRTPPT, uRTPSeqNo);
m_uExpectedSequence = uRTPSeqNo;
-
}
else if (ulAddr != m_ulEncoderAddr || ulSSRC != m_ulSSRC)
{
@@ -641,17 +644,12 @@
RejectPacket(ulAddr);
return HXR_OK;
}
-
- BYTE* pRTPPkt = (BYTE*)pBuffer->GetBuffer();
- UINT8 uRTPPT;
- UINT16 uRTPSeqNo;
-
- PacketSkimmer::GetRTPSequence(pRTPPkt, pBuffer->GetSize(), uRTPPT,
- uRTPSeqNo);
-
+
// normal case, we get the one we wanted
if (uRTPSeqNo == m_uExpectedSequence)
{
+ ulDeliveryTime = HX_GET_TICKCOUNT() - ulStartRecvTime;
+
m_PacketSeqNumBucket.Set(uRTPSeqNo);
m_uExpectedSequence++;
}
@@ -659,9 +657,18 @@
{
m_ulDuplicates++;
HXAtomicIncUINT32(&m_pSharedStats->m_uDuplicates);
+
+ //We just chuck the pkt
+ return HXR_OK;
}
else
{
+ /** Will have to change the calculation of delivery time
+ * as DeliveryTime(SeqNo +1 ) when we handle outo of order
+ * pkts.For now keeping it simple
+ */
+ ulDeliveryTime = HX_GET_TICKCOUNT() - ulStartRecvTime;
+
m_PacketSeqNumBucket.Set(uRTPSeqNo);
UINT32 ulExpected;
@@ -736,7 +743,6 @@
}
}
-
// timeout
HX_ASSERT(m_ulCallbackID);
//ScheduleBYETimeout();
@@ -751,19 +757,36 @@
HXAtomicIncUINT32(&m_pSharedStats->m_uPacketsRcvd);
HXAtomicAddUINT32(&m_pSharedStats->m_uBytesRcvd, pBuffer->GetSize());
}
-
- HX_RESULT hResult = HXR_OK;
- IHXPacket* pPacket = NULL;
+
+ IHXRTPPacketInfo* pRTPPacketInfo = NULL;
+ IHXRTPPacket* pRTPPacket = NULL;
+ IHXPacket* pPacket = NULL;
IHXBroadcastDistPktExt* pPacketExt = NULL;
+ IHXBuffer* pPayload = NULL;
+ HX_RESULT hResult = HXR_OK;
- hResult = m_pClassFactory->CreateInstance(CLSID_IHXPacket, (void**)&pPacket);
- if (FAILED(hResult))
- {
- goto bail;
- }
- HX_ASSERT(pPacket);
-
- uiFlags = 0;
+ //Compute RTP Time - RTP ITme
+ UINT32 ulStartRTPTime = 0;
+ UINT32 ulPktRTPTime = rtpPktBase.timestamp ;
+ UINT32 ulRTPTime = ulPktRTPTime - ulStartRTPTime;
+
+ //Compute ASMRuleNumber
+ UINT16 unASMRuleNumber = 0;
+ UINT32 ulBaseRule = 0;
+
+ IHXValues* pStream = NULL;
+ m_pStreamsObj->GetStreamHeader(m_nStreamNum, pStream);
+
+ pStream->GetPropertyULONG32("BaseRule", ulBaseRule);
+ unASMRuleNumber = ulBaseRule + rtpPktBase.marker_flag;
+
+ HX_RELEASE(pStream);
+
+ //Payload
+ UCHAR* puPayload = (UCHAR*) rtpPktBase.data.data;
+ ULONG32 ulLength = (ULONG32) rtpPktBase.data.len;
+
+ UINT8 uiFlags = 0;
if (m_pPktSkimmer)
{
@@ -786,17 +809,57 @@
uiFlags = HX_ASM_SWITCH_ON | HX_ASM_SWITCH_OFF;
}
+ hResult = m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pPayload);
+ HX_ASSERT(pPayload);
- hResult = pPacket->Set(pBuffer,
- HX_GET_TICKCOUNT(), // HXTime (?)
- m_nStreamNum,
- uiFlags,
- 0); // not RTCP
-
- pPacket->QueryInterface(IID_IHXBroadcastDistPktExt,
- (void **)&pPacketExt);
+ hResult = pPayload->Set(puPayload, ulLength);
+ if (FAILED(hResult))
+ {
+ goto bail;
+ }
+
+ hResult = m_pClassFactory->CreateInstance(CLSID_IHXRTPPacketInfo, (void**)&pRTPPacketInfo);
+ if (FAILED(hResult))
+ {
+ goto bail;
+ }
+ HX_ASSERT(pRTPPacketInfo);
+
+ //SET SSRC, Seq No, MarkerBit
+ //IGNORE Padding/PaddingBit, Extension/ExtensionBit, CSRCList/CSRCCount Payload
+ pRTPPacketInfo->SetSequenceNumber(rtpPktBase.seq_no);
+ pRTPPacketInfo->SetMarkerBit(rtpPktBase.marker_flag);
+ pRTPPacketInfo->SetSSRC(rtpPktBase.ssrc);
+
+ hResult = pRTPPacketInfo->QueryInterface(IID_IHXRTPPacket, (void**)&pRTPPacket);
+ if (FAILED(hResult))
+ {
+ goto bail;
+ }
+ HX_ASSERT(pRTPPacket);
+
+ //The SetRTP method would work only if owned by atmost 1 user
+ HX_RELEASE(pRTPPacketInfo);
+
+ hResult = pRTPPacket->SetRTP(
+ pPayload,
+ ulDeliveryTime,
+ ulRTPTime,
+ m_nStreamNum,
+ uiFlags,
+ unASMRuleNumber
+ );
+
+ hResult = pRTPPacket->QueryInterface(IID_IHXPacket, (void**)&pPacket);
+ if (FAILED(hResult))
+ {
+ goto bail;
+ }
+ HX_ASSERT(pPacket);
+ pPacket->QueryInterface(IID_IHXBroadcastDistPktExt, (void **)&pPacketExt);
HX_ASSERT(pPacketExt);
+
if(pPacketExt)
{
BYTE* pBuf = pBuffer->GetBuffer();
@@ -808,6 +871,8 @@
pPacketExt->SetStreamSeqNo(unSeqNo);
HX_RELEASE(pPacketExt);
}
+ HX_RELEASE(pRTPPacket);
+ HX_RELEASE(pPayload);
if (FAILED(hResult))
{
@@ -815,12 +880,17 @@
}
m_pStreamsObj->AddPacket(pPacket);
- HX_RELEASE(pPacket);
+ HX_RELEASE(pPacket);
return HXR_OK;
+
bail:
+ HX_RELEASE(pRTPPacketInfo);
+ HX_RELEASE(pRTPPacket);
+ HX_RELEASE(pPayload);
HX_RELEASE(pPacket);
+
EndStream();
return HXR_OK;
}
_______________________________________________
Server-cvs mailing list
Server-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/server-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic