rtp/rtpstack/tsrc/rtptestapp/src/rtptestapp.cpp
changeset 29 5f12516512fa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp/rtpstack/tsrc/rtptestapp/src/rtptestapp.cpp	Thu Jun 24 14:43:49 2010 +0300
@@ -0,0 +1,422 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    
+*
+*/
+
+
+// HEADERS
+#include <connpref.h>
+#include <es_sock.h>
+#include <commdbconnpref.h>
+#include "in_sock.h"
+#include <e32cons.h>
+#include <e32err.h>
+#include <e32std.h>
+#include <e32base.h>
+#include <badesca.h>
+#include <random.h>
+#include "rtpheader.h"
+#include "rtptestapp.h"
+
+const TUint KIAPID = 1;
+const TInt KLength = 20;
+_LIT8(KHello, "RTP APIs...testing");
+_LIT8(KNoCName, "");
+
+CConsoleBase *gConsole;
+CActiveScheduler *sched;
+
+void MainL()
+    {
+    // Create a Console 
+    gConsole = Console::NewL(_L("Test Console"), TSize(KConsFullScreen, KConsFullScreen));
+    CleanupStack::PushL(gConsole);
+    
+    // Create an Active scheduler 
+    sched = new (ELeave) CActiveScheduler;
+    CActiveScheduler::Install(sched);
+    
+    //IAP(Internet Access Point) id to be chaged as per comms dat
+    CRtpTestApp * iRtpTestApp = CRtpTestApp::NewL();   
+    
+    // Send RTP Packet with CSRC and Check RTP Stack 
+    // Supports maximum 15 contributing sources
+    iRtpTestApp->SendRtpPacketL();
+    
+    // Send RTP packet with zero length paylpoad
+    iRtpTestApp->SendZeroLengthRtpPacketL();
+    
+    // Send RTP Packets and Modify packet in callback function
+    iRtpTestApp->SendRtpPacketLoopbackL();
+    
+    
+    User::After(5000000);
+    delete iRtpTestApp;
+    delete sched;
+    CleanupStack::PopAndDestroy(gConsole);
+    
+    }
+
+CRtpTestApp * CRtpTestApp::NewL()
+{
+    gConsole->Printf(_L("RtpTestApp::NewL\n"));
+    CRtpTestApp* self = new( ELeave ) CRtpTestApp(); 
+    CleanupStack::PushL( self );
+    
+    // To construct the objects in the second-phase of the construction
+    self->ConstructL( );
+    CleanupStack::Pop( self);
+    return self;
+}
+
+CRtpTestApp::CRtpTestApp()
+    {
+    
+    }
+
+
+void CRtpTestApp::ErrorNotify( TInt /*aErrCode*/ )
+    {
+    
+    }
+
+void CRtpTestApp::SdesReceived( TRtpSSRC /*aSSRC*/,
+                   const TRtpSdesParams& /*aParams*/ )
+    {
+    
+    }
+
+void CRtpTestApp::ByeReceived( TRtpId /*aStreamId*/, TRtpSSRC /*aSSRC*/,
+                  const TDesC8& /*aReason*/ )
+    {
+    
+    }
+
+void CRtpTestApp::AppReceived( TRtpId /*aStreamId*/, TRtpSSRC /*aSSRC*/,
+                  const TRtcpApp& /*aApp*/ )
+    {
+    
+    }
+
+void CRtpTestApp::SrReceived( TRtpId /*aStreamId*/, TRtpSSRC /*aSSRC*/,
+                 const TTimeStamps& /*aTimeStamps*/ )
+    {
+    
+    }
+
+void CRtpTestApp::RrReceived( TRtpId /*aStreamId*/, TRtpSSRC /*aSSRC*/ )
+    {
+    
+    }
+
+void CRtpTestApp::RtpPacketReceived( TRtpId /*aStreamId*/, const TRtpRecvHeader& aHeaderInfo, const TDesC8& /*aPayloadData*/ )
+    {
+    gConsole->Printf(_L("RtpPacketReceived .. \n"));
+    
+    for(int i=0; i<aHeaderInfo.iCsrcCount; i++)
+        {
+        if ( (*iCsrclist)[i] == *(aHeaderInfo.iCsrcList+i) )
+            {
+            gConsole->Printf(_L("RtpPacketReceived, Successfully\n"));
+            }
+        else
+            {
+            gConsole->Printf(_L("Malformed RTP Packet Received\n"));
+            gConsole->Printf(_L("Test Case Failed\n"));
+            }
+        }
+    
+    // Check for modified Padding, header extension, Marker bit values 1
+    if( aHeaderInfo.iMarker == 0 )
+        {
+        gConsole->Printf(_L("Test Case Failed\n"));
+        }
+    }
+
+void CRtpTestApp::ReadyToSendRtpPacket(  TRtpId /*aTranStreamId*/, TPtr8 &aPacket  )
+    {
+    gConsole->Printf(_L("ReadyToSendRtpPacket Callback..\n"));
+    
+    // Change Marker bit value from 0 to 1
+    aPacket[1] = aPacket[1] | 0x80;
+    
+    TUint32* data32 = reinterpret_cast<TUint32*>(&(aPacket[8]));
+    //Change SSRC Value from
+    *data32 = ByteOrder::Swap32(0xDEADBEEF);
+    }
+
+void CrtpDataSender::RunL()
+    {
+    gConsole->Printf(_L("CrtpDataSender::RunL\n"));
+    CActiveScheduler::Stop();
+    }
+
+void CRtpTestApp::ConstructL()
+    {
+    iRtpApi = CRtpAPI::NewL(*this );
+
+    TVersion  version = iRtpApi->Version();
+    
+    TInt result(KErrNone);
+    
+    iParams.iCName.Set(KNoCName());
+
+    iRtpApi->OpenL( iParams, NULL, NULL, NULL );
+    
+    result = iRtpApi->StartConnection(KIAPID);
+    gConsole->Printf(_L("Local Ip Address %d\n"),result);
+    
+    TBuf<50> addrStr;
+    TInetAddr inetaddr = iRtpApi->GetLocalIPAddressL();
+    inetaddr.Output(addrStr);
+    
+    gConsole->Printf(_L("Local Ip Address %s\n"),addrStr.PtrZ());
+    
+    iSessionParams.iPriority = TCreateSessionParams::EPriorityStandard;
+    iSessionParams.iSocketBufSize = KSocketBufSize;
+    
+    
+    iPort1 = 8000 ;
+    iPort2 = 9000;
+
+    iRtcpParams.iRtcpFraction = 10;
+    iRtcpParams.iRtcpTimeOut = 5000000;
+    iRtcpParams.iSessionBWidth = 300;
+    
+    iEnableRtcp = EFalse;
+    
+    //Creating New session
+    iSessionId1  = KNullId;
+    iSessionId2 = KNullId;
+    iSessionId1 = iRtpApi->CreateSessionL(iSessionParams, iPort1, iEnableRtcp, &iRtcpParams);
+    iSessionId2 = iRtpApi->CreateSessionL(iSessionParams,iPort2,EFalse,&iRtcpParams);
+    
+    TInetAddr remAddress = iRtpApi->GetLocalIPAddressL(); 
+    remAddress.SetPort(iPort2); //Session 1 sends data to Session 2
+    
+    iRtpApi->SetRemoteAddress(iSessionId1, remAddress);
+     
+    iRtpApi->RegisterRtpObserver(iSessionId1, *this);
+    iRtpApi->RegisterRtcpObserver(iSessionId1, *this);
+    iRtpApi->RegisterRtpObserver(iSessionId2, *this);
+    iRtpApi->RegisterRtcpObserver(iSessionId2, *this);
+    iRtpApi->RegisterRtpPostProcessingObserver(iSessionId1, *this);
+    
+    TTranStreamParams streamParams;
+    streamParams.iPayloadType = 98;
+    TRtpSSRC locSSRC;
+    
+    iS1T1 = iRtpApi->CreateTransmitStreamL(iSessionId1,streamParams,locSSRC);
+    
+    TRcvStreamParams rcvParams;
+    rcvParams.iPayloadType = 98;
+
+    iS2R1 = iRtpApi->CreateReceiveStreamL(iSessionId2,rcvParams);
+    
+    
+    /* Start both the sessions */
+    TInt ret = iRtpApi->StartSession(iSessionId1);
+    ret = iRtpApi->StartSession(iSessionId2);
+    
+    iRtpApi->SetSamplingRate(98,8000);
+    }
+
+
+void CRtpTestApp::SendRtpPacketL()
+    {
+    gConsole->Printf(_L("SendRtpPackets  TO Loopback address and Verify Header fields.. \n"));
+    
+    TRtpSendHeader headerinfo;
+    headerinfo.iHeaderExtension = NULL;
+    headerinfo.iMarker = 0;
+    headerinfo.iPadding = 0;
+    headerinfo.iPayloadType = 98;
+    headerinfo.iTimestamp = 1000;
+    
+    HBufC8* data = HBufC8::NewLC(KLength);
+    data->Des().Copy(KHello);
+
+    
+    TRtpSendPktParams *header = new(ELeave) TRtpSendPktParams(headerinfo);
+    CleanupDeletePushL(header);
+    header->iTranStreamId = iS1T1;
+    header->iPayloadData.Set(data->Des()); 
+    
+    const TUint KArrayGranularity = 15;
+    
+    iCsrclist = new(ELeave) CArrayFixFlat<TUint32>(KArrayGranularity);
+    
+    // Send RTP Packets with CSRC list - 17 CSRC. Max Supported CSRC list is 15.
+    iCsrclist->AppendL(100001);
+    iCsrclist->AppendL(100002);
+    iCsrclist->AppendL(100003);
+    iCsrclist->AppendL(100004);
+    iCsrclist->AppendL(100005);
+    iCsrclist->AppendL(100006);
+    iCsrclist->AppendL(100007);
+    iCsrclist->AppendL(100008);
+    iCsrclist->AppendL(100009);
+    iCsrclist->AppendL(100010);
+    iCsrclist->AppendL(100011);
+    iCsrclist->AppendL(100012);
+    iCsrclist->AppendL(100013);
+    iCsrclist->AppendL(100014);
+    iCsrclist->AppendL(100015);
+    iCsrclist->AppendL(100016);
+    iCsrclist->AppendL(100017);
+    
+    iRtpApi->SetSamplingRate(headerinfo.iPayloadType, 8000);
+    TInt ret1 = iRtpApi->SendRtpPacket(*header, iCsrclist->Array());
+    
+    CrtpDataSender *datasend = CrtpDataSender::NewL(iRtpApi, iS1T1);
+    CleanupStack::PushL(datasend);
+    
+    datasend->SendRtpData(*header, iCsrclist->Array());
+    
+    gConsole->Printf(_L("SendRtpPacket %d\n"),ret1);
+    
+    CActiveScheduler::Start();
+    
+    CleanupStack::PopAndDestroy(3);
+    delete iCsrclist;
+    iCsrclist = 0;
+    }
+
+
+void CRtpTestApp::SendRtpPacketLoopbackL()
+    {
+    gConsole->Printf(_L("SendRtpPackets  TO Loopback address and Verify Header fields.. \n"));
+
+    TRtpSendHeader header; 
+    header.iHeaderExtension = NULL;
+    header.iMarker = 0;
+    header.iPadding = 0;
+    header.iPayloadType = 98;
+    header.iTimestamp = 1000;
+    
+    HBufC8* data = HBufC8::NewLC(KLength);
+    data->Des().Copy(KHello);
+
+    TRtpSendPktParams *headerinfo = new(ELeave) TRtpSendPktParams(header);
+    CleanupDeletePushL(headerinfo);
+    headerinfo->iTranStreamId = iS1T1;
+    headerinfo->iPayloadData.Set(data->Des()); 
+    
+    const TUint KArrayGranularity = 15;
+    
+    // Create CSRC list and Append CSRC identifiers
+    iCsrclist = new(ELeave) CArrayFixFlat<TUint32>(KArrayGranularity);
+    
+    iCsrclist->AppendL(123456);
+    iCsrclist->AppendL(999999);
+     
+    TInt error2( KErrNone );
+    // Try sending synchronously with Csrc
+    error2 = iRtpApi->SendRtpPacket(*headerinfo, iCsrclist->Array());
+    gConsole->Printf(_L("SendRtpPacket.. %d\n"), error2);
+    
+    // Try sending asynchronously with CSRC
+    CrtpDataSender *datasend = CrtpDataSender::NewL(iRtpApi, iS1T1);
+    CleanupStack::PushL(datasend);
+    datasend->SendRtpData(*headerinfo, iCsrclist->Array());
+    gConsole->Printf(_L("SendRtpPacket.. %d\n"), error2);
+    
+    CActiveScheduler::Start();
+    
+    CleanupStack::PopAndDestroy(3);
+    delete iCsrclist;
+    iCsrclist = 0;
+    }
+
+void CRtpTestApp::SendZeroLengthRtpPacketL()
+    {
+    // Start Session on Session id
+    iRtpApi->StartSession(iSessionId1);
+    
+    TInetAddr remAddress = iRtpApi->GetLocalIPAddressL();
+    remAddress.SetPort(9000); //Session 1 sends data to Session 2
+    
+    iRtpApi->SetRemoteAddress(iSessionId1, remAddress);
+    
+    iRtpApi->RegisterRtpObserver(iSessionId1, *this);
+    iRtpApi->RegisterRtcpObserver(iSessionId1, *this);
+    iRtpApi->RegisterRtpPostProcessingObserver(iSessionId1, *this);
+    
+    //iRtpApi->SetNonRTPDataObserver(iSessionId1, *this);
+    
+    TTranStreamParams tranStreamParams;
+    tranStreamParams.iPayloadType = 96;
+    TRtpSSRC ssrc = 4567890;
+    
+    TRtpId streamId = iRtpApi->CreateTransmitStreamL(iSessionId1, tranStreamParams, ssrc);
+
+    
+    TRtpSendHeader headerinfo;
+    headerinfo.iHeaderExtension = 0;
+    headerinfo.iPayloadType = 96;
+    headerinfo.iTimestamp = 12345678;
+    
+    TRtpSendPktParams *header = new(ELeave) TRtpSendPktParams(headerinfo);
+    CleanupDeletePushL(header);
+    header->iTranStreamId = streamId;
+    
+    const TUint KArrayGranularity = 15;
+    
+    iCsrclist = new(ELeave) CArrayFixFlat<TUint32>(KArrayGranularity);
+    
+    // Send RTP Packets with CSRC list
+    iCsrclist->AppendL(100001);
+    iCsrclist->AppendL(100002);
+    
+    iRtpApi->SetSamplingRate(headerinfo.iPayloadType, 8000);
+    
+    TInt ret1 = iRtpApi->SendRtpPacket(*header, iCsrclist->Array());
+    
+    CrtpDataSender *datasend = CrtpDataSender::NewL(iRtpApi, streamId);
+    CleanupStack::PushL(datasend);
+    datasend->SendRtpData(*header, iCsrclist->Array());
+    
+    CActiveScheduler::Start();
+    
+    CleanupStack::PopAndDestroy(2);
+    delete iCsrclist;
+    iCsrclist = 0;
+    }
+
+CRtpTestApp::~CRtpTestApp()
+    {
+    delete iRtpApi;
+    }
+
+GLDEF_C TInt E32Main()
+/**
+ * @return - Standard Epoc error code on exit
+ */
+    {
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    if(!cleanup)
+        {
+        return KErrNoMemory;
+        }
+    TInt err = 0;
+    TRAP(err,MainL());
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return err;
+    }
+
+