/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __M4VSS3GPP_API_H__
#define __M4VSS3GPP_API_H__

/**
 ******************************************************************************
 * @file    M4VSS3GPP_API.h
 * @brief   Video Studio Service 3GPP public API.
 * @note    VSS allows editing 3GPP files.
 *          It is a straightforward and fully synchronous API.
 ******************************************************************************
 */

/**
 *  OSAL basic types and errors */
#include "M4OSA_Types.h"
#include "M4OSA_Error.h"

/**
 *  OSAL types for file access */
#include "M4OSA_FileReader.h"
#include "M4OSA_FileWriter.h"

/**
 *  Definition of M4_VersionInfo */
#include "M4TOOL_VersionInfo.h"

/**
 * Image planes definition */
#include "M4VIFI_FiltersAPI.h"

/**
 * Common definitions of video editing components */
#include "M4_VideoEditingCommon.h"
#include "M4ENCODER_AudioCommon.h"
#include "M4AD_Common.h"
#include "M4DA_Types.h"

/**
 * Extended API (xVSS) */
#ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
#include "M4VSS3GPP_Extended_API.h"
#endif

//#include "M4VD_HW_API.h"
//#include "M4VE_API.h"


#ifdef __cplusplus
extern "C" {
#endif



/**
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 *
 *      Edition Feature
 *
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 */

/**
 *  Public type of the VSS edit context */
typedef M4OSA_Void* M4VSS3GPP_EditContext;


/**
 ******************************************************************************
 * enum     M4VSS3GPP_VideoEffectType
 * @brief   This enumeration defines the video effect types of the VSS3GPP
 ******************************************************************************
 */
typedef enum
{
    M4VSS3GPP_kVideoEffectType_None           = 0,  /**< No video effect */
    M4VSS3GPP_kVideoEffectType_FadeFromBlack  = 8,  /**< Intended for begin effect */
    M4VSS3GPP_kVideoEffectType_FadeToBlack    = 16, /**< Intended for end effect */
    M4VSS3GPP_kVideoEffectType_External       = 256 /**< External effect function is used */
    /* reserved 256 + n */                          /**< External effect number n */

} M4VSS3GPP_VideoEffectType;


/**
 ******************************************************************************
 * enum     M4VSS3GPP_AudioEffectType
 * @brief   This enumeration defines the audio effect types of the VSS3GPP
 ******************************************************************************
 */
typedef enum
{
    M4VSS3GPP_kAudioEffectType_None    = 0,
    M4VSS3GPP_kAudioEffectType_FadeIn  = 8, /**< Intended for begin effect */
    M4VSS3GPP_kAudioEffectType_FadeOut = 16 /**< Intended for end effect */

} M4VSS3GPP_AudioEffectType;


/**
 ******************************************************************************
 * enum     M4VSS3GPP_VideoTransitionType
 * @brief   This enumeration defines the video effect that can be applied during a transition.
 ******************************************************************************
 */
typedef enum
{
    M4VSS3GPP_kVideoTransitionType_None      = 0,
    M4VSS3GPP_kVideoTransitionType_CrossFade = 1,
    M4VSS3GPP_kVideoTransitionType_External  = 256
    /* reserved 256 + n */                          /**< External transition number n */

} M4VSS3GPP_VideoTransitionType;


/**
 ******************************************************************************
 * enum     M4VSS3GPP_AudioTransitionType
 * @brief   This enumeration defines the audio effect that can be applied during a transition.
 ******************************************************************************
 */
typedef enum
{
    M4VSS3GPP_kAudioTransitionType_None = 0,
    M4VSS3GPP_kAudioTransitionType_CrossFade

} M4VSS3GPP_AudioTransitionType;


/**
 ******************************************************************************
 * struct   M4VSS3GPP_ExternalProgress
 * @brief   This structure contains information provided to the external Effect
 *          and Transition functions
 * @note    The uiProgress value should be enough for most cases
 ******************************************************************************
 */
typedef struct
{
    /**< Progress of the Effect or the Transition, from 0 to 1000 (one thousand) */
    M4OSA_UInt32    uiProgress;
    /**< Index of the current clip (first clip in case of a Transition), from 0 to N */
    //M4OSA_UInt8     uiCurrentClip;
    /**< Current time, in milliseconds, in the current clip time-line */
    M4OSA_UInt32    uiClipTime;
    /**< Current time, in milliseconds, in the output clip time-line */
    M4OSA_UInt32    uiOutputTime;
    M4OSA_Bool        bIsLast;

} M4VSS3GPP_ExternalProgress;


/**
 ************************************************************************
 * enum     M4VSS3GPP_codecType
 * @brief    This enum defines the codec types used to create interfaces
 * @note    This enum is used internally by the VSS3GPP services to identify
 *             a currently supported codec interface. Each codec is
 *            registered with one of this type associated.
 *            When a codec instance is needed, this type is used to
 *            identify and retrieve its interface.
 *            This can be extended for other codecs.
 ************************************************************************
 */
typedef enum
{
    /* Video Decoder Types */
    M4VSS3GPP_kVideoDecMPEG4 = 0,
    M4VSS3GPP_kVideoDecH264,

    /* Video Encoder Types */
    M4VSS3GPP_kVideoEncMPEG4,
    M4VSS3GPP_kVideoEncH263,
    M4VSS3GPP_kVideoEncH264,

    /* Audio Decoder Types */
    M4VSS3GPP_kAudioDecAMRNB,
    M4VSS3GPP_kAudioDecAAC,
    M4VSS3GPP_kAudioDecMP3,

    /* Audio Encoder Types */
    M4VSS3GPP_kAudioEncAMRNB,
    M4VSS3GPP_kAudioEncAAC,

    /* number of codecs, keep it as last enum entry, before invlaid type */
    M4VSS3GPP_kCodecType_NB,
    /* invalid codec type */
    M4VSS3GPP_kCodecTypeInvalid = 255

} M4VSS3GPP_codecType;


/**
 ******************************************************************************
 * prototype    M4VSS3GPP_editVideoEffectFct
 * @brief       Begin and End video effect functions implemented by the integrator
 *              must match this prototype.
 * @note        The function is provided with the original image of the clip.
 *              It must apply the video effect to build the output image.
 *              The progress of the effect is given, on a scale from 0 to 1000.
 *              When the effect function is called, all the image plane structures
 *              and buffers are valid and owned by the VSS 3GPP.
 *
 * @param   pFunctionContext    (IN) The function context, previously set by the integrator
 * @param   pInputPlanes        (IN) Input YUV420 image: pointer to an array of three valid
                                     image planes (Y, U and V)
 * @param   pOutputPlanes       (IN/OUT) Output (filtered) YUV420 image: pointer to an array
                                         of three valid image planes (Y, U and V)
 * @param   pProgress           (IN) Set of information about the video transition progress.
 * @param   uiExternalEffectId  (IN) Which effect function should be used (for external effects)
 *
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 ******************************************************************************
 */
typedef M4OSA_ERR (*M4VSS3GPP_editVideoEffectFct)
(
    M4OSA_Void *pFunctionContext,
    M4VIFI_ImagePlane *pInputPlanes,
    M4VIFI_ImagePlane *pOutputPlanes,
    M4VSS3GPP_ExternalProgress *pProgress,
    M4OSA_UInt32 uiExternalEffectId
);


/**
 ******************************************************************************
 * prototype    M4VSS3GPP_editVideoTransitionFct
 * @brief       External transition functions implemented by the integrator
 *              must match this prototype.
 * @note        The function is provided with the image of the first clip and
 *              the image of the second clip. It must build the output image
 *              from the two input images.
 *              The progress of the transition is given, on a scale from 0 to 1000.
 *              When the external function is called, all the image plane
 *              structures and buffers are valid and owned by the VSS 3GPP.
 *
 * @param   pFunctionContext    (IN) The function context, previously set by the integrator
 * @param   pClip1InputPlanes   (IN) First input YUV420 image: pointer to an array of three
                                     valid image planes (Y, U and V)
 * @param   pClip2InputPlanes   (IN) Second input YUV420 image: pointer to an array of three
                                     valid image planes (Y, U and V)
 * @param   pOutputPlanes       (IN/OUT) Output (filtered) YUV420 image: pointer to an array
                                         of three valid image planes (Y, U and V)
 * @param   pProgress           (IN) Set of information about the video effect progress.
 * @param   uiExternalTransitionId    (IN) Which transition function should be used
                                            (for external transitions)
 *
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 ******************************************************************************
 */
typedef M4OSA_ERR (*M4VSS3GPP_editVideoTransitionFct)
(
    M4OSA_Void *pFunctionContext,
    M4VIFI_ImagePlane *pClip1InputPlanes,
    M4VIFI_ImagePlane *pClip2InputPlanes,
    M4VIFI_ImagePlane *pOutputPlanes,
    M4VSS3GPP_ExternalProgress *pProgress,
    M4OSA_UInt32 uiExternalTransitionId
);


/**
 ******************************************************************************
 * struct   M4VSS3GPP_EffectSettings
 * @brief   This structure defines an audio/video effect for the edition.
 * @note    Effect start time is relative to output clip.
 ******************************************************************************
 */
typedef struct
{
    M4OSA_UInt32                 uiStartTime;           /**< In ms */
    M4OSA_UInt32                 uiDuration;            /**< In ms */
    M4VSS3GPP_VideoEffectType    VideoEffectType;       /**< None, FadeIn, FadeOut, etc. */
    M4VSS3GPP_editVideoEffectFct ExtVideoEffectFct;     /**< External effect function */
    M4OSA_Void                  *pExtVideoEffectFctCtxt;/**< Context given to the external
                                                             effect function */
    M4VSS3GPP_AudioEffectType    AudioEffectType;       /**< None, FadeIn, FadeOut */

#ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    M4xVSS_EffectSettings         xVSS;
#endif

} M4VSS3GPP_EffectSettings;


/**
 ******************************************************************************
 * enum        M4VSS3GPP_TransitionBehaviour
 * @brief    Transition behavior
 ******************************************************************************
 */
typedef enum
{
    M4VSS3GPP_TransitionBehaviour_SpeedUp = 0,
    M4VSS3GPP_TransitionBehaviour_Linear,
    M4VSS3GPP_TransitionBehaviour_SpeedDown,
    M4VSS3GPP_TransitionBehaviour_SlowMiddle,
    M4VSS3GPP_TransitionBehaviour_FastMiddle
} M4VSS3GPP_TransitionBehaviour;


/**
 ******************************************************************************
 * struct   M4VSS3GPP_TransitionSettings
 * @brief   This structure defines the transition to be applied when assembling two clips.
 ******************************************************************************
 */
typedef struct
{
    /**< Duration of the transition, in milliseconds (set to 0 to get no transition) */
    M4OSA_UInt32                     uiTransitionDuration;

    /**< Type of the video transition */
    M4VSS3GPP_VideoTransitionType    VideoTransitionType;

    /**< External transition video effect function */
    M4VSS3GPP_editVideoTransitionFct ExtVideoTransitionFct;

    /**< Context of the external transition video effect function */
    M4OSA_Void                      *pExtVideoTransitionFctCtxt;
    M4VSS3GPP_AudioTransitionType    AudioTransitionType;   /**< Type of the audio transition */
    M4VSS3GPP_TransitionBehaviour     TransitionBehaviour;    /**<Transition behaviour*/

#ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    M4xVSS_TransitionSettings        xVSS;
#endif

} M4VSS3GPP_TransitionSettings;


/**
 ******************************************************************************
 * struct   M4VSS3GPP_ClipSettings
 * @brief   This structure defines an input clip for the edition.
 * @note    It also contains the settings for the cut and begin/end effects applied to the clip.
 ******************************************************************************
 */
typedef struct
{
    M4OSA_Void                     *pFile;            /**< Clip file descriptor */
    M4VIDEOEDITING_FileType         FileType;         /**< .3gp, .amr, .mp3     */
    M4OSA_UInt32                    filePathSize;      /**< Clip path size
                                                           (add because of UTF16 conversion)*/
    M4VIDEOEDITING_ClipProperties   ClipProperties;   /**< Clip analysis previously computed
                                                       with M4VSS3GPP_editAnalyseClip */
    M4OSA_UInt32                    uiBeginCutTime;   /**< Begin cut time, in milliseconds */
    M4OSA_UInt32                    uiEndCutTime;     /**< End cut time, in milliseconds */
    M4OSA_Bool                      bTranscodingRequired;

#ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    M4xVSS_ClipSettings             xVSS;
#endif

} M4VSS3GPP_ClipSettings;


/**
 ******************************************************************************
 * struct   M4VSS3GPP_EditSettings
 * @brief   This structure gathers all the information needed to define a complete
 *          edition operation
 ******************************************************************************
 */
typedef struct
{
      /**< Number of element of the clip list pClipList */
    M4OSA_UInt8                      uiClipNumber;
    /**< The properties of this clip will be used as a reference for compatibility checking */
    M4OSA_UInt8                      uiMasterClip;
    /**< List of the input clips settings. Pointer to an array of uiClipNumber
     clip settings pointers */
    M4VSS3GPP_ClipSettings           **pClipList;
    /**< List of the transition settings. Pointer to an array of uiClipNumber-1
     transition settings pointers */
    M4VSS3GPP_TransitionSettings     **pTransitionList;
    M4VSS3GPP_EffectSettings         *Effects;         /**< List of effects */
    M4OSA_UInt8                         nbEffects;     /**< Number of effects in the above list */
    /**< Frame rate at which the modified video sections will be encoded */
    M4VIDEOEDITING_VideoFramerate    videoFrameRate;
    M4OSA_Void                       *pOutputFile;      /**< Output 3GPP clip file descriptor */
    M4OSA_UInt32                     uiOutputPathSize;    /**< Output file path size*/
    /**< Temporary file to store metadata ("moov.bin") */
    M4OSA_Void                       *pTemporaryFile;

#ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    M4xVSS_EditSettings              xVSS;
#endif
    M4OSA_Float                    PTVolLevel;
} M4VSS3GPP_EditSettings;


/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editAnalyseClip()
 * @brief   This function allows checking if a clip is compatible with VSS 3GPP editing
 * @note    It also fills a ClipAnalysis structure, which can be used to check if two
 *          clips are compatible
 * @param   pClip               (IN) File descriptor of the input 3GPP/MP3 clip file.
 * @param   pClipProperties     (IN) Pointer to a valid ClipProperties structure.
 * @param   FileType            (IN) Type of the input file (.3gp, .amr, .mp3)
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return   M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED
 * @return   M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION
 * @return   M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED
 * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE
 * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE
 * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC
 * @return   M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT
 * @return   M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE
 * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT
 * @return   M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editAnalyseClip(M4OSA_Void *pClip, M4VIDEOEDITING_FileType FileType,
                                    M4VIDEOEDITING_ClipProperties  *pClipProperties,
                                    M4OSA_FileReadPointer *pFileReadPtrFct);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility()
 * @brief   This function allows checking if two clips are compatible with each other
 *          for VSS 3GPP editing assembly feature.
 * @note
 * @param   pClip1Properties        (IN) Clip analysis of the first clip
 * @param   pClip2Properties        (IN) Clip analysis of the second clip
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION
 * @return  M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_PLATFORM
 * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT
 * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE
 * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE
 * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING
 * @return  M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY
 * @return  M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility(M4VIDEOEDITING_ClipProperties  *pClip1Properties,
                                               M4VIDEOEDITING_ClipProperties  *pClip2Properties);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editInit()
 * @brief    Initializes the VSS 3GPP edit operation (allocates an execution context).
 * @note
 * @param    pContext            (OUT) Pointer on the VSS 3GPP edit context to allocate
 * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
 * @param   pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
 * @return    M4ERR_ALLOC:        There is no more available memory
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editInit(
    M4VSS3GPP_EditContext* pContext,
    M4OSA_FileReadPointer* pFileReadPtrFct,
    M4OSA_FileWriterPointer* pFileWritePtrFct );

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editCreateClipSettings()
 * @brief    Allows filling a clip settings structure with default values
 *
 * @note    WARNING: pClipSettings->pFile      will be allocated in this function.
 *
 * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
 * @param   pFile               (IN) Clip file name
 * @param   filePathSize        (IN) Size of the clip path (needed for UTF16 conversion)
 * @param    nbEffects           (IN) Nb of effect settings to allocate
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editCreateClipSettings(M4VSS3GPP_ClipSettings *pClipSettings,
                                           M4OSA_Void* pFile, M4OSA_UInt32 filePathSize,
                                           M4OSA_UInt8 nbEffects);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editDuplicateClipSettings()
 * @brief    Duplicates a clip settings structure, performing allocations if required
 *
 * @param    pClipSettingsDest    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
 * @param    pClipSettingsOrig    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
 * @param   bCopyEffects        (IN) Flag to know if we have to duplicate effects (deprecated)
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editDuplicateClipSettings(M4VSS3GPP_ClipSettings *pClipSettingsDest,
                                              M4VSS3GPP_ClipSettings *pClipSettingsOrig,
                                              M4OSA_Bool bCopyEffects);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editFreeClipSettings()
 * @brief    Free the pointers allocated in the ClipSetting structure (pFile, Effects).
 *
 * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editFreeClipSettings(M4VSS3GPP_ClipSettings *pClipSettings);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editOpen()
 * @brief   Set the VSS 3GPP input and output files, and set the settings.
 * @note
 * @param   pContext            (IN) VSS 3GPP edit context
 * @param   pSettings           (IN) Edit settings
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        VSS is not in an appropriate state for this function to be called
 * @return  M4ERR_ALLOC:        There is no more available memory
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editOpen(M4VSS3GPP_EditContext pContext, M4VSS3GPP_EditSettings *pSettings);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editStep()
 * @brief   Perform one step of editing.
 * @note
 * @param   pContext                (IN) VSS 3GPP edit context
 * @param   pProgress               (OUT) Progress percentage (0 to 100) of the editing operation
 * @return  M4NO_ERROR:             No error
 * @return  M4ERR_PARAMETER:        pContext is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:            VSS 3GPP is not in an appropriate state for this function to
 *                                  be called
 * @return  M4VSS3GPP_WAR_EDITING_DONE:Edition is done, user should now call M4VSS3GPP_editClose()
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editStep(M4VSS3GPP_EditContext pContext, M4OSA_UInt8 *pProgress);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editClose()
 * @brief   Finish the VSS 3GPP edit operation.
 * @note    The output 3GPP file is ready to be played after this call
 * @param   pContext            (IN) VSS 3GPP edit context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        VSS 3GPP is not in an appropriate state for this function
 *                              to be called
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editClose(M4VSS3GPP_EditContext pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_editCleanUp()
 * @brief   Free all resources used by the VSS 3GPP edit operation.
 * @note    The context is no more valid after this call
 * @param   pContext            (IN) VSS 3GPP edit context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_editCleanUp(M4VSS3GPP_EditContext pContext);

/**
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 *
 *      Audio Mixing Feature
 *
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 */
/**
 *  Public type of the VSS audio mixing context */
typedef M4OSA_Void* M4VSS3GPP_AudioMixingContext;


/**
 ******************************************************************************
 * struct   M4VSS3GPP_AudioMixingSettings
 * @brief   This structure defines the settings of the audio mixing operation.
 ******************************************************************************
 */
typedef struct {
    M4OSA_Void*                             pOriginalClipFile;      /**< Input 3GPP clip file */
    M4OSA_Void*                             pAddedAudioTrackFile;   /**< New audio track */
    M4VIDEOEDITING_FileType                 AddedAudioFileType;     /**< File Format of the new audio file */
    M4OSA_UInt32                            uiAddCts;               /**< Time, in milliseconds,
                                                                    at which the added audio track is inserted */
    M4OSA_UInt32                            uiAddVolume;            /**< Volume, in percentage,
                                                                        of the added audio track */
    M4OSA_UInt32                            uiBeginLoop;            /**< Describes in milli-second the
                                                                        start time of the loop */
    M4OSA_UInt32                            uiEndLoop;              /**< Describes in milli-second the end
                                                                    time of the loop (0 means no loop) */
    M4OSA_Bool                              bRemoveOriginal;      /**< If true, the original audio track
                                                                     is not taken into account */
    M4OSA_Void*                             pOutputClipFile;      /**< Output 3GPP clip file */
    M4OSA_Void*                             pTemporaryFile;       /**< Temporary file to store metadata
                                                     ("moov.bin") */
    /**< The following parameters are optionnal. They are just used in case of MP3 replacement. */
    M4VIDEOEDITING_AudioSamplingFrequency   outputASF;         /**< Output sampling frequency */
    M4VIDEOEDITING_AudioFormat              outputAudioFormat; /**< Output audio codec(AAC/AMR)*/
    M4VIDEOEDITING_Bitrate                  outputAudioBitrate; /**< Output audio bitrate */
    M4OSA_UInt8                             outputNBChannels; /**< Output audio nb of channels */
    M4OSA_Bool                              b_DuckingNeedeed;
    M4OSA_Int32                             InDucking_threshold;
    M4OSA_Float                             fBTVolLevel;
    M4OSA_Float                             fPTVolLevel;
    M4OSA_Float                             InDucking_lowVolume;
    M4OSA_Bool                              bLoop;
    M4OSA_UInt32                            uiSamplingFrequency;
    M4OSA_UInt32                            uiNumChannels;
} M4VSS3GPP_AudioMixingSettings;

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_audioMixingInit(M4VSS3GPP_AudioMixingContext* pContext,
 *                                     M4VSS3GPP_AudioMixingSettings* pSettings)
 * @brief    Initializes the VSS audio mixing operation (allocates an execution context).
 * @note
 * @param    pContext        (OUT) Pointer on the VSS audio mixing context to allocate
 * @param    pSettings        (IN) Pointer to valid audio mixing settings
 * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
 * @param   pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return    M4ERR_ALLOC:        There is no more available memory
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_audioMixingInit(
    M4VSS3GPP_AudioMixingContext* pContext,
    M4VSS3GPP_AudioMixingSettings* pSettings,
    M4OSA_FileReadPointer* pFileReadPtrFct,
    M4OSA_FileWriterPointer* pFileWritePtrFct );

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_audioMixingStep()
 * @brief   Perform one step of audio mixing.
 * @note
 * @param   pContext                        (IN) VSS 3GPP audio mixing context
 * @return  M4NO_ERROR:                     No error
 * @return  M4ERR_PARAMETER:                pContext is M4OSA_NULL (debug only)
 * @param   pProgress                       (OUT) Progress percentage (0 to 100)
                                                  of the finalization operation
 * @return  M4ERR_STATE:                    VSS is not in an appropriate state for
                                            this function to be called
 * @return  M4VSS3GPP_WAR_END_OF_AUDIO_MIXING: Audio mixing is over, user should
                                               now call M4VSS3GPP_audioMixingCleanUp()
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_audioMixingStep(M4VSS3GPP_AudioMixingContext pContext,
                                     M4OSA_UInt8 *pProgress);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_audioMixingCleanUp()
 * @brief   Free all resources used by the VSS audio mixing operation.
 * @note    The context is no more valid after this call
 * @param   pContext            (IN) VSS 3GPP audio mixing context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_audioMixingCleanUp(M4VSS3GPP_AudioMixingContext pContext);


/**
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 *
 *      Extract Picture Feature
 *
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 */
/**
 *  Public type of the VSS extract picture context */
typedef M4OSA_Void* M4VSS3GPP_ExtractPictureContext;

/**
 ******************************************************************************
 * struct   M4VSS3GPP_ExtractPictureSettings
 * @brief   This structure defines the settings of the extract picture audio operation.
 ******************************************************************************
 */
typedef struct {
    M4OSA_Void*                         pInputClipFile;  /**< Input 3GPP clip file */
    M4OSA_Int32                         iExtractionTime; /**< frame time (in ms) to be extracted */
    M4OSA_Void*                         pOutputYuvPic;   /**< Output YUV picture name */
} M4VSS3GPP_ExtractPictureSettings;


/******************************************************************************
 * M4OSA_ERR M4VSS3GPP_extractPictureInit()
 * @brief    Initializes the VSS extract picture operation (allocates an execution context).
 * @note
 * @param    pContext            (OUT) Pointer on the VSS extract picture context to allocate
 * @param    pSettings            (IN) Pointer to valid extract picture settings
 * @param    pWidth                (OUT) video stream width
 * @param    pHeight                (OUT) video stream height
 * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
 * @return    M4NO_ERROR:                        No error
 * @return    M4ERR_PARAMETER:                At least one parameter is M4OSA_NULL (debug only)
 * @return    M4ERR_ALLOC:                    There is no more available memory
 * @return    M4VSS3GPP_ERR_INVALID_CLIP1:    The input clip is empty
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_extractPictureInit(
        M4VSS3GPP_ExtractPictureContext* pContext,
        M4VSS3GPP_ExtractPictureSettings* pSettings,
        M4OSA_UInt32 *pWidth,
        M4OSA_UInt32 *pHeight,
        M4OSA_FileReadPointer* pFileReadPtrFct );

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_extractPictureStep()
 * @brief   Perform one step of picture extraction.
 * @note
 * @param   pContext                        (IN) VSS extract picture context
 * @return  M4NO_ERROR:                     No error
 * @return  M4ERR_PARAMETER:                pContext is M4OSA_NULL (debug only)
 * @param   pDecPlanes                      (OUT) Plane in wich the extracted picture is copied
 * @param   pProgress                       (OUT) Progress percentage (0 to 100)
                                                 of the picture extraction
 * @return  M4ERR_STATE:                    VSS is not in an appropriate state for this
                                            function to be called
 * @return  VSS_WAR_END_OF_EXTRACT_PICTURE: Picture extraction  is over, user should now
                                            call M4VSS3GPP_extractPictureCleanUp()
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_extractPictureStep(M4VSS3GPP_ExtractPictureContext pContext,
                                       M4VIFI_ImagePlane *pDecPlanes, M4OSA_UInt8 *pProgress);

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_extractPictureCleanUp()
 * @brief   Free all resources used by the VSS picture extraction.
 * @note    The context is no more valid after this call
 * @param   pContext            (IN) VSS extract picture context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_extractPictureCleanUp(M4VSS3GPP_ExtractPictureContext pContext);

/**
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 *
 *      Common features
 *
 ******************************************************************************
 ******************************************************************************
 ******************************************************************************
 */

/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_GetVersion()
 * @brief   Get the VSS version.
 * @note    Can be called anytime. Do not need any context.
 * @param   pVersionInfo        (OUT) Pointer to a version info structure
 * @return  M4NO_ERROR:         No error
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_GetVersion(M4_VersionInfo* pVersionInfo);


#ifdef WIN32
/**
 ******************************************************************************
 * M4OSA_ERR M4VSS3GPP_GetErrorMessage()
 * @brief   Return a string describing the given error code
 * @note    The input string must be already allocated (and long enough!)
 * @param   err             (IN) Error code to get the description from
 * @param   sMessage        (IN/OUT) Allocated string in which the description will be copied
 * @return  M4NO_ERROR:     Input error is from the VSS3GPP module
 * @return  M4ERR_PARAMETER:Input error is not from the VSS3GPP module
 ******************************************************************************
 */
M4OSA_ERR M4VSS3GPP_GetErrorMessage(M4OSA_ERR err, M4OSA_Char* sMessage);
#endif /**< WIN32 */


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __M4VSS3GPP_API_H__ */