imagingext_plat/extended_icl_jpeg_api/inc/IclExtJpegApi.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 16:01:03 +0300
branchRCL_3
changeset 30 e6e35c6539fa
parent 19 e27d6f36a9e6
permissions -rw-r--r--
Revision: 201038 Kit: 201041

/*
* Copyright (c) 2006 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:  Definition of CVisualFrame, CExtJpegDecoder and CExtJpegEncoder
*
*/

#ifndef _ICLEXTJPEGAPI_
#define _ICLEXTJPEGAPI_

#include "ImageConversion.h"
#include <icl/Icl_UIDS.hrh>

#include "ICLExifImageFrame.h"
const TInt KMaxNumberOfPlanes = KMaxPlanesInFrame;
const TUid KUidExtFormatJpeg = { 0 };
const TUid KUidExtIclApiSupport = { 0 };
const TInt KExtensionUID = 0x01010101;

// FORWARD DECLARATIONS
class CVisualFrameImpl;

// CLASS DECLARATION

/**
* CVisualFrame
* @lib IclExtJpegApi.lib
* @since 3.2
*/
class CVisualFrame : public CBase
    {
    public:

        // TFrameLayout contains the scan line lengths and offsets for each component in planar YUV case
        class TFrameLayout
            {
            public:
                TInt iNumberOfPlanes;
                TInt iScanLineLength[KMaxNumberOfPlanes];
                TInt iOffset[KMaxNumberOfPlanes];
                TInt iLength[KMaxNumberOfPlanes];
                TInt iMaxLength[KMaxNumberOfPlanes];                
            };

        enum TDataContainer
            {
            EInChunk,
            EInDescriptor
            };
            
        enum TDataFormat
            {
            /* Copied from CCamera::TFormat: */
            
            /** 8 bit greyscale values, 0=black, 255=white. */
            EFormatMonochrome            = 0x0001,//+
            /** Packed RGB triplets, 4 bits per pixel with red in the least significant bits
            and the 4 most significant bits unused. */
            EFormat16bitRGB444            = 0x0002,//+
            /** Packed RGB triplets, 5 bits per pixel for red and blue and 6 bits for green,
            with red in the least significant bits. */
            EFormat16BitRGB565            = 0x0004,//+
            /** Packed RGB triplets, 8 bits per pixel with red in the least significant bits
            and the 8 most significant bits unused. */
            EFormat32BitRGB888            = 0x0008,//+
            /** JFIF JPEG. */
            EFormatJpeg                    = 0x0010,
            /** EXIF JPEG */
            EFormatExif                    = 0x0020,
            /** CFbsBitmap object with display mode EColor4K. */
            EFormatFbsBitmapColor4K        = 0x0040,
            /** CFbsBitmap object with display mode EColor64K. */
            EFormatFbsBitmapColor64K    = 0x0080,
            /** CFbsBitmap object with display mode EColor16M. */
            EFormatFbsBitmapColor16M    = 0x0100,
            /** Implementation dependent. */
            EFormatUserDefined            = 0x0200,
            /** 4:2:0 format, 8 bits per sample, Y00Y01Y10Y11UV. */
            EFormatYUV420Interleaved    = 0x0400,//+
            /** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03...U0...V0... */
            EFormatYUV420Planar            = 0x0800,//+
            /** 4:2:2 format, 8 bits per sample, UY0VY1. */
            EFormatYUV422                = 0x1000,//+
            /** 4:2:2 format, 8 bits per sample, Y1VY0U. */
            EFormatYUV422Reversed        = 0x2000,//+
            /** 4:4:4 format, 8 bits per sample, Y00U00V00 Y01U01V01... */
            EFormatYUV444                = 0x4000,//+
            /** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03...U0V0... */
            EFormatYUV420SemiPlanar        = 0x8000,//+

            /* Other formats: */
            
            /** 4:2:2 format, 8 bits per sample, Y0Y1UV. */
            EFormatExtYUV422Interleaved = 0x00100000,
            /** 4:2:2 format, 8 bits per sample, Y0Y1Y2...U0U1...V0V1. */
            EFormatExtYUV422Planar      = 0x00200000,
            /** 4:4:4 format, 8 bits per sample, Y0U0V0Y1U1V1. */
            EFormatExtYUV444Planar = 0x00400000,
            /** DCT coefficients */
            EFormatExtDctCoeff = 0x00800000,            
                        
            };
    
    public: // New functions

        /**
        * Symbian C++ Two-phased constructor.
        * @since 3.2
        * @param aBuffer        A descriptor reference to buffer containing the image data.
        * @param aDimension     The dimensions of the corresponding image data.
        * @param aFrameFormat	The frame format of the corresponding image data.
        * @return CVisualFrame* A pointer to frame object.
        */
        IMPORT_C static CVisualFrame* NewL( 
                                    TDes8& aBuffer, 
                                    const TSize& aDimension,
                                    TInt aFrameFormat );

        /**
        * Symbian C++ Two-phased constructor.
        * @since 3.2
        * @param aChunk         An RChunk reference to buffer containing the image data.
        * @param aSize          The amount of image data in bytes.
        * @param amaxSize       The maximum size of the memory reserved in the chunk.
        * @param aDataOffset    The offset value specifying the location of the image 
        *                       data in the chunk.
        * @param aDimension     The dimensions of the corresponding image data.
        * @param aFrameFormat   The frame format of the corresponding image data.
        * @return CVisualFrame* A pointer to frame object.
        */
        IMPORT_C static CVisualFrame* NewL( 
                                    RChunk& aChunk, 
                                    TInt aSize,
                                    TInt aMaxSize, 
                                    TInt aDataOffset,
                                    const TSize& aDimension, 
                                    TInt aFrameFormat );

        /**
        * Symbian C++ Two-phased constructor.
        * @since 3.2
        * @param aBuffer        A descriptor reference to buffer containing the image data.
        * @param aDimension     The dimensions of the corresponding image data.
        * @param aFrameLayout   The layout of the image color components.
        * @return CVisualFrame* A pointer to frame object.
        */
        IMPORT_C static CVisualFrame* NewL( 
                                    TDes8& aBuffer, 
                                    const TSize& aDimension, 
                                    TInt aFrameFormat, 
                                    const TFrameLayout& aFrameLayout ); 

        /**
        * Symbian C++ Two-phased constructor.
        * @since 3.2
        * @param aChunk         An RChunk reference to buffer containing the image data.
        * @param aSize          The amount of image data in bytes.
        * @param aMaxSize       The maximum size of the memory reserved in the chunk for 
        *                       the image data.
        * @param aDimension     The dimensions of the corresponding image data.
        * @param aFrameFormat   The frame format of the corresponding image data.
        * @param aFrameLayout   The layout of the image color components. TFrameLayout 
        * 						contains the scan line lengths and offsets for each component 
        *						in planar YUV case
        * @return CVisualFrame* A pointer to frame object.
        */
        IMPORT_C static CVisualFrame* NewL( 
                                    RChunk& aChunk, 
                                    TInt aSize, 
                                    TInt aMaxSize,
                                    const TSize& aDimension, 
                                    TInt aFrameFormat, 
                                    const TFrameLayout& aFrameLayout );        
       
       
        /**
        * Returns a constant reference to the chunk containing 
        * the image data, if exists.
        * @since 3.2
        * @return RChunk
        */
        IMPORT_C const RChunk& DataChunkL() const;
        
        /**
        * Returns a descriptor pointer to the image data location, if exists
        * @since 3.2
        * @return TPtr8
        */        
        IMPORT_C TPtr8 DataPtrL() const;

        /**
        * Returns the dimensions of the image.
        * @since 3.2
        * @return TSize
        */        
        IMPORT_C TSize Dimension() const;

        /**
        * Return the image data format.
        * @since 3.2
        * @return TInt
        */        
        IMPORT_C TInt FrameFormat() const;
        
        /**
        * Returns the offset of the image data for non-planar, 
        * single-component or compressed images. 
        * @since 3.2
        * @return TInt
        */        
        IMPORT_C TInt DataOffset() const;

        /**
        * Returns the amount of stored image data in bytes.
        * @since 3.2
        * @return TInt
        */        
        IMPORT_C TInt Size() const;

        /**
        * Sets the amount of image data to the given value. 
        * Should be called when the image data amount is modified explicitly.
        * @since 3.2
        * @return void
        */
        IMPORT_C void SetSizeL( TInt aSize );

        /**
        * Returns the maximum size of the memory space reserved for image data
        * @since 3.2
        * @return TInt
        */
        IMPORT_C TInt MaxSize() const;

        /**
        * Returns the storage type of the image data.
        * @since 3.2
        * @return TDataContainer
        */        
        IMPORT_C TDataContainer DataContainer() const;

        /**
        * Returns the layout of the image data for planar compressed images.
        * @since 3.2
        * @return TFrameLayout
        */        
        IMPORT_C const TFrameLayout& FrameLayout() const;    

        /**
        * Destructor
        */
        IMPORT_C virtual ~CVisualFrame();

        /**
        * Symbian C++ Two-phased constructor.
        */        
        IMPORT_C static CVisualFrame* NewL( const CImageFrame* aImageFrame );

        /**
        * Get image frame
        * @since 3.2
        * @return CImageFrame
        */
        IMPORT_C CImageFrame* GetImageFrameL();
       
        
    private:
    
        CVisualFrameImpl* iVisualFrameImpl;

    };
    

