blob: 6d4868ce7469c730540f5c6fbf25bd26a91bc106 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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.
* -------------------------------------------------------------------
*/
#ifndef _MP4DEC_API_H_
#define _MP4DEC_API_H_
#include "m4vh263_decoder_pv_types.h"
// #define PV_TOLERATE_VOL_ERRORS
#define PV_MEMORY_POOL
#ifndef _PV_TYPES_
#define _PV_TYPES_
typedef uint Bool;
#define PV_CODEC_INIT 0
#define PV_CODEC_STOP 1
#endif
#define PV_TRUE 1
#define PV_FALSE 0
/* flag for post-processing 4/25/00 */
#ifdef DEC_NOPOSTPROC
#undef PV_POSTPROC_ON /* enable compilation of post-processing code */
#else
#define PV_POSTPROC_ON
#endif
#define PV_NO_POST_PROC 0
#define PV_DEBLOCK 1
#define PV_DERING 2
#include "visual_header.h" // struct VolInfo is defined
/**@name Structure and Data Types
* These type definitions specify the input / output from the PVMessage
* library.
*/
/*@{*/
/* The application has to allocate space for this structure */
typedef struct tagOutputFrame
{
uint8 *data; /* pointer to output YUV buffer */
uint32 timeStamp; /* time stamp */
} OutputFrame;
typedef struct tagApplicationData
{
int layer; /* current video layer */
void *object; /* some optional data field */
} applicationData;
/* Application controls, this structed shall be allocated */
/* and initialized in the application. */
typedef struct tagvideoDecControls
{
/* The following fucntion pointer is copied to BitstreamDecVideo structure */
/* upon initialization and never used again. */
int (*readBitstreamData)(uint8 *buf, int nbytes_required, void *appData);
applicationData appData;
uint8 *outputFrame;
void *videoDecoderData; /* this is an internal pointer that is only used */
/* in the decoder library. */
#ifdef PV_MEMORY_POOL
int32 size;
#endif
int nLayers;
/* pointers to VOL data for frame-based decoding. */
uint8 *volbuf[2]; /* maximum of 2 layers for now */
int32 volbuf_size[2];
} VideoDecControls;
typedef enum
{
H263_MODE = 0, MPEG4_MODE, UNKNOWN_MODE
} MP4DecodingMode;
typedef enum
{
MP4_I_FRAME, MP4_P_FRAME, MP4_B_FRAME, MP4_BAD_FRAME
} MP4FrameType;
typedef struct tagVopHeaderInfo
{
int currLayer;
uint32 timestamp;
MP4FrameType frameType;
int refSelCode;
int16 quantizer;
} VopHeaderInfo;
/*--------------------------------------------------------------------------*
* VideoRefCopyInfo:
* OMAP DSP specific typedef structure, to support the user (ARM) copying
* of a Reference Frame into the Video Decoder.
*--------------------------------------------------------------------------*/
typedef struct tagVideoRefCopyInfoPtr
{
uint8 *yChan; /* The Y component frame the user can copy a new reference to */
uint8 *uChan; /* The U component frame the user can copy a new reference to */
uint8 *vChan; /* The V component frame the user can copy a new reference to */
uint8 *currentVop; /* The Vop for video the user can copy a new reference to */
} VideoRefCopyInfoPtr;
typedef struct tagVideoRefCopyInfoData
{
int16 width; /* Width */
int16 height; /* Height */
int16 realWidth; /* Non-padded width, not a multiple of 16. */
int16 realHeight; /* Non-padded height, not a multiple of 16. */
} VideoRefCopyInfoData;
typedef struct tagVideoRefCopyInfo
{
VideoRefCopyInfoData data;
VideoRefCopyInfoPtr ptrs;
} VideoRefCopyInfo;
/*@}*/
#ifdef __cplusplus
extern "C"
{
#endif
OSCL_IMPORT_REF Bool PVInitVideoDecoder(VideoDecControls *decCtrl, uint8 *volbuf[], int32 *volbuf_size, int nLayers, int width, int height, MP4DecodingMode mode);
Bool PVAllocVideoData(VideoDecControls *decCtrl, int width, int height, int nLayers);
OSCL_IMPORT_REF Bool PVCleanUpVideoDecoder(VideoDecControls *decCtrl);
Bool PVResetVideoDecoder(VideoDecControls *decCtrl);
OSCL_IMPORT_REF void PVSetReferenceYUV(VideoDecControls *decCtrl, uint8 *refYUV);
Bool PVDecSetReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp);
Bool PVDecSetEnhReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp);
OSCL_IMPORT_REF Bool PVDecodeVideoFrame(VideoDecControls *decCtrl, uint8 *bitstream[], uint32 *timestamp, int32 *buffer_size, uint use_ext_timestamp[], uint8* currYUV);
Bool PVDecodeVopHeader(VideoDecControls *decCtrl, uint8 *buffer[], uint32 timestamp[], int32 buffer_size[], VopHeaderInfo *header_info, uint use_ext_timestamp[], uint8 *currYUV);
Bool PVDecodeVopBody(VideoDecControls *decCtrl, int32 buffer_size[]);
void PVDecPostProcess(VideoDecControls *decCtrl, uint8 *outputYUV);
OSCL_IMPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *display_width, int32 *display_height);
OSCL_IMPORT_REF void PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *buf_width, int32 *buf_height);
OSCL_IMPORT_REF void PVSetPostProcType(VideoDecControls *decCtrl, int mode);
uint32 PVGetVideoTimeStamp(VideoDecControls *decoderControl);
int PVGetDecBitrate(VideoDecControls *decCtrl);
int PVGetDecFramerate(VideoDecControls *decCtrl);
uint8 *PVGetDecOutputFrame(VideoDecControls *decCtrl);
int PVGetLayerID(VideoDecControls *decCtrl);
int32 PVGetDecMemoryUsage(VideoDecControls *decCtrl);
OSCL_IMPORT_REF MP4DecodingMode PVGetDecBitstreamMode(VideoDecControls *decCtrl);
Bool PVExtractVolHeader(uint8 *video_buffer, uint8 *vol_header, int32 *vol_header_size);
int32 PVLocateFrameHeader(uint8 *video_buffer, int32 vop_size);
int32 PVLocateH263FrameHeader(uint8 *video_buffer, int32 vop_size);
Bool PVGetVolInfo(VideoDecControls *decCtrl, VolInfo *pVolInfo); // BX 6/24/04
Bool IsIntraFrame(VideoDecControls *decoderControl);
#ifdef __cplusplus
}
#endif
#endif /* _MP4DEC_API_H_ */