[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