blob: b75ccd154a42ba9e0ec772a9ad70ff70c84c8ba6 [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.
* -------------------------------------------------------------------
*/
#if !defined(ADAPTATION_LAYER_H)
#define ADAPTATION_LAYER_H
#include "oscl_types.h"
#include "oscl_error_codes.h"
#include "pvt_params.h"
#include "h245def.h"
#include "crccheck_cpp.h"
#include "h324utils.h"
#ifndef PVMF_MEDIA_FRAG_GROUP_H_INCLUDED
#include "pvmf_media_frag_group.h"
#endif
#ifndef PVMF_POOL_BUFFER_ALLOCATOR_H_INCLUDED
#include "pvmf_pool_buffer_allocator.h"
#endif
#define DEF_AL2_SN_POS 1
#define DEF_AL3_SN_POS 2
class IncomingALPduInfo
{
public:
IncomingALPduInfo() : sdu_size(0), crc_error(0), seq_num_error(0) {}
int16 sdu_size;
bool crc_error;
int32 seq_num_error;
};
class AdaptationLayer
{
public:
AdaptationLayer(TPVDirection dir, uint32 sdu_size, uint32 max_num_sdus): iLogger(NULL)
{
OSCL_UNUSED_ARG(dir);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "AdaptationLayer::AdaptationLayer Dir=%d, Sdu Size=%d, Max num sdus=%d", dir, sdu_size, max_num_sdus));
iSduSize = sdu_size;
iMaxNumSdus = max_num_sdus;
iPktNum = 0;
}
virtual ~AdaptationLayer() {}
virtual unsigned GetHdrSz() = 0;
virtual unsigned GetTrlrSz() = 0;
virtual PVMFStatus StartPacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt) = 0;
virtual PVMFStatus CompletePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt) = 0;
virtual void ParsePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt, IncomingALPduInfo& info) = 0;
unsigned GetSduSize()
{
return iSduSize;
}
unsigned GetPduSize()
{
return iSduSize + GetHdrSz() + GetTrlrSz();
}
virtual void Construct() = 0;
protected:
uint32 iSduSize;
uint32 iMaxNumSdus;
int32 iPktNum;
PVLogger* iLogger;
};
class AdaptationLayer1 : public AdaptationLayer
{
public:
AdaptationLayer1(TPVDirection dir, uint32 sdu_size, uint32 max_num_sdus) : AdaptationLayer(dir, sdu_size, max_num_sdus)
{
}
void Construct();
unsigned GetHdrSz()
{
return 0;
}
unsigned GetTrlrSz()
{
return 0;
}
PVMFStatus StartPacket(OsclSharedPtr<PVMFMediaDataImpl>& /*pkt*/)
{
return PVMFSuccess;
}
PVMFStatus CompletePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt);
void ParsePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt, IncomingALPduInfo& info);
};
class AdaptationLayer2 : public AdaptationLayer
{
public:
AdaptationLayer2(TPVDirection dir, uint32 sdu_size, uint32 max_num_sdus, bool seqno = false)
: AdaptationLayer(dir, sdu_size, max_num_sdus),
iSNPos(0),
iHdrSz(0),
iTrlrSz(1)
{
SetSeqnum(seqno);
iSeqNum = 0;
}
void Construct();
~AdaptationLayer2()
{
}
inline unsigned GetHdrSz()
{
return iHdrSz;
}
inline unsigned GetTrlrSz()
{
return iTrlrSz;
}
PVMFStatus StartPacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt);
PVMFStatus CompletePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt);
void ParsePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt, IncomingALPduInfo& info);
void SetSeqnum(bool on_off);
private:
unsigned iSNPos;
unsigned iHdrSz;
unsigned iTrlrSz;
unsigned iSeqNum;
PVMFBufferPoolAllocator iMemFragmentAlloc;
CRC crc;
};
class AdaptationLayer3 : public AdaptationLayer
{
public:
AdaptationLayer3(TPVDirection dir, uint32 sdu_size, uint32 max_num_sdus, uint16 snpos)
: AdaptationLayer(dir, sdu_size, max_num_sdus),
iSNPos(snpos),
iHdrSz(snpos),
iTrlrSz(2)
{
iSeqNum = 0;
}
~AdaptationLayer3()
{
}
void Construct();
inline unsigned GetHdrSz()
{
return iHdrSz;
}
inline unsigned GetTrlrSz()
{
return iTrlrSz;
}
void SetSeqnumSz(uint16 sz);
PVMFStatus StartPacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt);
PVMFStatus CompletePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt);
void ParsePacket(OsclSharedPtr<PVMFMediaDataImpl>& pkt, IncomingALPduInfo& info);
private:
void DRTXSend(int , uint16)
{
}
void AlDrtxInd()
{
}
unsigned iSNPos;
unsigned iHdrSz;
unsigned iTrlrSz;
unsigned iSeqNum;
PVMFBufferPoolAllocator iMemFragmentAlloc;
CRC crc;
};
class AdaptationLayerAlloc
{
public:
static int GetAlIndex(ErrorProtectionLevel_t epl)
{
switch (epl)
{
case E_EP_LOW:
return 1;
case E_EP_MEDIUM:
return 2;
case E_EP_HIGH:
return 3;
}
return 0;
}
static OsclSharedPtr<AdaptationLayer> GetAdaptationLayer(TPVDirection dir,
PS_H223LogicalChannelParameters lcnParams,
uint32 sdu_size,
uint32 max_num_sdus)
{
uint16 al_index = 0;
uint16 hint = 0;
switch (lcnParams->adaptationLayerType.index)
{
case 1:
al_index = 1;
break;
case 2:
al_index = 1;
break;
case 3:
al_index = 2;
hint = 0;
break;
case 4:
al_index = 2;
hint = 1;
break;
case 5:
al_index = 3;
hint = lcnParams->adaptationLayerType.al3->controlFieldOctets;
break;
}
return GetAdaptationLayer(dir, al_index, sdu_size, max_num_sdus, hint);
}
static OsclSharedPtr<AdaptationLayer> GetAdaptationLayer(TPVDirection dir,
uint16 index,
uint32 sdu_size,
uint32 max_num_sdus,
uint16 hint)
{
AdaptationLayer* al = NULL;
void* ptr = NULL;
switch (index)
{
case 1:
ptr = OSCL_DEFAULT_MALLOC(sizeof(AdaptationLayer1));
al = new(ptr)AdaptationLayer1(dir, sdu_size, max_num_sdus);
break;
case 2:
ptr = OSCL_DEFAULT_MALLOC(sizeof(AdaptationLayer2));
al = new(ptr)AdaptationLayer2(dir, sdu_size, max_num_sdus, (hint ? true : false));
break;
case 3:
ptr = OSCL_DEFAULT_MALLOC(sizeof(AdaptationLayer3));
al = new(ptr)AdaptationLayer3(dir, sdu_size, max_num_sdus, hint);
break;
default:
OSCL_LEAVE(OsclFailure);
}
al->Construct();
OsclRefCounterSA<Oscl_TAlloc<AdaptationLayer, BasicAlloc> > *alRefCounter =
new OsclRefCounterSA<Oscl_TAlloc<AdaptationLayer, BasicAlloc> >(ptr);
OsclSharedPtr<AdaptationLayer> alPtr(al, alRefCounter);
return alPtr;
}
static uint16 GetHdrSz(int index)
{
switch (index)
{
case 0:
case 1:
case 2:
case 3:
return 0;
case 4:
return 1;
case 5:
return 2;
}
return 0;
}
static int GetTrlrSz(int index)
{
switch (index)
{
case 0:
case 1:
case 2:
return 0;
case 3:
case 4:
return 1;
case 5:
return 2;
}
return 0;
}
};
#endif