/*
 * 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    M4WRITER_common.h
 * @brief    VES writers shell interface.
 * @note    This file defines the types internally used by the VES to abstract writers
 ******************************************************************************
*/
#ifndef __M4WRITER_COMMON_H__
#define __M4WRITER_COMMON_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "M4OSA_Types.h"
#include "M4OSA_FileWriter.h"   /* for M4OSA_FileWriterPointer */
#include "M4OSA_FileReader.h"   /* for M4OSA_FileWriterPointer */
#include "M4OSA_OptionID.h"     /* for M4OSA_OPTION_ID_CREATE() */
#include "M4OSA_CoreID.h"       /* for M4WRITER_COMMON */

#include "M4SYS_Stream.h"       /* for M4SYS_StreamID */
#include "M4SYS_AccessUnit.h"   /* for M4SYS_AccessUnit */

/**
 ******************************************************************************
 * MP4W Errors & Warnings definition
 ******************************************************************************
*/
#define M4WAR_WRITER_STOP_REQ        M4OSA_ERR_CREATE(M4_WAR, M4WRITER_COMMON ,0x000001)

/**
 ******************************************************************************
 * enum        M4WRITER_OutputFileType
 * @brief    This enum defines the avalaible output file format.
 ******************************************************************************
*/
typedef enum
{
    M4WRITER_kUnknown=-1,
    M4WRITER_k3GPP=0,            /**< 3GPP compliant file */
    M4WRITER_kAVI=1,            /**< AVI file */
    M4WRITER_kAMR=2,            /**< AMR file */
    M4WRITER_kNETWORK3GPP=3,    /**< 3GPP via TCP */
    M4WRITER_kPCM=4,            /**< PCM file */
    M4WRITER_kJPEG=5,            /**< JPEG EXIF writer */
    M4WRITER_kMP3=6,            /**< MP3 writer */

    M4WRITER_kType_NB  /* number of writers, keep it as last enum entry */

} M4WRITER_OutputFileType;

/**
 ******************************************************************************
 * enum    M4WRITER_OptionID
 * @brief    This enums defines all avalaible options. All the reuturned values are in
 *           M4OSA_UInt32 type.
 ******************************************************************************
*/
typedef enum {
    M4WRITER_kMaxAUSize        = M4OSA_OPTION_ID_CREATE (M4_READ|M4_WRITE, M4WRITER_COMMON, 0x01),
    M4WRITER_kMaxChunckSize    = M4OSA_OPTION_ID_CREATE (M4_READ|M4_WRITE, M4WRITER_COMMON, 0x02),
    M4WRITER_kFileSize          = M4OSA_OPTION_ID_CREATE (M4_READ            , \
        M4WRITER_COMMON, 0x03),  /**< File size if the process was ended when we call the method */
    M4WRITER_kFileSizeAudioEstimated= M4OSA_OPTION_ID_CREATE (M4_READ    ,\
         M4WRITER_COMMON, 0x04),    /**< File size if the process was ended when we call the
                                     method, estimated size for audio */
    M4WRITER_kEmbeddedString  = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x05),    /**< String embedded at the end of the file(SW - VES) */
    M4WRITER_kEmbeddedVersion = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x06),    /**< Version embedded at the end of the file */
    M4WRITER_kIntegrationTag  = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x07),    /**< String embedded at the end of the file (char[60]
                                         for integration purpose) */
    M4WRITER_kMaxFileSize      = M4OSA_OPTION_ID_CREATE (M4_WRITE        , \
        M4WRITER_COMMON, 0x08),    /**< Maximum file size limitation */
    M4WRITER_kMaxFileDuration = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x09),    /**< Maximum file duration limitation */
    M4WRITER_kSetFtypBox      = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x0A),    /**< Set 'ftyp' atom */
    M4WRITER_kMetaData          = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x0B),    /**< Additionnal information to set in the file */
    M4WRITER_kDSI          = M4OSA_OPTION_ID_CREATE (M4_WRITE        , \
        M4WRITER_COMMON, 0x0C),    /**< To set DSI of the file (Decoder specifc info) */
    M4WRITER_kJpegReserveFPData     = M4OSA_OPTION_ID_CREATE (M4_WRITE        ,\
         M4WRITER_COMMON, 0x0D),    /**< Reserve some space in the file for JPEG fast
                                        processing data */
    M4WRITER_kJpegSetFPData     = M4OSA_OPTION_ID_CREATE (M4_WRITE        , \
        M4WRITER_COMMON, 0x0E),    /**< Write Fast Processing Data in the file*/
    /* + CRLV6775 -H.264 trimming */
    M4WRITER_kMUL_PPS_SPS       = M4OSA_OPTION_ID_CREATE (M4_WRITE        , M4WRITER_COMMON, 0x0F)
    /* - CRLV6775 -H.264 trimming */
} M4WRITER_OptionID;


/**
 ******************************************************************************
 * struct    M4WRITER_Header
 * @brief    This structure defines the buffer where an header is put.
 ******************************************************************************
*/
typedef struct
{
    M4OSA_MemAddr8    pBuf;        /**< Buffer for the header */
    M4OSA_UInt32    Size;        /**< Size of the data */
} M4WRITER_Header;


