--- /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;
+ }
+
+