vtprotocolplugins/VideoSource/src/CVSMMFDataBuffer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* 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:  Video Source subsystem.
*
*/


// INCLUDE FILES

#include <ecam.h>
#include <e32debug.h>
#include "CVSMMFDataBuffer.h"

// MACROS

#ifdef _DEBUG
#    define __IF_DEBUG(t) {RDebug::t;}
#else
#    define __IF_DEBUG(t)
#endif

// ============================ CVSMMFDataBuffer ===============================

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::NewL
// -----------------------------------------------------------------------------
//
EXPORT_C CVSMMFDataBuffer* CVSMMFDataBuffer::NewL()
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL() >>"), RThread().Id().operator TUint()));
    CVSMMFDataBuffer* self = new ( ELeave ) CVSMMFDataBuffer;
    CleanupStack::PushL(self);
    self->ConstructL( KMMFDataBufferDefaultBufferSize );
    CleanupStack::Pop(); // self
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL <<"), RThread().Id().operator TUint()));
    return self;
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::NewL
// -----------------------------------------------------------------------------
//
EXPORT_C CVSMMFDataBuffer* CVSMMFDataBuffer::NewL( TInt aMaxBufferSize )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL() >>"), RThread().Id().operator TUint()));
    CVSMMFDataBuffer* self = new ( ELeave ) CVSMMFDataBuffer;
    CleanupStack::PushL(self);
    self->ConstructL( aMaxBufferSize );
    CleanupStack::Pop(); // self
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NewL <<"), RThread().Id().operator TUint()));
    return self;
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::~CVSMMFDataBuffer
// -----------------------------------------------------------------------------
//
EXPORT_C CVSMMFDataBuffer::~CVSMMFDataBuffer()
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::~CVSMMFDataBuffer() >>"), RThread().Id().operator TUint()));
    delete[] iData;
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::~CVSMMFDataBuffer() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::ReAllocBufferL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::ReAllocBufferL( TInt aMaxBufferSize )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ReAllocBufferL() >>"), RThread().Id().operator TUint()));
    if ( !iIsBufferSet )
        {
        TUint8* tmp = new (ELeave) TUint8[aMaxBufferSize];
        delete[] iData;
        iData = tmp;
        iPtr.Set( iData, 0, aMaxBufferSize );
        iMaxBufferSize = aMaxBufferSize;
        }
    else
        {
        User::Leave( KErrNotSupported );
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ReAllocBufferL() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::NeedsReset
// -----------------------------------------------------------------------------
//
TBool CVSMMFDataBuffer::NeedsReset() const
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::NeedsReset() ><"), RThread().Id().operator TUint()));
    return iNeedsReset;
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetNeedsReset
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetNeedsReset( TBool aNeedsReset )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetNeedsReset() >>"), RThread().Id().operator TUint()));
    iNeedsReset = aNeedsReset;
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetNeedsReset() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::Reset
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::Reset()
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Reset() >>"), RThread().Id().operator TUint()));
    iPtr.Zero();
    SetNeedsReset( EFalse );
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Reset() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::Data
// -----------------------------------------------------------------------------
//
TDes8& CVSMMFDataBuffer::Data()
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() >>"), RThread().Id().operator TUint()));
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() <<"), RThread().Id().operator TUint()));
    return iPtr;
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::Data
// -----------------------------------------------------------------------------
//
const TDesC8& CVSMMFDataBuffer::Data() const
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() >>"), RThread().Id().operator TUint()));
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Data() <<"), RThread().Id().operator TUint()));
    return iPtr;
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetStatus
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetStatus( TBufferStatus aStatus )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetStatus() >>"), RThread().Id().operator TUint()));
    CMMFBuffer::SetStatus( aStatus );
    if ( iStatus == EBeingFilled )
        {
        Reset();
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetStatus() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetRequestSizeL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetRequestSizeL( TInt aSize )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetRequestSizeL() >>"), RThread().Id().operator TUint()));
    if ( aSize < 0 )
        {
        User::Leave( KErrUnderflow );
        }
    else if ( aSize > iPtr.MaxLength() )
        {
        User::Leave( KErrOverflow );
        }
    else
        {
        iRequestSize = aSize;
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetRequestSizeL() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::BufferSize
// -----------------------------------------------------------------------------
//
TUint CVSMMFDataBuffer::BufferSize() const
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::BufferSize() >>"), RThread().Id().operator TUint()));
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::BufferSize() <<"), RThread().Id().operator TUint()));
    return iPtr.Length();
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetPosition
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetPosition( TUint aPosition )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetPosition() >>"), RThread().Id().operator TUint()));
    if ( aPosition <= (TUint)iPtr.Length() )
        {
        iPosition = aPosition;
        }
    else
        {
        iPosition = (TUint)iPtr.Length();   // Tried to position beyond end of
                                            // data
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetPosition() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetFrameBufferL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetFrameBufferL( MFrameBuffer* aFrameBuffer )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() >>"), RThread().Id().operator TUint()));
    iFrameBuffer = aFrameBuffer;
    //Buffer is valid
    iIsBufferSet = ETrue;
    if ( aFrameBuffer == NULL )
        {
        iPtr.Set( iData, 0, iMaxBufferSize );
        }
    else
        {
        Reset();
        TPtrC8 ptr( *iFrameBuffer->DataL( 0 ) );
        iPtr.Set((TUint8*)ptr.Ptr(), ptr.Size(), ptr.Size());
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetFrameBufferL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetFrameBufferL( MCameraBuffer* aCameraBuffer )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() >>"), RThread().Id().operator TUint()));
    iCameraBuffer = aCameraBuffer;
    //Buffer is valid
    iIsBufferSet = ETrue;
    if ( aCameraBuffer == NULL )
        {
        iPtr.Set( iData, 0, iMaxBufferSize );
        }
    else
        {
        Reset();
        // Take the latest frame data from buffer should be always 0,
        // but if buffer contains more than 1 frame could be something else
        TPtrC8 ptr( *iCameraBuffer->DataL( iCameraBuffer->NumFrames() - 1 ) );
        iPtr.Set((TUint8*)ptr.Ptr(), ptr.Size(), ptr.Size());
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetFrameBuffer() <<"), RThread().Id().operator TUint()));
    }



// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::ReleaseL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::ReleaseL()
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Release() >>"), RThread().Id().operator TUint()));
    if( iFrameBuffer )
        {
        iFrameBuffer->Release();
        SetFrameBufferL( (MFrameBuffer*)NULL );
        }
    else if( iCameraBuffer )
    	{
    	iCameraBuffer->Release();
        SetFrameBufferL( (MCameraBuffer*)NULL );
    	}
    else
        {
        if ( iPtr.Ptr() != iData )
            {
            iPtr.Set( iData, 0, iMaxBufferSize );
            }
        if( NeedsReset() )
            {
            Reset();
            }
        }

    //Buffer is no longer valid
    iIsBufferSet = EFalse;
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::Release() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::SetBufferOffset
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::SetBufferOffset( TInt aOffset )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset() >>"), RThread().Id().operator TUint()));
    if ( !iIsBufferSet )
        {
        __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset(): Length = %d, Offset = %d"), RThread().Id().operator TUint(), iPtr.Length(), aOffset));
        iPtr.Set( iData + aOffset, iPtr.Length() - aOffset, iMaxBufferSize );
        }
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::SetBufferOffset() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::CVSMMFDataBuffer
// -----------------------------------------------------------------------------
//
CVSMMFDataBuffer::CVSMMFDataBuffer() :
    CMMFDataBuffer( KUidMmfDataBuffer ), iPtr(0,0,0), iIsBufferSet(EFalse)
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::CVSMMFDataBuffer() >>"), RThread().Id().operator TUint()));
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::CVSMMFDataBuffer() <<"), RThread().Id().operator TUint()));
    }

// -----------------------------------------------------------------------------
// CVSMMFDataBuffer::ConstructL
// -----------------------------------------------------------------------------
//
void CVSMMFDataBuffer::ConstructL( TInt aMaxBufferSize )
    {
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ConstructL() >>"), RThread().Id().operator TUint()));
    iData = new (ELeave) TUint8[aMaxBufferSize];
    iPtr.Set( iData, 0, aMaxBufferSize );
    iMaxBufferSize = aMaxBufferSize;
    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSMMFDataBuffer::ConstructL() <<"), RThread().Id().operator TUint()));
    }

//  End of File