videoeditorengine/vedengine/videoprocessor/inc/Parser.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:  
* Definition of an abstract base class for file format parsers.
*
*/



#ifndef __PARSER_H__
#define __PARSER_H__

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

// CONSTANTS
// MACROS
// DATA TYPES
// FUNCTION PROTOTYPES
// FORWARD DECLARATIONS
// CLASS DECLARATION

/**
*  Base class for file format parser
*  ?other_description_lines
*/
class CParser : public CBase
{
	
public: // Constants
	
	enum TErrorCode 
	{
		EInternalAssertionFailure   = -2200,
			EParserNotEnoughData = -2201,
			EParserEndOfStream = -2202,
			EParserBufferTooSmall = -2203,
			EParserUnsupportedFormat = -2204,
			EParserStreamCorrupted = -2205,
			EParserFailure = -2206
	};

	// file format
	enum TFileFormat {
		EFileFormatUnrecognized = 0,
	    EFileFormat3GP,
		EFileFormatMP4
	};
	
	// video format
	enum TVideoFormat {
		EVideoFormatNone = 0,
		EVideoFormatH263Profile0Level10,
		EVideoFormatH263Profile0Level45,        
        EVideoFormatMPEG4,
        EVideoFormatAVCProfileBaseline,
        EVideoFormatAVCProfileMain,
        EVideoFormatAVCProfileExtended 
	};
	
	// audio format
	enum TAudioFormat 
	{
		EAudioFormatNone = 0,            
		EAudioFormatAMR,
		EAudioFormatAAC
	};
	
#ifdef __VIDEOEDIT__
		enum TProcessingMode
		{
			EParseOnly = 1,
				EParseAndDecode,
				EDecodeOnly
		};
#endif
		
public: // Data structures
	
	// common stream parameters
	struct TStreamParameters 
	{
		TBool iHaveVideo;  // is there video in the stream ?
		TBool iHaveAudio;  // is there audio in the stream ?
		TUint iNumDemuxChannels;  // number of demux channels
		TFileFormat iFileFormat;  // file format
		TVideoFormat iVideoFormat;  // video format
		TAudioFormat iAudioFormat;  // audio format 
		
		TUint iAudioFramesInSample; // audio frames per one sample (3GPP)
    
		TUint iVideoWidth;  // width of a video frame
		TUint iVideoHeight;   // height of a video frame
		TInt64 iVideoPicturePeriodNsec;  // one PCF tick period in nanoseconds
		TUint iVideoIntraFrequency;  // intra frame frequency in stream
		
		TUint iStreamLength;  // stream length in milliseconds
		TUint iVideoLength;
		TUint iAudioLength;
		
		TBool iCanSeek;   // TRUE if seeking in file is possible
		
		TUint iStreamSize;  // stream size in bytes
		TUint iStreamBitrate;  // stream average bitrate            
		
		TUint iMaxPacketSize; // The maximum media packet size
		TUint iLogicalChannelNumberVideo; // Logical channel number for video data
		TUint iLogicalChannelNumberAudio; // Logical channel number for audio data
		TUint iReferencePicturesNeeded; // Number of reference pictures
		// the video decoder needs to store.
		TUint iNumScalabilityLayers; // The number of different scalability layers used
		TUint iLayerFrameRates[8];  // Picture rate for each layer
		
		TReal iFrameRate;
		TUint iVideoTimeScale; 
		TUint iAudioTimeScale;
		
	};
		
	public: // New functions
		
        /**
		* Write a block of data to parser.
		* @param aBlock Block to be written.
		*/
		virtual TInt WriteDataBlock(const TDes8& aBlock) = 0;
		
		/**
		* Parses the stream header.
		* @param aStreamParameters Stream parameters        
		*/	
        
        virtual TInt ParseHeaderL(TStreamParameters& aStreamParameters) = 0;
				
        /**
        * Resets the parser to initial state.
        * => If input stream is in a file, rewinds it.
        * => If input is written to parser, all buffered bytes are flushed
        * @param aStreamParameters Stream parameters        
        */
        virtual TInt Reset() = 0; 				        

        /**
        * Gets the number of frames in the current clip
        *
        * @return Number of frames
        */
        inline TInt GetNumberOfFramesInClip() { return iNumberOfFrames; }
        
        virtual	TInt GetNumberOfVideoFrames() = 0; 

        virtual TInt GetNumberOfFrames() = 0;

        /**
        * Seeks to intra frame before given time
        *
        * @param aStartTime Time in microseconds to seek
        * @param aIndex Index of the frame at aStartTime, if known. 0 otherwise
        *
        * @return Number of frames
        */
		virtual	TInt SeekOptimalIntraFrame(TTimeIntervalMicroSeconds aStartTime, TInt aIndex, TBool aFirstTime) = 0; 

        /**
        * Gets the size of video frame at given index
        *
        * @param aIndex Index of the frame
        *
        * @return Size of frame in bytes
        */
        virtual	TInt GetVideoFrameSize(TInt aIndex) = 0;

        /**
        * Gets the timestamp of video frame at given index
        *
        * @param aIndex Index of the frame
        * @param aTimeStamp Output: timestamp in ticks
        *
        * @return Timestamp in milliseconds
        */
        virtual	TInt GetVideoFrameStartTime(TInt aIndex, TInt* aTimeStampInTicks) = 0;

        /**
        * Gets the type of video frame at given index
        *
        * @param aIndex Index of the frame
        *
        * @return Frame type: 1 = INTRA, 0 = INTER
        */
        virtual	TInt8 GetVideoFrameType(TInt aIndex) = 0;			        
        
        /**
        * Gets the start frame index of the current clip                
        *
        * @return Frame index
        */
        inline TInt GetStartFrameIndex() { return iStartFrameIndex; }

        /**
        * From CParser Parser the stream header.
        * @param aAudioFrameSize average frame size of audio frame	
        */
        virtual TInt ParseAudioInfo(TInt& aAudioFrameSize) = 0;

		virtual TInt GetMP4SpecificSize() = 0;  //Added for Mpeg-4 Support 

        virtual TInt GetAudioBitrate(TInt& aBitrate) = 0;

        virtual TInt GetVideoFrameRate(TReal& aFrameRate) = 0;
        
        virtual TInt GetDecoderSpecificInfoSize() = 0;
        
        virtual TInt ReadAVCDecoderSpecificInfo(TDes8& aBuf) = 0;
        
        virtual TInt GetVideoDuration(TInt& aDurationInMs) = 0;


    public:  // Data

        // stream parameters
        TStreamParameters iStreamParameters;
        // ETrue if parsing this clip for the first time
        TBool iFirstTimeClipParsing;
         // number of frames in output clip
        TInt iOutputNumberOfFrames; 

    protected:  // Data

        // current frame number
        TInt iFrameNumber;  
        // number of frames in current clip
        TInt iNumberOfFrames; 
        // index of the first included frame
        TInt iStartFrameIndex;
		
    };
		
#endif      // __PARSER_H__   
		
// End of File