videoeditorengine/vedengine/videoprocessor/inc/activequeue.h
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "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:
* Ixonos Plc
*
* Description: 
* Data buffering and queuing support definitions, class CActiveQueue.
*
*/


#ifndef     __ACTIVEQUEUE_H__
#define     __ACTIVEQUEUE_H__


//  INCLUDES

#ifndef __E32BASE_H__
#include <e32base.h>
#endif


//  FORWARD DECLARATIONS

class CDataProcessor;
class CActiveQueue;


//#define BLOCK_GUARD_AREA


//  CLASS DEFINITIONS

// Queue block class
class TActiveQueueBlock : public TPtr8
{
    TActiveQueueBlock(TUint8 *aBuf, TInt aMaxLength) : TPtr8(aBuf, aMaxLength) {};
protected:
    friend class CActiveQueue;
    TActiveQueueBlock *iNextBlock; // next block in the allocated block list
    TActiveQueueBlock *iPrevBlock; // prev. block in the allocated block list
    TActiveQueueBlock *iNextList; // next block in the data queue / free list
};

// The queue class
class CActiveQueue : public CBase
{
public: // constants
    enum TErrorCode
    {
        EInternalAssertionFailure = -1000,
        ENoWriter = -1001, 
        ENoReader = -1002,
        EWriteAfterStreamEnd = -1003
    };

public: // interface functions
    // Constructors and destructor
    CActiveQueue(TUint aNumberOfBlocks, TUint aBlockLength);
    ~CActiveQueue();
    void ConstructL();

    // Set/remove reader
    void SetReader(CDataProcessor *aReader, TAny *aUserPointer);
    void RemoveReader();

    // Set/remove writer
    void SetWriter(CDataProcessor *aWriter, TAny *aUserPointer);
    void RemoveWriter();

    void ResetStreamEnd();
    
    // Get the number of free blocks available for new data
    TUint NumFreeBlocks();

    // Get the number of blocks with data queued
    TUint NumDataBlocks();

    // Get a free block for writing data into the queue (writer)
    TPtr8 *GetFreeBlockL(TUint aBlockLength);

    // Add a data block to the queue (writer)
    void WriteBlock(TPtr8 *aBlock);

    // Read a data block from the queue (reader)
    TPtr8 *ReadBlock();

    // Return a read block back to the empty block list (reader)
    void ReturnBlock(TPtr8 *aBlock);

    // Notify that the stream has ended (writer)
    void WriteStreamEnd();

    // Check if the writer has notified that the stream has ended (reader)
    TBool StreamEnded();

    // Testing aid: get total number of blocks
    TUint NumBlocks() { return iNumBlocks; };


private: // Internal methods
    TActiveQueueBlock *AllocateBlockL();
    void FreeBlockL(TActiveQueueBlock *aBlock);
    
private: // Data
    TUint iNewBlockLength; // length of new blocks that are allocated
    TUint iInitialBlocks; // initial number of blocks to allocate
    
    CDataProcessor *iReader; // the reader
    TAny *iReaderUserPointer;
    CDataProcessor *iWriter; // the writer
    TAny *iWriterUserPointer;

    TActiveQueueBlock *iBlocks; // the list of all allocated blocks
    TUint iNumBlocks; // total number of blocks
    TActiveQueueBlock *iFreeList; // the free block list
    TUint iNumFreeBlocks; // number of free blocks
    TActiveQueueBlock *iDataQueueHead; // the data queue head (where blocks are
                                       // read from)
    TActiveQueueBlock *iDataQueueTail; // the data queue tail (where blocks are
                                       // written to
    TUint iNumDataBlocks; // number of data blocks

    TBool iStreamEnd; // has the stream ended?
};


#endif      //  __ACTIVEQUEUE_H__
            
// End of File