/*
 * 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.
 */

/**
 ******************************************************************************
 * @file    M4MCS_API.h
 * @brief   Media Conversion Service public API.
 * @note    MCS allows transcoding a 3gp/mp4 file into a new 3gp/mp4 file changing the
 *          video and audio encoding settings.
 *          It is a straightforward and fully synchronous API.
 ******************************************************************************
 */

#ifndef __M4MCS_API_H__
#define __M4MCS_API_H__

/**
 *    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"

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

/**
 * To enable external audio codecs registering*/
#include "M4AD_Common.h"
#include "M4ENCODER_AudioCommon.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 *    Public type of the MCS context */
typedef M4OSA_Void* M4MCS_Context;


/**
 ******************************************************************************
 * enum        M4MCS_MediaRendering
 * @brief    This enum defines different media rendering
 ******************************************************************************
 */
typedef enum
{
    M4MCS_kResizing = 0,    /**< The media is resized, the aspect ratio can be
                              different from the original one.
                              All of the media is rendered */
    M4MCS_kCropping,        /**< The media is cropped, the aspect ratio is the
                              same as the original one.
                              The media is not rendered entirely */
    M4MCS_kBlackBorders     /**< Black borders are rendered in order to keep the
                              original aspect ratio. All the media is rendered */
} M4MCS_MediaRendering;


/**
 ******************************************************************************
 * struct   M4MCS_ExternalProgress
 * @brief   This structure contains information provided to the external Effect functions
 * @note    The uiProgress value should be enough for most cases
 ******************************************************************************
 */
typedef struct
{
    M4OSA_UInt32    uiProgress;     /**< Progress of the Effect from 0 to 1000 (one thousand) */
    M4OSA_UInt32    uiClipTime;     /**< Current time, in milliseconds,
                                          in the current clip time-line */
    M4OSA_UInt32    uiOutputTime;   /**< Current time, in milliseconds,
                                          in the output clip time-line */

} M4MCS_ExternalProgress;


/**
 ******************************************************************************
 * enum     M4MCS_AudioEffectType
 * @brief   This enumeration defines the audio effect types of the MCS
 ******************************************************************************
 */
typedef enum
{
    M4MCS_kAudioEffectType_None    = 0,
    M4MCS_kAudioEffectType_FadeIn  = 8, /**< Intended for begin effect */
    M4MCS_kAudioEffectType_FadeOut = 16, /**< Intended for end effect */
    M4MCS_kAudioEffectType_External = 256

} M4MCS_AudioEffectType;


/**
 ******************************************************************************
 * prototype    M4MCS_editAudioEffectFct
 * @brief       Audio effect functions implemented by the integrator
 *              must match this prototype.
 * @note        The function is provided with the original PCM data buffer and its size.
 *              Audio effect have to be applied on it.
 *              The progress of the effect is given, on a scale from 0 to 1000.
 *              When the effect function is called, all the buffers are valid and
 *              owned by the MCS.
 *
 * @param   pFunctionContext    (IN) The function context, previously set by the integrator
 * @param   pPCMdata            (IN/OUT) valid PCM data buffer
 * @param   uiPCMsize           (IN/OUT) PCM data buffer corresponding size
 * @param   pProgress           (IN) Set of information about the audio effect progress.
 *
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 ******************************************************************************
 */
typedef M4OSA_ERR (*M4MCS_editAudioEffectFct)
(
    M4OSA_Void *pFunctionContext,
    M4OSA_Int16 *pPCMdata,
    M4OSA_UInt32 uiPCMsize,
    M4MCS_ExternalProgress *pProgress
);


/**
 ******************************************************************************
 * struct   M4MCS_EffectSettings
 * @brief   This structure defines an audio effect for the edition.
 ******************************************************************************
 */
typedef struct
{
    M4OSA_UInt32                 uiStartTime;              /**< In ms */
    M4OSA_UInt32                 uiDuration;               /**< In ms */
    M4MCS_editAudioEffectFct     ExtAudioEffectFct;        /**< External effect function */
    M4OSA_Void                   *pExtAudioEffectFctCtxt;  /**< Context given to the external
                                                                effect function */
    M4MCS_AudioEffectType        AudioEffectType;         /**< None, FadeIn, FadeOut */

} M4MCS_EffectSettings;


