Revision: 201023 RCL_3 PDK_3.0.1
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 21 Jun 2010 16:05:57 +0300
branchRCL_3
changeset 33 f40c1a748eb9
parent 25 fb1bbf85a302
child 41 b9d283c5c7b5
Revision: 201023 Kit: 2010125
multimediacommscontroller/mmccfilesourcesink/inc/mccfileaudio.h
multimediacommscontroller/mmccfilesourcesink/inc/mccfilevideo.h
multimediacommscontroller/mmccfilesourcesink/src/mccfilesourceimpl.cpp
multimediacommscontroller/mmccfilesourcesink/src/mccfilevideo.cpp
multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMCCFileSourceImpl.cpp
multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMccFileAudio.cpp
multimediacommscontroller/mmccshared/inc/mccinternaldef.h
multimediacommscontroller/mmccsubcontroller/src/mcccodecconfigurator.cpp
multimediacommsengine/mmcesrv/mmcemediamanager/src/mcemediasdpcodec.cpp
multimediacommsengine/mmcesrv/mmcemediamanager/tsrc/ut_mediamanager/src/UT_cmcemediasdpcodec.cpp
--- a/multimediacommscontroller/mmccfilesourcesink/inc/mccfileaudio.h	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/inc/mccfileaudio.h	Mon Jun 21 16:05:57 2010 +0300
@@ -100,6 +100,7 @@
 	#ifdef EUNIT_TEST
         friend class UT_CMccFileAudio;
         friend class UT_CMccMultiplexer;
+        friend class UT_CMccFileSourceImpl;
     #endif	
 	};
 
--- a/multimediacommscontroller/mmccfilesourcesink/inc/mccfilevideo.h	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/inc/mccfilevideo.h	Mon Jun 21 16:05:57 2010 +0300
@@ -56,6 +56,7 @@
 	TFourCC GetFourCC();
 	TCallBack TickCallBack();
 	HBufC8* GetConfigKeyL();
+	TUint32 VideoType() const;
 
 public:
     static TInt TickVideoL( TAny* aObject );
--- a/multimediacommscontroller/mmccfilesourcesink/src/mccfilesourceimpl.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/src/mccfilesourceimpl.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -28,6 +28,7 @@
 #include "mccfilevideo.h"
 #include "mccinternalevents.h"
 #include "mmccinterfacedef.h"
+#include "mccinternaldef.h"
 
 
 
@@ -368,12 +369,14 @@
     
     // Average bitrate is for the whole stream, 
     // subtract audio average to get video average
-    TUint32 averageBitRate = iFileVideo->StreamAverageBitRate() - audioBitRate;
+    TUint32 videoBitRate = iFileVideo->StreamAverageBitRate() - audioBitRate;
+    MccConversionUtility::BitRateSanitize( 
+        videoBitRate, videoBitRate, iFileVideo->VideoType() );
     
     __FILESOURCE_CONTROLL_INT1( "CMccFileSourceImpl::VideoBitRateL, videoBitRate", 
-                               averageBitRate )
+        videoBitRate )
 
-    return averageBitRate;
+    return videoBitRate;
     }
 
 // -----------------------------------------------------------------------------
--- a/multimediacommscontroller/mmccfilesourcesink/src/mccfilevideo.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/src/mccfilevideo.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -231,7 +231,16 @@
     ExtractH264ParameterSetNALUsL( &configKey, ETrue );
     return configKey;
     }
-    
+
+// -----------------------------------------------------------------------------
+// CMccFileVideo::VideoType
+// -----------------------------------------------------------------------------
+//
+TUint32 CMccFileVideo::VideoType() const
+    {
+    return iType;
+    }
+
 // -----------------------------------------------------------------------------
 // CMccFileVideo::Position
 // -----------------------------------------------------------------------------
@@ -279,10 +288,9 @@
 //
 TReal CMccFileVideo::VideoFrameRateL()
 	{
-	// Round to have zero decimals for clearness sake
-	TReal roundedFrameRate;
-	User::LeaveIfError( Math::Round( roundedFrameRate, iFrameRate, 0 ) );
-    return roundedFrameRate;	
+    TReal modFrameRate;
+    MccConversionUtility::FrameRateSanitizeL( modFrameRate, iFrameRate, iType );
+    return modFrameRate;
 	}
  
 // -----------------------------------------------------------------------------
--- a/multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMCCFileSourceImpl.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMCCFileSourceImpl.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -23,6 +23,7 @@
 #include "mmcccodecinformation.h"
 #include "mccresourcepool.h"
 #include "mmccinterfacedef.h"
+#include "mccinternaldef.h"
 #include "mccunittestmacros.h"
 
 
