/* ------------------------------------------------------------------
 * Copyright (C) 2008 PacketVideo
 *
 * 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.
 * -------------------------------------------------------------------
 */
/**
This file contains application function interfaces to the AVC decoder library
and necessary type defitionitions and enumerations.
@publishedAll
*/

#ifndef _AVCDEC_API_H_
#define _AVCDEC_API_H_

#include "avcapi_common.h"

/**
 This enumeration is used for the status returned from the library interface.
*/
typedef enum
{
    /**
    The followings are fail with details. Their values are negative.
    */
    AVCDEC_NO_DATA = -4,
    AVCDEC_PACKET_LOSS = -3,
    /**
    Fail information
    */
    AVCDEC_NO_BUFFER = -2, /* no output picture buffer available */
    AVCDEC_MEMORY_FAIL = -1, /* memory allocation failed */
    AVCDEC_FAIL = 0,
    /**
    Generic success value
    */
    AVCDEC_SUCCESS = 1,
    AVCDEC_PICTURE_OUTPUT_READY = 2,
    AVCDEC_PICTURE_READY = 3,

    /**
    The followings are success with warnings. Their values are positive integers.
    */
    AVCDEC_NO_NEXT_SC = 4,
    AVCDEC_REDUNDANT_FRAME = 5,
    AVCDEC_CONCEALED_FRAME = 6	/* detect and conceal the error */
} AVCDec_Status;


/**
This structure contains sequence parameters information.
*/
typedef struct tagAVCDecSPSInfo
{
    int FrameWidth;
    int FrameHeight;
    uint frame_only_flag;
    int  frame_crop_left;
    int  frame_crop_right;
    int  frame_crop_top;
    int  frame_crop_bottom;

} AVCDecSPSInfo;


