/* ------------------------------------------------------------------
 * 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	_h324utils_h
#define _h324utils_h
#include "pvt_params.h"
#include "h245def.h"
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif

#include "pvt_common.h"

#define MAX_NUM_SIMULTANEOUS_CAPABILITIES 31
#define MAX_CONFIG_INFO_SIZE 128
#define MAX_H264_FORMAT_SPECIFIC_INFO_LEN 128
#define DEF_AL3_SEND_BUFFER_SIZE 1024

/* Generic logger macros for using across the protocol stack node */
#define PVMF_INCOMING_VIDEO_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iIncomingVideoLogger,PVLOGMSG_INFO,m);
#define PVMF_INCOMING_AUDIO_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iIncomingAudioLogger,PVLOGMSG_INFO,m);
#define PVMF_OUTGOING_AUDIO_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iOutgoingAudioLogger,PVLOGMSG_INFO,m);
#define PVMF_OUTGOING_VIDEO_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iOutgoingVideoLogger,PVLOGMSG_INFO,m);


#define PV2WAY_FILLER_FSI_LEN 9
#define PV2WAY_FILLER_FSI {1,2,3,4,5,6,7,8,9}


/* Allocator for TSC */
class PVMFTscAlloc : public Oscl_DefAlloc
{
    public:
        void* allocate(const uint32 size)
        {
            void* tmp = (void*)oscl_malloc(size);
            return tmp;
        }

        void deallocate(void* p)
        {
            oscl_free(p);
        }
};

/* Removed C Linkage - Glk - Due to overloaded fxns
#ifdef __cplusplus
extern "C" {
#endif

  */
struct MultiplexCapabilityInfo
{
    bool iAllowAl1Video;
    bool iAllowAl2Video;
    bool iAllowAl3Video;
    bool iAllowAl1Audio;
    bool iAllowAl2Audio;
    bool iAllowAl3Audio;
    unsigned iMaximumAl2SDUSize;
    unsigned iMaximumAl3SDUSize;
};

typedef struct S_CapabilityIdentifierStandard
{
    uint8 reserved1;
    uint8 itu; /* 0 = t */
    uint8 spec_type; /* 0==recommendation */
    uint8 series_letter; /* h = 8 */
    uint32 spec_number; /* 245,241 etc */
    uint8 data[4];
}* PS_CapabilityIdentifierStandard;


PVAudTypeSimple_t GetSimpleAudioType(PVAudType_t);

PVCodecType_t GetCodecType(PS_DataType pDataType);
PV2WayMediaType GetMediaType(PS_DataType pDataType);
PVCodecType_t GetVidCodecTypeFromVideoCapability(PS_VideoCapability capability);
PVCodecType_t GetVidCodecTypeFromCapabilityIdentifier(S_CapabilityIdentifierStandard& identifier);
PVCodecType_t GetAudCodecTypeFrom245Index(int32 index);
PVCodecType_t GetAudCodecType(PS_GenericCapability audio_capability);
PVCodecType_t GetAudCodecType(PS_AudioCapability audio_capability);
PVCodecType_t GetUiCodecTypeFrom245Index(int32 index);
void GetCodecInfo(PS_Capability capability, CodecCapabilityInfo& info);
ErrorProtectionLevel_t GetEpl(uint16 al_index);
void printBuffer(PVLogger* logger, const uint8* buffer, uint16 len);
unsigned GetFormatSpecificInfo(PS_DataType pDataType, uint8*& fsi);
PS_Capability LookupCapability(PS_TerminalCapabilitySet pTcs, uint16 cap_entry_num);
bool IsTransmitOnlyAltCapSet(PS_TerminalCapabilitySet pTcs, PS_AlternativeCapabilitySet pAltCapSet);
PVMFStatus VerifyCodecs(PS_TerminalCapabilitySet pTcs,
                        Oscl_Vector<OlcFormatInfo, OsclMemAllocator> codecs,
                        PVLogger *logger);
PVMFStatus GetCodecCapInfo(PVCodecType_t codec,
                           PS_TerminalCapabilitySet pTcs,
                           CodecCapabilityInfo& codec_info,
                           PVLogger *logger);
uint32 CheckAltCapSet(PS_AlternativeCapabilitySet pAltCapSet, uint32 entry);
PS_TerminalCapabilitySet GenerateTcs(MultiplexCapabilityInfo& mux_cap_info,
                                     Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& outgoing_codecs,
                                     Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& incoming_codecs);
