mmplugins/lib3gp/impl/inc/mp4lib.h
changeset 0 40261b775718
child 23 545d349d14da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/lib3gp/impl/inc/mp4lib.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1548 @@
+// Copyright (c) 2006-2009 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:
+//
+
+
+
+/**
+ @file
+ @publishedPartner
+ @deprecated
+*/
+
+#ifndef _MP4LIB_H
+#define _MP4LIB_H
+
+#define MP4Handle mp4_i32*
+
+#include <f32file.h>
+#include <caf/caf.h>
+#include <3gplibrary/mp4config.h>
+
+/**
+Provides async parse read observer.
+*/
+class M3GPMP4LibAsyncObserver
+{
+   public:
+
+        /**
+        Informs the client about asyncronous parse audio frames operation completion.
+        
+        @param aError     		Error code.
+        @param aAudioSize		Size of the returned audio frames (in bytes).
+        @param aTimeStamp 		Audio frame presentation time in milliseconds from the
+                   				beginning of the audio sequence.
+        @param aReturnedFrames	Number of frames returned, or 0 if not known.
+        @param aTimestamp2		Audio frame presentation time in timescale from the
+                   				beginning of the audio sequence
+        
+        */
+        virtual void M3GPMP4LibAudioFramesAvailable(MP4Err aError,
+        											mp4_u32 aAudioSize, 
+        											mp4_u32 aTimeStamp, 
+        											mp4_u32 aReturnedFrames,
+ 					                              	mp4_u32 aTimestamp2) = 0;    
+
+        /**
+        Informs the client about asyncronous parse video frame operation completion.
+
+        @param aError     	Error code.
+        @param aFrameSize   Size of the returned frame (in bytes).
+        @param aTimeStamp   Video frame presentation time in milliseconds from the 
+        					beginning of the video sequence
+        @param aKeyFrame	Returns MP4TRUE if the current frame is a key frame (intra), 
+        					otherwise the value is MP4FALSE
+        @param aTimestamp2	Video frame presentation time in timescale from the beginning 
+        					of the video sequence
+        
+        */
+        virtual void M3GPMP4LibVideoFrameAvailable(MP4Err aError,
+        										   mp4_u32 aFrameSize, 
+        										   mp4_u32 aTimeStamp, 
+        										   mp4_bool aKeyFrame, 
+        										   mp4_u32 aTimestamp2) = 0;    
+};
+
+/**  
+This class provides async temporary file deleting observer.
+*/
+class M3GPMP4LibAsyncTempFileRemoverObserver
+{
+   public:
+
+        /**
+        Informs the client about unused temporary file that can be deleted.
+        @param tempFileName		Name of the temporary file that can be deleted.
+                     			Ownership of the file name memory buffer is transferred.
+        */
+        virtual void M3GPMP4LibDeleteTempFileName( MP4FileName tempFileName ) = 0;    
+
+};
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+Error codes returned by the library
+*/
+enum
+	{
+	/** Success */
+  	MP4_OK,   
+  	/** Generic error */                 
+	MP4_ERROR,   
+	/** Library can't allocate memory */              
+	MP4_OUT_OF_MEMORY,   
+	/** MP4 library needs more data before the
+       requested information can be returned */      
+	MP4_NOT_AVAILABLE,  
+	/** The library has been opened with the input in a file */       
+	MP4_FILE_MODE, 
+	/** The input is not streamable */            
+	MP4_NOT_STREAMABLE,
+	/** Frame of requested type is not available */        
+	MP4_NO_REQUESTED_FRAME, 
+	/** Requested frame doesn't fit into the given buffer */   
+	MP4_BUFFER_TOO_SMALL,
+	/** No more video frames left */      
+	MP4_END_OF_VIDEO,
+	/** Can't seek to requested position */          
+	MP4_CANT_SEEK,  
+	/** Error in file handling */           
+	MP4_FILE_ERROR,        
+	/** Input stream is invalid */    
+	MP4_INVALID_INPUT_STREAM, 
+	/** Frame doesn't exist (previous frame was last) */ 
+	MP4_NO_FRAME,   
+	/** Illegal type */           
+	MP4_INVALID_TYPE, 
+	/** Timescale has not been set */         
+	MP4_TIMESCALE_NOT_SET,
+	/** Error writing metadata */     
+	MP4_METADATA_ERROR,
+	/** No video in input stream */        
+	MP4_NO_VIDEO, 
+	/** No audio in input stream */             
+	MP4_NO_AUDIO,  
+	/** Output buffer has not been initialized for buffer writing */             
+	MP4_NO_OUTPUT_BUFFER, 
+	/** Not enough space in output buffer to write to */      
+	MP4_OUTPUT_BUFFER_TOO_SMALL,
+	/** No UDTA data found */	
+	MP4_UDTA_NOT_FOUND		 
+	};
+
+
+/** 
+Possible data source types
+*/
+enum
+	{
+	/** Data is read from an RFile64 handle */
+	MP4_SOURCE_RFILE,   
+	/** Data is read via the CAF */        
+	MP4_SOURCE_CAF,             
+	};
+
+/** 
+Possible input/output values for audio/video type
+*/
+
+/** No audio or video */
+#define MP4_TYPE_NONE              0x0000
+/** Video Type. MPEG-4 video (MPEG-4 Part 2) - Simple and Advance Simple Profiles */
+#define MP4_TYPE_MPEG4_VIDEO       0x0001
+/** Audio Type.  MPEG-4 audio (MPEG-4 Part 3) */
+#define MP4_TYPE_MPEG4_AUDIO       0x0002
+/** Video Type. H263 Profile 0  */
+#define MP4_TYPE_H263_PROFILE_0    0x0004
+/** Video Type. H263 Profile 3  */
+#define MP4_TYPE_H263_PROFILE_3    0x0008
+/** Audio Type. AMR NB */
+#define MP4_TYPE_AMR_NB            0x0010
+/** Audio Type. AMR WB */
+#define MP4_TYPE_AMR_WB            0x0020
+/** Type not supported */
+#define MP4_TYPE_UNSUPPORTED       0x0040
+/** AVC baseline (MPEG-4 Part 10) */
+#define MP4_TYPE_AVC_PROFILE_BASELINE      0x0080
+/** AVC main (MPEG-4 Part 10) */
+#define MP4_TYPE_AVC_PROFILE_MAIN          0x0100
+/** AVC extended (MPEG-4 Part 10) */
+#define MP4_TYPE_AVC_PROFILE_EXTENDED      0x0200
+/** QCELP 13K additions */
+#define MP4_TYPE_QCELP_13K         0x0400
+/** AVC high (MPEG-4 Part 10) */
+#define MP4_TYPE_AVC_PROFILE_HIGH      0x0800
+
+/**
+Flags used by composer
+*/
+/** No special setup */
+#define MP4_FLAG_NONE              0x0000
+/** Meta data is placed at end of file */
+#define MP4_FLAG_METADATALAST      0x0001
+/** Collect metadata in files instead of storing it in memory */
+#define MP4_FLAG_LONGCLIP          0x0002
+/** Generate a 3G2 File instead of a 3GP File */
+#define MP4_FLAG_GENERATE_3G2      0x0004
+/** Generate a MP4 File instead of a 3GP File */
+#define MP4_FLAG_GENERATE_MP4      0x0008
+/** Use large output buffers for writing */
+#define MP4_FLAG_LARGEFILEBUFFER   0x0010
+
+
+/** Size of buf in MP4HandleStruct must be at least 128 bytes */
+#define TMPBUFSIZE 128  
+/** Duration of one AMR frame is 20 ms */         
+#define AUDIO_FRAME_DURATION 20  
+
+#define MP4FALSE (mp4_bool)0
+#define MP4TRUE  (mp4_bool)1
+
+/** 
+Possible locations for user data atom (UDTA)
+*/
+/** No user data */
+#define MP4_UDTA_NONE         0x0000
+/** User data resides within the Movie Box */
+#define MP4_UDTA_MOOV         0x0001
+/** User data resides within the Track Box for video */
+#define MP4_UDTA_VIDEOTRAK    0x0002
+/** User data resides within the Track Box for audio */
+#define MP4_UDTA_AUDIOTRAK    0x0004
+
+/**
+Initializes the MP4 composing operation. The instance handle of the library is 
+set by the function.
+ 
+The possible values of type parameter are
+
+     MP4_TYPE_H263_PROFILE_0
+     MP4_TYPE_H263_PROFILE_3
+     MP4_TYPE_MPEG4_VIDEO
+     MP4_TYPE_AMR_NB
+     MP4_TYPE_AMR_WB
+     MP4_TYPE_MPEG4_AUDIO
+     MP4_TYPE_NONE
+     MP4_TYPE_AVC_PROFILE_BASELINE 
+     MP4_TYPE_AVC_PROFILE_MAIN
+     MP4_TYPE_AVC_PROFILE_EXTENDED
+	 MP4_TYPE_AVC_PROFILE_HIGH
+     MP4_TYPE_QCELP_13K
+
+In addition, any combination of one video and one audio type are
+possible. For example
+
+     MP4_TYPE_H263_PROFILE_0 | MP4_TYPE_AMR_NB
+
+The output file is placed in the current working directory if no path is
+specified. The type of filename is dependent on the architecture. When
+compiling in Symbian OS, this is a unicode string.
+
+ 
+@param handle		MP4 library handle
+@param filename	Name of the output MP4 file
+@param type		Type of the output file
+ 
+@return	MP4_OK             Success
+ 			MP4_ERROR          Generic error
+ 			MP4_FILE_ERROR     Error opening file
+ 			MP4_OUT_OF_MEMORY  Out of memory
+*/
+extern IMPORT_C MP4Err MP4ComposeOpen(MP4Handle *handle, MP4FileName filename, mp4_u32 type);
+
+/**
+This function initializes the MP4 composing operation. The instance
+handle of the library is set by the function.
+ 
+The possible values of type parameter are
+ 
+ 	 MP4_TYPE_H263_PROFILE_0
+     MP4_TYPE_H263_PROFILE_3
+     MP4_TYPE_MPEG4_VIDEO
+     MP4_TYPE_AMR_NB
+     MP4_TYPE_AMR_WB
+     MP4_TYPE_MPEG4_AUDIO
+     MP4_TYPE_NONE
+     MP4_TYPE_AVC_PROFILE_BASELINE 
+     MP4_TYPE_AVC_PROFILE_MAIN
+     MP4_TYPE_AVC_PROFILE_EXTENDED
+	 MP4_TYPE_AVC_PROFILE_HIGH
+     MP4_TYPE_QCELP_13K
+     
+In addition, any combination of one video and one audio type are possible. For example
+ 
+     MP4_TYPE_H263_PROFILE_0 | MP4_TYPE_AMR_NB
+ 
+The output is placed in the buffer given as argument. 
+Size of composed data is in composedSize variable.
+ 
+@param handle	       MP4 library handle
+@param type           Type of the output file
+@param composeBuffer  Buffer to write to.
+@param composedSize   Size of composed data.
+ 
+@return 
+   MP4_OK                 Success
+   MP4_ERROR              Generic error
+   MP4_FILE_ERROR         Error opening file
+   MP4_OUT_OF_MEMORY      Out of memory
+   MP4_NO_OUTPUT_BUFFER   No composed buffer 
+*/
+extern IMPORT_C MP4Err MP4ComposeOpenToBuffer(MP4Handle *handle, mp4_u32 type, mp4_u8* composeBuffer, mp4_u32 *composedSize);
+
+/** 
+This function initializes the MP4 composing operation to existing file handle. The instance
+handle of the library is set by the function.
+ 
+NOTE: MP4_FLAG_METADATALAST must be defined in MP4ComposeSetFlags if MP4ComposeOpenFileHandle is used!
+ 
+The possible values of type parameter are
+ 
+     MP4_TYPE_H263_PROFILE_0
+     MP4_TYPE_H263_PROFILE_3
+     MP4_TYPE_MPEG4_VIDEO
+     MP4_TYPE_AMR_NB
+     MP4_TYPE_AMR_WB
+     MP4_TYPE_MPEG4_AUDIO
+     MP4_TYPE_NONE
+     MP4_TYPE_AVC_PROFILE_BASELINE 
+     MP4_TYPE_AVC_PROFILE_MAIN
+     MP4_TYPE_AVC_PROFILE_EXTENDED
+	 MP4_TYPE_AVC_PROFILE_HIGH
+     MP4_TYPE_QCELP_13K
+ 
+In addition, any combination of one video and one audio type are possible. For example
+ 
+      MP4_TYPE_H263_PROFILE_0 | MP4_TYPE_AMR_NB
+ 
+The output file is placed in the current working directory if no path is
+specified. The type of filename is dependent on the architecture. When
+compiling in Symbian OS, this is a unicode string.
+ 
+@param handle             MP4 library handle
+@param composedfile       File handle to output file
+@param metadataTempDrive  If MP4ComposeSetFlags() is configured to use temporary files for metadata
+                          (MP4_FLAG_LONGCLIP) this is way to tell library which drive to use for 
+                          temporary files.
+@param type               Type of the output file
+ 
+@return     MP4_OK             Success
+            MP4_ERROR          Generic error
+            MP4_FILE_ERROR     Error opening file
+            MP4_OUT_OF_MEMORY  Out of memory
+*/
+extern IMPORT_C MP4Err MP4ComposeOpenFileHandle(MP4Handle *handle, RFile *composedfile, TDriveNumber metadataTempDrive, mp4_u32 type);
+
+/** 
+This function initializes the MP4 composing operation to existing file handle. The instance
+handle of the library is set by the function.
+ 
+NOTE: MP4_FLAG_METADATALAST must be defined in MP4ComposeSetFlags if MP4ComposeOpenFileHandle is used!
+ 
+The possible values of type parameter are
+ 
+  	 MP4_TYPE_H263_PROFILE_0
+     MP4_TYPE_H263_PROFILE_3
+     MP4_TYPE_MPEG4_VIDEO
+     MP4_TYPE_AMR_NB
+     MP4_TYPE_AMR_WB
+     MP4_TYPE_MPEG4_AUDIO
+     MP4_TYPE_NONE
+     MP4_TYPE_AVC_PROFILE_BASELINE 
+     MP4_TYPE_AVC_PROFILE_MAIN
+     MP4_TYPE_AVC_PROFILE_EXTENDED
+	 MP4_TYPE_AVC_PROFILE_HIGH
+     MP4_TYPE_QCELP_13K
+ 
+In addition, any combination of one video and one audio type are possible. For example
+ 
+      MP4_TYPE_H263_PROFILE_0 | MP4_TYPE_AMR_NB
+ 
+The output file is placed in the current working directory if no path is
+specified. The type of filename is dependent on the architecture. When
+compiling in Symbian OS, this is a unicode string.
+ 
+@param handle             MP4 library handle
+@param composedfile       File handle to output file
+@param metadataTempDrive  If MP4ComposeSetFlags() is configured to use temporary files for metadata
+						  (MP4_FLAG_LONGCLIP) this is way to tell library which drive to use for 
+  						  temporary files.
+@param type               Type of the output file
+ 
+@return		MP4_OK             Success
+ 			MP4_ERROR          Generic error
+ 			MP4_FILE_ERROR     Error opening file
+ 			MP4_OUT_OF_MEMORY  Out of memory
+*/
+extern IMPORT_C MP4Err MP4ComposeOpenFileHandle64(MP4Handle *handle, RFile64 *composedfile, TDriveNumber metadataTempDrive, mp4_u32 type);
+
+/**
+This function closes the MP4 composing operation. It frees the memory
+allocated by the library instance and closes the output MP4 file.
+ 
+It is necessary to call this function before the output file is
+guaranteed to be a valid MP4 file even though the file may exist prior to
+the call.
+ 
+The library handle is not valid after this call.
+ 
+@param handle   MP4 library handle
+ 
+@return		MP4_OK              Success
+ 			MP4_ERROR           Generic error
+ 			MP4_METADATA_ERROR  Metadata could not be written
+*/
+extern IMPORT_C MP4Err MP4ComposeClose(MP4Handle handle);
+
+/**
+This function is used to inform the MP4 library about the video data. The
+data given to the library is inserted into the MP4 file headers.
+ 
+The parameter timescale indicates the timescale of the video data
+to be inserted. Timescale tells how many units of time pass in one second.
+ 
+Note: Timescale should be chosen so that the duration of each sample is
+an integer. Timescale should also be chosen so that the duration
+of the presentation fits into 32 bits.
+ 
+@param handle   	MP4 library handle
+@param timescale    Timescale of video
+@param width        Video width
+@param height       Video height
+@param maxbitrate   Maximum bitrate of video
+@param avgbitrate   Average bitrate of video
+ 
+@return		MP4_OK       Success
+ 			MP4_ERROR    Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeAddVideoDescription(MP4Handle handle, mp4_u32 timescale, mp4_u16 width, mp4_u16 height, mp4_u32 maxbitrate, mp4_u32 avgbitrate);
+
+/**
+This function is used to inform the MP4 library about the audio data. The
+data given to the library is inserted into the MP4 file headers.
+ 
+The parameter timescale indicates the timescale of the audio data
+to be inserted. Timescale tells how many units of time pass in one second.
+ 
+Note: timescale must be smaller than 65536.
+ 
+Note: audioFramesPerSample and modeSet are needed only for AMR audio.
+    
+@param handle                MP4 library handle
+@param timescale             Timescale of audio
+@param audioFramesPerSample  AMR frames per sample
+@param modeSet               AMR mode set
+ 
+@return		MP4_OK     Success
+ 			MP4_ERROR  Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeAddAudioDescription(MP4Handle handle, mp4_u32 timescale, mp4_u8 audioFramesPerSample, mp4_u16 modeSet);
+
+/**
+This function writes one video frame to the MP4 composer library.
+ 
+The frames must be inserted in causal order. Because the library doesn't
+analyze the video bitstream, the frames can't be retrieved from the
+resulting MP4 file correctly if they are not in proper order.
+ 
+The data is available in the MP4 output file only after calling
+MP4ComposeClose. MP4ComposeClose is called exactly once when all audio
+and video data has been inserted into the library.
+ 
+@param handle       MP4 library handle
+@param buffer       Video frame data
+@param framesize    Size of the video frame in bytes
+@param duration     Duration of video frame (in timescale,
+                 	see MP4ComposeAddVideoDescription)
+@param keyframe     Flag to indicate whether this frame is a keyframe
+ 
+@return		MP4_OK					Success
+ 			MP4_ERROR				Generic error
+ 			MP4_TIMESCALE_NOT_SET	Timescale has not been set
+*/
+extern IMPORT_C MP4Err MP4ComposeWriteVideoFrame(MP4Handle handle, mp4_u8 *buffer, mp4_u32 framesize, mp4_u32 duration, mp4_bool keyframe);
+
+/**
+This function writes audio frames to the MP4 composer library. The data is 
+available in the MP4 output file only after calling
+MP4ComposeClose. MP4ComposeClose is called exactly once when all audio
+and video data has been insrted into the library.
+ 
+For MPEG audio:
+ 
+This function writes one MPEG audio frame to the MP4 composer library.
+ 
+Note: numberofframes is meaningless with MPEG audio since only one frame
+can be added with one call.
+ 
+For other audio types:
+ 
+This function writes a number of audio frames to the MP4 composer library. 
+All audio frames inserted with one function call will be placed inside
+one audio sample in the resulting file.
+ 
+Note: Once this function is called with a certain numberofframes
+parameter, it can't be changed. This is a limitation of the MP4 file
+format. Only the last call can have a different number of frames if
+their number is less than numberofframes.
+ 
+@param handle          MP4 library handle
+@param buffer          Audio data
+@param bytestowrite    Number of bytes of audio data in buffer
+@param numberofframes  Number of frames to write
+@param duration        Duration of audio frames (in timescale,
+	                   see MP4ComposeAddAudioDescription)
+ 
+@return		MP4_OK             		Success
+ 			MP4_ERROR				Generic error
+ 			MP4_TIMESCALE_NOT_SET	Timescale has not been set
+*/
+extern IMPORT_C MP4Err MP4ComposeWriteAudioFrames(MP4Handle handle, mp4_u8 *buffer, mp4_u32 bytestowrite, mp4_u32 numberofframes, mp4_u32 duration);
+
+/**
+This function writes MPEG-4 or AVC video DecoderSpecificInfo data into the appropriate atom.
+
+If the video type is MPEG-4 the DecoderSpecificInfo will be written into the esds atom. If the
+video type is AVC (any profile) the DecoderSpecificInfo will be written into the avcC atom.
+
+Note: This function needs to be called only when MPEG-4 or AVC video is used.
+ 
+@param handle         MP4 library handle
+@param info           Buffer containing DecoderSpecificInfo
+@param infosize       Size of info in bytes
+ 
+@return		MP4_OK		Success
+ 			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeWriteVideoDecoderSpecificInfo(MP4Handle handle, mp4_u8 *info, mp4_u32 infosize);
+
+/**
+This function writes MPEG audio DecoderSpecificInfo data into esds atom.
+ 
+Note: This function needs to be called only when MPEG audio is used.
+ 
+@param handle         MP4 library handle
+@param info           Buffer containing DecoderSpecificInfo
+@param infosize       Size of info in bytes
+ 
+@return		MP4_OK     Success
+ 			MP4_ERROR  Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeWriteAudioDecoderSpecificInfo(MP4Handle handle, mp4_u8 *info, mp4_u32 infosize);
+
+/**
+This function allows settings flags that modify the behaviour
+of the library. Use binary OR to specify several flags.
+ 
+The following flags can be used:
+ 
+MP4_FLAG_NONE            No special setup.
+ 
+MP4_FLAG_METADATALAST    Write metadata last in the file without tmpfile.
+                         Default is to write the metadata in the
+                         beginning of the file.
+                          
+MP4_FLAG_LONGCLIP        Collect metadata in files instead of collecting
+                         it in memory if the amount is large. Only usable
+                         in Symbian OS.
+ 
+MP4_FLAG_GENERATE_3G2    Generate a 3G2 File instead of a 3GP File.
+                         If not set, then 3GP file is generated.
+                         Generation of 3G2 file may be automatically set 
+                         during composition, based on the selection 
+                         of 3GPP2 specific codecs.
+ 
+MP4_FLAG_GENERATE_MP4    Generate a MP4 File instead of a 3GP File.
+                         If not set, then 3GP file is generated.
+                         Generation may be automatically set to 3GP
+                         if codecs selected do not support MP4.
+ 
+MP4_FLAG_LARGEFILEBUFFER Use larger output buffers in file writing.
+                         Non MP4_ARCH_WIN32 compilations only.
+ 
+Note: This function should be called after MP4ComposeOpen before
+      any other MP4Compose functions.
+ 
+Note: If MP4ComposeOpenFileHandle is used instead of MP4ComposeOpen the MP4_FLAG_METADATALAST must be defined.
+ 
+@param handle         MP4 library handle
+@param flags          Flags to enable
+ 
+@return		MP4_OK              Success
+ 			MP4_ERROR  			Generic error
+ 			MP4_OUT_OF_MEMORY	Out of Memory
+*/
+extern IMPORT_C MP4Err MP4ComposeSetFlags(MP4Handle handle, mp4_u32 flags);
+
+/**
+This function initializes the MP4 parsing operation. The instance handle
+of the library is set by the function.
+
+The filename parameter is used to specify the type of the input. If the
+parameter is non-NULL, it is assumed to be the filename of the input MP4
+file. If the parameter is NULL, the library expects the input MP4 data to
+be inserted by subsequent calls of MP4ParseWriteData.
+ 
+@param handle     MP4 library handle
+@param filename   Name of the input MP4 file or NULL if the data is coming from
+                  stream
+ 
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_OUT_OF_MEMORY  Out of memory
+			MP4_FILE_ERROR     Error opening file
+*/
+extern IMPORT_C MP4Err MP4ParseOpen(MP4Handle *handle, MP4FileName filename);
+
+/**
+This function initializes the MP4 parsing operation. The instance handle
+of the library is set by the function.
+ 
+The RFile *inputfile parameter is pointer to valid file handle.
+Library expects that file has been opened and will be closed outside of library.
+ 
+@param handle     MP4 library handle
+@param inputfile  File handle to be parsed.
+           
+@return     MP4_OK             Success
+            MP4_ERROR          Generic error
+            MP4_OUT_OF_MEMORY  Out of memory
+            MP4_FILE_ERROR;    Error accessing file
+*/
+extern IMPORT_C MP4Err MP4ParseOpenFileHandle(MP4Handle *handle, RFile *inputfile );
+
+/**
+This function initializes the MP4 parsing operation. The instance handle
+of the library is set by the function.
+ 
+The RFile64 *inputfile parameter is pointer to valid file handle.
+Library expects that file has been opened and will be closed outside of library.
+ 
+@param handle     MP4 library handle
+@param inputfile  File handle to be parsed.
+           
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_OUT_OF_MEMORY  Out of memory
+			MP4_FILE_ERROR;    Error accessing file
+*/
+extern IMPORT_C MP4Err MP4ParseOpenFileHandle64(MP4Handle *handle, RFile64 *inputfile );
+
+/**
+This function initializes the MP4 parsing operation. The instance handle
+of the library is set by the function.
+ 
+The ContentAccess::CData *inputfile parameter is pointer to valid CAF object.
+Library expects that file has been opened and will be closed outside of library.
+ 
+@param handle     MP4 library handle
+@param inputfile  CAF data source handle to be parsed.
+           
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_OUT_OF_MEMORY  Out of memory
+			MP4_FILE_ERROR;    Error accessing file
+*/
+extern IMPORT_C MP4Err MP4ParseOpenCAF(MP4Handle *handle, ContentAccess::CData *inputfile );
+
+/**
+This function closes the MP4 parsing operation. It frees the resources
+allocated by the library instance.
+
+The library handle is not valid after this call.
+ 
+@param handle     MP4 library handle
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseClose(MP4Handle handle);
+
+/**
+This function returns parameters describing the video stream. It can be
+called after enough data has been inserted into the library so that MP4
+headers containing the information can be read. If there is not enough
+data, those functions return MP4_NOT_AVAILABLE and more data needs to be
+inserted into the library by MP4ParseWriteData.
+ 
+The framerate parameter refers to the frame rate of the original video
+material.
+ 
+The videotype parameter can be one of the following:
+  MP4_TYPE_MPEG4_VIDEO
+  MP4_TYPE_H263_PROFILE_0
+  MP4_TYPE_H263_PROFILE_3
+  MP4_TYPE_AVC_PROFILE_BASELINE 
+  MP4_TYPE_AVC_PROFILE_MAIN
+  MP4_TYPE_AVC_PROFILE_EXTENDED
+  MP4_TYPE_AVC_PROFILE_HIGH
+ 
+Note: For timescale parameter, NULL can be specified if the caller
+      doesn't need the value.
+ 
+@param handle       MP4 library handle
+@param videolength  Duration of video in milliseconds
+@param framerate    Frame rate of video (in Hz)
+@param videotype    Type of video stream
+@param videowidth   Width of video image measured in pixels
+@param videoheight  Height of video image measured in pixels
+@param timescale    Timescale of video track
+
+@return		MP4_OK             		  Success
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the
+    			                      requested information can be returned
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_NO_VIDEO              Input doesn't contain video track
+*/
+extern IMPORT_C MP4Err MP4ParseRequestVideoDescription(MP4Handle handle, mp4_u32 *videolength, mp4_double *framerate, mp4_u32 *videotype, mp4_u32 *videowidth, mp4_u32 *videoheight, mp4_u32 *timescale);
+
+/**
+This function returns parameters describing the audio stream. It can be
+called after enough data has been inserted into the library so that MP4
+headers containing the information can be read.
+ 
+Note: framespersample parameter is set only when AMR type audio is used.
+ 
+Note: For timescale parameter, NULL can be specified if the caller
+      doesn't need the value.
+ 
+@param handle                    MP4 library handle
+@param audiolength               Duration of audio in milliseconds
+@param audiotype                 Type of audio
+@param framespersample           Number of audio frames in each sample
+@param timescale                 Timescale of audio track
+@param averagebitrate            Average bitrate of audio
+ 
+@return		MP4_OK            		  Success
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the
+                        			  requested information can be returned
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_NO_AUDIO              Input doesn't contain audio track
+*/
+extern IMPORT_C MP4Err MP4ParseRequestAudioDescription(MP4Handle handle, mp4_u32 *audiolength, mp4_u32 *audiotype, mp4_u8 *framespersample, mp4_u32 *timescale, mp4_u32 *averagebitrate);
+
+/**
+This function returns parameters describing the contents of the MP4
+file. It can be called after enough data has been inserted into the
+library so that MP4 headers containing the information can be read.
+ 
+@param handle                 MP4 library handle
+@param streamsize             Length of the stream in bytes
+@param streamaveragebitrate   Average bitrate of the stream in bps
+
+@return		MP4_OK					  Success
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the
+    			                      requested information can be returned
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseRequestStreamDescription(MP4Handle handle, mp4_u32 *streamsize, mp4_u32 *streamaveragebitrate);
+
+/**
+This function inserts MP4 data to the MP4 library.
+ 
+It is necessary to call this function only if the input filename has not
+been given with MP4ParseOpen. Several functions can return
+MP4_NOT_AVAILABLE if the library doesn't have enough data to return the
+information that the caller requests. In that case, more data needs to be
+inserted to the library before calling those functions again.
+ 
+This function makes a copy of the data inserted into the library so the
+caller can use buffer for other purposes. If the function returns
+MP4_OUT_OF_MEMORY, the buffer contents have not been copied into the
+library and the caller needs to reduce the buffer size before calling
+again.
+ 
+If bytestowrite argument is zero, it indicates that there would be no more 
+data to feed via this function. Such a function call MUST be done if a 
+complete 3GP/MP4 file is to be written to the library's internal memory. The
+buffer argument may be inputted as NULL in such a case.
+ 
+@param handle         MP4 library handle
+@param buffer         Data to be written
+@param bytestowrite   Size of buffer in bytes
+ 
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_OUT_OF_MEMORY  Library can't allocate enough memory for the data
+*/
+extern IMPORT_C MP4Err MP4ParseWriteData(MP4Handle handle, mp4_u8 *buffer, mp4_u32 bytestowrite);
+
+/**
+This function returns the number of bytes that the library instance has
+in its allocated buffers.
+ 
+The function is only valid when the filename is not provided when opening
+the library. Zero is returned in bytes when in file mode.
+ 
+@see MP4ParseWriteData.
+ 
+@param handle   MP4 library handle
+@param bytes    Number of allocated bytes in the library
+ 
+@return		MP4_OK         Success
+			MP4_ERROR      Generic error
+			MP4_FILE_MODE  The library has been opened with the input in a file
+*/
+extern IMPORT_C MP4Err MP4ParseGetBufferedBytes(MP4Handle handle, mp4_u32 *bytes);
+
+/**
+This function returns the type of the next audio/video frame in the
+stream. The type can be one of the following:
+ 
+MP4_TYPE_MPEG4_VIDEO
+MP4_TYPE_MPEG4_AUDIO
+MP4_TYPE_H263_PROFILE_0
+MP4_TYPE_H263_PROFILE_3
+MP4_TYPE_AMR_NB
+MP4_TYPE_AMR_WB
+MP4_TYPE_AVC_PROFILE_BASELINE 
+MP4_TYPE_AVC_PROFILE_MAIN
+MP4_TYPE_AVC_PROFILE_EXTENDED
+MP4_TYPE_AVC_PROFILE_HIGH
+MP4_TYPE_QCELP_13K
+ 
+The function is only valid when the input is streamable.
+ 
+When reading audio/video from an MP4 container in streaming mode, the
+samples must be read from the container in the same order as they were
+inserted in it. This function determines the type of the next sample and
+based on this information the user can call either MP4ParseReadVideoFrame
+or MP4ParseReadAudioFrames to fetch more data.
+ 
+@param handle   MP4 library handle
+@param type     Type of the next frame
+
+@return		MP4_OK             		  Success
+			MP4_ERROR                 Generic error
+			MP4_NOT_STREAMABLE        The input is not streamable
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the
+			                          requested information can be returned
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_NO_FRAME              Frame doesn't exist (previous frame was last)
+*/
+extern IMPORT_C MP4Err MP4ParseNextFrameType(MP4Handle handle, mp4_u32 *type);
+
+/**
+This function returns the size of the next frame of type type in bytes.
+The frame type can be one of the following:
+ 
+MP4_TYPE_MPEG4_VIDEO
+MP4_TYPE_MPEG4_AUDIO
+MP4_TYPE_H263_PROFILE_0
+MP4_TYPE_H263_PROFILE_3
+MP4_TYPE_AMR_NB
+MP4_TYPE_AMR_WB
+MP4_TYPE_AVC_PROFILE_BASELINE 
+MP4_TYPE_AVC_PROFILE_MAIN
+MP4_TYPE_AVC_PROFILE_EXTENDED
+MP4_TYPE_AVC_PROFILE_HIGH
+MP4_TYPE_QCELP_13K
+ 
+@param handle     MP4 library handle
+@param type       Type of the frame
+@param framesize  Size of the requested frame in bytes
+ 
+@return		MP4_OK		              Success
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+           				              frames can be returned
+			MP4_NO_REQUESTED_FRAME    Frame of requested type is not available
+			MP4_INVALID_TYPE          Illegal type
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+ 
+*/
+extern IMPORT_C MP4Err MP4ParseNextFrameSize(MP4Handle handle, mp4_u32 type, mp4_u32 *framesize);
+
+/**
+This function reads the next video frame from the MP4 file/stream and
+returns it to the caller.
+ 
+Note: Next frame depends on the position in the input MP4 file.
+MP4ParseSeek can be used to change the current position in the MP4 file.
+ 
+If the function returns MP4_NOT_AVAILABLE, the caller needs to call
+MP4ParseWriteData to insert more data before calling again.
+ 
+framesize is returned even if buffer was too small to contain the data.
+ 
+Note: Specify NULL as timestamp2 if not interested in this parameter.
+ 
+@param handle       MP4 library handle
+@param buffer       Video frame is returned here
+@param buffersize   Size of the user allocated buffer (in bytes)
+@param framesize    Size of the frame that was returned (in bytes)
+@param timestamp    Video frame presentation time in milliseconds from the
+             		beginning of the video sequence
+@param keyframe     Has a value of MP4TRUE if current frame is a keyframe
+             		(intra) or MP4FALSE otherwise
+@param timestamp2   Video frame presentation time in timescale from the
+             		beginning of the video sequence
+ 
+@return		MP4_OK             		  Success
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+     			                      frame can be returned
+			MP4_BUFFER_TOO_SMALL      Requested frame doesn't fit into the given buffer
+			MP4_NO_FRAME              Frame doesn't exist (previous frame was last)
+			MP4_ERROR                 Generic error
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseReadVideoFrame(MP4Handle handle, mp4_u8 *buffer, mp4_u32 buffersize, mp4_u32 *framesize, mp4_u32 *timestamp, mp4_bool *keyframe, mp4_u32 *timestamp2);
+
+/**
+This function reads DecoderSpecificInfo data from MPEG-4 or AVC metadata and
+returns it to the caller.
+
+If the video type is MPEG-4 the DecoderSpecificInfo from the esds atom will be
+returned. If the video type is AVC (any profile) the DecoderSpecificInfo from the
+avcC atom will be returned.
+
+decspecinfosize is set even if buffer is too small to contain the data.
+The function can be called with buffersize 0 to query the size of
+DecoderSpecificInfo.
+ 
+Note: DecoderSpecificInfo is specific to MPEG-4 and AVC video. Therefore,
+	  only MPEG-4 or AVC video streams contain this information.
+ 
+@param handle           MP4 library handle
+@param buffer           DecoderSpecificInfo is returned here
+@param buffersize       Size of the user allocated buffer (in bytes)
+@param decspecinfosize  Size of DecoderSpecificInfo is returned here
+ 
+@return		MP4_OK             		  Success
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+        			                  frames can be returned
+			MP4_BUFFER_TOO_SMALL      Requested data doesn't fit into the given buffer
+			MP4_ERROR                 Generic error
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseReadVideoDecoderSpecificInfo(MP4Handle handle, mp4_u8 *buffer, mp4_u32 buffersize, mp4_u32 *decspecinfosize);
+
+/**
+This function reads the audio frames that are stored in the current
+audio sample from the MP4 file/stream and returns them to the caller.
+ 
+Note: Next frame depends on the position in the input MP4 file.
+      MP4ParseSeek can be used to change the current position in the
+      MP4 file.
+ 
+If the function returns MP4_NOT_AVAILABLE, the caller needs to call
+MP4ParseWriteData to insert more data before calling again.
+ 
+audiosize is returned even if buffer was too small to contain the data.
+ 
+Note: returnedframes may differ from the correct value when accessing
+      the last audio sample.
+ 
+Note: Specify NULL as timestamp2 if not interested in this parameter.
+ 
+@param handle           MP4 library handle
+@param buffer           Audio frames are returned here
+@param buffersize       Size of the user allocated buffer (in bytes)
+@param audiosize        Size of the returned audio frames (in bytes)
+@param timestamp        Audio frame presentation time in milliseconds from the
+ 		                beginning of the audio sequence
+@param returnedframes   Number of frames returned, or 0 if not known
+@param timestamp2       Audio frame presentation time in timescale from the
+ 		                beginning of the audio sequence
+ 
+@return		MP4_OK					  Success
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+           				              frames can be returned
+			MP4_BUFFER_TOO_SMALL      Requested frames don't fit into the given buffer
+			MP4_ERROR                 Generic error
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_NO_FRAME              No more frames available
+*/
+extern IMPORT_C MP4Err MP4ParseReadAudioFrames(MP4Handle handle, mp4_u8 *buffer, mp4_u32 buffersize, mp4_u32 *audiosize, mp4_u32 *timestamp, mp4_u32 *returnedframes, mp4_u32 *timestamp2);
+
+/**
+This function reads DecoderSpecificInfo data from MP4 metadata and
+returns it to the caller.
+ 
+decspecinfosize is set even if buffer is too small to contain the data.
+The function can be called with buffersize 0 to query the size of
+DecoderSpecificInfo.
+ 
+Note: This function can be used for both MPEG-4 audio and AMR.
+ 
+@param handle           MP4 library handle
+@param buffer           DecoderSpecificInfo is returned here
+@param buffersize       Size of the user allocated buffer (in bytes)
+@param decspecinfosize  Size of DecoderSpecificInfo is returned here
+ 
+@return		MP4_OK             Success
+			MP4_NOT_AVAILABLE  MP4 library needs more data before the requested
+                          		frames can be returned
+			MP4_BUFFER_TOO_SMALL  Requested data doesn't fit into the given buffer
+			MP4_ERROR          Generic error
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseReadAudioDecoderSpecificInfo(MP4Handle handle, mp4_u8 *buffer, mp4_u32 buffersize, mp4_u32 *decspecinfosize);
+
+/**
+Return the timestamp of the next video frame. This only works if the
+input MP4 data is in a file.
+ 
+The function can be used to find out which frames have been coded to
+optimize the input frame selection if video frame rate needs to be
+modified.
+ 
+When this function call returns MP4_END_OF_VIDEO, there are no more video
+frames left in the MP4 file and the timestamp returned with the previous
+call was the timestamp of the last video frame.
+ 
+Note: User must call MP4ParseSeek() to seek to the correct position
+      after calls of this function. Otherwise the current position is
+      undetermined.
+ 
+Note: Specify NULL as timestamp2 if this value is not needed.
+ 
+@param handle      MP4 library handle
+@param timestamp   Timestamp in milliseconds is returned here
+@param timestamp2  Timestamp in timescale is returned here
+ 
+@return		MP4_OK 		              Success
+			MP4_END_OF_VIDEO          No more video frames left
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the
+          				                requested information can be returned
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseGetNextVideoTimestamp(MP4Handle handle, mp4_u32 *timestamp, mp4_u32 *timestamp2);
+
+/**
+This function determines whether the input MP4 stream is streamable,
+i.e. the media data is arranged in such a manner that playback can be
+started without downloading the entire stream.
+ 
+@param handle   MP4 library handle
+ 
+@return		MP4_OK                    The file is streamable
+			MP4_NOT_STREAMABLE        The file is not streamable
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+        			                  information can be returned
+			MP4_ERROR                 Generic error
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseIsStreamable(MP4Handle handle);
+
+/**
+This function seeks to the position specified by position parameter in
+the input MP4 file. The function can be called only if the input MP4 data
+is in a file and the file name has been specified with MP4ParseOpen
+function call.
+ 
+The position is considered to be from the start of the presentation time
+line in the MP4 file. Thus audio and video positions can't be given
+separately.
+ 
+The function will set current audio and video positions in the following
+manner:
+ 
+If there is only audio in the file, the current position will be set to
+the audio frame at or just before the given position.
+ 
+If there is only video in the file and keyframe is MP4FALSE, the current
+position will be set to the video frame at or just before the given
+position. If keyframe is set to MP4TRUE, the current position will be set
+to the first keyframe at or before current position.
+ 
+If there are both audio and video in the file, video is first positioned
+as explained above and then audio is seeked to the closest position in
+relation to video.
+ 
+@param handle          MP4 library handle
+@param position        Position to seek to in milliseconds in the MP4
+                	   presentation time line
+@param audioPosition   Position of audio after seek (in milliseconds)
+@param videoPosition   Position of video after seek (in milliseconds)
+@param keyframe        If set to MP4TRUE, the 1st video keyframe before given
+                	   point will be seeked to. If set to MP4FALSE, the first
+                	   video frame before given point will be seeked to.
+ 
+@return		MP4_OK         Success
+			MP4_ERROR      Generic error
+			MP4_CANT_SEEK  Can't seek to requested position
+ 
+*/
+extern IMPORT_C MP4Err MP4ParseSeek(MP4Handle handle, mp4_u32 position, mp4_u32 *audioPosition, mp4_u32 *videoPosition, mp4_bool keyframe);
+
+/**
+This function determines whether the next frame of type type is
+available.
+ 
+The frame type can be one of the following:
+ 
+MP4_TYPE_MPEG4_VIDEO
+MP4_TYPE_MPEG4_AUDIO
+MP4_TYPE_H263_PROFILE_0
+MP4_TYPE_H263_PROFILE_3
+MP4_TYPE_AMR_NB
+MP4_TYPE_AMR_WB
+MP4_TYPE_AVC_PROFILE_BASELINE 
+MP4_TYPE_AVC_PROFILE_MAIN
+MP4_TYPE_AVC_PROFILE_EXTENDED
+MP4_TYPE_AVC_PROFILE_HIGH
+MP4_TYPE_QCELP_13K
+ 
+@param handle     MP4 library handle
+@param type       Type of the frame
+ 
+@return		MP4_OK                    Frame is available
+			MP4_ERROR                 Generic error
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+    			                      frames can be returned
+			MP4_NO_REQUESTED_FRAME    Frame of requested type is not available
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+*/
+extern IMPORT_C MP4Err MP4ParseIsFrameAvailable(MP4Handle handle, mp4_u32 type);
+
+/**
+Return the largest position in a file that has been accessed or the latest accessed 
+absolute byte location of the stream.
+ 
+Note: The function returns a valid position after one audio or video
+      sample has been read.
+ 
+@param handle     MP4 library handle
+@param position   Result is returned here
+ 
+@return		MP4_OK		Success 
+*/
+extern IMPORT_C MP4Err MP4ParseGetLastPosition(MP4Handle handle, mp4_u32 *position);
+
+/**
+Return the largest position in a file that has been accessed or the latest accessed 
+absolute byte location of the stream.
+ 
+Note: The function returns a valid position after one audio or video
+      sample has been read.
+ 
+@param handle     MP4 library handle
+@param position   Result is returned here
+ 
+@return		MP4_OK		Success 
+*/
+extern IMPORT_C MP4Err MP4ParseGetLastPosition64(MP4Handle handle, mp4_u64 *position);
+
+/**
+Return the number of video frames.
+ 
+@param handle			MP4 library handle
+@param numberOfFrames   Result is returned here
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetNumberOfVideoFrames(MP4Handle handle, mp4_u32 *numberOfFrames);
+
+/**
+Return video frame size.
+ 
+@param handle           MP4 library handle
+@param index            Index of video frame
+@param frameSize        Result is returned here
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetVideoFrameSize(MP4Handle handle, mp4_u32 index, mp4_u32 *frameSize);
+
+/**
+Return video frame start time.
+ 
+@param handle           MP4 library handle
+@param index            Index of video frame
+@param timestamp        Result is returned here
+@param timestampms      Result in milliseconds
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetVideoFrameStartTime(MP4Handle handle, mp4_u32 index, mp4_u32 *timestamp, mp4_u32 *timestampms);
+
+/**
+Return video frame type.
+ 
+@param handle           MP4 library handle
+@param index            Index of video frame
+@param frametype        Result is returned here
+ 
+@return		MP4_OK 		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetVideoFrameType(MP4Handle handle, mp4_u32 index, mp4_bool *frametype);
+
+/**
+Return the video sample entry index of the next video frame to be read.
+ 
+The smallest index value is 1.
+ 
+@param handle     MP4 library handle
+@param videosampleentryindex   Visual SampleEntry index of the next video frame to be read.
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetVideoSampleEntryIndex(MP4Handle handle, mp4_u32 *videosampleentryindex);
+
+/**
+Return the audio sample entry index of the next audio frame to be read.
+ 
+The smallest index value is 1.
+ 
+@param handle     MP4 library handle
+@param audiosampleentryindex   Visual SampleEntry index of the next audio frame to be read.
+ 
+@return		MP4_OK		Success
+			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetAudioSampleEntryIndex(MP4Handle handle, mp4_u32 *audiosampleentryindex);
+
+/**
+ This function sets the storage mode of QCELP 13K
+ qcelpStorageMode = 0  ...QCELP will be registered using QCELPSampleEntry Box (Default)
+ qcelpStorageMode = 1  ...QCELP will be registered using MP4AudioDescription Box 
+ 
+ Note: This function needs to be called only when QCLEP 13K is used and when it is going to 
+       be stored registered using the MP4AudioDescription Box. 
+ 
+ @param handle         	   MP4 library handle
+ @param qcelpStorageMode   Decoder configuration registration mode of QCELP 13K Codec
+ 
+ @return	MP4_OK		Success
+ 			MP4_ERROR	Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeSetQCELPStorageMode(MP4Handle handle, mp4_u8 qcelpStorageMode);
+
+/**
+Return the decoder configuration registration mode of QCELP 13K Codec.
+ 
+ qcelpStorageMode = 0        QCELP is registered using QCELPSampleEntry Box (Default)
+ qcelpStorageMode = 1        QCELP is registered using MP4AudioDescription Box
+ 
+@param handle     MP4 library handle
+@param qcelpStorageMode   Decoder configuration registration mode of QCELP 13K Codec
+ 
+@return		MP4_OK		Success
+			MP4_ERROR  	Generic error 
+*/
+extern IMPORT_C MP4Err MP4ParseGetQCELPStorageMode(MP4Handle handle, mp4_u8 *qcelpStorageMode);
+
+/**
+This function gets the frame infoparameters from star index to number of elements in array from that index,
+properties obtained are startTime, frameType and frameSize.  
+ 
+Important Note:--- The number of elements allocated in the array should be equal to the sizeofarray
+ 
+ 
+@param apihandle     MP4 library handle
+@param startindex    Index from where to start getting information for the array
+@param sizeofarray   number of elements that exist in the allocated frame array
+@param aFrameInfoArray Array of Structures of frame parameters 
+ 
+
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_NO_OUTPUT_BUFFER Output buffer pointer uninitialized
+*/
+extern IMPORT_C MP4Err MP4GetVideoFrameProperties(MP4Handle apihandle,mp4_u32 startindex,mp4_u32 sizeofarray,TFrameInfoParameters* aFrameInfoArray);
+
+/**
+ This function sets properties of composed video clip.
+ 	 
+ Setup details in TVideoClipProperties struct:
+ 
+       mp4_u32 iH263Level        level of H.263
+ 
+ @param apihandle              MP4 library handle
+ @param aVideoClipProperties   Setup info struct.
+ 
+ @return	MP4_OK             Success
+ 			MP4_ERROR          Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeSetVideoClipProperties(MP4Handle apihandle, const TVideoClipProperties& aVideoClipProperties);
+
+/**
+This function gets properties of parsed video clip.
+
+Returned details in TVideoClipProperties struct:
+ 
+    mp4_u32 iH263Level        level of H.263
+ 
+@param apihandle     		MP4 library handle
+@param aVideoClipProperties Filled info struct.
+ 
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+*/
+extern IMPORT_C MP4Err MP4ParseGetVideoClipProperties(MP4Handle apihandle, TVideoClipProperties& aVideoClipProperties);
+
+/**
+Retrieve an atom of given type from user data atom (UDTA) to the given buffer.
+ 
+Note: on return parameters contain following information:
+	udtaLocation   Hash of all locations in file that contain UDTA atom.
+                   MP4_UDTA_NONE | MP4_UDTA_MOOV | MP4_UDTA_VIDEOTRAK | MP4_UDTA_AUDIOTRAK
+	buffer         Buffer containing asked atom.
+	bufferSize     Size of atom written in buffer. If buffer is too small for atom variable contains needed size.
+	atomIndex      Count of same subatom type in this UDTA. Starts from 0 (zero) index.
+
+@param handle         MP4 library handle
+@param udtaLocation   Location of UDTA atom inside file.
+@param udtaAtomType   Type of atom to be read from UDTA.
+   		                Hex value of 4 chars representing atom type defined in standard.
+       		            For example: 0x7469746c //'titl' - title for the media atom
+                                0x61757468 //'auth' - author of the media atom
+                                0x676e7265 //'gnre' - genre (category and style) of the media atom  
+@param buffer         Buffer to write atom to.
+@param bufferSize     Size of given buffer.
+@param atomIndex      Index of atom if UDTA contains multiple subatoms of same asked udtaAtomType.
+ 
+@return		MP4_OK             			   Success
+			MP4_ERROR                      Generic error 
+			MP4_OUTPUT_BUFFER_TOO_SMALL    Buffer to write atom to is too small, required size in buffersize argument.
+			MP4_INVALID_TYPE               Asked udtaLocation is invalid.
+			MP4_NOT_AVAILABLE              UDTA or wanted subatom is not available in asked location.
+			MP4_CANT_SEEK                  Can't seek to UDTA atom location.
+*/
+extern IMPORT_C MP4Err MP4ParseGetUserDataAtom(MP4Handle handle, 
+                                                            mp4_u8& udtaLocation,
+                                                            mp4_u32 udtaAtomType,
+                                                            mp4_u8* buffer,
+                                                            mp4_u32& bufferSize,
+                                                            mp4_u32& atomIndex );
+
+/**
+Writes a buffer containing whole atom to inside of user data atom (UDTA) defined in udtaLocation.
+ 
+@param apihandle      MP4 library handle
+@param udtaLocation   Location of UDTA atom inside file.
+                       MP4_UDTA_MOOV | MP4_UDTA_VIDEOTRAK | MP4_UDTA_AUDIOTRAK 
+@param buffer         Buffer to write atom from.
+@param bufferSize     Size of buffer.
+ 
+@return		MP4_OK             			   Success
+ 			MP4_ERROR                      Generic error 
+ 			MP4_OUT_OF_MEMORY              Out of memory
+ 			MP4_INVALID_TYPE               Asked udtaLocation is invalid.
+*/
+extern IMPORT_C MP4Err MP4ComposeSetUserDataAtom(MP4Handle apihandle, 
+                                                            mp4_u8& udtaLocation,
+                                                            mp4_u8* buffer,
+                                                            mp4_u32& bufferSize );     
+
+/**
+Sets internal buffer sizes to 3GPMP4Lib. Usage optional.
+Must be used after MP4ComposeSetFlags when composing.
+ 
+Defaults for composing (with MP4_FLAG_LARGEFILEBUFFER): 
+ 
+	mediaWriteBufferSize:       2048, (2*65536)
+	writeBufferMaxCount:        15
+ 
+Default for parsing:
+	readBufferSize:             8k             
+                 
+@param apihandle			MP4 library handle
+@param mediaWriteBufferSize	Size of media data file output buffers (bytes).
+ 							0 to use default internal value.
+@param writeBufferMaxCount	Max amount of buffers (both media and meta) before file output changes
+							to synchronous (by default file writing is asynchronous operation).
+	                        0 to use default internal value.
+	                        Min value 6.
+@param readBufferSize		Size of file read buffer. 0 to use default internal value.
+ 
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+ 			MP4_OUT_OF_MEMORY  Out of Memory error 
+*/
+extern IMPORT_C MP4Err MP4SetCustomFileBufferSizes( MP4Handle apihandle, 
+                                                               mp4_u32 mediaWriteBufferSize,
+                                                               mp4_u32 writeBufferMaxCount,
+                                                               mp4_u32 readBufferSize );
+
+/**
+This function gets the next frame's dependency information from SDTP box.
+ 
+Return values of each parameter can be the following:
+  aDependsOn:
+    0: the dependency of this sample is unknown;
+    1: this sample does depend on others (not an I picture);
+    2: this sample does not depend on others (I picture);
+ 
+  aIsDependedOn:
+    0: the dependency of other samples on this sample is unknown;
+    1: other samples depend on this one (not disposable);
+    2: no other sample depends on this one (disposable);
+ 
+  aHasRedundancy:
+    0: it is unknown whether there is redundant coding in this sample;
+    1: there is redundant coding in this sample;
+    2: there is no redundant coding in this sample;
+ 
+@param apihandle       MP4 library handle
+@param aDependsOn      Defines whether current frame is I-frame (2), isn't I-frame (1) or if it only
+ 		               can be found out by using MP4ParseReadVideoFrame()-method (0).
+@param aIsDependentOn  Defined the dependency of other frames on this one
+@param aHasRedundancy  Defined the existence of redundant coding in this frame
+
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+			MP4_NOT_AVAILABLE  Metadata not available
+			MP4_INVALID_INPUT_STREAM Error in reading metadata
+			MP4_NO_OUTPUT_BUFFER Output buffer uninitialized	
+*/
+extern IMPORT_C MP4Err MP4ParseNextVideoFrameDependencies(MP4Handle apihandle, mp4_u8* aDependsOn, mp4_u8* aIsDependentOn, mp4_u8* aHasRedundancy);
+
+/**
+This function sets the next frame's dependency information to SDTP box.
+ 
+NOTE: This function should be called before MP4ComposeWriteVideoFrame for each frame. Otherwise
+      default values are inserted for the missing frames (0 = unknown).
+ 
+Possible values for each parameter are the following:
+    aDependsOn:
+       0: the dependency of this sample is unknown;
+       1: this sample does depend on others (not an I picture);
+       2: this sample does not depend on others (I picture);
+       3: reserved, DO NOT USE
+
+    aIsDependedOn:
+       0: the dependency of other samples on this sample is unknown;
+       1: other samples depend on this one (not disposable);
+       2: no other sample depends on this one (disposable);
+       3: reserved, DO NOT USE
+
+    aHasRedundancy:
+       0: it is unknown whether there is redundant coding in this sample;
+       1: there is redundant coding in this sample;
+       2: there is no redundant coding in this sample;
+       3: reserved, DO NOT USE
+
+@param apihandle		MP4 library handle
+@param aDependsOn		Defines whether current frame is I-frame (2), isn't I-frame (1) or if it only
+						can be found out by using MP4ParseReadVideoFrame()-method (0).
+@param aIsDependentOn	Defines the dependency of other frames on this one
+@param aHasRedundancy	Defines the existence of redundant coding in this frame
+ 
+@return		MP4_OK             Success
+			MP4_ERROR          Generic error
+*/
+extern IMPORT_C MP4Err MP4ComposeWriteNextVideoFrameDependencies(MP4Handle apihandle, mp4_u8 aDependsOn, mp4_u8 aIsDependentOn, mp4_u8 aHasRedundancy);
+
+/**
+This function reads the audio frames asynchronously that are stored in the current
+audio sample from the MP4 file and returns them to the caller.
+ 
+Note: Only one async parse audio or video frame(s) operation can be ongoing at any given time.
+ 
+Note: Observer notification only comes if called function returns MP4_OK.
+If given buffer is too small MP4_BUFFER_TOO_SMALL is returned and buffersize contains needed
+size for audio frame.
+ 
+When feeding in parsed clip as memory buffers if the function returns MP4_NOT_AVAILABLE, 
+the client needs to call MP4ParseWriteData to insert more data before calling this method again.
+ 
+@param handle       MP4 library handle
+@param aObserver	Observer designed to receive notification of Asynchronous event completion
+@param buffer       Buffer that audio frames are written to.
+@param buffersize   Size of the user allocated buffer (in bytes). In MP4_BUFFER_TOO_SMALL error case contains
+	 				needed size for memory buffer.
+ 
+@return		MP4_OK            		  Success
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+									  frames can be returned
+			MP4_BUFFER_TOO_SMALL      Requested frames don't fit into the given buffer
+			MP4_ERROR                 Generic error
+			MP4_FILE_ERROR			  Async operation is not for buffer mode
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_NO_FRAME              No more frames available
+			MP4_OUT_OF_MEMORY		  Out of Memory.
+*/ 
+extern IMPORT_C MP4Err MP4ParseReadAudioFramesAsync(MP4Handle handle, M3GPMP4LibAsyncObserver* aObserver, mp4_u8 *buffer, mp4_u32* buffersize );
+
+/**
+This function reads the next video frame from the MP4 file and returns it to the caller.
+ 
+Note: Only one async parse audio or video frame(s) operation can be ongoing at any given time.
+ 
+Note: Observer notification only comes if called function returns MP4_OK.
+If given buffer is too small MP4_BUFFER_TOO_SMALL is returned and buffersize contains needed
+size for video frame.
+ 
+When feeding in parsed clip as memory buffers if the function returns MP4_NOT_AVAILABLE, 
+the client needs to call MP4ParseWriteData to insert more data before calling this method again.
+ 
+@param handle       MP4 library handle
+@param aObserver	Observer designed to receive notification of Asynchronous event completion
+@param buffer       Video frame is returned here
+@param buffersize   Size of the user allocated buffer (in bytes). In MP4_BUFFER_TOO_SMALL error case contains
+					needed size for memory buffer.
+ 
+@return		MP4_OK             		  Success
+			MP4_NOT_AVAILABLE         MP4 library needs more data before the requested
+          				              frame can be returned
+			MP4_BUFFER_TOO_SMALL      Requested frame doesn't fit into the given buffer
+			MP4_NO_FRAME              Frame doesn't exist (previous frame was last)
+			MP4_ERROR                 Generic error
+			MP4_OUT_OF_MEMORY		  Out of Memory
+			MP4_INVALID_INPUT_STREAM  MP4 stream is invalid
+			MP4_FILE_ERROR			  Async operation is not for buffer mode			
+*/
+extern IMPORT_C MP4Err MP4ParseReadVideoFrameAsync(MP4Handle handle, M3GPMP4LibAsyncObserver* aObserver, mp4_u8* buffer, mp4_u32* buffersize );
+
+/**
+This function sets async temporary file deleting observer. Meta data temporary file removing can be done 
+on background to improve video recording stopping.
+
+@param handle       MP4 library handle
+@param aObserver    Temorary file deleting observer
+ 
+@return		MP4_OK       Success
+			MP4_ERROR    Generic error
+*/
+
+extern IMPORT_C MP4Err MP4ComposeSetTempFileRemoverObserver(MP4Handle *handle, M3GPMP4LibAsyncTempFileRemoverObserver *aObserver);
+  
+/**
+This function cancels the outstanding asynchronous read audio/video frame request. 
+
+No callback function will be called.
+
+Note:  As only one asynchronous parse audio or video frame(s) operation can be ongoing at any given time, 
+this function can be used to cancel audio or video read request. If this is called without any outstanding 
+request, nothing happens.
+
+@param handle       MP4 library handle
+
+@see MP4ParseReadVideoFrameAsync 
+@see MP4ParseReadAudioFramesAsync
+*/
+extern IMPORT_C void MP4CancelReadFrame(MP4Handle handle);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+// End of File