/**
 ******************************************************************************
 * struct    M4WRITER_StreamVideoInfos
 * @brief    This structure defines the specific video stream infos, extension to
 *           M4SYS_StreamDescription.
 ******************************************************************************
*/
typedef struct {
    M4OSA_UInt32    height;                /**< Frame height */
    M4OSA_UInt32    width;                /**< Frame Width */
    M4OSA_Double    fps;                /**< Targetted framerate of the video */
    M4WRITER_Header    Header;                /**< Sequence header of the video stream,
                                        member set to NULL if no header present */
} M4WRITER_StreamVideoInfos;


/**
 ******************************************************************************
 * struct    M4WRITER_StreamAudioInfos
 * @brief    This structure defines the specific audio stream infos, extension to
             M4SYS_StreamDescription.
 ******************************************************************************
*/
typedef struct {
    M4OSA_UInt32    nbSamplesPerSec;    /**< Number of Samples per second */
    M4OSA_UInt16    nbBitsPerSample;    /**< Number of Bits in 1 sample */
    M4OSA_UInt16    nbChannels;            /**< Number of channels */
    M4WRITER_Header    Header;                /**< Decoder Specific Info of the audiostream,
                                             member set to NULL if no DSI present */
} M4WRITER_StreamAudioInfos;


/**
 ******************************************************************************
 * enum        M4WRITER_Orientation
 * @brief    This enum defines the possible orientation of a frame as described
 *            in the EXIF standard.
 ******************************************************************************
*/
typedef enum
{
    M4WRITER_OrientationUnknown = 0,
    M4WRITER_OrientationTopLeft,
    M4WRITER_OrientationTopRight,
    M4WRITER_OrientationBottomRight,
    M4WRITER_OrientationBottomLeft,
    M4WRITER_OrientationLeftTop,
    M4WRITER_OrientationRightTop,
    M4WRITER_OrientationRightBottom,
    M4WRITER_OrientationLeftBottom
}M4WRITER_Orientation ;

/**
 ******************************************************************************
 * struct    M4WRITER_MetaData
 * @brief    This structure defines all the meta data to store in the encoded file.
 ******************************************************************************
*/
typedef struct
{
    M4OSA_Char*                Description ;
    M4OSA_Char*                PhoneManufacturer ;
    M4OSA_Char*                PhoneModel ;
    M4OSA_Char*                Artist ;
    M4OSA_Char*                Copyright ;
    M4OSA_Char*                Software ;
    M4OSA_Char*                CreationDate;
    M4WRITER_Orientation    Orientation ;

    M4OSA_UInt32            Width ;
    M4OSA_UInt32            Height ;

    M4OSA_UInt32            ThumbnailWidth ;
    M4OSA_UInt32            ThumbnailHeight ;
    M4OSA_Bool                ThumbnailPresence ;
}M4WRITER_MetaData;


typedef void* M4WRITER_Context;

typedef M4OSA_ERR (M4WRITER_openWrite)        (M4WRITER_Context* hContext,\
                                             void* outputFileDescriptor,\
                                             M4OSA_FileWriterPointer* pFileWriterPointer,\
                                             void* tempFileDescriptor, \
                                             M4OSA_FileReadPointer* pFileReaderPointer);
typedef M4OSA_ERR (M4WRITER_addStream)        (M4WRITER_Context  pContext,\
                                            M4SYS_StreamDescription*streamDescription);
typedef M4OSA_ERR (M4WRITER_startWriting)    (M4WRITER_Context  pContext);
typedef M4OSA_ERR (M4WRITER_closeWrite)        (M4WRITER_Context  pContext);
typedef M4OSA_ERR (M4WRITER_setOption)        (M4WRITER_Context  pContext, \
                                            M4OSA_UInt32 optionID, \
                                            M4OSA_DataOption optionValue);
typedef M4OSA_ERR (M4WRITER_getOption)        (M4WRITER_Context  pContext, \
                                            M4OSA_UInt32 optionID, \
                                            M4OSA_DataOption optionValue);


/**
 ******************************************************************************
 * struct    M4WRITER_GlobalInterface
 * @brief    Defines all the functions required for a writer shell.
 ******************************************************************************
*/
typedef struct _M4WRITER_GlobalInterface
{
    M4WRITER_openWrite*             pFctOpen;
    M4WRITER_addStream*                pFctAddStream;
    M4WRITER_startWriting*          pFctStartWriting;
    M4WRITER_closeWrite*            pFctCloseWrite;
    M4WRITER_setOption*                pFctSetOption;
    M4WRITER_getOption*                pFctGetOption;
} M4WRITER_GlobalInterface;

typedef M4OSA_ERR  M4WRITER_startAU(M4WRITER_Context pContext, M4SYS_StreamID streamID,\
                                     M4SYS_AccessUnit* pAU);
typedef M4OSA_ERR  M4WRITER_processAU(M4WRITER_Context pContext, M4SYS_StreamID streamID,\
                                     M4SYS_AccessUnit* pAU);

/**
 ******************************************************************************
 * struct    M4WRITER_DataInterface
 * @brief    Defines all the functions required to write data with a writer shell.
 ******************************************************************************
*/
typedef struct _M4WRITER_DataInterface
{
    M4WRITER_startAU*    pStartAU;
    M4WRITER_processAU* pProcessAU;

    M4WRITER_Context    pWriterContext;

} M4WRITER_DataInterface;

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /*__M4WRITER_COMMON_H__*/