--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imageadaptationextensions/iclextjpegapi/src/IclExtJpegApiFrameImplV2.cpp Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,663 @@
+/*
+* 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: Implementation of CVisualFrameImpl
+*
+*/
+
+#include "IclExtJpegApi.h"
+#include "IclExtJpegApiFrameImpl.h"
+
+// ---------------------------------------------------------
+// TFrameFormatExt::Constructor
+// ---------------------------------------------------------
+//
+void TFrameFormatExt::Constructor()
+ {
+ switch ( iFormatCode )
+ {
+ case CVisualFrame::EFormatMonochrome:
+ {
+ iColourSpace = KUidColourSpaceYCbCr;
+ iSampling = KUidSamplingMonochrome;
+ break;
+ }
+ case CVisualFrame::EFormat16bitRGB444:
+ case CVisualFrame::EFormat16BitRGB565:
+ case CVisualFrame::EFormat32BitRGB888:
+ case CVisualFrame::EFormatFbsBitmapColor4K:
+ case CVisualFrame::EFormatFbsBitmapColor64K:
+ case CVisualFrame::EFormatFbsBitmapColor16M:
+ {
+ iColourSpace = KUidColourSpaceRGB;
+ iSampling = KUidSamplingColor444;
+ break;
+ }
+ case CVisualFrame::EFormatYUV420SemiPlanar:
+ case CVisualFrame::EFormatYUV420Interleaved:
+ case CVisualFrame::EFormatYUV420Planar:
+ {
+ iColourSpace = KUidColourSpaceYCbCr;
+ iSampling = KUidSamplingColor420;
+ break;
+ }
+ case CVisualFrame::EFormatYUV422:
+ case CVisualFrame::EFormatYUV422Reversed:
+ case CVisualFrame::EFormatExtYUV422Interleaved:
+ case CVisualFrame::EFormatExtYUV422Planar:
+ {
+ iColourSpace = KUidColourSpaceYCbCr;
+ iSampling = KUidSamplingColor422;
+ break;
+ }
+ case CVisualFrame::EFormatExtYUV444Planar:
+ case CVisualFrame::EFormatYUV444:
+ {
+ iColourSpace = KUidColourSpaceYCbCr;
+ iSampling = KUidSamplingColor444;
+ break;
+ }
+ case CVisualFrame::EFormatJpeg:
+ case CVisualFrame::EFormatExif:
+ case CVisualFrame::EFormatUserDefined:
+ case CVisualFrame::EFormatExtDctCoeff:
+ {
+ iColourSpace = KNullUid;
+ iSampling = KNullUid;
+ break;
+ }
+ default:
+ {
+ iFormatCode = KErrNotFound;
+ iColourSpace = KNullUid;
+ iSampling = KNullUid;
+ }
+ }
+ }
+
+// ----------------------------------------------------------
+// TFrameFormatExt::ColourSpace
+// ----------------------------------------------------------
+//
+TUid TFrameFormatExt::ColourSpace() const
+ {
+ return iColourSpace;
+ }
+
+// ----------------------------------------------------------
+// TFrameFormatExt::Sampling
+// ----------------------------------------------------------
+//
+TUid TFrameFormatExt::Sampling() const
+ {
+ return iSampling;
+ }
+
+// ----------------------------------------------------------
+// TFrameFormatExt::FormatCode
+// ----------------------------------------------------------
+//
+TInt TFrameFormatExt::FormatCode() const
+ {
+ return iFormatCode;
+ }
+
+// ----------------------------------------------------------
+// TFrameFormatExt::ColourSpace
+// ----------------------------------------------------------
+//
+void TFrameFormatExt::SetColourSpace( TUid aColourSpace )
+ {
+ iColourSpace = aColourSpace;
+ }
+
+
+
+/*****************************************************/
+/* Visual Frame Data Structure in Extended ICL API */
+/*****************************************************/
+
+
+// ----------------------------------------------------------
+// TFrameFormatBase* GetFrameFormatL
+// ----------------------------------------------------------
+//
+TFrameFormatBase* GetFrameFormatL( TInt aFrameFormatCode )
+ {
+ TUid formatUid = KNullUid;
+ switch ( aFrameFormatCode )
+ {
+ case CVisualFrame::EFormatMonochrome:
+ {
+ formatUid = KUidFormatYUVMonochrome;
+ break;
+ }
+ case CVisualFrame::EFormat16bitRGB444:
+ {
+ formatUid = KUidFormat16bitRGB444Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormat16BitRGB565:
+ {
+ formatUid = KUidFormat16BitRGB565Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormat32BitRGB888:
+ {
+ formatUid = KUidFormat32BitRGB888Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormatYUV420Interleaved:
+ {
+ formatUid = KUidFormatYUV420Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormatYUV420Planar:
+ {
+ formatUid = KUidFormatYUV420Planar;
+ break;
+ }
+ case CVisualFrame::EFormatYUV422:
+ {
+ formatUid = KUidFormatYUV422Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormatYUV422Reversed:
+ {
+ formatUid = KUidFormatYUV422InterleavedReversed;
+ break;
+ }
+ case CVisualFrame::EFormatYUV444:
+ {
+ formatUid = KUidFormatYUV444Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormatYUV420SemiPlanar:
+ {
+ formatUid = KUidFormatYUV420SemiPlanar;
+ break;
+ }
+ case CVisualFrame::EFormatExtYUV422Interleaved:
+ {
+ formatUid = KUidFormatYYUV422Interleaved;
+ break;
+ }
+ case CVisualFrame::EFormatExtYUV422Planar:
+ {
+ formatUid = KUidFormatYUV422Planar;
+ break;
+ }
+ case CVisualFrame::EFormatExtYUV444Planar:
+ {
+ formatUid = KUidFormatYUV444Planar;
+ break;
+ }
+ case CVisualFrame::EFormatJpeg:
+ case CVisualFrame::EFormatExif:
+ case CVisualFrame::EFormatFbsBitmapColor4K:
+ case CVisualFrame::EFormatFbsBitmapColor64K:
+ case CVisualFrame::EFormatFbsBitmapColor16M:
+ case CVisualFrame::EFormatUserDefined:
+ case CVisualFrame::EFormatExtDctCoeff:
+ {
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ }
+ }
+ TFrameFormatBase* frameFormatBase = NULL;
+ if ( formatUid == KNullUid )
+ {
+ frameFormatBase = new ( ELeave ) TFrameFormatExt( aFrameFormatCode );
+ }
+ else
+ {
+ frameFormatBase = new ( ELeave ) TFrameFormat( formatUid );
+ }
+ return frameFormatBase;
+ }
+
+// ----------------------------------------------------------
+// GetFrameFormat
+// ----------------------------------------------------------
+//
+TInt GetFrameFormat( const TFrameFormatBase& aFrameFormat )
+ {
+ TInt frameFormatCode = KErrNotFound;
+ if ( aFrameFormat.Type() == KUidIclImageFrameFormat )
+ {
+ const TFrameFormat& frameFormat = reinterpret_cast<const TFrameFormat&>( aFrameFormat );
+ switch ( frameFormat.FormatCode().iUid )
+ {
+ case KFormatYUVMonochromeUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatMonochrome;
+ break;
+ }
+ case KFormat16bitRGB444InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormat16bitRGB444;
+ break;
+ }
+ case KFormat16BitRGB565InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormat16BitRGB565;
+ break;
+ }
+ case KFormat32BitRGB888InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormat32BitRGB888;
+ break;
+ }
+ case KFormatYUV420InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV420Interleaved;
+ break;
+ }
+ case KFormatYUV420PlanarUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV420Planar;
+ break;
+ }
+ case KFormatYUV422InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV422;
+ break;
+ }
+ case KFormatYUV422InterleavedReversedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV422Reversed;
+ break;
+ }
+ case KFormatYUV444InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV444;
+ break;
+ }
+ case KFormatYUV420SemiPlanarUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatYUV420SemiPlanar;
+ break;
+ }
+ case KFormatYYUV422InterleavedUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatExtYUV422Interleaved;
+ break;
+ }
+ case KFormatYUV422PlanarUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatExtYUV422Planar;
+ break;
+ }
+ case KFormatYUV444PlanarUidValue:
+ {
+ frameFormatCode = CVisualFrame::EFormatExtYUV444Planar;
+ break;
+ }
+ default:
+ {
+ }
+ }
+ }
+ else if ( aFrameFormat.Type() == KUidExtIclImageFrameFormat )
+ {
+ frameFormatCode = reinterpret_cast<const TFrameFormatExt&>( aFrameFormat ).FormatCode();
+ }
+ return frameFormatCode;
+ }
+
+
+
+// ---------------------------------------------------------
+// CVisualFrameImpl* CVisualFrameImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CVisualFrameImpl* CVisualFrameImpl::NewL(
+ TDes8& aBuffer,
+ const TSize& aDimension,
+ TInt aFrameFormat )
+ {
+
+ TFrameFormatBase* frameFormat = GetFrameFormatL( aFrameFormat );
+
+ CleanupStack::PushL( frameFormat );
+
+ TFrameLayout frameLayout = TFrameLayout( 1 );
+ frameLayout.SetStart( 0, 0 );
+ frameLayout.SetScanLength( 0, aBuffer.MaxLength() );
+ frameLayout.SetLength( 0, aBuffer.MaxLength() );
+ frameLayout.SetCurrentLength( 0, aBuffer.Length() );
+
+ CVisualFrameImpl* self = new ( ELeave ) CVisualFrameImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL( aBuffer, aBuffer.MaxLength(), aDimension, *frameFormat, frameLayout );
+ CleanupStack::Pop( self );
+ CleanupStack::PopAndDestroy( frameFormat );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl* CVisualFrameImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CVisualFrameImpl* CVisualFrameImpl::NewL(
+ RChunk& aChunk,
+ TInt aSize,
+ TInt aMaxSize,
+ TInt aDataOffset,
+ const TSize& aDimension,
+ TInt aFrameFormat )
+ {
+
+ TFrameFormatBase* frameFormat = GetFrameFormatL( aFrameFormat );
+ CleanupStack::PushL( frameFormat );
+
+ TFrameLayout frameLayout = TFrameLayout( 1 );
+
+ frameLayout.SetStart( 0, aDataOffset );
+ frameLayout.SetScanLength( 0, aMaxSize );
+ frameLayout.SetLength( 0, aMaxSize );
+ frameLayout.SetCurrentLength( 0, aSize );
+
+ CVisualFrameImpl* self = new ( ELeave ) CVisualFrameImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL( &aChunk, aMaxSize, aDataOffset, aDimension, *frameFormat, frameLayout );
+ self->iSize = aSize;
+ CleanupStack::Pop( self );
+ CleanupStack::PopAndDestroy( frameFormat );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl* CVisualFrameImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CVisualFrameImpl* CVisualFrameImpl::NewL(
+ TDes8& aBuffer,
+ const TSize& aDimension,
+ TInt aFrameFormat,
+ const CVisualFrame::TFrameLayout& aFrameLayout )
+ {
+ TFrameFormatBase* frameFormat = GetFrameFormatL( aFrameFormat );
+ CleanupStack::PushL( frameFormat );
+
+ TFrameLayout frameLayout = TFrameLayout( aFrameLayout.iNumberOfPlanes );
+
+ for ( TInt i = 0; i < aFrameLayout.iNumberOfPlanes; ++i )
+ {
+ frameLayout.SetStart( i, aFrameLayout.iOffset[i] );
+ frameLayout.SetScanLength( i, aFrameLayout.iScanLineLength[i] );
+ frameLayout.SetLength( i, aFrameLayout.iMaxLength[i] );
+ frameLayout.SetCurrentLength( i, aFrameLayout.iLength[i] );
+ }
+
+ CVisualFrameImpl* self = new ( ELeave ) CVisualFrameImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL( aBuffer, aBuffer.MaxLength(), aDimension, *frameFormat, frameLayout );
+ CleanupStack::Pop( self );
+ CleanupStack::PopAndDestroy( frameFormat );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl* CVisualFrameImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CVisualFrameImpl* CVisualFrameImpl::NewL(
+ RChunk& aChunk,
+ TInt aSize,
+ TInt aMaxSize,
+ const TSize& aDimension,
+ TInt aFrameFormat,
+ const CVisualFrame::TFrameLayout& aFrameLayout )
+ {
+ TFrameFormatBase* frameFormat = GetFrameFormatL( aFrameFormat );
+ CleanupStack::PushL( frameFormat );
+
+ TFrameLayout frameLayout = TFrameLayout( aFrameLayout.iNumberOfPlanes );
+
+ for ( TInt i = 0; i < aFrameLayout.iNumberOfPlanes; ++i )
+ {
+ frameLayout.SetStart( i, aFrameLayout.iOffset[i] );
+ frameLayout.SetScanLength( i, aFrameLayout.iScanLineLength[i] );
+ frameLayout.SetLength( i, aFrameLayout.iMaxLength[i] );
+ frameLayout.SetCurrentLength( i, aFrameLayout.iLength[i] );
+ }
+
+ CVisualFrameImpl* self = new ( ELeave ) CVisualFrameImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL( &aChunk, aMaxSize, aFrameLayout.iOffset[0], aDimension, *frameFormat, frameLayout );
+ self->iSize = aSize;
+ CleanupStack::Pop( self );
+ CleanupStack::PopAndDestroy( frameFormat );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl* CVisualFrameImpl::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CVisualFrameImpl* CVisualFrameImpl::NewL( const CImageFrame* aImageFrame )
+ {
+ if ( ( aImageFrame->FrameFormat().Type() != KUidIclImageFrameFormat ) &&
+ ( aImageFrame->FrameFormat().Type() != KUidExtIclImageFrameFormat ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ CVisualFrameImpl* self = new ( ELeave ) CVisualFrameImpl();
+ CleanupStack::PushL( self );
+ if ( aImageFrame->IsChunk() )
+ {
+ self->ConstructL(
+ &const_cast<CImageFrame*>( aImageFrame )->DataChunk(),
+ aImageFrame->MaxBufferSize(),
+ aImageFrame->DataOffset(),
+ aImageFrame->FrameSizeInPixels(),
+ aImageFrame->FrameFormat(),
+ aImageFrame->FrameLayout() );
+ const TFrameLayout& frameLayout = reinterpret_cast<const TFrameLayout&>( aImageFrame->FrameLayout() );
+ self->iSize = frameLayout.CurrentLength( frameLayout.Planes() - 1 ) + frameLayout.Start( frameLayout.Planes() - 1 ) - frameLayout.Start( 0 );
+ }
+ else
+ {
+ self->ConstructL(
+ const_cast<CImageFrame*>( aImageFrame )->Data(),
+ aImageFrame->MaxBufferSize(),
+ aImageFrame->FrameSizeInPixels(),
+ aImageFrame->FrameFormat(),
+ aImageFrame->FrameLayout() );
+ }
+
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::GetImageFrameL
+// ---------------------------------------------------------
+//
+CImageFrame* CVisualFrameImpl::GetImageFrameL()
+ {
+ if ( FrameFormat().Type() != KUidIclImageFrameFormat )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ if ( IsChunk() )
+ {
+ return CImageFrame::NewL(
+ &DataChunk(),
+ MaxBufferSize(),
+ DataOffset(),
+ FrameSizeInPixels(),
+ FrameFormat(),
+ FrameLayout() );
+ }
+ else
+ {
+ return CImageFrame::NewL(
+ Data(),
+ MaxBufferSize(),
+ FrameSizeInPixels(),
+ FrameFormat(),
+ FrameLayout() );
+ }
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::DataChunkL
+// ---------------------------------------------------------
+//
+const RChunk& CVisualFrameImpl::DataChunkL() const
+ {
+ if ( !IsChunk() )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return const_cast<CVisualFrameImpl*>( this )->DataChunk();
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::DataPtrL
+// ---------------------------------------------------------
+//
+TPtr8 CVisualFrameImpl::DataPtrL() const
+ {
+ if ( IsChunk() )
+ {
+ User::Leave( KErrNotFound );
+ }
+ TDes8& des = const_cast<CVisualFrameImpl*>( this )->Data();
+ return TPtr8( const_cast<TUint8*>( des.Ptr() ), des.Length(), des.MaxLength() );
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::Dimension
+// ---------------------------------------------------------
+//
+TSize CVisualFrameImpl::Dimension() const
+ {
+ return FrameSizeInPixels();
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::FrameFormat2
+// ---------------------------------------------------------
+//
+TInt CVisualFrameImpl::FrameFormat2() const
+ {
+ return GetFrameFormat( FrameFormat() );
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::DataOffset
+// ---------------------------------------------------------
+//
+TInt CVisualFrameImpl::DataOffset() const
+ {
+ return CImageFrame::DataOffset();
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::Size
+// ---------------------------------------------------------
+//
+TInt CVisualFrameImpl::Size() const
+ {
+ if ( !IsChunk() )
+ {
+ return Data().Length();
+ }
+ return iSize;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::SetSizeL
+// ---------------------------------------------------------
+//
+void CVisualFrameImpl::SetSizeL( TInt aSize )
+ {
+ if ( ( aSize < 0 ) || ( aSize > MaxSize() ) )
+ {
+ User::Leave( KErrArgument );
+ }
+ if ( !IsChunk() )
+ {
+ Data().SetLength( aSize );
+ }
+ iSize = aSize;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::MaxSize
+// ---------------------------------------------------------
+//
+TInt CVisualFrameImpl::MaxSize() const
+ {
+ return MaxBufferSize();
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::DataContainer
+// ---------------------------------------------------------
+//
+TInt CVisualFrameImpl::DataContainer() const
+ {
+ if ( IsChunk() )
+ {
+ return CVisualFrame::EInChunk;
+ }
+ return CVisualFrame::EInDescriptor;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::FrameLayout2
+// ---------------------------------------------------------
+//
+const CVisualFrame::TFrameLayout& CVisualFrameImpl::FrameLayout2() const
+ {
+ const TFrameLayout& frameLayout = reinterpret_cast<const TFrameLayout&>( FrameLayout() );
+ CVisualFrame::TFrameLayout& frameLayout2 = const_cast<CVisualFrameImpl*>( this )->iFrameLayout2;
+ frameLayout2.iNumberOfPlanes = frameLayout.Planes();
+ for (TInt i = 0; i < iFrameLayout2.iNumberOfPlanes; ++i )
+ {
+ frameLayout2.iOffset[i] = frameLayout.Start( i );
+ frameLayout2.iScanLineLength[i] = frameLayout.ScanLength( i );
+ frameLayout2.iLength[i] = frameLayout.CurrentLength( i );
+ frameLayout2.iMaxLength[i] = frameLayout.Length( i );
+ }
+ return iFrameLayout2;
+ }
+
+// ---------------------------------------------------------
+// CVisualFrameImpl::~CVisualFrameImpl
+// Destructor
+// ---------------------------------------------------------
+//
+CVisualFrameImpl::~CVisualFrameImpl()
+ {
+ }
+
+// End of File