@@ -252,6 +253,12 @@
 void UT_CMccFileSourceImpl::UT_CMccFileSourceImpl_VideoBitRateLL(  )
     {
     TUint32 videoBitRate = iSourceImp->VideoBitRateL();
+    EUNIT_ASSERT_EQUALS(videoBitRate, KMccH263ProfileZeroMinBitRateIOP); // Low bitrate increased to more interoperable
+    
+    // Test situation where no need to make iop modification for bitrate
+    iSourceImp->iFileVideo->iStreamAverageBitRate = 100000;
+    videoBitRate = iSourceImp->VideoBitRateL();
+    EUNIT_ASSERT_EQUALS(videoBitRate, iSourceImp->iFileVideo->iStreamAverageBitRate - iSourceImp->iFileAudio->iAverageBitRate);
     }
 
 void UT_CMccFileSourceImpl::UT_CMccFileSourceImpl_PositionLL(  )
--- a/multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMccFileAudio.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccfilesourcesink/tsrc/ut_filesourcesink/Src/UT_CMccFileAudio.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -32,6 +32,7 @@
 #include "mmccinterfacedef.h"
 #include "mccresourcepool.h"
 #include "Mcculdatapath.h"
+#include "mccinternaldef.h"
 
 // CONSTRUCTION
 UT_CMccFileAudio* UT_CMccFileAudio::NewL()
@@ -315,7 +316,20 @@
 void UT_CMccFileAudio::UT_CMccFileAudio_VideoFrameRateLL(  )
     {
     TReal videoFrameRate = iAudio->VideoFrameRateL();
+    EUNIT_ASSERT_EQUALS( (TInt)videoFrameRate, 0 );
     TReal videoFrameRate2 = iVideo->VideoFrameRateL();
+    EUNIT_ASSERT_EQUALS( (TInt)videoFrameRate2, 5 );
+    
+    // Test that framerate is limited to more interoperable value if value is too high for codec type
+    iVideo->iType = MP4_TYPE_H263_PROFILE_0;
+    iVideo->iFrameRate = 21;
+    videoFrameRate2 = iVideo->VideoFrameRateL();
+    EUNIT_ASSERT_EQUALS( (TInt)videoFrameRate2, KMccH263ProfileZeroMaxFramerateIOP );
+    
+    iVideo->iType = MP4_TYPE_AVC_PROFILE_BASELINE;
+    iVideo->iFrameRate = 18;
+    videoFrameRate2 = iVideo->VideoFrameRateL();
+    EUNIT_ASSERT_EQUALS( (TInt)videoFrameRate2, 18 ); // Value not changed for AVC
     }
 
 void UT_CMccFileAudio::UT_CMccFileAudio_StartTimerL(  )
--- a/multimediacommscontroller/mmccshared/inc/mccinternaldef.h	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccshared/inc/mccinternaldef.h	Mon Jun 21 16:05:57 2010 +0300
@@ -25,6 +25,8 @@
 #include <e32base.h>
 #include <mmf/common/mmfcontroller.h>
 #include <tconvbase64.h>  
+#include <e32math.h>
+#include <3gplibrary/mp4lib.h>
 
 
 #include "rtpdef.h"
@@ -68,6 +70,10 @@
 // Increased RTP socket size in bytes, default socket size is around 4KB
 const TInt KMccIncreasedRtpSocketSize = 10000;
 
+// Values used to force better interoperability against some vendors
+const TReal KMccH263ProfileZeroMaxFramerateIOP = 15;
+const TUint32 KMccH263ProfileZeroMinBitRateIOP = 64001;
+
 // MACROS
 
 #ifdef _DEBUG
@@ -782,6 +788,35 @@
     	User::LeaveIfError( encoder.Encode( aInput, ptrOutput ) );
     	return output;
         }
+    
+    static void FrameRateSanitizeL( 
+        TReal& aSanitizedFrameRate, TReal aOrigFrameRate, TUint32 aVideoType )
+        {
+        // Round to have zero decimals for clearness sake
+        User::LeaveIfError( Math::Round( aSanitizedFrameRate, aOrigFrameRate, 0 ) );
+        
+        if ( aVideoType == MP4_TYPE_H263_PROFILE_0 && 
+             aSanitizedFrameRate > KMccH263ProfileZeroMaxFramerateIOP )
+            {
+            aSanitizedFrameRate = KMccH263ProfileZeroMaxFramerateIOP;
+            }
+        }
+    
+    static void BitRateSanitize( 
+        TUint32& aSanitizedBitRate, TUint32 aOrigBitRate, TUint32 aVideoType )
+        {
+        if ( aVideoType == MP4_TYPE_H263_PROFILE_0 && 
+             aOrigBitRate > 0 && 
+             aOrigBitRate < KMccH263ProfileZeroMinBitRateIOP )
+            {
+            aSanitizedBitRate = KMccH263ProfileZeroMinBitRateIOP;
+            }
+        else 
+            {
+            aSanitizedBitRate = aOrigBitRate;
+            }
+        }
+    
     };
         
 #endif
--- a/multimediacommscontroller/mmccsubcontroller/src/mcccodecconfigurator.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommscontroller/mmccsubcontroller/src/mcccodecconfigurator.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -667,14 +667,19 @@
                 __SUBCONTROLLER( "AVC" )
                 setting.iVideoFourCC = TFourCC( KMccFourCCIdAVC );
                 }
