/*
 * Copyright (C) 2009 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.
 */

/*------------------------------------------------------------------------------

    Table of contents

    1. Include Headers

    2. Enumerations used as a return value or a parameter.
        2.1. API's return value enumerations.

    3. User Structures
        3.1. Structures for H264SwDecDecode() parameters.
        3.2. Structures for information interchange with
             DEC API and user application.

    4. Prototypes of Decoder API functions

------------------------------------------------------------------------------*/

#ifndef H264SWDECAPI_H
#define H264SWDECAPI_H

#ifdef __cplusplus
extern "C"
{
#endif

/*------------------------------------------------------------------------------
    1. Include Headers
------------------------------------------------------------------------------*/

    #include "basetype.h"

/*------------------------------------------------------------------------------
    2.1. API's return value enumerations.
------------------------------------------------------------------------------*/

    typedef enum
    {
        H264SWDEC_OK = 0,
        H264SWDEC_STRM_PROCESSED = 1,
        H264SWDEC_PIC_RDY,
        H264SWDEC_PIC_RDY_BUFF_NOT_EMPTY,
        H264SWDEC_HDRS_RDY_BUFF_NOT_EMPTY,
        H264SWDEC_PARAM_ERR = -1,
        H264SWDEC_STRM_ERR = -2,
        H264SWDEC_NOT_INITIALIZED = -3,
        H264SWDEC_MEMFAIL = -4,
        H264SWDEC_INITFAIL = -5,
        H264SWDEC_HDRS_NOT_RDY = -6,
        H264SWDEC_EVALUATION_LIMIT_EXCEEDED = -7
    } H264SwDecRet;

/*------------------------------------------------------------------------------
    3.1. Structures for H264SwDecDecode() parameters.
------------------------------------------------------------------------------*/

    /* typedef of the Decoder instance */
    typedef void *H264SwDecInst;

    /* Input structure */
    typedef struct
    {
        u8  *pStream;            /* Pointer to stream to be decoded          */
        u32  dataLen;            /* Number of bytes to be decoded            */
        u32  picId;              /* Identifier for the picture to be decoded */
        u32 intraConcealmentMethod; /* 0 = Gray concealment for intra
                                       1 = Reference concealment for intra */

    } H264SwDecInput;


    /* Output structure */
    typedef struct
    {
        u8  *pStrmCurrPos;      /* Pointer to stream position where decoder
                                   ended up */
    } H264SwDecOutput;

    /* Output structure for H264SwDecNextPicture */
    typedef struct
    {
        u32 *pOutputPicture;    /* Pointer to the picture, YUV format       */
        u32 picId;              /* Identifier of the picture to be displayed*/
        u32 isIdrPicture;       /* Flag to indicate if the picture is an
                                   IDR picture */
        u32 nbrOfErrMBs;        /* Number of concealed MB's in the picture  */
    } H264SwDecPicture;

/*------------------------------------------------------------------------------
    3.2. Structures for information interchange with DEC API
         and user application.
------------------------------------------------------------------------------*/

    typedef struct
    {
        u32 cropLeftOffset;
        u32 cropOutWidth;
        u32 cropTopOffset;
        u32 cropOutHeight;
    } CropParams;

    typedef struct
    {
        u32 profile;
        u32 picWidth;
        u32 picHeight;
        u32 videoRange;
        u32 matrixCoefficients;
        u32 parWidth;
        u32 parHeight;
        u32 croppingFlag;
        CropParams cropParams;
    } H264SwDecInfo;

    /* Version information */
    typedef struct
    {
        u32 major;    /* Decoder API major version */
        u32 minor;    /* Dncoder API minor version */
    } H264SwDecApiVersion;

/*------------------------------------------------------------------------------
    4. Prototypes of Decoder API functions
------------------------------------------------------------------------------*/

    H264SwDecRet H264SwDecDecode(H264SwDecInst      decInst,
                                 H264SwDecInput     *pInput,
                                 H264SwDecOutput    *pOutput);

    H264SwDecRet H264SwDecInit(H264SwDecInst *decInst,
                               u32            noOutputReordering);

    H264SwDecRet H264SwDecNextPicture(H264SwDecInst     decInst,
                                      H264SwDecPicture *pOutput,
                                      u32               endOfStream);

    H264SwDecRet H264SwDecGetInfo(H264SwDecInst decInst,
                                  H264SwDecInfo *pDecInfo);

    void  H264SwDecRelease(H264SwDecInst decInst);

    H264SwDecApiVersion H264SwDecGetAPIVersion(void);

    /* function prototype for API trace */
    void H264SwDecTrace(char *);

    /* function prototype for memory allocation */
    void* H264SwDecMalloc(u32 size, u32 num);

    /* function prototype for memory free */
    void H264SwDecFree(void *ptr);

    /* function prototype for memory copy */
    void H264SwDecMemcpy(void *dest, void *src, u32 count);

    /* function prototype for memset */
    void H264SwDecMemset(void *ptr, i32 value, u32 count);


#ifdef __cplusplus
}
#endif

#endif /* H264SWDECAPI_H */












