mmshplugins/mmcctranscoder/src/transcodersessioninfo.cpp
changeset 0 f0cf47e981f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmshplugins/mmcctranscoder/src/transcodersessioninfo.cpp	Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,557 @@
+/*
+* Copyright (c) 2002-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:  
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32math.h>
+#include <mmcctranscoder.h>
+#include <mmcccodecinformation.h>
+
+#include "transcodersessioninfo.h"
+#include "mcctranscoderlogs.h"
+
+// CONSTANTS
+
+const TInt KMccTranscoderProgressMultiplier = 2;
+const TInt KMccTranscoderProgressMiddle = 50;
+
+const TInt KMccTranscoderVideoOnlyBitrate = 64000;
+
+const TInt KMccTranscoderAvcTargetSegmentSize = 1300; // Try to fit to MTU
+
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CMccTranscoderSessionInfo
+// default constructor
+// -----------------------------------------------------------------------------
+//
+CMccTranscoderSessionInfo::CMccTranscoderSessionInfo()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::ConstructL( )
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::NewL
+// Static constructor.
+// -----------------------------------------------------------------------------
+//
+CMccTranscoderSessionInfo* CMccTranscoderSessionInfo::NewLC()
+    {
+    CMccTranscoderSessionInfo* self = new (ELeave) CMccTranscoderSessionInfo;
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::~CMccTranscoderSessionInfo
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMccTranscoderSessionInfo::~CMccTranscoderSessionInfo()
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::~CMccTranscoderSessionInfo" )
+    
+    delete iMovie;
+    delete iVideoCodec;
+    delete iAudioCodec;
+    
+    __TRANSCODER( "CMccTranscoderSessionInfo::~CMccTranscoderSessionInfo, exit" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetQuality
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetQuality( TUint32 aQuality )
+    {
+    __TRANSCODER_INT1( "CMccTranscoderSessionInfo::SetQuality, quality=", aQuality )
+
+    switch( aQuality )
+        {
+        case CVedMovie::EQualityAutomatic:
+            iQuality = CVedMovie::EQualityAutomatic;
+            break; 
+        case CVedMovie::EQualityMMSInteroperability:
+            iQuality = CVedMovie::EQualityMMSInteroperability;
+            break;
+        case CVedMovie::EQualityResolutionCIF:
+            iQuality = CVedMovie::EQualityResolutionCIF;        
+            break;
+        case CVedMovie::EQualityResolutionQCIF:
+            iQuality = CVedMovie::EQualityResolutionQCIF;        
+            break;
+        case CVedMovie::EQualityLast: 
+            iQuality = CVedMovie::EQualityLast; 
+            break;
+        default:  
+            iQuality = CVedMovie::EQualityLast; 
+            break;
+        } 
+          
+    __TRANSCODER( "CMccTranscoderSessionInfo::SetQuality, exits" )
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetDesFileL
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetDesFileL( const TDesC& aFileName )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::SetDesFileL" )
+
+    __ASSERT_ALWAYS( aFileName.Length() > 0, User::Leave( KErrArgument ) );
+  
+    iDesFile.Copy( aFileName );
+        
+    __TRANSCODER( "CMccTranscoderSessionInfo::SetDesFileL, exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetVideoType
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetVideoType( 
+    const TDesC8& aSdpName,
+    const TInt aVideoBitRate )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::SetVideoType" )
+
+    if ( aSdpName.CompareF( KAVCSdpName )  == 0 )
+        {
+        iVideoCodec->SetVideoType( EVedVideoTypeAVCBaselineProfile ); 
+        // Other than zero value will cause transcoding failure for AVC
+        iSyncIntervalInPicture = 0; 
+        iSegmentSizeInBytes = KMccTranscoderAvcTargetSegmentSize;
+        }
+    else if ( aSdpName.CompareF( KH263SdpName ) == 0 ||
+              aSdpName.CompareF( KH2631998SdpName ) == 0||
+              aSdpName.CompareF( KH2632000SdpName  ) == 0 )
+        {
+        const TInt maxBitRateOne = 64000;
+        const TInt maxBitRateTwo = 128000;
+        if ( aVideoBitRate <= maxBitRateOne )
+            {
+            iVideoCodec->SetVideoType( EVedVideoTypeH263Profile0Level10 );
+            }
+        if ( aVideoBitRate >  maxBitRateOne && 
+             aVideoBitRate < maxBitRateTwo )
+            {
+            iVideoCodec->SetVideoType( EVedVideoTypeH263Profile0Level45 ); 
+            }
+        iSyncIntervalInPicture = 1;
+        }
+    else 
+        {
+        iVideoCodec->SetVideoType( EVedVideoTypeUnrecognized) ;
+        } 
+        
+    __TRANSCODER( "CMccTranscoderSessionInfo::SetVideoType, exit" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetVideoType
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetAudioType( const TDesC8& aSdpName )
+   {
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetAudioType" )
+
+   if ( iAudioCodec )
+       {
+       if ( aSdpName.CompareF( KAACSdpName )  == 0 )
+            {
+            iAudioCodec->SetAudioType( EVedAudioTypeAAC_LC );  
+            }
+       else if ( aSdpName.CompareF( KAMRSdpName )  == 0  )
+            {
+            iAudioCodec->SetAudioType( EVedAudioTypeAMR );
+            }
+       else
+            {
+            iAudioCodec->SetAudioType( EVedAudioTypeUnrecognized );  
+            } 
+       }
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetAudioType, exit" )
+
+   }
+   
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetVideoType
+// -----------------------------------------------------------------------------
+//
+TUint32 CMccTranscoderSessionInfo::SessionId()
+   {
+   return iSessionId;    
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetVideoType
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::GenerateSessionId()
+   {
+   __TRANSCODER( "CMccTranscoderSessionInfo::GenerateSessionId" )
+
+   iSessionId = 0;
+    
+   while( iSessionId == 0 )
+        {
+        iSessionId = static_cast<TUint32>( Math::Random() );
+        }
+   
+   __TRANSCODER( "CMccTranscoderSessionInfo::GenerateSessionId, exit" )
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CreateMovieL()
+// -----------------------------------------------------------------------------
+//
+// ownership is transferred
+void CMccTranscoderSessionInfo::CreateMovieL( )
+   {
+   __TRANSCODER( "CMccTranscoderSessionInfo::CreateMovieL" )
+
+   if ( iMovie )
+       {
+       delete iMovie;
+       iMovie = NULL;
+       }
+   iMovie = CVedMovie::NewL( 0 );
+   
+   __TRANSCODER( "CMccTranscoderSessionInfo::CreateMovieL, exit" )
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::Movie
+// -----------------------------------------------------------------------------
+//
+CVedMovie& CMccTranscoderSessionInfo::Movie()
+   {
+   return *iMovie;   
+   }
+
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::Quality
+// -----------------------------------------------------------------------------
+//                    
+CVedMovie::TVedMovieQuality CMccTranscoderSessionInfo::Quality()
+   {
+   return iQuality;   
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::DesFile
+// -----------------------------------------------------------------------------
+//
+const TDesC& CMccTranscoderSessionInfo::DesFile()
+   {
+   return iDesFile;
+   }
+
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::VideoCodec
+// -----------------------------------------------------------------------------
+//
+CMccTranscoderVideoCodec& CMccTranscoderSessionInfo::VideoCodec()
+   {
+   return *iVideoCodec;    
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetVideoCodec
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetVideoCodec( CMccTranscoderVideoCodec* aCodec )
+   {
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetVideoCodec" )
+
+   if ( iVideoCodec )
+       {
+       delete iVideoCodec;
+       }
+   iVideoCodec = aCodec;
+   
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetVideoCodec, exit" )
+
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::AudioCodec
+// -----------------------------------------------------------------------------
+//
+CMccTranscoderAudioCodec& CMccTranscoderSessionInfo::AudioCodec()
+   {
+   return *iAudioCodec;
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetAudioCodec
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetAudioCodec( CMccTranscoderAudioCodec* aCodec )
+   {
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetAudioCodec " )
+
+   if ( iAudioCodec )
+       {
+       delete iAudioCodec;
+       }
+       
+   iAudioCodec = aCodec;
+   
+   __TRANSCODER( "CMccTranscoderSessionInfo::SetAudioCodec, exit" )
+
+   }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CheckVideoCodecL
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::CheckVideoCodecL( 
+    const TMccTranscoderCodecInfo& aCodecInfo )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::CheckVideoCodecL " )
+
+      // check if video code info is not empty, save it
+    if ( aCodecInfo.iMimeType.Length() )
+        {
+        if ( iVideoCodec )
+            {
+            delete iVideoCodec;
+            iVideoCodec = NULL;  
+            }
+        iVideoCodec = CMccTranscoderVideoCodec::NewL();
+        
+        iVideoCodec->SetBitrate( aCodecInfo.iBitrate );
+        iVideoCodec->SetFrameRate( aCodecInfo.iFramerate );
+        iVideoCodec->SetVideoResolution( 
+            TSize(aCodecInfo.iVideoWidth, aCodecInfo.iVideoHeight) );
+        
+        SetVideoType( aCodecInfo.iMimeType, aCodecInfo.iBitrate );       
+        }   
+    
+    __TRANSCODER( "CMccTranscoderSessionInfo::CheckVideoCodecL, exit " )
+
+    }
+        
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CheckAudioCodecL
+// -----------------------------------------------------------------------------
+//       
+void CMccTranscoderSessionInfo::CheckAudioCodecL( 
+    const TMccTranscoderCodecInfo& aCodecInfo )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::CheckAudioCodecL " )
+
+      // check if audio code info is not empty, save it
+    if (aCodecInfo.iMimeType.Length() )
+        {
+        if ( iAudioCodec )
+            {
+            delete iAudioCodec; 
+            iAudioCodec = NULL; 
+            }
+        iAudioCodec = CMccTranscoderAudioCodec::NewL();
+        iAudioCodec->SetBitrate( aCodecInfo.iBitrate );
+        iAudioCodec->SetAudioChannelMode( EVedAudioChannelModeSingleChannel );
+        iAudioCodec->SetSamplingRate( aCodecInfo.iSamplingFreq );   
+        SetAudioType( aCodecInfo.iMimeType );
+        }
+        
+    __TRANSCODER( "CMccTranscoderSessionInfo::CheckAudioCodecL, exit " )
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CheckAudioCodecL
+// -----------------------------------------------------------------------------
+//  
+void CMccTranscoderSessionInfo::GetPutputParameters( 
+    TVedOutputParameters& params )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::GetPutputParameters " )
+
+    if ( iVideoCodec )
+        {
+        __TRANSCODER( "Set video output values from codec" )
+        params.iVideoType = iVideoCodec->VideoType();
+        params.iVideoResolution = iVideoCodec->VideoResolution();
+        params.iVideoBitrate = iVideoCodec->Bitrate();
+        params.iVideoFrameRate = iVideoCodec->FrameRate();  
+        }
+    else if ( iMovie )// set video parameters from clip
+        {
+        __TRANSCODER( "Set video output values from mov" )
+        params.iVideoType = iMovie->VideoType();
+        params.iVideoResolution = iMovie->Resolution();
+        params.iVideoBitrate = CalculateVideoBitrate( *iMovie );
+        params.iVideoFrameRate = iMovie->VideoFrameRate();
+        }
+        
+    //insert GOBs into clip
+    params.iSyncIntervalInPicture = iSyncIntervalInPicture;  
+    params.iSegmentSizeInBytes = iSegmentSizeInBytes;
+
+    // audio parameters are stored in session, 
+    // copy those parameters from session, 
+    if ( iAudioCodec )
+        {
+        __TRANSCODER( "Set audio output values from codec" )
+        params.iAudioType = iAudioCodec->AudioType();
+        params.iAudioBitrate = iAudioCodec->Bitrate();
+        params.iAudioChannelMode = EVedAudioChannelModeSingleChannel;
+        params.iAudioSamplingRate = iAudioCodec->SamplingRate();
+        }
+    else if ( iMovie )// set audio parameters from clip
+        {
+        params.iAudioType = iMovie->AudioType();
+        if ( params.iAudioType != EVedAudioTypeNoAudio )
+            {
+            __TRANSCODER( "Set audio output values from mov" )
+            params.iAudioBitrate = iMovie->AudioBitrate();
+            params.iAudioChannelMode = iMovie->AudioChannelMode();
+            params.iAudioSamplingRate = iMovie->AudioSamplingRate();
+            }
+        else if ( params.iVideoType == EVedVideoTypeAVCBaselineProfile )
+            {
+            __TRANSCODER( "No audio for avc, set compatibility values" )
+            
+            // VideoEditorEngine strangely wants still these specific
+            // audio values if video type is AVC and clip does not contain
+            // audio.
+            const TInt KMccTranscoderVedCompatibility = 16000;
+            params.iAudioBitrate = KMccTranscoderVedCompatibility;
+            params.iAudioSamplingRate = KMccTranscoderVedCompatibility;
+            }
+        else
+            {
+            __TRANSCODER( "No audio, do not set audio output values" )
+            }
+        }   
+       
+    __TRANSCODER( "CMccTranscoderSessionInfo::GetPutputParameters, exit " )
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::SetRemoved
+// -----------------------------------------------------------------------------
+//
+void CMccTranscoderSessionInfo::SetRemoved( TBool aIsRemoved )
+    {
+    iIsRemoved = aIsRemoved;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::IsRemoved
+// -----------------------------------------------------------------------------
+//       
+TBool CMccTranscoderSessionInfo::IsRemoved() const
+    {
+    return iIsRemoved;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::Progressed
+// -----------------------------------------------------------------------------
+//
+TInt CMccTranscoderSessionInfo::Progressed( TInt aProgressPercentage )
+    {
+    // If only one media element is present, ved engine progress
+    // percentage has to be multiplied by two (otherwise it goes only to 50%)
+    if ( iAudioNotPresent && 
+       ( aProgressPercentage <= KMccTranscoderProgressMiddle ) )
+        {
+        aProgressPercentage = 
+            ( aProgressPercentage * KMccTranscoderProgressMultiplier );
+        }
+    return aProgressPercentage;
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::Progressed
+// -----------------------------------------------------------------------------
+//   
+void CMccTranscoderSessionInfo::ClipAdded()
+    {
+     if ( iMovie )
+        {
+        __TRANSCODER_INT1( "CMccTranscoderSessionInfo::ClipAdded, audio type:", 
+                           iMovie->AudioType() )
+        
+        iAudioNotPresent =
+            ( iMovie->AudioType() == EVedAudioTypeNoAudio || 
+              iMovie->AudioType() == EVedAudioTypeUnrecognized );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::QualityChangeNeeded
+// If client has set output video codec, quality setting is ignored
+// -----------------------------------------------------------------------------
+//
+TBool CMccTranscoderSessionInfo::QualityChangeNeeded()
+    {
+    return ( iQuality != CVedMovie::EQualityAutomatic && !iVideoCodec );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMccTranscoderSessionInfo::CalculateVideoBitrate
+// -----------------------------------------------------------------------------
+// 
+TInt CMccTranscoderSessionInfo::CalculateVideoBitrate( CVedMovie& aMovie )
+    {
+    __TRANSCODER( "CMccTranscoderSessionInfo::CalculateVideoBitrate" )
+    
+    TInt videoBitrate( KMccTranscoderVideoOnlyBitrate );
+    if ( aMovie.AudioType() != EVedAudioTypeNoAudio && 
+         aMovie.AudioBitrate() > 0 &&
+         aMovie.AudioBitrate() < videoBitrate )
+        {
+        videoBitrate -= aMovie.AudioBitrate();
+        }
+    
+    __TRANSCODER_INT1( "CMccTranscoderSessionInfo::CalculateVideoBitrate, exit bitrate:", 
+                       videoBitrate )    
+    return videoBitrate;
+    }
+    
+// End of file
+