/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** 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:		voType.h

	Content:	data type definition

*******************************************************************************/
#ifndef __voType_H__
#define __voType_H__

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

#ifdef _WIN32
#	define VO_API __cdecl
#	define VO_CBI __stdcall
#else
#	define VO_API
#	define VO_CBI
#endif //_WIN32

/** VO_IN is used to identify inputs to an VO function.  This designation
    will also be used in the case of a pointer that points to a parameter
    that is used as an output. */
#ifndef VO_IN
#define VO_IN
#endif

/** VO_OUT is used to identify outputs from an VO function.  This
    designation will also be used in the case of a pointer that points
    to a parameter that is used as an input. */
#ifndef VO_OUT
#define VO_OUT
#endif

/** VO_INOUT is used to identify parameters that may be either inputs or
    outputs from an VO function at the same time.  This designation will
    also be used in the case of a pointer that  points to a parameter that
    is used both as an input and an output. */
#ifndef VO_INOUT
#define VO_INOUT
#endif

#define VO_MAX_ENUM_VALUE	0X7FFFFFFF

/** VO_VOID */
typedef void VO_VOID;

/** VO_U8 is an 8 bit unsigned quantity that is byte aligned */
typedef unsigned char VO_U8;

/** VO_BYTE is an 8 bit unsigned quantity that is byte aligned */
typedef unsigned char VO_BYTE;

/** VO_S8 is an 8 bit signed quantity that is byte aligned */
typedef signed char VO_S8;

/** VO_CHAR is an 8 bit signed quantity that is byte aligned */
typedef char VO_CHAR;

/** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */
typedef unsigned short VO_U16;

/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */
#if defined _WIN32
typedef unsigned short VO_WCHAR;
typedef unsigned short* VO_PWCHAR;
#elif defined LINUX
typedef unsigned char VO_WCHAR;
typedef unsigned char* VO_PWCHAR;
#endif

/** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */
typedef signed short VO_S16;

/** VO_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
typedef unsigned long VO_U32;

/** VO_S32 is a 32 bit signed quantity that is 32 bit word aligned */
typedef signed long VO_S32;

/* Users with compilers that cannot accept the "long long" designation should
   define the VO_SKIP64BIT macro.  It should be noted that this may cause
   some components to fail to compile if the component was written to require
   64 bit integral types.  However, these components would NOT compile anyway
   since the compiler does not support the way the component was written.
*/
#ifndef VO_SKIP64BIT
#ifdef _WIN32
/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
typedef unsigned __int64  VO_U64;
/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
typedef signed   __int64  VO_S64;
#else // WIN32
/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
typedef unsigned long long VO_U64;
/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
typedef signed long long VO_S64;
#endif // WIN32
#endif // VO_SKIP64BIT

/** The VO_BOOL type is intended to be used to represent a true or a false
    value when passing parameters to and from the VO core and components.  The
    VO_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.
 */
typedef enum VO_BOOL {
    VO_FALSE = 0,
    VO_TRUE = !VO_FALSE,
	VO_BOOL_MAX = VO_MAX_ENUM_VALUE
} VO_BOOL;

/** The VO_PTR type is intended to be used to pass pointers between the VO
    applications and the VO Core and components.  This is a 32 bit pointer and
    is aligned on a 32 bit boundary.
 */
typedef void* VO_PTR;

/** The VO_HANDLE type is intended to be used to pass pointers between the VO
    applications and the VO Core and components.  This is a 32 bit pointer and
    is aligned on a 32 bit boundary.
 */
typedef void* VO_HANDLE;

/** The VO_STRING type is intended to be used to pass "C" type strings between
    the application and the core and component.  The VO_STRING type is a 32
    bit pointer to a zero terminated string.  The  pointer is word aligned and
    the string is byte aligned.
 */
typedef char* VO_PCHAR;

/** The VO_PBYTE type is intended to be used to pass arrays of bytes such as
    buffers between the application and the component and core.  The VO_PBYTE
    type is a 32 bit pointer to a zero terminated string.  The  pointer is word
    aligned and the string is byte aligned.
 */
typedef unsigned char* VO_PBYTE;

/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as
    unicode char between the application and the component and core.  The VO_PTCHAR
    type is a 32 bit pointer to a zero terminated string.  The  pointer is word
    aligned and the string is byte aligned.
 */
/*
#if !defined LINUX
typedef unsigned short* VO_PTCHAR;
typedef unsigned short* VO_TCHAR;
#else
typedef char* VO_PTCHAR;
typedef char VO_TCHAR;
#endif
*/

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

/**
 * Input stream format, Frame or Stream..
 */
typedef enum {
    VO_INPUT_FRAME	= 1,	/*!< Input contains completely frame(s) data. */
    VO_INPUT_STREAM,		/*!< Input is stream data. */
	VO_INPUT_STREAM_MAX = VO_MAX_ENUM_VALUE
} VO_INPUT_TYPE;


/**
 * General data buffer, used as input or output.
 */
typedef struct {
	VO_PBYTE	Buffer;		/*!< Buffer pointer */
	VO_U32		Length;		/*!< Buffer size in byte */
	VO_S64		Time;		/*!< The time of the buffer */
} VO_CODECBUFFER;


/**
 * The init memdata flag.
 */
typedef enum{
	VO_IMF_USERMEMOPERATOR		=0,	/*!< memData is  the pointer of memoperator function*/
	VO_IMF_PREALLOCATEDBUFFER	=1,	/*!< memData is  preallocated memory*/
	VO_IMF_MAX = VO_MAX_ENUM_VALUE
}VO_INIT_MEM_FlAG;


/**
 * The init memory structure..
 */
typedef struct{
	VO_INIT_MEM_FlAG			memflag;	/*!<memory flag  */
	VO_PTR						memData;	/*!<a pointer to VO_MEM_OPERATOR or a preallocated buffer  */
	VO_U32						reserved1;	/*!<reserved  */
	VO_U32						reserved2;	/*!<reserved */
}VO_CODEC_INIT_USERDATA;


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // __voType_H__
