videoeditorengine/h263decoder/inc/VedVolReader.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:  
* Header for VOL header parser.
*
*/



#ifndef __VEDVOLREADER_H__
#define __VEDVOLREADER_H__


//  INCLUDES
#include <e32base.h>
#include <e32std.h>
#include <vedcommon.h>





// DATA TYPES

/**
 * Structure for the Video Object Layer header data
 */ 
struct TVolHeader
    {
    TInt iProfileLevelId;     // Indicates the Level Id (0,1,2,3,4,8 or 9) of the Simple
                              // Profile the Video Object conforms to
    TInt iVoPriority;         // Priority assigned to the Video Object 
                              // a value between 1(lowest)-7(highest).
                              // If not in the bitstream, set to zero
   
    TInt iVoId;               // id of the Video Object 
    TInt iVolId;              // id of the Video Object Layer 
    TInt iRandomAccessibleVol;// set to 1 if all the VOPs in the stream are I-VOP.
    TInt iPixelAspectRatio;   // see MPEG-4 visual spec. pp. 71

    TInt iTimeIncrementResolution;
                              // Resolution to interpret the time_increment 
                              // fields in the VOP headers 

    TInt iLumWidth;           // Frame width of the Y component in pixels 
    TInt iLumHeight;          // Frame height of the Y component in pixels 

    TUint8 iErrorResDisable;  // Flag ON if no resynchronization markers are
                              // used inside frames. 
                              // When OFF it doesn't mean they ARE used.
    TUint8 iDataPartitioned;  // Flag indicating if data partitioning inside 
                              // a VP is used or not.
    TUint8 iReversibleVlc;    // flag indicating the usage of reversible 
                              // VLC codes

    // the following parameters concern the input video signal,
    // see MPEG-4 visual spec. pp. 66-70, and "Note" in viddemux_mpeg.c 
    // Not used in the current implementatnion.
    TInt iVideoFormat;
    TInt iVideoRange;
    TInt iColourPrimaries;    
    TInt iTransferCharacteristics;
    TInt iMatrixCoefficients;

    // the following parameters are used in the Video Buffering Verifier
    // (Annex D) to monitor the input bit buffer, complexity, memory buffer
    // used in the decoding process. The conformance of a stream can be checked
    // using these parameters. 
    // Not used in the current implementatnion. 
    TUint32 iBitRate;
    TUint32 iVbvBufferSize;
    TUint32 iVbvOccupancy;

    HBufC8* iUserData;        // User Data if available
    };
    


// CLASS DECLARATION

/**
 * A class for parsing the Video Object Layer header
 */
class CVedVolReader : public CBase
    {
public:

    /**
     * Two-phased constructor.
     */
    IMPORT_C static CVedVolReader* NewL();

    /**
     * Destructor.
     */
    virtual ~CVedVolReader();
    
    /**
     * Parses given Video Object Layer header
     * @param aData Buffer from where to parse the header
     * @return error code
     */
    IMPORT_C TInt ParseVolHeaderL(TDesC8& aData);
    
    /**
     * Returns the time increment resolution that was read from the VOL header
     * @return time increment resolution
     */    
    IMPORT_C TInt TimeIncrementResolution() const;
    
    /**
     * Returns the width of the video that was read from the VOL header
     * @return width
     */  
    IMPORT_C TInt Width() const;
    
    /**
     * Returns the height of the video that was read from the VOL header
     * @return height
     */  
    IMPORT_C TInt Height() const;
    
    /**
     * Returns the Level Id of the Simple Profile the Video Object conforms to
     * @return profile level Id
     */  
    IMPORT_C TInt ProfileLevelId() const;
    
    /**
     * Returns the bitstream mode of the video
     * @return bitstream mode
     */  
    IMPORT_C TVedVideoBitstreamMode BitstreamMode() const;
    
    /**
     * Returns the size of the VOL header
     * @return size of the header
     */  
    IMPORT_C TInt HeaderSize() const;

private:

    /**
     * Structure for internal buffer of the header sequence
     */
    struct TSeqHeaderBuffer
        {
        TDesC8& iData;           // The actual data of the buffer
        TInt    iGetIndex;       // Index of getting from the buffer 
        TInt    iBitInOctet;	 // Bit index in the buffer
        
        TSeqHeaderBuffer(TDesC8& aData, TInt aGetIndex, TInt aBitInOctet) :
            iData(aData), iGetIndex(aGetIndex), iBitInOctet(aBitInOctet) {}
        };
    
    /**
     * C++ default constructor.
     */
    CVedVolReader();
    
    /**
     * By default Symbian OS constructor is private.
     */
    void ConstructL();
    
    /**
     * Reads requested bits from given buffer
     * @param aBuffer Buffer from where to read the bits
     * @param aNumBits Amount of bits to read
     * @param aFlush Discard the bits that were read
     * @return The bits that were read
     */
    TUint32 ReadSeqHeaderBits(TSeqHeaderBuffer& aBuffer, TInt aNumBits, TBool aFlush);
    
    /**
     * Reads user data from given buffer
     * @param aBuffer Buffer from where to read the user data
     */
    void ReadUserDataL(TSeqHeaderBuffer& aBuffer);
    
    /**
     * Checks what is the bit stream mode the video
     * @param aErd Flag error resilience disable used
     * @param aDp Flag data partitioned used
     * @param aRvlc Flag reversible vlc used
     * @return The bit stream mode
     */
    TVedVideoBitstreamMode CheckBitstreamMode(TUint8 aErd, TUint8 aDp, TUint8 aRvlc);

private:

    // Member variables
    
    static const TInt KMaxUserDataLength;       // The maximum allocated memory for 
                                                // user data (UD). Only this much of the UD
                                                // from the bitstream is stored
                                                
    static const TUint8 KMsbMask[8];            // Mask for extracting the needed bits
    static const TUint8 KLsbMask[9];
    
    TVolHeader iHeader;                         // For storing the header data
    
    TVedVideoBitstreamMode iBitstreamMode;
    TInt iHeaderSize;

    };

#endif // __VEDVOLREADER_H__