#ifdef __cplusplus
extern "C"
{
#endif
    /** THE FOLLOWINGS ARE APIS */
    /**
    This function parses one NAL unit from byte stream format input according to Annex B.
    \param "bitstream"	"Pointer to the bitstream buffer."
    \param "nal_unit"	"Point to pointer and the location of the start of the first NAL unit
    					 found in bitstream."
    \param "size"		"As input, the pointer to the size of bitstream in bytes. As output,
    					 the value is changed to be the size of the found NAL unit."
    \return	"AVCDEC_SUCCESS if success, AVCDEC_FAIL if no first start code is found, AVCDEC_NO_NEX_SC if
    		the first start code is found, but the second start code is missing (potential partial NAL)."
    */
    AVCDec_Status PVAVCAnnexBGetNALUnit(uint8 *bitstream, uint8 **nal_unit, int *size);

    /**
    This function sniffs the nal_unit_type such that users can call corresponding APIs.
    \param "bitstream"	"Pointer to the beginning of a NAL unit (start with forbidden_zero_bit, etc.)."
    \param "size"		"size of the bitstream (NumBytesInNALunit + 1)."
    \param "nal_unit_type" "Pointer to the return value of nal unit type."
    \return	"AVCDEC_SUCCESS if success, AVCDEC_FAIL otherwise."
    */
    AVCDec_Status PVAVCDecGetNALType(uint8 *bitstream, int size, int *nal_type, int *nal_ref_idc);

    /**
    This function decodes the sequence parameters set, initializes related parameters and
    allocates memory (reference frames list), must also be compliant with Annex A.
    It is equivalent to decode VOL header of MPEG4.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    \param "nal_unit"	"Pointer to the buffer containing single NAL unit.
    					The content will change due to EBSP-to-RBSP conversion."
    \param "nal_size"		"size of the bitstream NumBytesInNALunit."
    \return	"AVCDEC_SUCCESS if success,
    		AVCDEC_FAIL if profile and level is not supported,
    		AVCDEC_MEMORY_FAIL if memory allocations return null."
    */
    AVCDec_Status	PVAVCDecSeqParamSet(AVCHandle *avcHandle, uint8 *nal_unit, int nal_size);

    /**
    This function returns sequence parameters such as dimension and field flag of the most recently
    decoded SPS. More can be added later or grouped together into a structure. This API can be called
    after PVAVCInitSequence. If no sequence parameter has been decoded yet, it will return AVCDEC_FAIL.

    \param "avcHandle"	"Handle to the AVC decoder library object."
    \param "seqInfo"	"Pointer to the AVCDecSeqParamInfo structure."
    \return "AVCDEC_SUCCESS if success and AVCDEC_FAIL if fail."
    \note "This API can be combined with PVAVCInitSequence if wanted to be consistent with m4vdec lib."
    */
    AVCDec_Status	PVAVCDecGetSeqInfo(AVCHandle *avcHandle, AVCDecSPSInfo *seqInfo);

    /**
    This function decodes the picture parameters set and initializes related parameters. Note thate
    the PPS may not be present for every picture.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    \param "nal_unit"	"Pointer to the buffer containing single NAL unit.
    					The content will change due to EBSP-to-RBSP conversion."
    \param "nal_size"		"size of the bitstream NumBytesInNALunit."
    \return	"AVCDEC_SUCCESS if success, AVCDEC_FAIL if profile and level is not supported."
    */
    AVCDec_Status	PVAVCDecPicParamSet(AVCHandle *avcHandle, uint8 *nal_unit, int nal_size);

    /**
    This function decodes one NAL unit of bitstream. The type of nal unit is one of the
    followings, 1, 5. (for now, no data partitioning, type 2,3,4).
    \param "avcHandle"	"Handle to the AVC decoder library object."
    \param "nal_unit"	"Pointer to the buffer containing a single or partial NAL unit.
    					The content will change due to EBSP-to-RBSP conversion."
    \param "buf_size"	"Size of the buffer (less than or equal nal_size)."
    \param "nal_size"	"size of the current NAL unit NumBytesInNALunit."
    \return	"AVCDEC_PICTURE_READY for success and an output is ready,
    		AVCDEC_SUCCESS for success but no output is ready,
    		AVCDEC_PACKET_LOSS is GetData returns AVCDEC_PACKET_LOSS,
    		AVCDEC_FAIL if syntax error is detected,
    		AVCDEC_MEMORY_FAIL if memory is corrupted.
    		AVCDEC_NO_PICTURE if no frame memory to write to (users need to get output and/or return picture).
    		AVCDEC_REDUNDANT_PICTURE if error has been detected in the primary picture and redundant picture is available,
    		AVCDEC_CONCEALED_PICTURE if error has been detected and decoder has concealed it."
    */
    AVCDec_Status	PVAVCDecSEI(AVCHandle *avcHandle, uint8 *nal_unit, int nal_size);

    AVCDec_Status PVAVCDecodeSlice(AVCHandle *avcHandle, uint8 *buffer, int buf_size);

    /**
    Check the availability of the decoded picture in decoding order (frame_num).
    The AVCFrameIO also provide displaying order information such that the application
    can re-order the frame for display. A picture can be retrieved only once.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    \param "output"		 "Pointer to the AVCOutput structure. Note that decoder library will
    					not re-used the pixel memory in this structure until it has been returned
    					thru PVAVCReleaseOutput API."
    \return "AVCDEC_SUCCESS for success, AVCDEC_FAIL if no picture is available to be displayed,
    		AVCDEC_PICTURE_READY if there is another picture to be displayed."
    */
    AVCDec_Status PVAVCDecGetOutput(AVCHandle *avcHandle, int *indx, int *release_flag, AVCFrameIO *output);

    /**
    This function resets the decoder and expects to see the next IDR slice.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    */
    void	PVAVCDecReset(AVCHandle *avcHandle);

    /**
    This function performs clean up operation including memory deallocation.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    */
    void	PVAVCCleanUpDecoder(AVCHandle *avcHandle);
//AVCDec_Status EBSPtoRBSP(uint8 *nal_unit,int *size);

#if 0
    /**
    Users can query the memory usage anytime. After PVAVCCleanUpDecoder(), this API should return zero.
    \param "avcHandle"	"Handle to the AVC decoder library object."
    \return "Amount of memory that has been allocated by the AVC decoder library in bytes."
    */
    unsigned long PVAVCDecGetMemoryUsage(AVCHandle *avcHandle);
#endif


    /** CALLBACK FUNCTION TO BE IMPLEMENTED BY APPLICATION */
    /**	In AVCHandle structure, userData is a pointer to an object with the following
    	member functions.
    */
    AVCDec_Status CBAVCDec_GetData(uint32 *userData, unsigned char **buffer, unsigned int *size);

#ifdef __cplusplus
}
#endif

#endif /* _AVCDEC_API_H_ */

