Home | History | Annotate | Download | only in include
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 #if !defined(LOWER_LAYER_H)
     19 #define LOWER_LAYER_H
     20 #include "oscl_types.h"
     21 #include "oscl_time.h"
     22 #ifndef OSCL_TIMER_H_INCLUDED
     23 #include "oscl_timer.h"
     24 #endif
     25 #include "pvt_params.h"
     26 #include "pduparcom.h"
     27 #include "layer.h"
     28 #include "media_packet.h"
     29 
     30 #ifndef OSCL_BASE_H_INCLUDED
     31 #include "oscl_base.h"
     32 #endif
     33 #ifndef OSCLCONFIG_IO_H_INCLUDED
     34 #include "osclconfig_io.h"
     35 #endif
     36 
     37 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED
     38 #include "oscl_scheduler_ao.h"
     39 #endif
     40 
     41 #ifndef OSCL_FILE_IO_H_INCLUDED
     42 #include "oscl_file_io.h"
     43 #endif
     44 
     45 #ifndef OSCL_PRIQUEUE_H_INCLUDED
     46 #include "oscl_priqueue.h"
     47 #endif
     48 
     49 #ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
     50 #include "oscl_mem_mempool.h"
     51 #endif
     52 
     53 #ifndef PVMF_MEDIA_DATA_H_INCLUDED
     54 #include "pvmf_media_data.h"
     55 #endif
     56 
     57 #ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
     58 #include "pvmf_simple_media_buffer.h"
     59 #endif
     60 
     61 #ifndef PVMF_NODE_INTERFACE_H_INCLUDED
     62 #include "pvmf_node_interface.h"
     63 #endif
     64 
     65 #ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED
     66 #include "pvmf_port_base_impl.h"
     67 #endif
     68 
     69 #ifndef PVMF_POOL_BUFFER_ALLOCATOR_H_INCLUDED
     70 #include "pvmf_pool_buffer_allocator.h"
     71 #endif
     72 
     73 #ifndef PVLOGGER_H_INCLUDED
     74 #include "pvlogger.h"
     75 #endif
     76 
     77 #include "h223types.h"
     78 #define H223_MAX_SEND_SIZE  1024
     79 #define DEFAULT_BITRATE 64000
     80 #define H223_DEMUX_BUFFER_INTERVAL_MS 0
     81 
     82 class LowerLayerObserver
     83 {
     84     public:
     85         virtual ~LowerLayerObserver() {}
     86         virtual PVMFStatus GetOutgoingMuxPdus(MuxPduPacketList& packets) = 0;
     87         virtual void LevelSetupComplete(PVMFStatus status, TPVH223Level level) = 0;
     88         virtual void DataReceptionStart() = 0;
     89         virtual H223PduParcomObserver* GetParcomObserver()  = 0;
     90         virtual void LowerLayerError(TPVDirection direction, PVMFStatus error) = 0;
     91 };
     92 
     93 
     94 /* Lower layer which binds to Network IO */
     95 class H223LowerLayer : public PvmfPortBaseImpl,
     96         public PVMFPortActivityHandler,
     97         public OsclTimerObject,
     98         public OsclTimerObserver,
     99         public H223PduParcomObserver
    100 {
    101     public:
    102         H223LowerLayer(int32 aPortTag, TPVLoopbackMode aLoopbackMode);
    103         ~H223LowerLayer();
    104 
    105         void SetObserver(LowerLayerObserver* observer)
    106         {
    107             iObserver = observer;
    108             if (iParcom.GetRep())
    109                 iParcom->SetObserver(iObserver->GetParcomObserver());
    110         }
    111 
    112         LowerLayerObserver* GetObserver()
    113         {
    114             return iObserver;
    115         }
    116 
    117         TPVStatusCode SetTimerRes(uint32 timer_res)
    118         {
    119             iMinTimerResolution = timer_res;
    120             UpdatePduSize();
    121             return EPVT_Success;
    122         }
    123 
    124         TPVStatusCode Open();
    125         TPVStatusCode Close();
    126         TPVStatusCode Start(H223PduParcomSharedPtr parcom);
    127         TPVStatusCode Stop();
    128 
    129         PVMFStatus Connect(PVMFPortInterface* aPort);
    130         void HandlePortActivity(const PVMFPortActivity &);
    131         //Force lower layer to stop.
    132         int Abort();
    133 
    134         TPVStatusCode SetLevel(TPVH223Level muxLevel);
    135 
    136         TPVH223Level GetLevel()
    137         {
    138             return iParcom->GetLevel();
    139         }
    140 
    141         TPVStatusCode SetBitrate(uint32 bitRate);
    142 
    143         TPVStatusCode SetTransmitProfile(bool iAnxA, bool iAnxADf, bool iAnxB, bool iAnxBOh)
    144         {
    145             iUseAnnexA = iAnxA;
    146             iUseAnnexADoubleFlag = iAnxADf;
    147             iUseAnnexB = iAnxB;
    148             iUseAnnexBwithHeader = iAnxBOh;
    149             return EPVT_Success;
    150         }
    151 
    152         TPVStatusCode SetMaxOutgoingPduSize(uint16 Size);
    153 
    154         int GetMinTimerRes()
    155         {
    156             return iMinTimerResolution;
    157         }
    158         /* Implement PAcketInput: process incoming packet */
    159         void PacketIn(PVMFSharedMediaDataPtr aMediaData);
    160 
    161         /* Dispatch outgoing packet */
    162         void DispatchPacket(OsclSharedPtr<PVMFMediaDataImpl>& pack);
    163 
    164         void SetLoopbackMode(TPVLoopbackMode aLoopbackMode);
    165 
    166         int iTimerIntervalNum;
    167         unsigned int iMinTimerResolution;
    168 
    169         void TimeoutOccurred(int32 timerID, int32 timeoutInfo);
    170 
    171         /* H223PduParcomObserver virtuals */
    172         uint32 MuxPduIndicate(uint8* pPdu, uint32 pduSz, int32 fClosing, int32 muxCode);
    173         void MuxPduErrIndicate(EMuxPduError err);
    174         void MuxSetupComplete(PVMFStatus status, TPVH223Level level);
    175         unsigned SetStuffingSize(TPVH223Level level);
    176 
    177         unsigned GetStuffingSize()
    178         {
    179             return iParcom->GetStuffingSz();
    180         }
    181         unsigned GetHeaderSize()
    182         {
    183             return iParcom->GetHeaderSz();
    184         }
    185 
    186         unsigned SetPduSize(unsigned pdu_size);
    187         unsigned GetPduSize()
    188         {
    189             return iPduSize;
    190         }
    191         unsigned GetSendSize();
    192 
    193         void ResetStats();
    194         void LogStats(TPVDirection dir);
    195         int32 GetTimestamp();
    196         void GetHdrFragment(OsclRefCounterMemFrag& hdr_frag);
    197         PVMFStatus CompletePacket(OsclSharedPtr<PVMFMediaDataImpl>& packet, int mt_entry, int pm);
    198         void DoStuffing(TPVH223Level level,
    199                         OsclSharedPtr<PVMFMediaDataImpl>& pkt,
    200                         uint32 stuffing_sz,
    201                         uint8 mux_code = 0);
    202         void SendStuffingMsgHeader(uint8* stuffing, uint16 num_bytes);
    203     protected:
    204         PVMFStatus PutData(PVMFSharedMediaMsgPtr aMsg);
    205         void Parse(uint8* buf, uint16 size);
    206         bool CheckLevel(uint8* pData, uint16 size , uint16* used_bytes, int* sync_detected);
    207         bool CheckLevelWithSync(uint8* pData, uint16 size, uint16* used_bytes) ;
    208         void SignalLevelSetupComplete(PVMFStatus status);
    209 
    210         void Run();
    211         void DoCancel();
    212     private:
    213         void InitParams();
    214         void InitRuntimeParams();
    215         PVMFStatus Mux();
    216         void UpdatePduSize();
    217         void CreateParcom(TPVH223Level level);
    218         void MuxException();
    219 
    220         LowerLayerObserver* iObserver;
    221 
    222         /* Transmit profile */
    223         bool iUseAnnexA;
    224         bool iUseAnnexADoubleFlag;
    225         bool iUseAnnexB;
    226         bool iUseAnnexBwithHeader;
    227 
    228         /* multiplex level */
    229         bool iLevelSetupComplete;
    230 
    231         /* Stuffing buffers for each level.  Pre-allocated and initialized with stuffing for that level */
    232         PVMFBufferPoolAllocator* iMemFragmentAlloc;
    233         OsclRefCounterMemFrag iStuffingFrag[MAX_H223_LEVELS+1];
    234 
    235         uint16 iStuffingSz[8];
    236 
    237         /* bitrate, bps */
    238         uint32 iBitrate;
    239 
    240         FragmentAllocator* iHdrFragmentAlloc;
    241 
    242         PVMFMediaFragGroupCombinedAlloc<OsclMemAllocator>* iDispatchPacketAlloc;
    243         OsclMemPoolFixedChunkAllocator* iMediaDataImplMemAlloc;
    244 
    245         OsclMemPoolFixedChunkAllocator* iMediaMsgPoolAlloc;
    246 
    247         OsclSharedPtr<PVMFMediaDataImpl> iDispatchPacket;
    248         MuxPduPacketList iSendPacketList;
    249 
    250         /* Send MUX-PDU size */
    251         unsigned iSendPduSz;
    252         unsigned iPduSize;
    253         unsigned iStuffingSize;
    254 
    255         /* Timer stuff */
    256         OsclTimer<OsclMemAllocator> iTimer;
    257 
    258         /* operational state */
    259         int iState;
    260         int iStateVal;
    261 
    262         /* PDU parcoms */
    263         H223PduParcomSharedPtr iParcom;
    264         TPVLoopbackMode iLoopbackMode;
    265 
    266         int iTimerCnt;
    267         int iBytesSent;
    268         uint32 iSendTimes;
    269 
    270         TimeValue iStartTimeTx;
    271         uint32 iNumBytesTx;
    272         uint32 iNumMuxSduBytesTx;
    273         uint32 iNumStuffingBytesTx;
    274         uint32 iNumPdusTx;
    275         uint32 iNumPmTx;
    276 
    277         TimeValue iStartTimeRx;
    278         uint32 iNumBytesRx;
    279 
    280         TimeValue  iLevelSetupTime;
    281 
    282         // Allocator for simple media data buffer
    283         OsclMemAllocator iMemAlloc;
    284         PVMFSimpleMediaBufferCombinedAlloc iMediaDataAlloc;
    285         TimeValue iStartMuxTime;
    286         TimeValue iLastMuxTime;
    287 
    288         PVLogger* iLogger;
    289         uint8* iDemuxBuffer;
    290         uint8* iDemuxBufferPos;
    291         uint32 iDemuxBufferSize;
    292         uint32 iSyncCheckCount;
    293         bool iSkipLevelCheck;
    294         uint8* iIdleSyncCheckBuffer;
    295         bool iSyncDetected;
    296         bool iDataReceptionStart;
    297 };
    298 
    299 
    300 #endif
    301