multimediacommsengine/mmcecli/src/mcevideostream.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "mcevideostream.h"
       
    20 #include "mcevideocodec.h"
       
    21 #include "mcesession.h"
       
    22 #include "mcemanager.h"
       
    23 #include "mcemediasource.h"
       
    24 #include "mcemediasink.h"
       
    25 #include "mcecamerasource.h"
       
    26 #include "mcertpsource.h"
       
    27 #include "mcertpsink.h"
       
    28 #include "mcedisplaysink.h"
       
    29 #include "mceserial.h"
       
    30 #include "mceevents.h"
       
    31 #include "mceh263codec.h"
       
    32 #include "mcefilesource.h"
       
    33 #include "mcecomfilesource.h"
       
    34 #include "mceclilogs.h"
       
    35 #include "cleanupresetanddestroy.h"
       
    36 
       
    37 
       
    38 #define _FLAT_DATA static_cast<CMceComVideoStream*>( iFlatData )
       
    39 
       
    40 
       
    41 
       
    42 
       
    43 // ============================ MEMBER FUNCTIONS ===============================
       
    44 
       
    45 // -----------------------------------------------------------------------------
       
    46 // Factory method
       
    47 // -----------------------------------------------------------------------------
       
    48 //
       
    49 EXPORT_C CMceVideoStream* CMceVideoStream::NewL()
       
    50     {
       
    51     CMceVideoStream* self = CMceVideoStream::NewLC();
       
    52 	CleanupStack::Pop( self );
       
    53 	return self; 
       
    54     }
       
    55 
       
    56 // -----------------------------------------------------------------------------
       
    57 // Factory method
       
    58 // Leaves instance on CleanupStack.
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 EXPORT_C CMceVideoStream* CMceVideoStream::NewLC()
       
    62     {
       
    63     CMceVideoStream* self = new (ELeave) CMceVideoStream();
       
    64 	CleanupStack::PushL( self );
       
    65 	self->ConstructL();
       
    66 	return self;
       
    67     }
       
    68 
       
    69 
       
    70 // -----------------------------------------------------------------------------
       
    71 // Destructor.
       
    72 // -----------------------------------------------------------------------------
       
    73 //
       
    74 EXPORT_C CMceVideoStream::~CMceVideoStream()
       
    75     {
       
    76 	iCodecs.ResetAndDestroy();
       
    77 	iSupportedVideoCodecs.ResetAndDestroy();
       
    78     }
       
    79 
       
    80 
       
    81 // -----------------------------------------------------------------------------
       
    82 // Returns codec.
       
    83 // Returns the codecs available to the session.
       
    84 // -----------------------------------------------------------------------------
       
    85 //
       
    86 EXPORT_C const RPointerArray<CMceVideoCodec>& CMceVideoStream::Codecs()
       
    87     {
       
    88     return iCodecs;
       
    89     }
       
    90 
       
    91 
       
    92 // -----------------------------------------------------------------------------
       
    93 // 
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 EXPORT_C void CMceVideoStream::AddCodecL( CMceVideoCodec* aCodec )
       
    97     {
       
    98     __ASSERT_ALWAYS(aCodec, User::Leave(KErrArgument));
       
    99     iCodecs.AppendL(aCodec);
       
   100     aCodec->Attach( *this );
       
   101     }
       
   102 
       
   103 
       
   104 // -----------------------------------------------------------------------------
       
   105 // 
       
   106 // -----------------------------------------------------------------------------
       
   107 //
       
   108 EXPORT_C void CMceVideoStream::RemoveCodecL( CMceVideoCodec& aCodec )
       
   109     {    
       
   110     RemoveCodecL( aCodec, Binder() );
       
   111     }
       
   112 
       
   113 
       
   114 // -----------------------------------------------------------------------------
       
   115 // NOT IMPLEMENTED YET
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 EXPORT_C void CMceVideoStream::ReplaceCodecsL( RPointerArray<CMceVideoCodec>* /*aCodecs*/ )
       
   119     {
       
   120     User::Leave( KErrNotSupported );
       
   121     }
       
   122 
       
   123 
       
   124 // -----------------------------------------------------------------------------
       
   125 // 
       
   126 // -----------------------------------------------------------------------------
       
   127 //
       
   128 EXPORT_C const RPointerArray<const CMceVideoCodec>& 
       
   129         CMceVideoStream::SupportedVideoCodecs() const
       
   130     {
       
   131 	return iSupportedVideoCodecs;
       
   132     }
       
   133 
       
   134 
       
   135 // -----------------------------------------------------------------------------
       
   136 // CMceVideoStream::InternalizeL
       
   137 // -----------------------------------------------------------------------------
       
   138 //
       
   139 void CMceVideoStream::InternalizeL( MMceComSerializationContext& aSerCtx )
       
   140     {
       
   141     CMceMediaStream::InternalizeL( aSerCtx );
       
   142     
       
   143     TMceVideoStreamSerializer<CMceVideoStream> serial( *this );
       
   144     serial.InternalizeL( aSerCtx );
       
   145 
       
   146     }
       
   147     
       
   148 // -----------------------------------------------------------------------------
       
   149 // CMceVideoStream::ExternalizeL
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 void CMceVideoStream::ExternalizeL( MMceComSerializationContext& aSerCtx )
       
   153     {
       
   154     CMceMediaStream::ExternalizeL( aSerCtx );
       
   155 
       
   156     TMceVideoStreamSerializer<CMceVideoStream> serial( *this );
       
   157     serial.ExternalizeL( aSerCtx );
       
   158     
       
   159     }
       
   160 
       
   161 
       
   162 
       
   163 // -----------------------------------------------------------------------------
       
   164 // CMceVideoStream::InitializeL
       
   165 // -----------------------------------------------------------------------------
       
   166 //
       
   167 void CMceVideoStream::InitializeL( 
       
   168     CMceSession& aParent, 
       
   169     TBool aDiscardUnusedCodecs )
       
   170     {
       
   171 	CMceMediaStream::InitializeL( aParent, aDiscardUnusedCodecs );
       
   172             
       
   173     for( TInt i = 0; i < iCodecs.Count(); i++ )
       
   174         {
       
   175         iCodecs[i]->InitializeL( *this );
       
   176         }
       
   177     }
       
   178 
       
   179 
       
   180 // -----------------------------------------------------------------------------
       
   181 // CMceVideoStream::InitializeL
       
   182 // -----------------------------------------------------------------------------
       
   183 //
       
   184 void CMceVideoStream::InitializeL( CMceManager* aManager, CMceSession& aSession )
       
   185     {
       
   186     MCECLI_DEBUG("CMceVideoStream::InitializeL, Entry");
       
   187     
       
   188     __ASSERT_ALWAYS( aManager, User::Leave( KErrArgument ) );
       
   189     
       
   190     CMceMediaStream::InitializeL( aManager, aSession );
       
   191     
       
   192     if ( iCodecs.Count() == 0 )
       
   193         {
       
   194         const RPointerArray<const CMceVideoCodec>& supportedCodes = 
       
   195                                       aManager->SupportedVideoCodecs();
       
   196         for( TInt i = 0; i < supportedCodes.Count(); i++ )
       
   197             {
       
   198             CMceVideoCodec* codec = supportedCodes[i]->CloneL();
       
   199             CleanupStack::PushL( codec );
       
   200             AddCodecL( codec );
       
   201             CleanupStack::Pop( codec );
       
   202             MCECLI_DEBUG_SVALUE("CMceVideoStream::InitializeL, \
       
   203 Added supported codec", codec->SdpName() );
       
   204             
       
   205             }
       
   206         }
       
   207     MCECLI_DEBUG("CMceVideoStream::InitializeL, Exit");
       
   208         
       
   209     }
       
   210 
       
   211     
       
   212 
       
   213 // -----------------------------------------------------------------------------
       
   214 // CMceVideoStream::SynchronizeWithFileL
       
   215 // -----------------------------------------------------------------------------
       
   216 //
       
   217 void CMceVideoStream::SynchronizeWithFileL( CMceFileSource& aFile )
       
   218     {
       
   219     MCECLI_DEBUG("CMceVideoStream::SynchronizeWithFileL, Entry");
       
   220     
       
   221     const TDesC8& videoCodec = aFile.SupportedVideo();
       
   222     
       
   223     TBool transcodingRequired( EFalse );
       
   224 
       
   225     CMceManager* manager = aFile.Manager();
       
   226     
       
   227     if ( iCodecs.Count() == 0 && manager )
       
   228         {
       
   229         const RPointerArray<const CMceVideoCodec>& supportedCodecs =
       
   230             manager->SupportedVideoCodecs();
       
   231          
       
   232         CMceVideoCodec* codec = NULL;
       
   233         for( TInt j = 0; j < supportedCodecs.Count() && !codec; j++ )
       
   234             {
       
   235             if ( videoCodec.CompareF( supportedCodecs[ j ]->SdpName() ) == 0 )
       
   236                 {
       
   237                 codec = supportedCodecs[ j ]->CloneL();
       
   238                 CleanupStack::PushL( codec );
       
   239                 AddCodecL( codec );
       
   240                 CleanupStack::Pop( codec );
       
   241                 MCECLI_DEBUG_SVALUE("CMceVideoStream::SynchronizeWithFileL, \
       
   242 Added supported codec", codec->SdpName() );
       
   243                 
       
   244                 }
       
   245             }
       
   246         }
       
   247 
       
   248     for( TInt i = 0; i < iCodecs.Count(); i++ )
       
   249         {
       
   250         CMceVideoCodec* codec = iCodecs[i];
       
   251         if ( videoCodec.CompareF( codec->SdpName() ) == 0 )
       
   252             {
       
   253             const TMceFileInfo& info = aFile.FileInfo();
       
   254             
       
   255             TUint allowedMaxBitrate = 0;
       
   256             TUint allowedBitrates = 0;
       
   257             
       
   258             TInt resolveError = 
       
   259                 static_cast<CMceComCodec*>( codec->FlatData() )->
       
   260                     ResolveAllowedBitrates( info.iVideoBitRate, allowedBitrates );
       
   261               
       
   262             if ( resolveError )
       
   263                 {
       
   264                 allowedBitrates = 0xFF;
       
   265                 }
       
   266                 
       
   267             codec->SetAllowedBitrates( allowedBitrates );
       
   268             codec->SetBitrate( info.iVideoBitRate );
       
   269             codec->SetFrameRateL( info.iVideoFrameRate );
       
   270             codec->SetResolutionL( info.iVideoFrameSize );
       
   271             
       
   272             allowedMaxBitrate = codec->MaxBitRate();
       
   273             
       
   274             if ( resolveError || info.iVideoBitRate > allowedMaxBitrate )
       
   275                 {
       
   276                 transcodingRequired = ETrue;
       
   277                 }
       
   278             }
       
   279         else
       
   280             {
       
   281             delete iCodecs[ i ];
       
   282             iCodecs.Remove( i );
       
   283             i--;
       
   284             }
       
   285         }
       
   286     
       
   287     if ( iCodecs.Count() == 0 || transcodingRequired )
       
   288         {
       
   289         SetState( CMceMediaStream::ETranscodingRequired );
       
   290         }
       
   291     else
       
   292         {
       
   293         SetState( CMceMediaStream::EInitialized );
       
   294         }
       
   295     TState state = State();
       
   296     MCECLI_DEBUG_MEDIASTATE("CMceVideoStream::SynchronizeWithFileL, exit state", state );
       
   297     }
       
   298 
       
   299 // -----------------------------------------------------------------------------
       
   300 // CMceVideoStream::FindCodec
       
   301 // -----------------------------------------------------------------------------
       
   302 //
       
   303 CMceCodec* CMceVideoStream::FindCodec( CMceCodec& aCodec )
       
   304     {
       
   305     const RPointerArray<CMceCodec>& codecs = 
       
   306         reinterpret_cast<const RPointerArray<CMceCodec>&>( Codecs() );
       
   307     return CMceMediaStream::FindCodec( codecs, aCodec );
       
   308     }
       
   309  
       
   310 // -----------------------------------------------------------------------------
       
   311 // CMceVideoStream::ReorderCodecsByPreferenceL
       
   312 // -----------------------------------------------------------------------------
       
   313 //   
       
   314 void CMceVideoStream::ReorderCodecsByPreferenceL( TBool aDiscardUnusedCodecs )
       
   315     {
       
   316     // First remove all disabled codecs
       
   317     if ( aDiscardUnusedCodecs )
       
   318         {
       
   319         TInt lastIndex( iCodecs.Count() - 1 );
       
   320         for( TInt i = lastIndex; i >= 0; i-- )
       
   321             {
       
   322             if ( iCodecs[i]->State() == CMceCodec::EDisabled )
       
   323                 {
       
   324                 RemoveCodecL( *iCodecs[ i ] );
       
   325                 }
       
   326             }
       
   327         }
       
   328         
       
   329     TBool inPreferenceOrder = ETrue; 
       
   330     
       
   331     for( TInt i = 0; i < iCodecs.Count() - 1 && inPreferenceOrder; i++ )
       
   332         {
       
   333         if ( iCodecs[i]->Preference() > iCodecs[i+1]->Preference() )
       
   334             {
       
   335             inPreferenceOrder = EFalse;   
       
   336             }
       
   337         }
       
   338        
       
   339     if ( !inPreferenceOrder ) 
       
   340         {
       
   341         RPointerArray<CMceVideoCodec> updated;
       
   342         
       
   343         MceCleanupResetAndDestroyPushL( updated );
       
   344         
       
   345         TLinearOrder<CMceVideoCodec> order( CMceVideoCodec::ComparePreferences );
       
   346                     
       
   347         for( TInt i = iCodecs.Count() -1; i >= 0; i-- )
       
   348             {
       
   349             CMceVideoCodec* codec = iCodecs[i];
       
   350             iCodecs.Remove( i );
       
   351             User::LeaveIfError( updated.InsertInOrderAllowRepeats( codec, order ) );
       
   352             }
       
   353            
       
   354         iCodecs.ResetAndDestroy();
       
   355          
       
   356         for( TInt i = updated.Count() -1; i >= 0; i-- )
       
   357             {
       
   358             CMceVideoCodec* newcodec = updated[i];
       
   359             updated.Remove( i );
       
   360             User::LeaveIfError( iCodecs.InsertInOrderAllowRepeats( newcodec, order ) );
       
   361             }
       
   362        
       
   363         CleanupStack::PopAndDestroy();//updated;   
       
   364         }      
       
   365     }
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 // CMceVideoStream::BaseCodecs
       
   369 // -----------------------------------------------------------------------------
       
   370 //
       
   371 const RPointerArray<CMceCodec>& CMceVideoStream::BaseCodecs()
       
   372     {
       
   373     const RPointerArray<CMceCodec>& codecs = 
       
   374         reinterpret_cast<const RPointerArray<CMceCodec>&>( Codecs() );
       
   375     return codecs;
       
   376     }
       
   377     
       
   378 // -----------------------------------------------------------------------------
       
   379 // CMceVideoStream::RemoveCodecL
       
   380 // -----------------------------------------------------------------------------
       
   381 //
       
   382 void CMceVideoStream::RemoveCodecL( CMceVideoCodec& aCodec, TBool aBinderOriginated )
       
   383     {
       
   384     MCECLI_DEBUG_SVALUE( "CMceVideoStream::RemoveCodecL, sdp name:", aCodec.SdpName() )
       
   385     
       
   386     TBool removed( EFalse );
       
   387     for(int i = 0; i < iCodecs.Count() && !removed; i++ )
       
   388         {
       
   389         if( iCodecs[i] == &aCodec || 
       
   390             iCodecs[i]->SdpName().CompareF( aCodec.SdpName() ) == 0 )
       
   391             {
       
   392             MCECLI_DEBUG( "CMceVideoStream::RemoveCodecL, removing" )
       
   393             
       
   394             TBool commandBound = aBinderOriginated ? ( Binder() ) : ( !Binder() );
       
   395             if ( BoundStream() && commandBound )
       
   396                 {
       
   397                 static_cast<CMceVideoStream*>( 
       
   398                     iLinkedStream )->RemoveCodecL( aCodec, aBinderOriginated );
       
   399                 }
       
   400                 
       
   401             delete iCodecs[i];
       
   402             iCodecs.Remove( i );
       
   403             removed = ETrue;
       
   404             }
       
   405         }
       
   406         
       
   407     MCECLI_DEBUG( "CMceVideoStream::RemoveCodecL, Exit" )
       
   408     }
       
   409         
       
   410 // -----------------------------------------------------------------------------
       
   411 // CMceVideoStream::EventReceivedL
       
   412 // -----------------------------------------------------------------------------
       
   413 //
       
   414 TInt CMceVideoStream::EventReceivedL( TMceEvent& aEvent )
       
   415     {
       
   416     
       
   417 	TInt status = CMceMediaStream::EventReceivedL( aEvent );
       
   418     if ( status != KMceEventNotConsumed )
       
   419         {
       
   420         return status;
       
   421         }
       
   422 
       
   423     //try codecs
       
   424     if ( aEvent.Id().IsCodecId() )
       
   425         {
       
   426         TInt codecStatus = status;
       
   427         TInt j = 0;
       
   428         while ( codecStatus != KMceEventConsumed && j < iCodecs.Count() )
       
   429             {
       
   430             CMceVideoCodec* codec = iCodecs[j]; 
       
   431             codecStatus = codec->EventReceivedL( aEvent );
       
   432             if ( codecStatus == KMceEventUpdate )
       
   433                 {
       
   434                 MCECLI_DEBUG("CMceVideoStream::EventReceivedL, \
       
   435 update codec by replacing old version with new one");
       
   436                 
       
   437                 CMceVideoCodec* updateCodec = static_cast<CMceVideoCodec*>( aEvent.Message() );
       
   438                 iCodecs.Remove( j );
       
   439                 delete codec;
       
   440                 updateCodec->InitializeL( *this );
       
   441                 iCodecs.AppendL( updateCodec );
       
   442                 updateCodec->Updated();
       
   443                 codecStatus = KMceEventConsumed;
       
   444                 }
       
   445             j++;                
       
   446             }
       
   447         status = codecStatus == KMceEventNotOwner ? KMceEventNotConsumed : codecStatus;
       
   448         }
       
   449         
       
   450     return status;
       
   451     }
       
   452 
       
   453 
       
   454 // -----------------------------------------------------------------------------
       
   455 // CMceVideoStream::IsAllowedCombination
       
   456 // -----------------------------------------------------------------------------
       
   457 //    
       
   458 TBool CMceVideoStream::IsAllowedCombination()
       
   459     {
       
   460     return ETrue;
       
   461     }
       
   462 
       
   463 
       
   464 // -----------------------------------------------------------------------------
       
   465 // Default C++ constructor.
       
   466 // -----------------------------------------------------------------------------
       
   467 //
       
   468 CMceVideoStream::CMceVideoStream()
       
   469     :CMceMediaStream()
       
   470     {
       
   471     }
       
   472 
       
   473 
       
   474 // -----------------------------------------------------------------------------
       
   475 // Symbian 2nd phase constructor.
       
   476 // -----------------------------------------------------------------------------
       
   477 //    
       
   478 void CMceVideoStream::ConstructL()
       
   479     {
       
   480     CMceComVideoStream* stream = CMceComVideoStream::NewLC();
       
   481     CMceMediaStream::ConstructL( stream );
       
   482     CleanupStack::Pop( stream );
       
   483     }
       
   484 
       
   485 
       
   486 
       
   487  // End of File
       
   488 
       
   489     
       
   490     
       
   491     
       
   492