multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMccFileAudio.cpp
changeset 0 1bce908db942
child 15 f40c1a748eb9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMccFileAudio.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,830 @@
+/*
+* 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_CMccFileAudio.h"
+
+//  EXTERNAL INCLUDES
+#include <digia/eunit/eunitmacros.h>
+
+
+//  INTERNAL INCLUDES
+#include "MccFileAudio.h"
+#include "MccFileVideo.h"
+#include "MccFileSourceImpl.h"
+#include "mmccinterfacedef.h"
+#include "mccresourcepool.h"
+#include "Mcculdatapath.h"
+
+// CONSTRUCTION
+UT_CMccFileAudio* UT_CMccFileAudio::NewL()
+    {
+    UT_CMccFileAudio* self = UT_CMccFileAudio::NewLC();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+UT_CMccFileAudio* UT_CMccFileAudio::NewLC()
+    {
+    UT_CMccFileAudio* self = new( ELeave ) UT_CMccFileAudio();
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+UT_CMccFileAudio::~UT_CMccFileAudio()
+    {
+    }
+
+// Default constructor
+UT_CMccFileAudio::UT_CMccFileAudio()
+    {
+    }
+
+// Second phase construct
+void UT_CMccFileAudio::ConstructL()
+    {
+    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+    // It generates the test case table.
+    CEUnitTestSuiteClass::ConstructL();
+    }
+
+//  METHODS
+
+
+
+void UT_CMccFileAudio::Setup2L(  )
+    {
+    iBuffer = CMMFDescriptorBuffer::NewL( 1000 );
+    iBuffer->Data().Copy(_L("aaaaaaaaaa"));
+    TMediaId media = KUidMediaTypeAudio;
+
+    MAsyncEventHandler* eventHandler = NULL;
+    CMccResourcePool* iMccResource = NULL;
+
+    iAudioULDPStub = CMccUlDataPath::NewL( eventHandler,iMccResource,  media );
+    media = KUidMediaTypeVideo;
+    iVideoULDPStub = CMccUlDataPath::NewL( eventHandler, iMccResource, media );
+    
+    TMccFileSourceSettingBuf settingBuf;
+    
+    iFileSourceImpl = CMccFileSourceImpl::NewL( 0 );
+    
+	iAudio = CMccFileAudio::NewL(*iFileSourceImpl);
+	iVideo = CMccFileVideo::NewL(*iFileSourceImpl);
+	
+#define KFileName TFileName(_L("c:\\test.mp4"));  
+    TFileName fileName = KFileName;
+    TFileName fullFileName;
+    MP4Err error = MP4_OK;
+    
+    RFs fS;
+    User::LeaveIfError( fS.Connect() );
+	CleanupClosePushL( fS );
+    TParse fp;	
+    if ( fS.Parse( fileName, fp ) != KErrNone )
+        {
+        RDebug::Print(_L("CMccFileSourceImpl::OpenFileL file name parse error!"));
+	    User::Leave( KErrGeneral );
+        }
+	
+    fullFileName = fp.FullName();
+
+  	CleanupStack::PopAndDestroy( &fS ); 
+  	
+  	if (MP4ParseOpen( &iMP4Handle, (wchar_t *) fullFileName.PtrZ() ) != MP4_OK )
+	  	{
+	  	iMP4Handle = NULL;
+	  	User::Leave(KErrGeneral);	
+	  	}	
+	  	
+	iAudio->ParseUpdateAudioDescriptions(iMP4Handle);
+	iVideo->ParseUpdateVideoDescriptions(iMP4Handle);
+	iAudio->ParseUpdateStreamDescription(iMP4Handle);
+	iAudio->SetFileHandle(iMP4Handle);
+	iVideo->SetFileHandle(iMP4Handle);
+    }
+
+void UT_CMccFileAudio::SetupL(  )
+    {
+    TMccFileSourceSettingBuf settingBuf;
+   
+    iBuffer = CMMFDescriptorBuffer::NewL( 1000 );
+    iBuffer->Data().Copy(_L("aaaaaaaaaa"));
+    TMediaId media = KUidMediaTypeAudio;
+
+    MAsyncEventHandler* eventHandler = NULL;
+    CMccResourcePool* iMccResource = NULL;
+
+    iAudioULDPStub = CMccUlDataPath::NewL( eventHandler,iMccResource,  media );
+    media = KUidMediaTypeVideo;
+    iVideoULDPStub = CMccUlDataPath::NewL( eventHandler, iMccResource, media );
+    
+    iFileSourceImpl = CMccFileSourceImpl::NewL( 0 );
+	iAudio = CMccFileAudio::NewL(*iFileSourceImpl);
+	iVideo = CMccFileVideo::NewL(*iFileSourceImpl);
+	
+#define KFileName2 TFileName(_L("c:\\CrazyFrog.3gp"));  
+    TFileName fileName = KFileName2;
+    TFileName fullFileName;
+    MP4Err error = MP4_OK;
+    
+    RFs fS;
+    User::LeaveIfError( fS.Connect() );
+	CleanupClosePushL( fS );
+    TParse fp;	
+    if ( fS.Parse( fileName, fp ) != KErrNone )
+        {
+        RDebug::Print(_L("CMccFileSourceImpl::OpenFileL file name parse error!"));
+	    User::Leave( KErrGeneral );
+        }
+	
+    fullFileName = fp.FullName();
+
+  	CleanupStack::PopAndDestroy( &fS ); 
+  	
+  	if (MP4ParseOpen( &iMP4Handle, (wchar_t *) fullFileName.PtrZ() ) != MP4_OK )
+	  	{
+	  	iMP4Handle = NULL;
+	  	User::Leave(KErrGeneral);	
+	  	}	
+	  	
+	iAudio->ParseUpdateAudioDescriptions(iMP4Handle);
+	iVideo->ParseUpdateVideoDescriptions(iMP4Handle);
+	iAudio->ParseUpdateStreamDescription(iMP4Handle);
+	iAudio->SetFileHandle(iMP4Handle);
+	iVideo->SetFileHandle(iMP4Handle);
+    }
+
+void UT_CMccFileAudio::Setup3L(  )
+    {
+    TMccFileSourceSettingBuf settingBuf;
+   
+    iBuffer = CMMFDescriptorBuffer::NewL( 1000 );
+    iBuffer->Data().Copy(_L("aaaaaaaaaa"));
+    TMediaId media = KUidMediaTypeAudio;
+
+    MAsyncEventHandler* eventHandler = NULL;
+    CMccResourcePool* iMccResource = NULL;
+
+    iAudioULDPStub = CMccUlDataPath::NewL( eventHandler,iMccResource,  media );
+    media = KUidMediaTypeVideo;
+    iVideoULDPStub = CMccUlDataPath::NewL( eventHandler, iMccResource, media );
+    
+    iFileSourceImpl = CMccFileSourceImpl::NewL( 0 );
+	iVideo = CMccFileVideo::NewL(*iFileSourceImpl);
+	iAudio = NULL;
+	
+#define KFileName3 TFileName(_L("c:\\test_avc.3gp"));  
+    TFileName fileName = KFileName3;
+    TFileName fullFileName;
+    MP4Err error = MP4_OK;
+    
+    RFs fS;
+    User::LeaveIfError( fS.Connect() );
+	CleanupClosePushL( fS );
+    TParse fp;	
+    if ( fS.Parse( fileName, fp ) != KErrNone )
+        {
+        RDebug::Print(_L("CMccFileSourceImpl::OpenFileL file name parse error!"));
+	    User::Leave( KErrGeneral );
+        }
+	
+    fullFileName = fp.FullName();
+
+  	CleanupStack::PopAndDestroy( &fS ); 
+  	
+  	if (MP4ParseOpen( &iMP4Handle, (wchar_t *) fullFileName.PtrZ() ) != MP4_OK )
+	  	{
+	  	iMP4Handle = NULL;
+	  	User::Leave(KErrGeneral);	
+	  	}	
+	  	;
+	iVideo->ParseUpdateVideoDescriptions(iMP4Handle);
+	iVideo->SetFileHandle(iMP4Handle);
+    }
+       
+void UT_CMccFileAudio::Teardown(  )
+    {
+    if ( iMP4Handle )
+	    {
+	    MP4Err error = MP4ParseClose( iMP4Handle );
+	    iMP4Handle = NULL;
+	    }
+	
+	delete iVideo; 
+	delete iAudio;
+    delete iFileSourceImpl;
+    delete iVideoULDPStub;
+    delete iAudioULDPStub;
+    delete iBuffer;
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_NewLL(  )
+    {
+    EUNIT_ASSERT( ETrue );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_SetPositionLL(  )
+    {
+    iAudio->SetFileHandle(NULL);
+  	iAudio->SetPositionL(100);
+  	EUNIT_ASSERT_EQUALS( iAudio->Position(), 100 );
+  	
+  	iAudio->SetPositionL(200);
+  	EUNIT_ASSERT_EQUALS( iAudio->Position(), 200 );
+
+  	// If position is changed while reader is active, position is changed to nearest iframe
+	iVideo->SetFileHandle(iMP4Handle);
+	iVideo->iIsPaused = EFalse;
+  	iVideo->SetPositionL(50);
+  	EUNIT_ASSERT( iVideo->Position() != 50 );
+  	
+  	// If position setting is called just because resuming (pos not changed while paused),
+  	// position is exactly the one which was when pause occured
+  	iVideo->iPosition = 50;
+  	iVideo->SetPositionL(50, ETrue);
+  	EUNIT_ASSERT_EQUALS( iVideo->Position(), 50 );
+  	
+  	// If position was changed while paused, position is changed to nearest iframe
+  	iVideo->iIsPaused = ETrue;
+  	iVideo->SetPositionL(100);
+  	EUNIT_ASSERT_EQUALS( iVideo->Position(), 100 );
+  	iVideo->iIsPaused = EFalse;
+  	iVideo->SetPositionL(100, ETrue);
+  	EUNIT_ASSERT( iVideo->Position() != 100 );
+  	
+  	// If position is tried to be set over the end, end pos is used
+  	iVideo->iIsPaused = EFalse;
+  	TUint32 duration = iVideo->Duration();
+  	iVideo->SetPositionL(duration + 1000, EFalse);
+  	EUNIT_ASSERT( iVideo->Position() <= duration );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_TypeL(  )
+    {
+    CCMRMediaBuffer::TBufferType bufferType1 = iAudio->Type();
+    CCMRMediaBuffer::TBufferType bufferType2 = iVideo->Type();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_PositionLL(  )
+    {
+    TUint32 pos = iAudio->Position();
+    TUint32 pos2 = iVideo->Position();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_DurationLL(  )
+    {
+    TUint32 duration = iAudio->Duration();
+    TUint32 duration2 = iVideo->Duration();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_AudioBitRateLL(  )
+    {
+    TUint32 audioBitRate = iAudio->AudioBitRate();
+    TUint32 audioBitRate2 = iVideo->AudioBitRate();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_VideoFrameSizeLL(  )
+    {
+    TSize size = iAudio->VideoFrameSize();
+    TSize size2 = iVideo->VideoFrameSize();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_VideoFrameRateLL(  )
+    {
+    TReal videoFrameRate = iAudio->VideoFrameRateL();
+    TReal videoFrameRate2 = iVideo->VideoFrameRateL();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_StartTimerL(  )
+    {
+    // Audio
+    iAudio->StartTimerL();
+    EUNIT_ASSERT( !iAudio->iIsPaused );
+    TInt posMod = iAudio->iPositionModifier;
+    iAudio->StopTimer();
+    EUNIT_ASSERT( iAudio->iIsPaused );
+    
+    User::After( 1000 );
+    iAudio->StartTimerL();
+    EUNIT_ASSERT( posMod != iAudio->iPositionModifier );
+    
+    // Video
+    iVideo->StartTimerL();
+    EUNIT_ASSERT( !iVideo->iIsPaused );
+    iVideo->StopTimer();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_StopTimerL(  )
+    {
+    // Audio
+    iAudio->StartTimerL();
+    EUNIT_ASSERT( !iAudio->iIsPaused );
+    iAudio->StopTimer();
+    EUNIT_ASSERT( iAudio->iIsPaused );
+    
+    // Video
+    iVideo->StartTimerL();
+    EUNIT_ASSERT( !iVideo->iIsPaused );
+    iVideo->StopTimer();    
+    TTime pauseStarted = iVideo->iPauseStarted;
+    EUNIT_ASSERT( iVideo->iIsPaused );
+    
+    User::After( 1000 );
+    iVideo->StopTimer();
+    EUNIT_ASSERT( iVideo->iIsPaused );
+    EUNIT_ASSERT( pauseStarted == iVideo->iPauseStarted );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_GetFourCCL(  )
+    {
+    TFourCC fourCC = iAudio->GetFourCC();
+    TFourCC fourCC2 = iVideo->GetFourCC();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_ResetTimeL(  )
+    {
+    iAudio->ResetTimeL();
+    iVideo->ResetTimeL();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_TickAudioLL(  )
+    {
+    iAudio->TickAudioL(iAudio);
+    iVideo->TickVideoL(iVideo);
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_ReadFrameLL(  )
+    {
+    // 3GP clip
+    TInt audioPos = iAudio->iPosition;
+    iAudio->ReadFrameL( EFalse );
+    EUNIT_ASSERT( iAudio->iPosition >= audioPos );
+    audioPos = iAudio->iPosition;
+    
+    iAudio->iConsumer = iAudioULDPStub;
+	iAudio->iConsumerBuffer = iBuffer;
+    iAudio->ReadFrameL( ETrue );
+    EUNIT_ASSERT( iAudio->iPosition > audioPos );
+    
+    TInt videoPos = iVideo->iPosition;
+    iVideo->ReadFrameL();
+    EUNIT_ASSERT( iVideo->iPosition >= videoPos );
+    videoPos = iVideo->iPosition;
+    iVideo->iConsumer = iVideoULDPStub;
+	iVideo->iConsumerBuffer = iBuffer;
+    iVideo->ReadFrameL();
+    EUNIT_ASSERT( iVideo->iPosition > videoPos );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_ReadFrameL2L(  )
+    {
+    // MP4 clip
+    TInt audioPos = iAudio->iPosition;
+    iAudio->ReadFrameL( EFalse );
+    EUNIT_ASSERT( iAudio->iPosition == audioPos ); // No audio
+    
+    TInt videoPos = iVideo->iPosition;
+    iVideo->ReadFrameL();
+    EUNIT_ASSERT( iVideo->iPosition >= videoPos );
+    videoPos = iVideo->iPosition;
+    
+    iVideo->ReadFrameL();
+    EUNIT_ASSERT( iVideo->iPosition > videoPos );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_ParseUpdateAudioDescriptionsL(  )
+    {
+    iAudio->ParseUpdateAudioDescriptions(iMP4Handle);
+    iVideo->ParseUpdateVideoDescriptions(iMP4Handle);
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_GetFrameLengthL()
+	{
+	TBuf8<3> data;
+	data.Append( 42 );
+	TUint8 dataVal = dataVal & 0x0;
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 13 );
+	
+	dataVal = dataVal & 0x0 | ( 0x1 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 14 );
+	
+	dataVal = dataVal & 0x0 | ( 0x2 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 16 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x3 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 18 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x4 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 20 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x5 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 21 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x6 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 27 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x7 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 32 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x8 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 6 );	
+	
+	dataVal = dataVal & 0x0 | ( 0xF << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 1 );	
+	
+	dataVal = dataVal & 0x0 | ( 0x9 << 3 );
+	data[ 0 ] = dataVal;
+	EUNIT_ASSERT_EQUALS( iAudio->GetFrameLength( data ), 0 );
+	}
+
+void UT_CMccFileAudio::UT_CMccFileAudio_SetStartTimeL()
+    {
+    static_cast<CMccFileSourceTypeBase*>(iAudio)->SetStartTime();
+    }
+         
+void UT_CMccFileAudio::UT_CMccFileAudio_IsPausedL()
+    {
+    static_cast<CMccFileSourceTypeBase*>(iAudio)->IsPaused();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileSink_GetTimeStampL()
+    {
+    TTimeIntervalMicroSeconds audioTimestamp = iAudio->GetTimeStamp(100);   
+    TTimeIntervalMicroSeconds videoTimestamp = iVideo->GetTimeStamp();
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_FillBufferL()
+    {
+    // Audio
+    iAudio->FillBufferL( iBuffer, iAudioULDPStub );
+    CMccFrameItem* frame = CreateFrameItemLC( 800 );
+    iAudio->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iAudio->FillBufferL( iBuffer, iAudioULDPStub );
+    EUNIT_ASSERT_EQUALS( iAudio->iFrames.Count(), 0 );
+    
+    // Video
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 800 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 0 );
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_WriteBufferL()
+    {
+    // Audio
+    iAudio->WriteBufferL();
+    
+    iAudio->FillBufferL( iBuffer, iAudioULDPStub );
+    CMccFrameItem* frame = CreateFrameItemLC( 800 );
+    iAudio->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iAudio->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iAudio->iFrames.Count(), 0 );
+    
+    // Too big frame
+    iAudio->FillBufferL( iBuffer, iAudioULDPStub );
+    frame = CreateFrameItemLC( 1200 );
+    iAudio->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iAudio->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iAudio->iFrames.Count(), 0 );
+    
+    // Video
+    iVideo->WriteBufferL();
+    
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 800 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iVideo->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 0 );
+    
+    // Too big frame
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 1200 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iVideo->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 0 );
+    
+    // AVC parameter sets exists and are written at first round
+    delete iVideo->iAVCNALUsBuffer;
+    iVideo->iAVCNALUsBuffer = NULL;
+    iVideo->iAVCNALUsBuffer = _L8("somedata").AllocL();
+    iVideo->iInsertParameterSets = ETrue;
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 800 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+
+    iVideo->WriteBufferL();
+    // real frame wasn't therefore yet written
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 1 ); 
+    EUNIT_ASSERT_EQUALS( iVideo->iInsertParameterSets, EFalse );
+    TInt64 firstParameterSetsTime = iVideo->iInsertParameterSetsTime.Int64();
+    EUNIT_ASSERT( firstParameterSetsTime != 0 );
+    
+    // Next round takes the real frame
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    iVideo->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 0 ); 
+    
+    // Once enough time has elapsed, AVC parameter sets are again written
+    // const TUint32 KMccFileSourceParameterSetsIntervalInMicroSeconds = 2000000;
+    iVideo->iInsertParameterSetsTime = ( iVideo->iInsertParameterSetsTime.Int64() - 2000002 );
+    firstParameterSetsTime = iVideo->iInsertParameterSetsTime.Int64();
+    
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 800 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+
+    iVideo->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 0 ); // param sets were not written yet
+    EUNIT_ASSERT_EQUALS( iVideo->iInsertParameterSets, ETrue );
+
+    iVideo->FillBufferL( iBuffer, iVideoULDPStub );
+    frame = CreateFrameItemLC( 800 );
+    iVideo->iFrames.AppendL( frame );
+    CleanupStack::Pop( frame );
+    
+    iVideo->WriteBufferL();
+    EUNIT_ASSERT_EQUALS( iVideo->iFrames.Count(), 1 ); // parameter sets were written
+    EUNIT_ASSERT_EQUALS( iVideo->iInsertParameterSets, EFalse );
+    EUNIT_ASSERT( iVideo->iInsertParameterSetsTime.Int64() != firstParameterSetsTime );
+    
+    }
+
+void UT_CMccFileAudio::UT_CMccFileAudio_TimingCorrectionL()
+    {
+    const TInt KMccTestTimerInterval = 100;
+    iAudio->SetStartTime();
+    iAudio->iTimerInterval = KMccTestTimerInterval; 
+    iAudio->DoTimingCorrection( 0 ); // Not enough time has elapsed
+    User::After( 2000100 );
+    
+    // Enough time has elapsed, correction not needed
+    iAudio->DoTimingCorrection( 2000 );
+    EUNIT_ASSERT( iAudio->iCorrectionInterval == KMccTestTimerInterval );
+    
+    // Enough time has elapsed and correction is needed as position is not
+    // far enough (speeding the timer)
+    iAudio->iPreviousCorrection -= TTimeIntervalMicroSeconds32( 2000000 );
+    iAudio->DoTimingCorrection( 1000 );
+    
+    EUNIT_ASSERT( iAudio->iCorrectionInterval < KMccTestTimerInterval );
+    
+    // Enough time has elapsed and correction is needed as position is too
+    // far (slowing the timer)
+    User::After( 2000100 );
+    iAudio->DoTimingCorrection( 8000 );
+    EUNIT_ASSERT( iAudio->iCorrectionInterval > KMccTestTimerInterval );
+    }    
+
+void UT_CMccFileAudio::UT_CMccFileAudio_ConfigKeyL()
+    {
+    HBufC8* confKey = iVideo->GetConfigKeyL();
+    CleanupStack::PushL( confKey );
+    EUNIT_ASSERT( confKey && confKey->Length() > 0 );
+   
+    
+    // Test also non-sdp version
+    HBufC8* confKey2 = NULL;
+    iVideo->ExtractH264ParameterSetNALUsL( &confKey2 );
+    CleanupStack::PushL( confKey2 );
+    EUNIT_ASSERT( confKey2 && confKey2->Length() > 0 );
+    EUNIT_ASSERT( confKey2->Des().CompareF( *confKey ) != 0 );
+    
+    CleanupStack::PopAndDestroy( confKey2 );
+    CleanupStack::PopAndDestroy( confKey );
+    }  
+    
+CMccFrameItem* UT_CMccFileAudio::CreateFrameItemLC( TInt aSize )
+    {
+    CMccFrameItem* item = new (ELeave) CMccFrameItem();
+    CleanupStack::PushL( item );
+    item->iFrame = HBufC8::NewL( aSize );
+    item->iTimeStamp = 1000;
+    return item;
+    }
+    
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE(
+    UT_CMccFileAudio,
+    "Add test suite description here.",
+    "UNIT" )
+
+EUNIT_TEST(
+    "NewL - test ",
+    "CMccFileAudio",
+    "NewL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_NewLL, Teardown)
+
+EUNIT_TEST(
+    "SetPositionL - test ",
+    "CMccFileAudio",
+    "SetPositionL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_SetPositionLL, Teardown)
+
+EUNIT_TEST(
+    "Type - test ",
+    "CMccFileAudio",
+    "Type",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_TypeL, Teardown)
+
+EUNIT_TEST(
+    "PositionL - test ",
+    "CMccFileAudio",
+    "PositionL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_PositionLL, Teardown)
+
+EUNIT_TEST(
+    "DurationL - test ",
+    "CMccFileAudio",
+    "DurationL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_DurationLL, Teardown)
+
+EUNIT_TEST(
+    "AudioBitRateL - test ",
+    "CMccFileAudio",
+    "AudioBitRateL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_AudioBitRateLL, Teardown)
+
+EUNIT_TEST(
+    "VideoFrameSizeL - test ",
+    "CMccFileAudio",
+    "VideoFrameSizeL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_VideoFrameSizeLL, Teardown)
+
+EUNIT_TEST(
+    "VideoFrameRateL - test ",
+    "CMccFileAudio",
+    "VideoFrameRateL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_VideoFrameRateLL, Teardown)
+
+EUNIT_TEST(
+    "StartTimer - test ",
+    "CMccFileAudio",
+    "StartTimer",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_StartTimerL, Teardown)
+
+EUNIT_TEST(
+    "StopTimer - test ",
+    "CMccFileAudio",
+    "StopTimer",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_StopTimerL, Teardown)
+
+EUNIT_TEST(
+    "GetFourCC - test ",
+    "CMccFileAudio",
+    "GetFourCC",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_GetFourCCL, Teardown)
+
+EUNIT_TEST(
+    "ResetTime - test ",
+    "CMccFileAudio",
+    "ResetTime",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_ResetTimeL, Teardown)
+
+EUNIT_TEST(
+    "TickAudioL - test ",
+    "CMccFileAudio",
+    "TickAudioL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_TickAudioLL, Teardown)
+
+EUNIT_TEST(
+    "ReadFrameL - test ",
+    "CMccFileAudio",
+    "ReadFrameL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_ReadFrameLL, Teardown)
+
+EUNIT_TEST(
+    "ReadFrameL2 - test ",
+    "CMccFileAudio",
+    "ReadFrameL2",
+    "FUNCTIONALITY",
+    Setup2L, UT_CMccFileAudio_ReadFrameL2L, Teardown)
+    
+EUNIT_TEST(
+    "ParseUpdateAudioDescriptions - test ",
+    "CMccFileAudio",
+    "ParseUpdateAudioDescriptions",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_ParseUpdateAudioDescriptionsL, Teardown)
+
+EUNIT_TEST(
+    "GetFrameLengthL - test ",
+    "CMccFileAudio",
+    "GetFrameLengthL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_GetFrameLengthL, Teardown)
+
+EUNIT_TEST(
+    "SetStartTimeL - test ",
+    "CMccFileAudio",
+    "SetStartTimeL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_SetStartTimeL, Teardown)
+
+EUNIT_TEST(
+    "IsPausedL - test ",
+    "CMccFileAudio",
+    "IsPausedL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_IsPausedL, Teardown)
+         
+EUNIT_TEST(
+    "GetTimeStampL - test ",
+    "CMccFileAudio",
+    "GetTimeStampL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileSink_GetTimeStampL, Teardown)
+    
+EUNIT_TEST(
+    "FillBufferL - test ",
+    "CMccFileAudio",
+    "FillBufferL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_FillBufferL, Teardown)
+    
+EUNIT_TEST(
+    "WriteBufferL - test ",
+    "CMccFileAudio",
+    "WriteBufferL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_WriteBufferL, Teardown)
+    
+EUNIT_TEST(
+    "TimingCorrectionL - test ",
+    "CMccFileAudio",
+    "TimingCorrectionL",
+    "FUNCTIONALITY",
+    SetupL, UT_CMccFileAudio_TimingCorrectionL, Teardown)
+
+EUNIT_TEST(
+    "ConfigKeyL - test ",
+    "CMccFileAudio",
+    "ConfigKeyL",
+    "FUNCTIONALITY",
+    Setup3L, UT_CMccFileAudio_ConfigKeyL, Teardown)
+        
+EUNIT_END_TEST_TABLE
+
+//  END OF FILE