// CLASS DECLARATION

/**
* CExtJpegDecoder
* @lib IclExtJpegApi.lib
* @since 3.2
*/
class CExtJpegDecoder : public CJPEGImageFrameDecoder
    {
    public:

        enum TDecoderCapability
            {
            ECapNone = 0x0000,
            ECapCropping = 0x0001,
            ECapStreaming = 0x0002,
            ECapRotation = 0x0004,
            ECapFlipping = 0x0008,
            ECapMirroring = 0x0010,
            ECapDctDecoding = 0x0020,
            ECapExifData = 0x0040
            };
            
        enum TDecoderOperations
            {
            EEnd = 0x00010000,
            ESupportedFormats = 0x00020000,
            ECapabilities = 0x00040000,
            EReadyForAsync = 0x00080000,
            EConvert = 0x00100000,
            EContinueConvert = 0x00200000
            };            
            
        enum TDecoderType
            {
            ESwImplementation = 0,
            EHwImplementation
            };
            
    public:

        /**
        * Symbian C++ Two-phased constructor.
        * @since 3.2
        */
        IMPORT_C static CExtJpegDecoder* NewL();

        
        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.
        * @param aSourceFilename    The name of the Jpeg file to decode.
        * @param aMIMEType          The Jpeg MIME type for matching the decoder plugin.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */
        IMPORT_C static CExtJpegDecoder* FileNewL( 
                                    RFs& aFs, 
                                    const TDesC& aSourceFilename, 
                                    const TDesC8& aMIMEType, 
                                    const TOptions aOptions = EOptionNone );

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.
        * @param aSourceFilename    The name of the Jpeg file to decode.
        * @param aOptions           Decoder options defined in ICL.
        * @param aImageType         The Jpeg image type.    
        * @param aImageSubType      The Jpeg image subtype (Null UID).  
        * @param aDecoderUid        The decoder plugin UID.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */      
        IMPORT_C static CExtJpegDecoder* FileNewL( 
                                    RFs& aFs, 
                                    const TDesC& aSourceFilename, 
                                    const TOptions aOptions = EOptionNone, 
                                    const TUid aImageType = KNullUid, 
                                    const TUid aImageSubType = KNullUid, 
                                    const TUid aDecoderUid = KNullUid );

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.
        * @param aSourceData        The descriptor reference for the Jpeg image data to decode.
        * @param aMIMEType          The Jpeg MIME type for matching the decoder plugin.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */      
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    RFs& aFs,
                                    const TDesC8& aSourceData,
                                    const TDesC8& aMIMEType,
                                    const TOptions aOptions = EOptionNone );
        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.
        * @param aSourceData        The descriptor reference for the Jpeg image data to decode.
        * @param aOptions           Decoder options defined in ICL.
        * @param aImageType         The Jpeg image type.
        * @param aImageSubType      The Jpeg image subtype (Null UID).
        * @param aDecoderUid        The decoder plugin UID.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */        
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    RFs& aFs, 
                                    const TDesC8& aSourceData,
                                    const TOptions aOptions = EOptionNone,
                                    const TUid aImageType  = KNullUid,
                                    const TUid aImageSubType = KNullUid,
                                    const TUid aDecoderUid = KNullUid );

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.    
        * @param aSourceData        Pointer to the visual frame structure keeping 
        *                           the Jpeg image data to decode.
        * @param aMIMEType          The Jpeg MIME type for matching the decoder plugin.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    RFs& aFs, 
                                    const CVisualFrame* aSourceData,
                                    const TDesC8& aMIMEType,
                                    const TOptions aOptions = EOptionNone );

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aFs                A reference to a file server session to use.    
        * @param aSourceData        Pointer to the visual frame structure keeping 
        *                           the Jpeg image data to decode.  
        * @param aOptions           Decoder options defined in ICL.
        * @param aImageType         The Jpeg image type.
        * @param aImageSubType      The Jpeg image subtype (Null UID).
        * @param aDecoderUid        The decoder plugin UID.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */        
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    RFs& aFs,
                                    const CVisualFrame* aSourceData,
                                    const TOptions aOptions = EOptionNone,
                                    const TUid aImageType  = KNullUid,
                                    const TUid aImageSubType = KNullUid,
                                    const TUid aDecoderUid = KNullUid );

        /**
        * Destructor.
        */
        IMPORT_C virtual ~CExtJpegDecoder();
    
        /**
        * Enables the use of cropping feature and specifies the cropping region. 
        * @since 3.2
        * @param aCropRect  The rectangular cropping region that will be decoded.
        * @return void
        */
        IMPORT_C void SetCroppingL( TRect aCropRect );

        /**
        * Enables the use of streaming feature and retrieves the macroblock 
        * dimensions in the Jpeg data.
        * @since 3.2
        * @param aMacroBlockSize    The macroblock dimensions in the 
        *                           Jpeg image that is set by the decoder
        * @return void
        */
        IMPORT_C void SetStreamingL( TSize& aMacroBlockSize );

        /**
        * Enables the use of rotation feature and specifies the rotating degree. 
        * @since 3.2
        * @param aDegree    The rotation degree. Can take any values between 1 and 359.
        * @return void
        */
        IMPORT_C void SetRotationL( TInt aDegree );

        /**
        * Enables the use of flipping feature.
        * @since 3.2
        * @return void
        */
        IMPORT_C void SetFlippingL();

        /**
        * Enables the use of mirroring feature.
        * @since 3.2
        * @return void
        */
        IMPORT_C void SetMirroringL();
        
        /**
        * SEnables the use of DCT decoding feature.
        * @since 3.2
        * @return void
        */        
        IMPORT_C void SetDctDecodingL();

        /**
        * Asynchronous function for initiating the decoding
        * @since 3.2
        * @param aRequestStatus         The pointer to the status of the operation 
        *                               that is set by the decoder after it is completed.
        *                               After a complete successful operation, the status 
        *                               is KErrNone.
        * @param aDestinationFrame      Pointer to the visual frame structure that is keeping 
        *                               the destination image data. The client should do the 
        *                               proper allocation of the destination location.
        * @param aNoOfDecodedMBlocks    Reference to the number of decoded macroblocks that is 
        *                               set by the decoder after the decoding is completed.
        * @param aFrameNumber           The frame index in the Jpeg image.
        * @return void
        */
        IMPORT_C void ConvertL( 
                        TRequestStatus* aRequestStatus, 
                        const CVisualFrame* aDestinationFrame, 
                        TInt& aNoOfDecodedMBlocks,
                        TInt aFrameNumber = 0 );

        /**
        * Asynchronous function for initiating one of the iterations of streamed decoding.
        * @since 3.2
        * @param aRequestStatus         The pointer to the status of the operation 
        *                               that is set by the decoder after it is completed.
        *                               After a complete successful operation, the status 
        *                               is KErrNone.
        * @param aDestinationFrame      Pointer to the visual frame structure that is keeping 
        *                               the destination image data. The client should do the 
        *                               proper allocation of the destination location.
        * @param aNoOfDecodedMBlocks    Reference to the number of decoded macroblocks that is 
        *                               set by the decoder after the decoding is completed.
        * @param aFrameNumber           The frame index in the Jpeg image.
        * @return void
        */
        IMPORT_C void ContinueConvertL( 
                        TRequestStatus* aRequestStatus, 
                        const CVisualFrame* aDestinationFrame, 
                        TInt& aNoOfDecodedMBlocks,
                        TInt aFrameNumber = 0 );

        /**
        * Returns the destination (uncompressed) data formats that are supported by the decoder
        * @since 3.2
        * @return TInt  The supported destination (uncompressed) data formats. 
        *               The value is a combination of the flags defined in 
        *               CVisualFrame::TDataFormat.
        */
        IMPORT_C TInt SupportedFormatsL();

        /**
        * Returns the Extended API features (capabilities) that are supported by the decoder.
        * @since 3.2
        * @return TInt  The supported Extended API features. 
        *               The value is a combination of the flags defined in TDecoderCapabilities.
        */
        IMPORT_C TInt CapabilitiesL();

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aDecoderType       Decoder implementation type: HW or SW.  
        * @param aFs                A reference to a file server session to use.
        * @param aSourceFilename    The name of the Jpeg file to decode.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */        
        IMPORT_C static CExtJpegDecoder* FileNewL( 
                                    const TDecoderType aDecoderType,
                                    RFs& aFs, 
                                    const TDesC& aSourceFilename, 
                                    const TOptions aOptions = EOptionNone );
                  
        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aDecoderType       Decoder implementation type: HW or SW.
        * @param aFs                A reference to a file server session to use.
        * @param aSourceData        The descriptor reference for the Jpeg image data to decode.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */                                            
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    const TDecoderType aDecoderType,
                                    RFs& aFs, 
                                    const TDesC8& aSourceData, 
                                    const TOptions aOptions = EOptionNone );

        /**
        * Creates and initializes CExtJpegDecoder
        * @since 3.2
        * @param aDecoderType       Decoder implementation type: HW or SW.
        * @param aFs                A reference to a file server session to use.
        * @param aSourceData        Pointer to the visual frame structure keeping 
        *                           the Jpeg image data to decode.
        * @param aOptions           Decoder options defined in ICL.
        * @return CExtJpegDecoder*  A pointer to decoder object.
        */                                            
        IMPORT_C static CExtJpegDecoder* DataNewL( 
                                    const TDecoderType aDecoderType, 
                                    RFs& aFs, 
                                    const CVisualFrame* aSourceData, 
                                    const TOptions aOptions = EOptionNone );
                      
        /**
        * Convert
        * @since 3.2
        * @param aRequestStatus     The pointer to the status of the operation 
        *                           that is set by the decoder after it is completed.
        *                           After a complete successful operation, the status 
        *                           is KErrNone.
        * @param aDestination       
        * @param aFrameNumber       The frame index in the Jpeg image.
        * @return void
        */                            
        IMPORT_C void Convert(  TRequestStatus* aRequestStatus, 
                                CFbsBitmap& aDestination, TInt aFrameNumber = 0);
                                
        /**
        * Convert
        * @since 3.2
        * @param aRequestStatus     The pointer to the status of the operation 
        *                           that is set by the decoder after it is completed.
        *                           After a complete successful operation, the status 
        *                           is KErrNone.
        * @param aDestination       Bitmap destination
        * @param aDestinationMask   Bitmap destination mask
        * @param aFrameNumber       The frame index in the Jpeg image.
        * @return void
        */                              
        IMPORT_C void Convert(  TRequestStatus* aRequestStatus, 
                                CFbsBitmap& aDestination, 
                                CFbsBitmap& aDestinationMask, 
                                TInt aFrameNumber = 0 );
                                
        /**
        * Continue convert
        * @since 3.2
        * @param aRequestStatus     The pointer to the status of the operation 
        *                           that is set by the decoder after it is completed.
        *                           After a complete successful operation, the status 
        *                           is KErrNone.
        * @return void
        */
        IMPORT_C void ContinueConvert( TRequestStatus* aRequestStatus );

    private:

        /**
        * C++ default constructor.
        */
        CExtJpegDecoder();
        
        /**
        * Get an uid by version range
        * @since 3.2
        * @param aMinVersion
        * @param aMaxVersion
        * @return TUid
        */
        static TUid GetUidByVersionRangeL( TInt aMinVersion, TInt aMaxVersion );
        
        TBool iIsExtConvert;

    };