/**
 ******************************************************************************
 * struct    M4MCS_OutputParams
 * @brief    MCS Output parameters
 * @note     Following parameters are used for still picture inputs :
 *             - OutputFileType (must be set to M4VIDEOEDITING_kFileType_JPG)
 *             - bDiscardExif must be set to M4OSA_TRUE or M4OSA_FALSE
 *             - bAdjustOrientation must be set to M4OSA_TRUE or M4OSA_FALSE
 *             - (MediaRendering is not handled : output image resolution is always
                 set according to BestFit criteria)
 *            bDiscardExif and bAdjustOrientation are still picture only parameters
 ******************************************************************************
 */
typedef struct
{
    /**< Format of the output file */
    M4VIDEOEDITING_FileType                 OutputFileType;
    /**< Output video compression format, see enum */
    M4VIDEOEDITING_VideoFormat              OutputVideoFormat;
    /**< Output frame size : QQVGA, QCIF or SQCIF */
    M4VIDEOEDITING_VideoFrameSize           OutputVideoFrameSize;
    /**< Targeted Output framerate, see enum */
    M4VIDEOEDITING_VideoFramerate           OutputVideoFrameRate;
    /**< Format of the audio in the stream */
    M4VIDEOEDITING_AudioFormat              OutputAudioFormat;
    /**< Sampling frequency of the audio in the stream */
    M4VIDEOEDITING_AudioSamplingFrequency   OutputAudioSamplingFrequency;
    /**< Set to M4OSA_TRUE if the output audio is mono */
    M4OSA_Bool                              bAudioMono;
    /**< Output PCM file if not NULL */
    M4OSA_Char                              *pOutputPCMfile;
    /**< To crop, resize, or render black borders*/
    M4MCS_MediaRendering                    MediaRendering;
    /**< List of effects */
    M4MCS_EffectSettings                    *pEffects;
    /**< Number of effects in the above list */
    M4OSA_UInt8                             nbEffects;

    /*--- STILL PICTURE ---*/
    /**< TRUE: Even if the input file contains an EXIF section,
    the output file won't contain any EXIF section.*/
    M4OSA_Bool                              bDiscardExif ;

    /**< =TRUE : picture must be rotated if Exif tags hold a rotation info
    (and rotation info is set to 0)*/
    M4OSA_Bool                              bAdjustOrientation ;
    /*--- STILL PICTURE ---*/
    M4OSA_Int32 outputVideoProfile;
    M4OSA_Int32 outputVideoLevel;
} M4MCS_OutputParams;

/*--- STILL PICTURE ---*/
/**
 ******************************************************************************
 * enum      M4MCS_SPOutputResolution
 * @brief    Still picture specific : MCS output targeted file resolution
 ******************************************************************************
 */
typedef enum
{
    M4MCS_kResSameAsInput       = 0x00, /*width x height*/
    M4MCS_kResQVGA              = 0x01, /*320x240*/
    M4MCS_kResVGA               = 0x02, /*640x480*/
    M4MCS_kResWQVGA             = 0x03, /*400x240*/
    M4MCS_kResWVGA              = 0x04, /*800x480*/
    M4MCS_kResXGA               = 0x05, /*1024x768*/
    M4MCS_kResCustom            = 0xFF  /*Size is set via StillPictureCustomWidth/Height*/
} M4MCS_SPOutputResolution ;


/**
 ******************************************************************************
 * enum      M4MCS_SPStrategy
 * @brief    Still picture specific : MCS strategy to configure the encoding parameters
 ******************************************************************************
 */
typedef enum
{
    M4MCS_kFileSizeOnlyFixed            = 0x00, /*StillPictureResolution and
                                                 QualityFactor are ignored*/
    M4MCS_kFileSizeAndResFixed          = 0x01, /*QualityFactor is ignored*/
    M4MCS_kQualityAndResFixed           = 0x02  /*OutputFileSize is ignored*/
} M4MCS_SPStrategy ;


/**
 ******************************************************************************
 * enum      M4MCS_SPCrop
 * @brief    Still picture specific : indicate whether cropping should be done
                                     before changing the resolution
 ******************************************************************************
 */
typedef enum
{
    M4MCS_kNoCrop                = 0x00, /*No Cropping is performed*/
    M4MCS_kCropBeforeResize      = 0x01  /*Input image is cropped (before changing resolution)*/
} M4MCS_SPCrop ;


