rtp/rtpstack/tsrc/rtptestapp/src/rtptestapp.cpp
author hgs
Thu, 24 Jun 2010 14:43:49 +0300
changeset 29 5f12516512fa
permissions -rw-r--r--
201025

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