diff -r 71306c87785a -r 0da2e08216b6 mmsharing/mmshengine/src/musengclipsession.cpp --- a/mmsharing/mmshengine/src/musengclipsession.cpp Tue Apr 27 16:34:06 2010 +0300 +++ b/mmsharing/mmshengine/src/musengclipsession.cpp Tue May 11 16:10:30 2010 +0300 @@ -313,11 +313,12 @@ } } - file->TranscodeL( aFileName ); - + // Set dest file already before transcoding as output file is deleted in failure case + iTranscodingDestFileName = aFileName; + TRAPD( err, file->TranscodeL( aFileName ) ); + HandleTranscodingFailureL( err ); iTranscodingOngoing = ETrue; - - iTranscodingDestFileName = aFileName; + MUS_LOG( "mus: [ENGINE] <- CMusEngClipSession::TranscodeL(...)" ) } @@ -341,20 +342,8 @@ // Even if cancel fails, try to delete the partial clip MUS_LOG( "mus: [ENGINE] - delete the partially converted clip" ) - RFs fs; - User::LeaveIfError( fs.Connect() ); - CleanupClosePushL( fs ); - - CFileMan* fileMan = CFileMan::NewL( fs ); - CleanupStack::PushL( fileMan ); - - MUS_LOG_TDESC8( "mus: [ENGINE] - trascoding destination filename", - iTranscodingDestFileName ) - err = fileMan->Delete( iTranscodingDestFileName ); - MUS_LOG1( "mus: [ENGINE] - file delete result %d", err ) - - CleanupStack::PopAndDestroy( fileMan ); - CleanupStack::PopAndDestroy(); // fs + + DeleteTranscodingDestinationFileL(); MUS_LOG( "mus: [ENGINE] <- CMusEngClipSession::CancelTranscodeL()" ) } @@ -483,6 +472,7 @@ const RPointerArray& streams = iSession->Streams(); TBool transcodingRequired = EFalse; + TBool transcodingRequiredDueUnknownCaps = EFalse; if ( iVideoCodecList ) { @@ -492,25 +482,31 @@ CMceVideoStream* videoStream = NULL; for ( TInt i = 0; i < streams.Count(); ++i ) { - if ( streams[i]->State() == CMceMediaStream::ETranscodingRequired ) + videoStream = static_cast( streams[i] ); + + if ( iTranscodingRequiredDueMissingOptions ) + { + MUS_LOG( " -> establish with current codec, remote capa unknown!!!" ) + TBool ignoreOptionsQueryCodecs( ETrue ); + AddVideoCodecL( *videoStream, ignoreOptionsQueryCodecs ); + } + else if ( streams[i]->State() == CMceMediaStream::ETranscodingRequired ) { transcodingRequired = ETrue; } - else if ( streams[i]->Type() == KMceVideo && - !IsH264Supported() ) + else if ( streams[i]->Type() == KMceVideo && !IsH264Supported() ) { MUS_LOG( " -> video stream found!!!" ) - videoStream = static_cast( streams[i] ); //transcoding of H264 is not needed only if we know explicitly - //that the peer supports it (from OPTIONS response) - + //that the peer supports it (from OPTIONS response) const RPointerArray& codecs = videoStream->Codecs(); for ( TInt codecIndex = 0; codecIndex < codecs.Count(); ++codecIndex ) { if ( codecs[codecIndex]->SdpName() == KMceSDPNameH264() ) { transcodingRequired = ETrue; + transcodingRequiredDueUnknownCaps = !iVideoCodecList; MUS_LOG( " -> Removing H264 codec from video stream" ) videoStream->RemoveCodecL( *codecs[codecIndex] ); codecIndex = 0; @@ -526,9 +522,11 @@ } } + iTranscodingRequiredDueMissingOptions = transcodingRequiredDueUnknownCaps; + if ( transcodingRequired ) { - iClipSessionObserver.TranscodingNeeded(); + iClipSessionObserver.TranscodingNeeded(iTranscodingRequiredDueMissingOptions); } else { @@ -595,18 +593,7 @@ // there's no getter for the filename in API. iFileName = iTranscodingDestFileName; - iTranscodingOngoing = EFalse; - - iClipSessionObserver.TranscodingCompletedInit(); - - TRAPD( error, EstablishSessionL() ) - if ( error != KErrNone ) - { - iSessionObserver.SessionFailed(); - } - - // Next call does not return before session establishment - iClipSessionObserver.TranscodingCompletedFinalize(); + DoCompleteTranscoding(); } } else if ( aStream.State() == CMceMediaStream::ETranscodingRequired && @@ -616,6 +603,7 @@ iClipSessionObserver.TranscodingFailed(); iTranscodingOngoing = EFalse; + iTranscodingRequiredDueMissingOptions = EFalse; } else if ( HasClipEnded() ) { @@ -741,7 +729,8 @@ // otherwise H263 is used. // ----------------------------------------------------------------------------- // -void CMusEngClipSession::AddVideoCodecL( CMceVideoStream& aVideoStream ) +void CMusEngClipSession::AddVideoCodecL( + CMceVideoStream& aVideoStream, TBool aIgnoreNegotiated ) { MUS_LOG( "mus: [ENGINE] -> CMusEngClipSession::AddVideoCodecL" ) @@ -757,8 +746,8 @@ CMceVideoCodec* addedCodec = NULL; - TPtrC8 addedCodecName = - IsH264Supported() ? KMceSDPNameH264() : KMceSDPNameH2632000(); + TPtrC8 addedCodecName = ( aIgnoreNegotiated || IsH264Supported() ) ? + KMceSDPNameH264() : KMceSDPNameH2632000(); MUS_LOG_TDESC8( "mus: [ENGINE] adding codec : ", addedCodecName ); @@ -1007,6 +996,67 @@ { return ( iVideoCodecList && iVideoCodecList->FindF( KMceSDPNameH264() ) >= 0 ); } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusEngClipSession::HandleTranscodingFailureL( TInt aError ) + { + if ( aError == KErrNone ) + { + return; + } + + TRAP_IGNORE( DeleteTranscodingDestinationFileL() ) + + User::LeaveIfError( aError ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMusEngClipSession::DoCompleteTranscoding() + { + iTranscodingOngoing = EFalse; + + iClipSessionObserver.TranscodingCompletedInit(); + + TRAPD( error, EstablishSessionL() ) + iTranscodingRequiredDueMissingOptions = EFalse; + if ( error != KErrNone ) + { + iSessionObserver.SessionFailed(); + } + // Next call does not return before session establishment + iClipSessionObserver.TranscodingCompletedFinalize(); + + return error; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusEngClipSession::DeleteTranscodingDestinationFileL() + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + CFileMan* fileMan = CFileMan::NewL( fs ); + CleanupStack::PushL( fileMan ); + + MUS_LOG_TDESC8( "mus: [ENGINE] - deleting trascoding destination, filename", + iTranscodingDestFileName ) + TInt err = fileMan->Delete( iTranscodingDestFileName ); + MUS_LOG1( "mus: [ENGINE] - file delete result %d", err ) + + CleanupStack::PopAndDestroy( fileMan ); + CleanupStack::PopAndDestroy(); // fs + } + // End of file