// CLASS DECLARATION

/**
* CExtJpegEncoder
* @lib IclExtJpegApi.lib
* @since 3.2
*/
class CExtJpegEncoder : public CJPEGImageFrameEncoder
    {
    public:

        enum TEncoderCapability
            {
            ECapNone = 0x0000,
            ECapStreaming = 0x0001,
            ECapBitmapOverlay = 0x0002,
            ECapImageReplacing = 0x0004,
            ECapBitmapReplacing = 0x0008,
            ECapLosslessRotation = 0x0010,
            ECapLosslessFlipping = 0x0020,
            ECapLosslessMirroring = 0x0040,
            ECapDctEncoding = 0x0080
            };
            
        enum TEncoderOperations
            {
            EEnd = 0x00010000,
            ESupportedFormats = 0x00020000,
            ECapabilities = 0x00040000,
            EReadyForAsync = 0x00080000,
            EConvert = 0x00100000,
            EContinueConvert = 0x00200000,
            EDestVisualFrame = 0x00400000,
            ENewDestData = 0x00800000,
            EDestDataSize = 0x01000000
            };
                 
        enum TEncoderType
            {
            ESwImplementation = 0,
            EHwImplementation
            };                   

    public:
    

        /**
        * Symbian C++ Two-phased constructor.
        */      
        IMPORT_C static CExtJpegEncoder* NewL();
        
        /**
        * Creates and initializes CExtJpegEncoder
        * @since 3.2
        * @param aFs                    A reference to a file server session to use.
        * @param aDestinationFilename   The name of the destination Jpeg file.
        * @param aMIMEType              The Jpeg MIME type for matching the encoder plugin.
        * @param aOptions               Encoder options defined in ICL.
        * @return CExtJpegEncoder*      A pointer to encoder object.
        */
        IMPORT_C static CExtJpegEncoder* FileNewL( 
                                    RFs& aFs, 
                                    const TDesC& aDestinationFilename, 
                                    const TDesC8& aMIMEType, 
                                    const TOptions aOptions = EOptionNone );

        /**
        * Creates and initializes CExtJpegEncoder
        * @param aFs                    A reference to a file server session to use.
        * @param aDestinationFilename   The name of the destination Jpeg file.
        * @param aOptions               Encoder options defined in ICL.
        * @param aImageT                The Jpeg image type.
        * @param aImageSubType          The Jpeg image subtype (Null UID).
        * @param aEncoderUid            The encoder plugin UID.
        * @return CExtJpegEncoder*      A pointer to encoder object.
        */      
        IMPORT_C static CExtJpegEncoder* FileNewL( 
                                    RFs& aFs, 
                                    const TDesC& aDestinationFilename, 
                                    const TOptions aOptions = EOptionNone, 
                                    const TUid aImageType = KNullUid, 
                                    const TUid aImageSubType = KNullUid, 
                                    const TUid aEncoderUid = KNullUid );

        /**
        * Creates and initializes CExtJpegEncoder
        * @param aDestinationData   Pointer reference to the destination 
        *                           Jpeg data location that will be allocated by the encoder.
        * @param aMIMEType          The Jpeg MIME type for matching the encoder plugin.
        * @param aOptions           Encoder options defined in ICL.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */  
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    HBufC8*& aDestinationData,
                                    const TDesC8& aMIMEType,
                                    const TOptions aOptions = EOptionNone);
        /**
        * Creates and initializes CExtJpegEncoder
        * @param aDestinationData   Pointer reference to the destination 
        *                           Jpeg data location that will be allocated by the encoder.
        * @param aOptions           Encoder options defined in ICL.
        * @param aImageType         The Jpeg image type.
        * @param aImageSubType      The Jpeg image subtype (Null UID).
        * @param aEncoderUid        The encoder plugin UID.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */  
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    HBufC8*& aDestinationData,
                                    const TOptions aOptions = EOptionNone,
                                    const TUid aImageType = KNullUid,
                                    const TUid aImageSubType = KNullUid,
                                    const TUid aEncoderUid = KNullUid);
        /**
        * Creates and initializes CExtJpegEncoder
        * @param aDestinationData   Pointer to the visual frame structure keeping the destination 
        *                           Jpeg data allocated with maximum size by the client.
        * @param aMIMEType          The Jpeg MIME type for matching the encoder plugin.
        * @param aOptions           Encoder options defined in ICL.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */  
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    const CVisualFrame* aDestinationData,
                                    const TDesC8& aMIMEType,
                                    const TOptions aOptions = EOptionNone);
        /**
        * Creates and initializes CExtJpegEncoder
        * @param aDestinationData   Pointer to the visual frame structure keeping the destination 
        *                           Jpeg data allocated with maximum size by the client.
        * @param aOptions           Encoder options defined in ICL.
        * @param aImageType         The Jpeg image type.
        * @param aImageSubType      The Jpeg image subtype (Null UID).
        * @param aEncoderUid        The encoder plugin UID.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */  
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    const CVisualFrame* aDestinationData,
                                    const TOptions aOptions = EOptionNone,
                                    const TUid aImageType = KNullUid,
                                    const TUid aImageSubType = KNullUid,
                                    const TUid aEncoderUid = KNullUid);

        /**
        * Destructor.
        */
        IMPORT_C virtual ~CExtJpegEncoder();

        /**
        * Enables the use of streaming feature and retrieves the
        * macroblock dimensions in the Jpeg data. 
        * @since 3.2
        * @param aMacroBlockSize    The macroblock dimensions in the Jpeg 
        *                           image that is set by the encoder.
        * @param aFrameImageData    The pointer to the destination Jpeg image data structure.
        * @return void
        */
        IMPORT_C void SetStreamingL( TSize& aMacroBlockSize, 
                                     const CFrameImageData* aFrameImageData= NULL );

        /**
        * Enables the use of replacing feature, where the given image 
        * is replaced starting from the specified up-left corner point.
        * @since 3.2
        * @param aReplaceImage      The image data that will be replaced.
        * @param aReplacePoint      The up-left corner point of the replacing region.
        * @return void
        */
        IMPORT_C void SetImageReplaceL( const CVisualFrame* aReplaceImage, TPoint aReplacePoint );

        /**
        * Enables the use of replacing feature, where the given bitmap 
        * is replaced starting from the specified up-left corner point.
        * @since 3.2
        * @param aReplaceBitmap     The bitmap that will be replaced.
        * @param aReplacePoint      The up-left corner point of the replacing region.
        * @return void
        */
        IMPORT_C void SetBitmapReplaceL( const CFbsBitmap& aReplaceBitmap, TPoint aReplacePoint );

        /**
        * Enables the use of overlay feature, where the given bitmap
        * is overlayed transparently based on the given alpha value
        * starting from the specified up-left corner point.
        * @since 3.2
        * @param aOverlayBitmap     The bitmap that will be overlayed.
        * @param aAlphaValue        The alpha value for the transparency of the overlayed bitmap.
        * @param aOverlayPoint      The up-left corner point of the overlay region.
        * @return void
        */
        IMPORT_C void SetBitmapOverlayL( const CFbsBitmap& aOverlayBitmap, 
                                         TUint aAlphaValue, TPoint aOverlayPoint );

        /**
        * Enables the use of lossless rotation feature and specifies the rotating degree.
        * @since 3.2
        * @param aDegree    The rotation degree. Can take any values between 1 and 359.
        * @return void
        */
        IMPORT_C void SetLosslessRotationL( TInt aDegree );

        /**
        * Enables the use of lossless flipping feature.
        * @since 3.2
        * @return void
        */
        IMPORT_C void SetLosslessFlippingL();

        /**
        * SEnables the use of lossless mirroring feature.
        * @since 3.2
        * @return void
        */
        IMPORT_C void SetLosslessMirroringL();

        /**
        * Enables the use of DCT encoding feature.
        * @since 3.2
        * @return void
        */        
        IMPORT_C void SetDctEncodingL();

        /**
        * Provides a new visual frame structure for the 
        * destination data replacing any previously delivered ones.
        * All the operations coming after this function call should
        * use the provided structure.
        * @since 3.2
        * @param aDestinationData   The new visual frame structure for the destination data.
        * @return void
        */        
        IMPORT_C void ProvideNewDestDataL( const CVisualFrame* aDestinationData );

        /**
        * Asynchronous function for initiating the encoding. 
        * @since 3.2
        * @param aRequestStatus         The pointer to the status of the operation 
        *                               that is set by the encoder after it is completed.
        *                               After a complete successful operation, the status 
        *                               is KErrNone.
        * @param aSourceFrame           Pointer to the visual frame structure that is keeping 
        *                               the source image data. In streaming case, contains a 
        *                               part of the uncompressed image data at the beginning.
        * @param aNoOfEncodedMBlocks    Reference to the number of encoded macroblocks that is 
        *                               set by the encoder after the encoding is completed.
        * @param aFrameImageData        Pointer to optional frame image data structure defined in ICL.
        * @return void
        */
        IMPORT_C void ConvertL( 
                        TRequestStatus* aRequestStatus, 
                        const CVisualFrame* aSourceFrame, 
                        TInt& aNoOfEncodedMBlocks,
                        const CFrameImageData* aFrameImageData = NULL );

        /**
        * Asynchronous function for initiating one of the iterations of streamed encoding.
        * @since 3.2
        * @param aRequestStatus         The pointer to the status of the operation 
        *                               that is set by the encoder after it is completed.
        *                               After a complete successful operation, the status 
        *                               is KErrNone.
        * @param aSourceFrame           Pointer to the visual frame structure that is keeping 
        *                               the source image data. In streaming case, contains a 
        *                               part of the uncompressed image data at the beginning.
        * @param aNoOfEncodedMBlocks    Reference to the number of encoded macroblocks that is 
        *                               set by the encoder after the encoding is completed.
        * @return
        */
        IMPORT_C void ContinueConvertL( 
                        TRequestStatus* aRequestStatus, 
                        const CVisualFrame* aSourceFrame,
                        TInt& aNoOfEncodedMBlocks );

        /**
        * Returns the source (uncompressed) data formats that are supported by the encoder.
        * @since 3.2
        * @return TInt  The supported source (uncompressed) data formats. 
        *               The value is a combination of the flags defined
        *               in CVisualFrame::TDataFormat.
        */
        IMPORT_C TInt SupportedFormatsL();

        /**
        * Returns the Extended API features (capabilities) that are supported by the encoder.
        * @since 3.2
        * @return TInt  The supported Extended API features. 
        *               The value is a combination of the flags defined 
        *               in TEncoderCapabilities.
        */
        IMPORT_C TInt CapabilitiesL();

        /**
        * Creates and initializes CExtJpegEncoder
        * @since 3.2
        * @param aEncoderType           Encoder implementation type: HW or SW.
        * @param aFs                    A reference to a file server session to use.
        * @param aDestinationFilename   The name of the destination Jpeg file.
        * @param aOptions               Encoder options defined in ICL.
        * @return CExtJpegEncoder*      A pointer to encoder object.
        */        
        IMPORT_C static CExtJpegEncoder* FileNewL( 
                                    const TEncoderType aEncoderType,
                                    RFs& aFs, 
                                    const TDesC& aDestinationFilename, 
                                    const TOptions aOptions = EOptionNone );
                
        /**
        * Creates and initializes CExtJpegEncoder
        * @since 3.2
        * @param aEncoderType       Encoder implementation type: HW or SW.
        * @param aDestinationData   Pointer reference to the destination Jpeg
        *                           data location that will be allocated by the encoder.
        * @param aOptions           Encoder options defined in ICL.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */                                    
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    const TEncoderType aEncoderType,
                                    HBufC8*& aDestinationData, 
                                    const TOptions aOptions = EOptionNone );
        /**
        * Creates and initializes CExtJpegEncoder
        * @since 3.2
        * @param aEncoderType       Encoder implementation type: HW or SW.
        * @param aDestinationData   Pointer to the visual frame structure keeping the 
        *                           destination Jpeg data allocated with maximum size by the client.
        * @param aOptions           Encoder options defined in ICL.
        * @return CExtJpegEncoder*  A pointer to encoder object.
        */                                    
        IMPORT_C static CExtJpegEncoder* DataNewL( 
                                    const TEncoderType aEncoderType, 
                                    const CVisualFrame* aDestinationData, 
                                    const TOptions aOptions = EOptionNone );        
        
        /**
        * Returns the actual destination buffer size
        * @since 3.2
        * @return TInt  The actual destination buffer size required. 
        *               -1 means the codec is not able to determine the required buffer size.
        */                                    
        IMPORT_C TInt GetDestinationDataSizeL();                                    


    private:
        
        /**
        * C++ default constructor.
        */
        CExtJpegEncoder();
        
        /**
        * Get an uid by version range
        * @since 3.2
        * @param aMinVersion
        * @param aMaxVersion
        * @return TUid
        */
        static TUid GetUidByVersionRangeL( TInt aMinVersion, TInt aMaxVersion );
    
    };

#endif  // _ICLEXTJPEGAPI_

// End of File