camappengine/StillConverter/Src/CaeStillEncoder.cpp
branchRCL_3
changeset 20 e3cdd00b5ae3
parent 19 18fa9327a158
child 21 27fe719c32e6
equal deleted inserted replaced
19:18fa9327a158 20:e3cdd00b5ae3
     1 /*
       
     2 * Copyright (c) 2002 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:  Still Image Encoder for Camera Application Engine
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <eikenv.h>
       
    22 
       
    23 #include "CaeStillConverter.h"
       
    24 #include "CaeStillEncoder.h"
       
    25 #include "CaeStillCommon.h"
       
    26 
       
    27 #ifdef CAE_TEST_VERSION
       
    28 #include "CaeStillConverterTestErrors.h"
       
    29 #endif
       
    30 
       
    31 
       
    32 // ================= MEMBER FUNCTIONS =======================
       
    33 
       
    34 
       
    35 // ---------------------------------------------------------
       
    36 // CCaeStillEncoder::NewL
       
    37 // Two-phased constructor.
       
    38 // ---------------------------------------------------------
       
    39 //
       
    40 EXPORT_C CCaeStillEncoder* CCaeStillEncoder::NewL()
       
    41     {
       
    42     CCaeStillEncoder* self = new( ELeave ) CCaeStillEncoder;
       
    43     CleanupStack::PushL( self );
       
    44     self->ConstructL();
       
    45     CleanupStack::Pop( self );
       
    46     return self;
       
    47     }
       
    48 
       
    49 
       
    50 // ---------------------------------------------------------
       
    51 // CCaeStillEncoder::~CCaeStillEncoder
       
    52 // Destructor.
       
    53 // ---------------------------------------------------------
       
    54 //
       
    55 EXPORT_C CCaeStillEncoder::~CCaeStillEncoder()
       
    56     {
       
    57     Cancel();
       
    58     Cleanup();
       
    59     
       
    60     // For RTRT code coverage analysis.
       
    61     // #pragma attol insert _ATCPQ_DUMP(0);
       
    62     }
       
    63 
       
    64 
       
    65 // ---------------------------------------------------------
       
    66 // CCaeStillEncoder::SetObserver
       
    67 // Sets Still encoder observer.
       
    68 // ---------------------------------------------------------
       
    69 //
       
    70 EXPORT_C void CCaeStillEncoder::SetObserver( 
       
    71     MCaeStillEncoderObserver* aObserver )
       
    72     {
       
    73     iObserver = aObserver;
       
    74     }
       
    75 
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CCaeStillEncoder::SetImageCodecL
       
    79 // Sets the specific image codec implementation to be used in encoding.
       
    80 // -----------------------------------------------------------------------------
       
    81 //
       
    82 void CCaeStillEncoder::SetImageCodecL( 
       
    83 	TUid aCodecUid )
       
    84     {
       
    85     iImageCodecUid = aCodecUid;
       
    86     }
       
    87 
       
    88 // ---------------------------------------------------------
       
    89 // CCaeStillEncoder::SetCompressionQuality
       
    90 // Sets compression quality.
       
    91 // ---------------------------------------------------------
       
    92 //
       
    93 EXPORT_C void CCaeStillEncoder::SetCompressionQuality( 
       
    94     TInt aQuality )
       
    95     {
       
    96     iJpegQuality = Min( KJpegQualityMax, Max( KJpegQualityMin, aQuality ) );
       
    97     }
       
    98 
       
    99 
       
   100 // ---------------------------------------------------------
       
   101 // CCaeStillEncoder::CompressionQuality
       
   102 // Gets compression quality.
       
   103 // ---------------------------------------------------------
       
   104 //
       
   105 EXPORT_C TInt CCaeStillEncoder::CompressionQuality() const
       
   106     {
       
   107     return iJpegQuality;
       
   108     }
       
   109 
       
   110 
       
   111 // ---------------------------------------------------------
       
   112 // CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L
       
   113 // Creates CImageItem object, places it in the internal 
       
   114 // queue and starts bitmap to memory image conversion.
       
   115 // ---------------------------------------------------------
       
   116 //
       
   117 EXPORT_C void CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L( 
       
   118     CFbsBitmap* aBitmap,  
       
   119     TTargetFormat aTargetFormat )
       
   120     {
       
   121     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L() entering" ) );
       
   122 
       
   123     CleanupStack::PushL( aBitmap );
       
   124 
       
   125     // Create image item and set up image data.
       
   126 
       
   127     CImageItem* imageItem = new( ELeave ) CImageItem;
       
   128 
       
   129     imageItem->iBitmap = aBitmap;
       
   130 
       
   131     CleanupStack::Pop( aBitmap );
       
   132     CleanupStack::PushL( imageItem );
       
   133 
       
   134     switch ( aTargetFormat )
       
   135         {
       
   136         case ETargetFormatJPEG:
       
   137         default:
       
   138             {
       
   139             imageItem->iImageTypeUid = KImageTypeJPGUid;
       
   140 
       
   141             imageItem->iFrameImageData = CFrameImageData::NewL(); 
       
   142             // ( do not push member variable to cleanup stack )
       
   143 
       
   144             TJpegImageData* imagedata = new( ELeave ) TJpegImageData;
       
   145             CleanupStack::PushL( imagedata );
       
   146 
       
   147             imagedata->iSampleScheme = KCaeJpegColorSampling;
       
   148             imagedata->iQualityFactor = iJpegQuality;
       
   149 
       
   150             User::LeaveIfError ( imageItem->iFrameImageData->AppendImageData( imagedata ) );
       
   151 
       
   152             CleanupStack::Pop( imagedata );
       
   153             break;
       
   154             }
       
   155         }
       
   156 
       
   157     #ifdef CAE_TEST_VERSION
       
   158     // For simulating errors when compiled as special "test version".
       
   159     CaeConvertCFbsBitmapToHBufC8ErrorL();
       
   160     #endif    
       
   161 
       
   162     // Append image to the queue.
       
   163     User::LeaveIfError ( iImageQueue->Append( imageItem ) );
       
   164 
       
   165     CleanupStack::Pop( imageItem );
       
   166 
       
   167     // Start image conversion if not busy.
       
   168     if ( !IsBusy() )
       
   169         {
       
   170         TRAPD( error, ConvertL() );
       
   171         if ( error != KErrNone )
       
   172             {
       
   173             ConversionComplete( error );
       
   174             }
       
   175         }
       
   176 
       
   177     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertCFbsBitmapToHBufC8L() returning" ) );
       
   178     }
       
   179 
       
   180 
       
   181 // ---------------------------------------------------------
       
   182 // CCaeStillEncoder::Cleanup
       
   183 // Destroy all allocations.
       
   184 // ---------------------------------------------------------
       
   185 //
       
   186 EXPORT_C void CCaeStillEncoder::Cleanup()
       
   187     {
       
   188     if ( iEncoder )
       
   189         {
       
   190         iEncoder->Cancel();
       
   191         delete iEncoder;
       
   192         iEncoder = NULL;
       
   193         }
       
   194 
       
   195     if ( iState != EIdle )
       
   196         {
       
   197         delete iEncodedImage;
       
   198         iEncodedImage = NULL;
       
   199         }
       
   200     
       
   201     if ( iImageQueue )
       
   202         {
       
   203         iImageQueue->ResetAndDestroy();
       
   204         }
       
   205     }
       
   206 
       
   207 
       
   208 // ---------------------------------------------------------
       
   209 // CCaeStillEncoder::CCaeStillEncoder
       
   210 // Default constructor. 
       
   211 // This can NOT leave.
       
   212 // ---------------------------------------------------------
       
   213 //
       
   214 CCaeStillEncoder::CCaeStillEncoder() :
       
   215 iJpegQuality( KJpegQualityMax )
       
   216     {
       
   217     CActiveScheduler::Add( this );
       
   218     }
       
   219 
       
   220 
       
   221 // ---------------------------------------------------------
       
   222 // CCaeStillEncoder::ConstructL
       
   223 // Symbian 2nd phase constructor that can leave.
       
   224 // ---------------------------------------------------------
       
   225 //
       
   226 void CCaeStillEncoder::ConstructL()
       
   227     {
       
   228     CCaeStillConverter::ConstructL();
       
   229     }
       
   230 
       
   231 
       
   232 // ---------------------------------------------------------
       
   233 // CCaeStillEncoder::DoCancel
       
   234 // From CActive, implements cancellation of an outstanding request.
       
   235 // ---------------------------------------------------------
       
   236 //
       
   237 void CCaeStillEncoder::DoCancel()
       
   238     {
       
   239     Cleanup();
       
   240     iState = EIdle;
       
   241     }
       
   242 
       
   243 
       
   244 // ---------------------------------------------------------
       
   245 // CCaeStillEncoder::ConvertL
       
   246 // Converts bitmap to memory JPEG image.
       
   247 // Allocates Image Conversion Library (ICL) encoder and 
       
   248 // starts conversion.
       
   249 // ---------------------------------------------------------
       
   250 //
       
   251 void CCaeStillEncoder::ConvertL()
       
   252     {
       
   253     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertL() entering" ) );
       
   254 
       
   255     // Do not delete the encoded image here, just set to NULL.
       
   256     iEncodedImage = NULL;
       
   257 
       
   258     // Allocate new ICL encoder.
       
   259     delete iEncoder;
       
   260     iEncoder = NULL;
       
   261     
       
   262     // Use the default codec or the specific codec
       
   263     iEncoder = CImageEncoder::DataNewL( iEncodedImage, 
       
   264     	CImageEncoder::EOptionNone, (*iImageQueue)[0]->iImageTypeUid, 
       
   265     	KNullUid, iImageCodecUid ); 
       
   266 
       
   267     LOGTEXT3( _L( "Cae: CCaeStillEncoder::ConvertL(). Requested encoder: %x, Found encoder: %x" ), iImageCodecUid.iUid, iEncoder->ImplementationUid().iUid );
       
   268     
       
   269     #ifdef CAE_TEST_VERSION
       
   270     // For simulating errors when compiled as special "test version".
       
   271     CaeStillConvertErrorL();
       
   272     #endif    
       
   273 
       
   274     iState = EConvert;
       
   275     iStatus = KRequestPending;
       
   276     iEncoder->Convert( &iStatus, 
       
   277                        *(*iImageQueue)[0]->iBitmap, 
       
   278                        (*iImageQueue)[0]->iFrameImageData );
       
   279     SetActive();
       
   280 
       
   281     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConvertL() returning" ) );
       
   282     }
       
   283 
       
   284 
       
   285 // ---------------------------------------------------------
       
   286 // CCaeStillEncoder::ConversionComplete
       
   287 // Perfoms necessary cleanup and delivers result 
       
   288 // to the client.
       
   289 // ---------------------------------------------------------
       
   290 //
       
   291 void CCaeStillEncoder::ConversionComplete( 
       
   292     TInt aError )
       
   293     {
       
   294     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConversionComplete() entering" ) );
       
   295     #ifdef _DEBUG
       
   296     if ( aError ) 
       
   297         {
       
   298         LOGTEXT2( _L( "Cae: CCaeStillEncoder::ConversionComplete(): error detected: %d" ), aError );
       
   299         }
       
   300     #endif
       
   301 
       
   302     if ( iEncoder )
       
   303         {
       
   304         iEncoder->Cancel();
       
   305         delete iEncoder;
       
   306         iEncoder = NULL;
       
   307         }
       
   308 
       
   309     // To be outputted via call-back.
       
   310     CFbsBitmap* bitmap = NULL;
       
   311     
       
   312     if ( iImageQueue->Count() > 0 )
       
   313         {
       
   314         bitmap = (*iImageQueue)[0]->iBitmap;
       
   315 
       
   316         (*iImageQueue)[0]->iBitmap = NULL; // Prevent deletion of source image.
       
   317         delete ( *iImageQueue )[0];
       
   318 
       
   319         // Remove item pointer from the queue and compress the queue.
       
   320         iImageQueue->Remove( 0 );
       
   321         }
       
   322 
       
   323     iState = EIdle;
       
   324 
       
   325     const TInt KZeroImageSize = 0; // Image size argument currently not in use.
       
   326 
       
   327     // Call back the client to deliver the result image. Gives away the ownership of the bitmap 
       
   328     // and iEncodedImage.
       
   329     iObserver->McaeseoHBufC8ImageReady( bitmap, iEncodedImage, aError, KZeroImageSize );
       
   330     iEncodedImage = NULL; // Ownership has been given away
       
   331 
       
   332     LOGTEXT( _L( "Cae: CCaeStillEncoder::ConversionComplete() returning" ) );
       
   333     }
       
   334 
       
   335 
       
   336 //  End of File