-            // Round to have zero decimals for clearness sake
-            User::LeaveIfError( Math::Round( setting.iVideoFrameRate, frameRate, 0 ) );
+
+            MccConversionUtility::FrameRateSanitizeL( 
+                setting.iVideoFrameRate, frameRate, videoType );
+            
             setting.iVideoFrameSize.iWidth = videoWidth;
             setting.iVideoFrameSize.iHeight = videoHeight;
             
             // Average bitrate is for the whole stream, 
             // subtract audio average to get video average
             setting.iVideoBitRate = videoAverageBitRate - audioAverageBitRate;
+            
+            MccConversionUtility::BitRateSanitize( 
+                            setting.iVideoBitRate, setting.iVideoBitRate, videoType );
             }
         else
             {
--- a/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcemediasdpcodec.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcemediasdpcodec.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -921,14 +921,15 @@
                 const TUint8 KPortOffsetFromIP = 1;
                 TInt port_offset = 
                     value.Match( KMatchIN ) - KPortOffsetFromIP;
-                TPtrC8 remoteRtcpPort = value.Left( port_offset );
-                
+                HBufC8* dataRemoteRtcpPort = value.Left( port_offset ).AllocLC();
+                TPtr8 remoteRtcpPort( dataRemoteRtcpPort->Des() );
+                remoteRtcpPort.TrimAll();
                 TLex8 lexPT( remoteRtcpPort );
                 User::LeaveIfError( lexPT.Val( rtcpPort, EDecimal ) );
                 // copy the address into correct format
                 TBuf16 <KMaxAddressLength> input;
                 input.Copy( remoteRtcpAddrTxt );      
-                
+                input.TrimAll();
                 MCEMM_DEBUG_SVALUE( "Found RTCP address", input )
                 
                 TInetAddr remoteRtcpAddr;
@@ -941,12 +942,17 @@
                     {
                     aStream.SetRemoteRtcpMediaAddrL( input );
                     }
+                CleanupStack::PopAndDestroy( dataRemoteRtcpPort );
                 }
             else
                 {
                 // only port present
-                TLex8 lexPT( value );
+                HBufC8* dataRemoteRtcpPort = value.AllocLC();
+                TPtr8 remoteRtcpPort( dataRemoteRtcpPort->Des() );
+                remoteRtcpPort.TrimAll();
+                TLex8 lexPT( remoteRtcpPort );
                 User::LeaveIfError ( lexPT.Val( rtcpPort, EDecimal ) );
+                CleanupStack::PopAndDestroy( dataRemoteRtcpPort );
                 }
 
 			aStream.SetRemoteRtcpMediaPort( rtcpPort );
--- a/multimediacommsengine/mmcesrv/mmcemediamanager/tsrc/ut_mediamanager/src/UT_cmcemediasdpcodec.cpp	Wed Jun 09 10:06:41 2010 +0300
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/tsrc/ut_mediamanager/src/UT_cmcemediasdpcodec.cpp	Mon Jun 21 16:05:57 2010 +0300
@@ -927,6 +927,23 @@
     EUNIT_ASSERT_EQUALS( INET_ADDR( 127,0,0,1 ), mediaStream->iRemoteRtcpAddress.Address() )
     audioLine->AttributeFields().ResetAndDestroy();
     
+    // Incorrect white space usage
+    rtcp = CSdpAttributeField::DecodeLC( _L8( "a=rtcp: 5050  IN IP4 2.2.2.2 \r\n" ) );
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 5050, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT_EQUALS( INET_ADDR( 2,2,2,2 ), mediaStream->iRemoteRtcpAddress.Address() )
+    audioLine->AttributeFields().ResetAndDestroy();
+    
+    rtcp = CSdpAttributeField::DecodeLC( _L8( "a=rtcp:  50506\r\n" ) );
+    audioLine->AttributeFields().AppendL( rtcp );
+    CleanupStack::Pop( rtcp );
+    iSdpCodec->DecodeRemoteRtcpFieldL( *audioLine, *mediaStream );
+    EUNIT_ASSERT_EQUALS( 50506, mediaStream->iRemoteRtcpPort )
+    EUNIT_ASSERT_EQUALS( INET_ADDR( 2,2,2,2 ), mediaStream->iRemoteRtcpAddress.Address() )
+    audioLine->AttributeFields().ResetAndDestroy();
+       
     CleanupStack::PopAndDestroy( sdp );
     }
     
@@ -1368,15 +1385,7 @@
     CleanupStack::PopAndDestroy( sdp );
 
     }
-    
 
-    CleanupStack::PushL( sdp );
-    secureSession->iKeyNeedUpdated = EFalse;
-	iSdpCodec->DecodeSecureSessionL(*audioLine, *mediaStream, EMceRoleAnswerer, ETrue );
-	
-	EUNIT_ASSERT( secureSession->iKeyNeedUpdated == ETrue );
-	CleanupStack::PopAndDestroy( sdp );	
-	}
 
 void UT_CMceMediaSdpCodec::UT_CMceMediaSdpCodec_DecodeDirectionLL()
 	{