/**
 ******************************************************************************
 * struct    M4MCS_EncodingParams
 * @brief    MCS file size, bitrate and cut parameters
 * @note     Following parameters are used for still picture inputs :
 *             - OutputFileSize
 *             - StillPictureResolution
 *             - QualityFactor
 *             - StillPictureStrategy
 *             - StillPictureCustomWidth/Height (if StillPictureResolution==M4MCS_kResCustom)
 *            Still picture only parameters : StillPictureResolution, QualityFactor,
 *            StillPictureStrategy and StillPictureCustomWidth/Height
 ******************************************************************************
 */
typedef struct
{
    M4VIDEOEDITING_Bitrate    OutputVideoBitrate;     /**< Targeted video bitrate */
    M4VIDEOEDITING_Bitrate    OutputAudioBitrate;     /**< Targeted audio bitrate */
    M4OSA_UInt32              BeginCutTime;           /**< Beginning cut time in input file */
    M4OSA_UInt32              EndCutTime;             /**< End cut time in input file */
    M4OSA_UInt32              OutputFileSize;         /**< Expected resulting file size */
    M4OSA_UInt32              OutputVideoTimescale;   /**< Optional parameter used to fix a
                                                           timescale during transcoding */

    /*--- STILL PICTURE ---*/
    M4OSA_Int32               QualityFactor ;         /**< =-1 (undefined) or 0(lowest)..
                                                            50(best) : This parameter is the
                                                            quality indication for the JPEG output
                                                            file (if =-1 the MCS will set quality
                                                            automatically)*/
    M4MCS_SPStrategy            StillPictureStrategy ; /**< Defines which input parameters
                                                            will be taken into account by MCS*/
    M4MCS_SPOutputResolution    StillPictureResolution;/**< Desired output resolution for
                                                            a still picture file */
    /**< (only if Resolution==M4MCS_kResCustom) : Custom output image width */
    M4OSA_UInt32                StillPictureCustomWidth;
    /**< (only if Resolution==M4MCS_kResCustom) : Custom output image height */
    M4OSA_UInt32                StillPictureCustomHeight;
    /**< Indicate whether Crop should be performed */
    M4MCS_SPCrop                StillPictureCrop;
    /**< (only if cropping) X coordinate of topleft corner of the crop window */
    M4OSA_UInt32                StillPictureCrop_X;
    /**< (only if cropping) Y coordinate of topleft corner of the crop window */
    M4OSA_UInt32                StillPictureCrop_Y;
    /**< (only if cropping) Width of the crop window (in pixels) */
    M4OSA_UInt32                StillPictureCrop_W;
    /**< (only if cropping) Height of the crop window (in pixels) */
    M4OSA_UInt32                StillPictureCrop_H;
    /*--- STILL PICTURE ---*/
} M4MCS_EncodingParams;

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_getVersion(M4_VersionInfo* pVersionInfo);
 * @brief    Get the MCS 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
 * @return   M4ERR_PARAMETER:    pVersionInfo is M4OSA_NULL (If Debug Level >= 2)
 ******************************************************************************
 */
M4OSA_ERR M4MCS_getVersion(M4_VersionInfo* pVersionInfo);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_init(M4MCS_Context* pContext, M4OSA_FileReadPointer* pFileReadPtrFct,
                        M4OSA_FileWriterPointer* pFileWritePtrFct);
 * @brief    Initializes the MCS (allocates an execution context).
 * @note
 * @param    pContext            (OUT) Pointer on the MCS 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 (If Debug Level >= 2)
 * @return   M4ERR_ALLOC:        There is no more available memory
 ******************************************************************************
 */
