multimediacommscontroller/mmccsubcontroller/tsrc/ut_subcontroller/Src/UT_CMccCodecConfigurator.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccsubcontroller/tsrc/ut_subcontroller/Src/UT_CMccCodecConfigurator.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,429 @@
+/*
+* 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:  
+*
+*/
+
+
+
+
+//  CLASS HEADER
+#include "UT_CMccCodecConfigurator.h"
+
+//  EXTERNAL INCLUDES
+#include <digia/eunit/EUnitMacros.h>
+#include <mmf/server/mmfaudioinput.h>
+#include <mmf/plugin/mmfaudioiointerfaceuids.hrh>
+
+//  INTERNAL INCLUDES
+#include "mcccodecconfigurator.h"
+#include "Mccinternalcodecs.h"
+#include "FormatStateMachine.h"
+#include <mmf/server/mmfformat.h>
+#include "mccrtpmediaclock.h"
+#include "mmccinterfacedef.h"
+#include "mccunittestmacros.h"
+#include "mccinternaldef.h"
+#include "mccgenericdatasink_STUB.h"
+#include "mccgenericdatasource_STUB.h"
+#include "mccfilesink.h"
+
+// CONSTRUCTION
+UT_CMccCodecConfigurator* UT_CMccCodecConfigurator::NewL()
+    {
+    UT_CMccCodecConfigurator* self = UT_CMccCodecConfigurator::NewLC();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+UT_CMccCodecConfigurator* UT_CMccCodecConfigurator::NewLC()
+    {
+    UT_CMccCodecConfigurator* self = new( ELeave ) UT_CMccCodecConfigurator();
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+UT_CMccCodecConfigurator::~UT_CMccCodecConfigurator()
+    {
+    }
+
+// Default constructor
+UT_CMccCodecConfigurator::UT_CMccCodecConfigurator()
+    {
+    }
+
+// Second phase construct
+void UT_CMccCodecConfigurator::ConstructL()
+    {
+    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+    // It generates the test case table.
+    CEUnitTestSuiteClass::ConstructL();
+    }
+
+//  METHODS
+
+void UT_CMccCodecConfigurator::SetupL()
+    {
+    iRtpMediaClock = CMccRtpMediaClock::NewL();
+    }
+
+void UT_CMccCodecConfigurator::Teardown()
+    {
+    delete iRtpMediaClock;
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_ConfigureCodecLL()
+    {
+    TMccCodecInfo cInfo;
+
+    // These two will fail because of the NULL    
+    //EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::ConfigureCodecL( NULL, reinterpret_cast<MDataSink&>( *this ), cInfo, *iRtpMediaClock ) );
+    //EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::ConfigureCodecL( reinterpret_cast<MDataSource&>( *this ), NULL, cInfo, *iRtpMediaClock ) );
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_DoConfigureAmrNbLL()
+    {
+    // aPlaybackDev == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureAmrNbL(
+        static_cast<MMMFAudioOutput&>( NULL ), KAmrNbBitrate475, EFalse ) );*/
+
+    // AMR-NB
+    TMccCodecInfo codecInfo;
+    codecInfo.iFourCC = KMccFourCCIdAMRNB;
+    codecInfo.iBitrate = 42;
+    // Wrong bitrate
+    EUNIT_ASSERT_LEAVE( MccCodecConfigurator::DoConfigureAmrL(
+        reinterpret_cast<MMMFAudioOutput&>( *this ), codecInfo ) );
+    
+    // AMR-WB    
+    codecInfo.iFourCC = KMccFourCCIdAMRWB;
+    // Wrong bitrate
+    EUNIT_ASSERT_LEAVE( MccCodecConfigurator::DoConfigureAmrL(
+        reinterpret_cast<MMMFAudioOutput&>( *this ), codecInfo ) );
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_DoConfigureAmrNbL2L()
+    {
+    // aRecordDev == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureAmrNbL(
+        static_cast<MMMFAudioInput&>( NULL ), KAmrNbBitrate475, EFalse ) );*/
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_DoConfigureUplinkStreamLL()
+    {
+    TMccCodecInfo codec;
+    
+    // aRecordDevice == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureLiveAudioUplinkStreamL(
+        static_cast<MMMFAudioInput&>( NULL ),
+        NULL,
+        codec ) );*/
+
+    // aFormatter == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureLiveAudioUplinkStreamL(
+        reinterpret_cast<MMMFAudioInput*>( this ),
+        NULL,
+        codec ) );*/
+
+    // wrong codec
+    EUNIT_ASSERT_LEAVE( MccCodecConfigurator::DoConfigureLiveAudioUplinkStreamL(
+        reinterpret_cast<MMMFAudioInput&>( *this ),
+        reinterpret_cast<CPayloadFormatWrite&>( *this ),
+        codec,
+        *iRtpMediaClock,
+        CMccSymStreamBase::EStateCodecLoaded ) );
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_DoConfigureDownlinkStreamLL()
+    {
+    TMccCodecInfo codec;
+    
+    // aPlayDevice == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureLiveAudioDownlinkStreamL(
+        static_cast<MMMFAudioOutput*>( NULL ),
+        NULL,
+        codec ) );*/
+
+    // aFormatter == NULL
+    /*EUNIT_ASSERT_LEAVE( CMccCodecConfigurator::DoConfigureLiveAudioDownlinkStreamL(
+        reinterpret_cast<MMMFAudioOutput*>( this ),
+        NULL,
+        codec ) );*/
+
+    // wrong codec
+    EUNIT_ASSERT_LEAVE( MccCodecConfigurator::DoConfigureLiveAudioDownlinkStreamL(
+        reinterpret_cast<MMMFAudioOutput&>( *this ),
+        reinterpret_cast<CPayloadFormatRead&>( *this ),
+        codec,
+        CMccSymStreamBase::EStateCodecLoaded ) );
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_DoGetClipConfigurationLL()
+    {
+    TMccFileSourceSetting settings;
+    
+    // File not found
+    settings.iFileName = _L("c:\\testfilecannotbefound.3gp");
+    TMccFileSourceSettingBuf settingsBuf( settings );
+    MCC_EUNIT_ASSERT_SPECIFIC_LEAVE( 
+        MccCodecConfigurator::DoGetClipConfigurationL( settingsBuf ), KErrNotFound );
+    
+    // File contains audio and video
+    settings.iFileName = _L("c:\\CrazyFrog.3gp");
+    settingsBuf = settings;
+    
+    TRAPD( err, MccCodecConfigurator::DoGetClipConfigurationL( settingsBuf ));
+    if ( err == KErrNotFound )
+        {
+    	User::Leave( KErrNoMemory ); // MP4 lib gives file errors when out of mem
+        }
+    else if ( err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    
+    settings = settingsBuf();
+    
+    // FourCC value is not set when running out of memory.    
+    if ( settings.iAudioFourCC == TFourCC() ||
+         settings.iVideoFourCC == TFourCC() )
+        {
+        return;
+        }   
+    
+    EUNIT_ASSERT( settings.iAudioFourCC == TFourCC( KMccFourCCIdAMRNB ) );
+    EUNIT_ASSERT( settings.iVideoFourCC == TFourCC( KMccFourCCIdH263 ) );
+    
+    TMccFileSourceSetting settings2;
+    settings2.iFileName = _L("c:\\test_avc.3gp");
+    settingsBuf = settings2;
+    
+    TRAP( err, MccCodecConfigurator::DoGetClipConfigurationL( settingsBuf ));
+    if ( err == KErrNotFound )
+        {
+    	User::Leave( KErrNoMemory ); // MP4 lib gives file errors when out of mem
+        }
+    else if ( err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    
+    settings2 = settingsBuf();
+    
+    // FourCC value is not set when running out of memory.    
+    if ( settings2.iVideoFourCC == TFourCC() )
+        {
+        return;
+        }   
+    
+    EUNIT_ASSERT( settings2.iVideoFourCC == TFourCC( KMccFourCCIdAVC ) );
+    }
+
+void UT_CMccCodecConfigurator::UT_CMccCodecConfigurator_PassPrerollFromSinkToSourceLL()
+    {
+    CMccGenericDataSource* dataSource = new ( ELeave ) CMccGenericDataSource( KMccFileSourceUid );
+    CleanupStack::PushL( dataSource );
+    CMccGenericDataSink* dataSink = new ( ELeave ) CMccGenericDataSink( KMccVideoSinkUid );
+    CleanupStack::PushL( dataSink );
+
+//    CMccFileSource* dataSource = new CMccFileSource();
+//    dataSource->iSourceImpl = CMccFileSourceImpl::NewL( 0 );
+
+    // Should return immediately
+    MccCodecConfigurator::PassPrerollFromSinkToSourceL(
+        reinterpret_cast<MDataSink*>( NULL ), (MDataSource *)dataSource );
+    // Should return immediately
+    MccCodecConfigurator::PassPrerollFromSinkToSourceL(
+        (MDataSink *)dataSink, reinterpret_cast<MDataSource*>( NULL ) );
+
+    TInt preroll = 346;
+    TPckgBuf<TInt> packageBuffer = preroll;
+    dataSink->SetParameterL( KMccPrerollTime, packageBuffer );
+
+    MccCodecConfigurator::PassPrerollFromSinkToSourceL(
+        (MDataSink *)dataSink, (MDataSource *)dataSource );
+        
+//    EUNIT_ASSERT( dataSource->iSourceImpl->DelayAfterStop() == KMccMinPreroll ); // KMccMinPreroll = 2000
+    packageBuffer = 0;
+    dataSource->GetParameterL( KMccPrerollTime, packageBuffer );
+    EUNIT_ASSERT( packageBuffer() == 346 );
+
+    CleanupStack::Pop( dataSink );
+    CleanupStack::Pop( dataSource );
+    delete dataSink;
+    delete dataSource;
+    }
+
+
+void UT_CMccCodecConfigurator::UT_MccCodecConfigurator_IlbcNeedsStopResumeL()
+    {
+    TInt origBr = 13300;
+    TInt newBr = 15200;
+    TFourCC fcc;
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( origBr, newBr, fcc ) == EFalse );
+    
+    fcc = KMccFourCCIdILBC;
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( origBr, newBr, fcc ) == ETrue );
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( origBr, origBr, fcc ) == EFalse );
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( newBr, newBr, fcc ) == EFalse );
+    
+    fcc = KMccFourCCIdAMRNB;
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( origBr, newBr, fcc ) == EFalse );
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( origBr, origBr, fcc ) == EFalse );
+    EUNIT_ASSERT( MccCodecConfigurator::IlbcNeedsStopResume( newBr, newBr, fcc ) == EFalse );
+    }
+    
+void UT_CMccCodecConfigurator::UT_MccCodecConfigurator_VadWithoutComfortNoiseL()
+    {
+    // Actually this test does not really work because CI's are not implemented
+    // in WINSCW. But, basic skeleton case implemented here so that it can be
+    // easily brought in action in case of working WINSCW CI's.
+    TUid inputUid = TUid::Uid( KMmfUidAudioInputInterface );
+    MDataSource* recordDevice = MDataSource::NewSourceL( inputUid, KNullDesC8 );
+    CleanupDeletePushL( recordDevice );
+    recordDevice->SourceThreadLogon( *this );
+    
+    MMMFAudioInput* tmp = static_cast<MMMFAudioInput*>( recordDevice );
+    
+    TMccCodecInfo info;
+    info.iFourCC = KMccFourCCIdILBC;
+    info.iComfortNoiseGenerationPt = KPayloadTypeUndefined;
+    info.iEnableDTX = ETrue;
+    
+    MCC_EUNIT_ASSERT_NO_LEAVE( 
+        MccCodecConfigurator::DoConfigureIlbcL( *tmp, info, CMccSymStreamBase::EStateCodecPrepared ) );
+    
+    info.iComfortNoiseGenerationPt = 13;
+    
+    MCC_EUNIT_ASSERT_NO_LEAVE( 
+        MccCodecConfigurator::DoConfigureIlbcL( *tmp, info, CMccSymStreamBase::EStateCodecPrepared ) );
+    
+    info.iFourCC = KMccFourCCIdG711;
+    info.iComfortNoiseGenerationPt = KPayloadTypeUndefined;
+    info.iEnableDTX = ETrue;
+    
+    recordDevice->SourceThreadLogoff();
+    User::LeaveIfError( recordDevice->SourceThreadLogon( *this ) );
+    
+    MCC_EUNIT_ASSERT_SPECIFIC_LEAVE( 
+        MccCodecConfigurator::DoConfigureG711L( *tmp, info, CMccSymStreamBase::EStateCodecPrepared ),
+        KErrNone ); // Was KErrNotFound, but stub return KErrNone. Not sure about hw.
+    
+    recordDevice->SourceThreadLogoff();
+    CleanupStack::PopAndDestroy( recordDevice );
+    }
+
+void UT_CMccCodecConfigurator::UT_MccCodecConfigurator_DoConfigureFileSinkL()
+    {
+    CMccFileSink* fileSink = static_cast<CMccFileSink*>( CMccFileSink::NewSinkL( KNullUid, KNullDesC8 ) );
+    CleanupStack::PushL( fileSink );
+    TMccCodecInfo videoCodec;
+    videoCodec.iType = KUidMediaTypeVideo;
+    videoCodec.iFourCC = KMccFourCCIdAVC;
+    MccCodecConfigurator::DoConfigureFileSinkL( *fileSink, videoCodec );
+    EUNIT_ASSERT( fileSink->SinkDataTypeCode( KUidMediaTypeVideo ) == KMccFourCCIdAVC );
+    
+    TMccCodecInfo audioCodec;
+    audioCodec.iType = KUidMediaTypeAudio;
+    audioCodec.iFourCC = KMccFourCCIdG711;
+    MccCodecConfigurator::DoConfigureFileSinkL( *fileSink, audioCodec );
+    EUNIT_ASSERT( fileSink->SinkDataTypeCode( KUidMediaTypeAudio ) == KMccFourCCIdG711 );
+    CleanupStack::PopAndDestroy( fileSink );
+    }
+    
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE(
+    UT_CMccCodecConfigurator,
+    "Add test suite description here.",
+    "UNIT" )
+
+EUNIT_TEST(
+    "ConfigureCodecL - test ",
+    "CMccCodecConfigurator",
+    "ConfigureCodecL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_ConfigureCodecLL, Teardown)
+
+EUNIT_TEST(
+    "DoConfigureAmrNbL - test ",
+    "CMccCodecConfigurator",
+    "DoConfigureAmrNbL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_DoConfigureAmrNbLL, Teardown)
+
+EUNIT_TEST(
+    "DoConfigureAmrNbL2 - test ",
+    "CMccCodecConfigurator",
+    "DoConfigureAmrNbL2",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_DoConfigureAmrNbL2L, Teardown)
+
+EUNIT_TEST(
+    "DoConfigureUplinkStreamL - test ",
+    "CMccCodecConfigurator",
+    "DoConfigureUplinkStreamL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_DoConfigureUplinkStreamLL, Teardown)
+
+EUNIT_TEST(
+    "DoConfigureDownlinkStreamL - test ",
+    "CMccCodecConfigurator",
+    "DoConfigureDownlinkStreamL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_DoConfigureDownlinkStreamLL, Teardown)
+
+EUNIT_TEST(
+    "DoGetClipConfigurationL - test ",
+    "CMccCodecConfigurator",
+    "DoGetClipConfigurationL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_DoGetClipConfigurationLL, Teardown)
+    
+EUNIT_TEST(
+    "PassPrerollFromSinkToSourceL - test ",
+    "CMccCodecConfigurator",
+    "PassPrerollFromSinkToSourceL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccCodecConfigurator_PassPrerollFromSinkToSourceLL, Teardown)
+
+EUNIT_TEST(
+    "IlbcNeedsStopResume - test ",
+    "CMccCodecConfigurator",
+    "IlbcNeedsStopResume",
+    "FUNCTIONALITY",
+    SetupL, UT_MccCodecConfigurator_IlbcNeedsStopResumeL, Teardown)
+
+EUNIT_TEST(
+    "VadWithoutComfortNoiser - test ",
+    "CMccCodecConfigurator",
+    "VadWithoutComfortNoise",
+    "FUNCTIONALITY",
+    SetupL, UT_MccCodecConfigurator_VadWithoutComfortNoiseL, Teardown)
+
+EUNIT_TEST(
+    "DoConfigureFileSinkL - test ",
+    "CMccCodecConfigurator",
+    "DoConfigureFileSinkL",
+    "FUNCTIONALITY",
+    SetupL, UT_MccCodecConfigurator_DoConfigureFileSinkL, Teardown)
+
+EUNIT_END_TEST_TABLE
+
+//  END OF FILE