void FillCapabilityTableEntry(PS_CapabilityTableEntry, CodecCapabilityInfo& codec_info, uint32 entry_num);
void FillCapability(CodecCapabilityInfo& codec_info, PS_Capability capability);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_Capability capability);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_GenericCapability capability);
void FillVideoCapability(VideoCodecCapabilityInfo& codec_info, PS_VideoCapability video_capability);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_VideoCapability capability);
void FillAudioCapability(CodecCapabilityInfo& codec_info, PS_AudioCapability audio_capability);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_AudioCapability capability);
void FillH263Capability(VideoCodecCapabilityInfo& video_codec_info, PS_H263VideoCapability h263caps);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_H263VideoCapability capability);
void FillG723Capability(PS_G7231 g723caps);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_G7231 capability);
void FillAmrCapability(PS_GenericCapability amrCaps);
CodecCapabilityInfo* GetCodecCapabilityInfoAmr(PS_GenericCapability capability);
#if 0
void FillH264Capability(VideoCodecCapabilityInfo& video_codec_info, PS_GenericCapability h264caps, bool includeCsi);
#endif
CodecCapabilityInfo* GetCodecCapabilityInfoAvc(PS_GenericCapability capability);
#if 0
void ParseH264Capability(PS_GenericCapability h264caps, CPvtAvcCapability& h264Capability);
#endif
void FillM4vCapability(VideoCodecCapabilityInfo& video_codec_info, PS_GenericCapability m4vcaps);
CodecCapabilityInfo* GetCodecCapabilityInfoMpeg4(PS_GenericCapability capability);
void FillUserInputCapability(CodecCapabilityInfo& codec_info, PS_UserInputCapability userinputCaps);
CodecCapabilityInfo* GetCodecCapabilityInfo(PS_UserInputCapability capability);
void ParseCapabilityIdentifierStandard(uint8* octet_string, uint16 octet_string_len, S_CapabilityIdentifierStandard& capabilityIdentifier);
unsigned GetMaxFrameRate(PS_DataType pDataType);
unsigned GetMaxFrameRate_H263(PS_H263VideoCapability h263caps);
unsigned GetMaxFrameRate_M4V(PS_GenericCapability m4vcaps);
unsigned GetMaxFrameRate_AVC(PS_GenericCapability avcCaps);
unsigned GetMaxBitrate(PS_DataType pDataType);
unsigned GetVideoFrameSize(PS_DataType pDataType, bool width);
unsigned GetVideoFrameSize_H263(PS_H263VideoCapability h263caps, bool width);
unsigned GetVideoFrameSize_M4V(PS_GenericCapability m4vcaps , bool width);

bool FindCodecForMediaType(PV2WayMediaType media, Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>&list, int* index);
bool IsSupported(Oscl_Vector<H324ChannelParameters, PVMFTscAlloc>& list, PV2WayMediaType media, CodecCapabilityInfo& codec_info, int*index);
CodecCapabilityInfo* IsSupported(CodecCapabilityInfo* codecInfo,
                                 Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& list);
bool IsResolutionSupported(const PVMFVideoResolution& resolution, const Oscl_Vector<PVMFVideoResolutionRange, OsclMemAllocator>& resolutions);
unsigned GetSampleInterval(PS_DataType pDataType);
bool PVCheckSH(uint8 *ptr, int32 size);

PS_H223LogicalChannelParameters
GetH223LogicalChannelParameters(uint8 al_index,
                                bool segmentable,
                                uint32 al_specific = 0);
/** Returns 1 if only one media type is present in the ACS.
   Returns 2 if there are more than one media type
   **/
uint16 GetCodecCapabilityInfo(PS_TerminalCapabilitySet pTcs,
                              PS_AlternativeCapabilitySet pAcs,
                              Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& in_codecs_acs);
void Deallocate(Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& cci);
PVMFStatus SetFormatSpecificInfo(PS_DataType pDataType, uint8* fsi, uint32 fsi_len);
uint32 SetFillerFsi(uint8* dest, uint32 dest_len);
bool IsFillerFsi(uint8* fsi, uint32 fsi_len);

/*
#ifdef __cplusplus
}
#endif*/

#define LOG_STATISTICS

#if defined(LOG_STATISTICS)
#define PV_STAT_SET(a, b)\
a  = b;
#else
#define PV_STAT_SET(a, b)
#endif

#if defined(LOG_STATISTICS)
#define PV_STAT_INCR(a, b)\
a  += b;
#else
#define PV_STAT_INCR(a, b)
#endif

#if defined(LOG_STATISTICS)
#define PV_STAT_INCR_COND(a, b, c)\
if(c){\
	a  += b;\
}
#else
#define PV_STAT_INCR_COND(a, b, c)
#endif

#if defined(LOG_STATISTICS)
#define PV_STAT_SET_TIME(a, cond)\
{\
if(cond == 0){\
	TimeValue timenow;\
	a = timenow;\
}\
}
#else
#define PV_STAT_SET_TIME(a, cond)
#endif

#endif	/* _h324utils_h */