M4OSA_ERR M4MCS_init(M4MCS_Context* pContext, M4OSA_FileReadPointer* pFileReadPtrFct,
                      M4OSA_FileWriterPointer* pFileWritePtrFct);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_open(M4MCS_Context pContext, M4OSA_Void* pFileIn, M4OSA_Void* pFileOut,
                          M4OSA_UInt32 uiMaxMetadataSize);
 * @brief   Set the MCS input and output files.
 * @note    It opens the input file, but the output file is not created yet.
 *          In case of still picture, four InputFileType are possible
 *          (M4VIDEOEDITING_kFileType_JPG/BMP/GIF/PNG
 *          If one of them is set, the OutputFileType SHALL be set to M4VIDEOEDITING_kFileType_JPG
 * @param   pContext            (IN) MCS context
 * @param   pFileIn             (IN) Input file to transcode (The type of this parameter
 *                                    (URL, pipe...) depends on the OSAL implementation).
 * @param   mediaType           (IN) Container type (.3gp,.amr, ...) of input file.
 * @param   pFileOut            (IN) Output file to create  (The type of this parameter
 *                                    (URL, pipe...) depends on the OSAL implementation).
 * @param   pTempFile           (IN) Temporary file for the constant memory writer to store
 *                                    metadata ("moov.bin").
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4ERR_ALLOC:        There is no more available memory
 * @return  M4ERR_FILE_NOT_FOUND:   The input file has not been found
 * @return  M4MCS_ERR_INVALID_INPUT_FILE:   The input file is not a valid file, or is corrupted
 * @return  M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM:  The input file contains no
 *                                                               supported audio or video stream
 ******************************************************************************
 */
M4OSA_ERR M4MCS_open(M4MCS_Context pContext, M4OSA_Void* pFileIn,
                     M4VIDEOEDITING_FileType InputFileType,
                     M4OSA_Void* pFileOut, M4OSA_Void* pTempFile);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_step(M4MCS_Context pContext, M4OSA_UInt8 *pProgress);
 * @brief   Perform one step of trancoding.
 * @note
 * @param   pContext            (IN) MCS context
 * @param   pProgress           (OUT) Progress percentage (0 to 100) of the transcoding
 * @note    pProgress must be a valid address.
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    One of the parameters is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4MCS_WAR_TRANSCODING_DONE: Transcoding is over, user should now call M4MCS_close()
 * @return  M4MCS_ERR_AUDIO_CONVERSION_FAILED: The audio conversion (AAC to AMR-NB, MP3) failed
 * @return  M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY: The input file contains an AAC audio track
 *                                                     with an invalid sampling frequency
 *                                                     (should never happen)
 * @return  M4MCS_WAR_PICTURE_AUTO_RESIZE: Picture will be automatically resized to fit
 *                                          into requirements
 ******************************************************************************
 */
M4OSA_ERR M4MCS_step(M4MCS_Context pContext, M4OSA_UInt8 *pProgress);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_pause(M4MCS_Context pContext);
 * @brief   Pause the transcoding i.e. release the (external hardware) video decoder.
 * @note    This function is not needed if no hardware accelerators are used.
 *          In that case, pausing the MCS is simply achieved by temporarily suspending
 *          the M4MCS_step function calls.
 * @param   pContext            (IN) MCS context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 ******************************************************************************
 */
M4OSA_ERR M4MCS_pause(M4MCS_Context pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_resume(M4MCS_Context pContext);
 * @brief   Resume the transcoding after a pause (see M4MCS_pause).
 * @note    This function is not needed if no hardware accelerators are used.
 *          In that case, resuming the MCS is simply achieved by calling
 *          the M4MCS_step function.
 * @param   pContext            (IN) MCS context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 ******************************************************************************
 */
M4OSA_ERR M4MCS_resume(M4MCS_Context pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_close(M4MCS_Context pContext);
 * @brief    Finish the MCS transcoding.
 * @note The output 3GPP file is ready to be played after this call
 * @param    pContext            (IN) MCS context
 * @return   M4NO_ERROR:         No error
 * @return   M4ERR_PARAMETER:    pContext is M4OSA_NULL (If Debug Level >= 2)
 * @return   M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 ******************************************************************************
 */
M4OSA_ERR M4MCS_close(M4MCS_Context pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_cleanUp(M4MCS_Context pContext);
 * @brief    Free all resources used by the MCS.
 * @note The context is no more valid after this call
 * @param    pContext            (IN) MCS context
 * @return   M4NO_ERROR:         No error
 * @return   M4ERR_PARAMETER:    pContext is M4OSA_NULL (If Debug Level >= 2)
 * @return   M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 ******************************************************************************
 */
M4OSA_ERR M4MCS_cleanUp(M4MCS_Context pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_abort(M4MCS_Context pContext);
 * @brief    Finish the MCS transcoding and free all resources used by the MCS
 *          whatever the state is.
 * @note    The context is no more valid after this call
 * @param    pContext            (IN) MCS context
 * @return    M4NO_ERROR:            No error
 * @return    M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
 ******************************************************************************
 */
M4OSA_ERR M4MCS_abort(M4MCS_Context pContext);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_getInputFileProperties(M4MCS_Context pContext,
 *                                          M4VIDEOEDITING_ClipProperties* pFileProperties);
 * @brief   Retrieves the properties of the audio and video streams from the input file.
 * @param   pContext            (IN) MCS context
 * @param   pProperties         (OUT) Pointer on an allocated M4VIDEOEDITING_ClipProperties
                                structure which is filled with the input stream properties.
 * @note    The structure pProperties must be allocated and further de-allocated
            by the application. The function must be called in the opened state.
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 ******************************************************************************
 */
M4OSA_ERR M4MCS_getInputFileProperties(M4MCS_Context pContext,
                                        M4VIDEOEDITING_ClipProperties *pFileProperties);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_setOutputParams(M4MCS_Context pContext, M4MCS_OutputParams* pParams);
 * @brief   Set the MCS video output parameters.
 * @note    Must be called after M4MCS_open. Must be called before M4MCS_step.
 * @param   pContext            (IN) MCS context
 * @param   pParams             (IN/OUT) Transcoding parameters
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4MCS_ERR_INVALID_VIDEO_FRAME_SIZE_FOR_H263 : Output video frame size parameter is
 *                                                          incompatible with H263 encoding
 * @return  M4MCS_ERR_INVALID_VIDEO_FRAME_RATE_FOR_H263 : Output video frame size parameter is
 *                                                          incompatible with H263 encoding
 * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT     : Undefined output video format parameter
 * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE : Undefined output video frame size
 * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE : Undefined output video frame rate
 * @return  M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT : Undefined output audio format parameter
 * @return  M4MCS_ERR_DURATION_IS_NULL : Specified output parameters define a null duration stream
 *                                        (no audio and video)
 ******************************************************************************
 */
M4OSA_ERR M4MCS_setOutputParams(M4MCS_Context pContext, M4MCS_OutputParams* pParams);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_setEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates)
 * @brief   Set the values of the encoding parameters
 * @note    Must be called before M4MCS_checkParamsAndStart().
 * @param   pContext           (IN) MCS context
 * @param   pRates             (IN) Transcoding parameters
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4MCS_ERR_AUDIOBITRATE_TOO_HIGH: Audio bitrate too high (we limit to 96 kbps)
 * @return  M4MCS_ERR_AUDIOBITRATE_TOO_LOW: Audio bitrate is too low (16 kbps min for aac,
 *                                           12.2 for amr, 8 for mp3)
 * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT: Begin cut and End cut are equals
 * @return  M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION: Begin cut time is larger than
 *                                                     the input clip duration
 * @return  M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT: End cut time is smaller than begin cut time
 * @return  M4MCS_ERR_MAXFILESIZE_TOO_SMALL: Not enough space to store whole output
 *                                            file at given bitrates
 * @return  M4MCS_ERR_VIDEOBITRATE_TOO_HIGH: Video bitrate too high (we limit to 800 kbps)
 * @return  M4MCS_ERR_VIDEOBITRATE_TOO_LOW: Video bitrate too low
 ******************************************************************************
 */
M4OSA_ERR M4MCS_setEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_getExtendedEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates)
 * @brief   Get the extended values of the encoding parameters
 * @note    Could be called after M4MCS_setEncodingParams.
 * @param   pContext           (IN) MCS context
 * @param   pRates             (OUT) Transcoding parameters
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT: Encoding settings would produce a
 *                                              null duration clip = encoding is impossible
 ******************************************************************************
 */
M4OSA_ERR M4MCS_getExtendedEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates);

/**
 ******************************************************************************
 * M4OSA_ERR M4MCS_checkParamsAndStart(M4MCS_Context pContext)
 * @brief
 * @note
 * @param   pContext           (IN) MCS context
 * @return  M4NO_ERROR:         No error
 * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
 * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
 * @return  M4MCS_ERR_AUDIOBITRATE_TOO_HIGH: Audio bitrate too high (we limit to 96 kbps)
 * @return  M4MCS_ERR_AUDIOBITRATE_TOO_LOW: Audio bitrate is too low (16 kbps min for aac,
 *                                           12.2 for amr, 8 for mp3)
 * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT: Begin cut and End cut are equals
 * @return  M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION: Begin cut time is larger than
 *                                                    the input clip duration
 * @return  M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT: End cut time is smaller than begin cut time
 * @return  M4MCS_ERR_MAXFILESIZE_TOO_SMALL: Not enough space to store whole output
 *                                            file at given bitrates
 * @return  M4MCS_ERR_VIDEOBITRATE_TOO_HIGH: Video bitrate too high (we limit to 800 kbps)
 * @return  M4MCS_ERR_VIDEOBITRATE_TOO_LOW:  Video bitrate too low
 ******************************************************************************
 */
M4OSA_ERR M4MCS_checkParamsAndStart(M4MCS_Context pContext);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __M4MCS_API_H__ */