Home | History | Annotate | Download | only in src
      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 // ----------------------------------------------------------------------
     19 //
     20 // This Software is an original work of authorship of PacketVideo Corporation.
     21 // Portions of the Software were developed in collaboration with NTT  DoCoMo,
     22 // Inc. or were derived from the public domain or materials licensed from
     23 // third parties.  Title and ownership, including all intellectual property
     24 // rights in and to the Software shall remain with PacketVideo Corporation
     25 // and NTT DoCoMo, Inc.
     26 //
     27 // -----------------------------------------------------------------------
     28 
     29 #include    "tscmain.h"
     30 #include    "tsc_sub.h"     /* Sub Routine Information Header                */
     31 #include    "tsc_component.h"
     32 
     33 #define MAX_VENDOR_ID_OID_LEN 512 /* Max len of object identifier sequence */
     34 /*****************************************************************************/
     35 /*  function name        : Tsc_IdcVi                                         */
     36 /*  function outline     : VendorIdentification procedure                    */
     37 /*  function discription : Tsc_IdcVi( void )                                 */
     38 /*  input data           : None                                              */
     39 /*  output data          : None                                              */
     40 /*  draw time            : '96.11.29                                         */
     41 /*---------------------------------------------------------------------------*/
     42 /*  amendent career      :                                                   */
     43 /*                                                                           */
     44 /*              Copyright (C) 1996 NTT DoCoMo                                */
     45 /*****************************************************************************/
     46 void TSC_324m::Tsc_IdcVi(void)
     47 {
     48     S_ControlMsgHeader infHeader;
     49     PS_VendorIdentification      pVendorIdentification;
     50 
     51     if (iVendor == NULL)
     52     {
     53         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
     54                         (0, "TSC_324m:Tsc_IdcVi - Not sending vendor id\n"));
     55         return;
     56     }
     57     /* Buffer Allocate */
     58     pVendorIdentification = (PS_VendorIdentification)OSCL_DEFAULT_MALLOC(sizeof(S_VendorIdentification));
     59     oscl_memset(pVendorIdentification, 0, sizeof(S_VendorIdentification));
     60     if (iVendor->GetVendorType() == EObjectIdentifier)
     61     {
     62         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
     63                         (0, "TSC_324m:Tsc_IdcVi - EObjectIdentifier\n"));
     64         pVendorIdentification->vendor.index = 0; /* object */
     65         pVendorIdentification->vendor.object = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
     66         uint16 sz = 0;
     67         uint8* data = ((TPVH245VendorObjectIdentifier*)iVendor)->GetVendor(&sz);
     68         pVendorIdentification->vendor.object->size = sz;
     69         pVendorIdentification->vendor.object->data = (uint8*)OSCL_DEFAULT_MALLOC(sz);
     70         oscl_memcpy(pVendorIdentification->vendor.object->data, data, sz);
     71     }
     72     else if (iVendor->GetVendorType() == EH221NonStandard)
     73     {
     74         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
     75                         (0, "TSC_324m:Tsc_IdcVi - EH221NonStandard\n"));
     76         pVendorIdentification->vendor.index = 1; /* H221Nonstandard */
     77         pVendorIdentification->vendor.h221NonStandard =
     78             (struct _H221NonStandard *)OSCL_DEFAULT_MALLOC(sizeof(struct _H221NonStandard));
     79         pVendorIdentification->vendor.h221NonStandard->manufacturerCode =
     80             (uint16)((TPVVendorH221NonStandard*)iVendor)->GetManufacturerCode();
     81         pVendorIdentification->vendor.h221NonStandard->t35CountryCode =
     82             ((TPVVendorH221NonStandard*)iVendor)->GetT35CountryCode();
     83         pVendorIdentification->vendor.h221NonStandard->t35Extension =
     84             ((TPVVendorH221NonStandard*)iVendor)->GetT35Extension();
     85     }
     86     else
     87     {
     88         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
     89                         (0, "TSC_324m:Tsc_IdcVi - ERROR - Invalid vendor type\n"));
     90         OSCL_DEFAULT_FREE(pVendorIdentification);
     91         return;
     92     }
     93     pVendorIdentification->option_of_productNumber = false;
     94     if (iProductNumberLen)
     95     {
     96         pVendorIdentification->option_of_productNumber = true;
     97         pVendorIdentification->productNumber.size =
     98             (uint16)iProductNumberLen;
     99         pVendorIdentification->productNumber.data =
    100             (uint8*)OSCL_DEFAULT_MALLOC(iProductNumberLen);
    101         oscl_memcpy(pVendorIdentification->productNumber.data,
    102                     iProductNumber, iProductNumberLen);
    103     }
    104     pVendorIdentification->option_of_versionNumber = false;
    105     if (iVersionNumberLen)
    106     {
    107         pVendorIdentification->option_of_versionNumber = true;
    108         pVendorIdentification->versionNumber.size =
    109             (uint16)iVersionNumberLen;
    110         pVendorIdentification->versionNumber.data =
    111             (uint8*)OSCL_DEFAULT_MALLOC(iVersionNumberLen);
    112         oscl_memcpy(pVendorIdentification->versionNumber.data,
    113                     iVersionNumber, iVersionNumberLen);
    114     }
    115 
    116     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Vi, 0, 0,
    117                     (uint8*)pVendorIdentification, sizeof(S_VendorIdentification));
    118     /* Primitive Send */
    119     iH245->DispatchControlMessage(&infHeader);
    120     Delete_VendorIdentification(pVendorIdentification);
    121     OSCL_DEFAULT_FREE(pVendorIdentification);
    122     return;
    123 }
    124 
    125 uint32 TSC_324m::VendorIdRecv(PS_ControlMsgHeader  pReceiveInf)
    126 {
    127     PS_VendorIdentification  pVendorIdentification =
    128         (PS_VendorIdentification)pReceiveInf->pParameter;
    129 
    130     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    131                     (0, "TSC_324m: Vendor Id Received - vendor index(%d), opn(%d), ovn(%d)\n",
    132                      pVendorIdentification->vendor.index,
    133                      pVendorIdentification->option_of_productNumber,
    134                      pVendorIdentification->option_of_versionNumber));
    135     if (iVendorR)
    136     {
    137         OSCL_DELETE(iVendorR);
    138         iVendorR = NULL;
    139     }
    140 
    141     if (iProductNumberR)
    142     {
    143         OSCL_DEFAULT_FREE(iProductNumberR);
    144         iProductNumberR = NULL;
    145         iProductNumberLenR = 0;
    146     }
    147     if (iVersionNumberR)
    148     {
    149         OSCL_DEFAULT_FREE(iVersionNumberR);
    150         iVersionNumberR = NULL;
    151         iVersionNumberLenR = 0;
    152     }
    153 
    154     if (pVendorIdentification->vendor.index == 0) // object identifier
    155     {
    156         if (pVendorIdentification->vendor.object->size &&
    157                 (pVendorIdentification->vendor.object->size < MAX_VENDOR_ID_OID_LEN))
    158         {
    159             if (pVendorIdentification->vendor.object->data[pVendorIdentification->vendor.object->size - 1] == '\0')
    160             {
    161                 PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    162                                 (0, "TSC_324m: Vendor Id - %s\n",
    163                                  pVendorIdentification->vendor.object->data));
    164             }
    165             iVendorR = new TPVH245VendorObjectIdentifier((uint8*)pVendorIdentification->vendor.object->data,
    166                     pVendorIdentification->vendor.object->size);
    167         }
    168         else
    169         {
    170             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    171                             (0, "TSC_324m:VendorIdRecv - Error - invalid length(%d)\n",
    172                              pVendorIdentification->vendor.object->size));
    173             return iTerminalStatus;
    174         }
    175     }
    176     else if (pVendorIdentification->vendor.index == 1) // H221NonStandard
    177     {
    178         iVendorR = new TPVVendorH221NonStandard(pVendorIdentification->vendor.h221NonStandard->t35CountryCode,
    179                                                 pVendorIdentification->vendor.h221NonStandard->t35Extension,
    180                                                 pVendorIdentification->vendor.h221NonStandard->manufacturerCode);
    181     }
    182     else
    183     {
    184         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    185                         (0, "TSC_324m:VendorIdRecv - Error - invalid index(%d)\n",
    186                          pVendorIdentification->vendor.index));
    187         return iTerminalStatus;
    188     }
    189     if (pVendorIdentification->option_of_productNumber)
    190     {
    191         iProductNumberLenR = pVendorIdentification->productNumber.size;
    192     }
    193     if (iProductNumberLenR)
    194     {
    195         if (pVendorIdentification->productNumber.data[iProductNumberLenR-1] == '\0')
    196         {
    197             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    198                             (0, "TSC_324m: Product Number - %s\n",
    199                              pVendorIdentification->productNumber.data));
    200         }
    201         iProductNumberR = (uint8*)OSCL_DEFAULT_MALLOC(iProductNumberLenR);
    202         oscl_memcpy(iProductNumberR, pVendorIdentification->productNumber.data,
    203                     iProductNumberLenR);
    204     }
    205     if (pVendorIdentification->option_of_versionNumber)
    206     {
    207         iVersionNumberLenR = pVendorIdentification->versionNumber.size;
    208     }
    209     if (iVersionNumberLenR)
    210     {
    211         if (pVendorIdentification->versionNumber.data[iVersionNumberLenR-1] == '\0')
    212         {
    213             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    214                             (0, "TSC_324m: Version Number - %s\n",
    215                              pVendorIdentification->versionNumber.data));
    216         }
    217         iVersionNumberR = (uint8*)OSCL_DEFAULT_MALLOC(iVersionNumberLenR);
    218         oscl_memcpy(iVersionNumberR, pVendorIdentification->versionNumber.data, iVersionNumberLenR);
    219     }
    220     if (iTSC_324mObserver)
    221     {
    222         iTSC_324mObserver->IncomingVendorId(iVendorR, iProductNumberR,
    223                                             (uint16)iProductNumberLenR, iVersionNumberR, (uint16)iVersionNumberLenR);
    224     }
    225     return iTerminalStatus;
    226 }
    227 
    228 
    229 //-----------------------------------------------------------------------------
    230 // Tsc_UII_DTMF()                                              (RAN-UII)
    231 //
    232 // This routine sends a DTMF signal via H.245 UserInputIndication message.
    233 // It takes two input values:
    234 //
    235 //   uint8   dtmf_value      (ascii value of a character in [0123456789#*ABCD!])
    236 //   uint16  dtmf_duration   (duration of pulse in mSec; 0 means no duration)
    237 //-----------------------------------------------------------------------------
    238 void TSC_324m::Tsc_UII_DTMF(uint8 dtmf_value, uint16 dtmf_duration)
    239 {
    240     S_ControlMsgHeader           infHeader;
    241     PS_UserInputIndication       pUserInputIndication;
    242 
    243     // Allocate the UII structure
    244     pUserInputIndication = (PS_UserInputIndication)OSCL_DEFAULT_MALLOC(sizeof(S_UserInputIndication));
    245 
    246     // Fill in the 'signal'
    247     pUserInputIndication->index = 3;  /* signal */
    248     pUserInputIndication->signal = (PS_Signal) OSCL_DEFAULT_MALLOC(sizeof(S_Signal));
    249 
    250     pUserInputIndication->signal->option_of_signalRtp = 0;
    251     pUserInputIndication->signal->signalType.size = 1;
    252     pUserInputIndication->signal->signalType.data = (uint8*) OSCL_DEFAULT_MALLOC(1 * sizeof(uint8));
    253     pUserInputIndication->signal->signalType.data[0] = dtmf_value;
    254 
    255     if (dtmf_duration == 0)
    256     {
    257         pUserInputIndication->signal->option_of_duration = 0;
    258     }
    259     else
    260     {
    261         pUserInputIndication->signal->option_of_duration = 1;
    262         pUserInputIndication->signal->duration = dtmf_duration;
    263     }
    264 
    265     // Send the message
    266     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Ui, 0, 0, (uint8*)pUserInputIndication,
    267                     sizeof(S_UserInputIndication));
    268     iH245->DispatchControlMessage(&infHeader);
    269     Delete_UserInputIndication(pUserInputIndication);
    270     OSCL_DEFAULT_FREE(pUserInputIndication);
    271     return;
    272 }
    273 
    274 void TSC_324m::Tsc_UII_Alphanumeric(const uint8* str, uint16 str_len)
    275 {
    276     S_ControlMsgHeader           infHeader;
    277     PS_UserInputIndication       pUserInputIndication;
    278     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    279                     (0, "TSC_324m:Tsc_UII_Alphanumeric - len(%d)", str_len));
    280 
    281     // Allocate the UII structure
    282     pUserInputIndication = (PS_UserInputIndication)OSCL_DEFAULT_MALLOC(sizeof(S_UserInputIndication));
    283 
    284     // Fill in the 'signal'
    285     pUserInputIndication->index = 1;  /* alphanumeric */
    286     pUserInputIndication->alphanumeric = (PS_int8STRING) OSCL_DEFAULT_MALLOC(sizeof(S_int8STRING));
    287     pUserInputIndication->alphanumeric->size = str_len;
    288     pUserInputIndication->alphanumeric->data = (uint8*) OSCL_DEFAULT_MALLOC(str_len * sizeof(uint8));
    289     oscl_memcpy(pUserInputIndication->alphanumeric->data, str, str_len);
    290 
    291     // Send the message
    292     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Ui, 0, 0, (uint8*)pUserInputIndication,
    293                     sizeof(S_UserInputIndication));
    294     iH245->DispatchControlMessage(&infHeader);
    295     Delete_UserInputIndication(pUserInputIndication);
    296     OSCL_DEFAULT_FREE(pUserInputIndication);
    297     return;
    298 }
    299 
    300 uint32 TSC_324m::UserInputIndicationRecv(PS_ControlMsgHeader  pReceiveInf)
    301 {
    302     PS_UserInputIndication pUserInputIndication  = (PS_UserInputIndication)pReceiveInf->pParameter;
    303     CPVUserInput* uii = NULL;
    304     uint16 duration = 0;
    305 
    306     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    307                     (0, "TSC_324m: User Input Indication Received - index(%d)\n", pUserInputIndication->index));
    308     switch (pUserInputIndication->index)
    309     {
    310         case 1: /* alphanumeric */
    311             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    312                             (0, "TSC_324m: User Input Indication Received - alphanumeric size(%d)",
    313                              pUserInputIndication->alphanumeric->size));
    314             uii = OSCL_NEW(CPVUserInputAlphanumeric, (pUserInputIndication->alphanumeric->data,
    315                            pUserInputIndication->alphanumeric->size));
    316             break;
    317         case 3: /* signal */
    318             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    319                             (0, "TSC_324m: User Input Indication Received - signal option_of_duration(%d), option_of_signalRtp(%d), signalType(%d)", pUserInputIndication->signal->option_of_duration, pUserInputIndication->signal->option_of_signalRtp, pUserInputIndication->signal->signalType.size));
    320             if (pUserInputIndication->signal->option_of_duration)
    321             {
    322                 duration = pUserInputIndication->signal->duration;
    323             }
    324             uii = OSCL_NEW(CPVUserInputDtmf, (*pUserInputIndication->signal->signalType.data,
    325                                               false, duration));
    326             break;
    327         default:
    328             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    329                             (0, "TSC_324m: User Input Indication Received - unrecognized type\n"));
    330     }
    331     if (uii)
    332     {
    333         if (iTSC_324mObserver)
    334             iTSC_324mObserver->UserInputReceived(uii);
    335         OSCL_DELETE(uii);
    336     }
    337 
    338     return iTerminalStatus;
    339 }
    340 
    341 void TSC_324m::IndicationMisc(TIndicationMisc type,
    342                               TPVChannelId channelId,
    343                               uint32 param,
    344                               OsclAny* param1)
    345 {
    346     OSCL_UNUSED_ARG(param1);
    347     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    348                     (0, "TSC_324m::IndicationMisc type(%d), channelId(%d), param(%d), param1(%x)",
    349                      type, channelId, param, param1));
    350 
    351     S_ControlMsgHeader infHeader;
    352     S_MiscellaneousIndication miscellaneousIndication;
    353     oscl_memset(&miscellaneousIndication, 0, sizeof(S_MiscellaneousIndication));
    354 
    355     switch (type)
    356     {
    357         case EVideoTemporalSpatialTradeOffIdc:
    358             miscellaneousIndication.logicalChannelNumber = (uint16)channelId;
    359             miscellaneousIndication.miType.index = 9;
    360             miscellaneousIndication.miType.videoTemporalSpatialTradeOff = (uint8)param;
    361             break;
    362         default:
    363             return;
    364     }
    365 
    366     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Mscl, 0, 0,
    367                     (uint8*)&miscellaneousIndication, sizeof(S_MiscellaneousIndication));
    368     iH245->DispatchControlMessage(&infHeader);
    369 }
    370 
    371 void TSC_324m::Tsc_IdcSkew(TPVChannelId lcn1, TPVChannelId lcn2, uint16 skew)
    372 {
    373     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    374                     (0, "TSC_324m::Tsc_IdcSkew lcn1(%d), lcn2(%d), skew(%d)",
    375                      lcn1, lcn2, skew));
    376     S_ControlMsgHeader infHeader;
    377     S_H223SkewIndication skewIndication;
    378     oscl_memset(&skewIndication, 0, sizeof(S_H223SkewIndication));
    379     skewIndication.logicalChannelNumber1 = (uint16)lcn1;
    380     skewIndication.logicalChannelNumber2 = (uint16)lcn2;
    381     skewIndication.skew = skew;
    382 
    383     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_H223skw, 0, 0,
    384                     (uint8*)&skewIndication, sizeof(S_H223SkewIndication));
    385     iH245->DispatchControlMessage(&infHeader);
    386 }
    387 
    388 uint32 TSC_324m::MiscIndicationRecv(PS_ControlMsgHeader  pReceiveInf)
    389 {
    390     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    391                     (0, "TSC_324m::MiscIndicationRecv"));
    392     PS_MiscellaneousIndication indication = (PS_MiscellaneousIndication)pReceiveInf->pParameter;
    393     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    394                     (0, "TSC_324m::MiscIndicationRecv lcn(%d),index(%d)",
    395                      indication->logicalChannelNumber, indication->miType.index));
    396     switch (indication->miType.index)
    397     {
    398         case 9:
    399             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    400                             (0, "TSC_324m::MiscIndicationRecv videoSpatialTemporalTradeoff(%d)",
    401                              indication->miType.videoTemporalSpatialTradeOff));
    402             if (iTSC_324mObserver)
    403             {
    404                 iTSC_324mObserver->VideoSpatialTemporalTradeoffIndicationReceived(indication->logicalChannelNumber,
    405                         indication->miType.videoTemporalSpatialTradeOff);
    406             }
    407             break;
    408         default:
    409             PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    410                             (0, "TSC_324m::MiscIndicationRecv Indication not handled"));
    411             break;
    412     }
    413     return iTerminalStatus;
    414 }
    415 
    416 uint32 TSC_324m::SkewIndicationRecv(PS_ControlMsgHeader  pReceiveInf)
    417 {
    418     PS_H223SkewIndication indication = (PS_H223SkewIndication)pReceiveInf->pParameter;
    419     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    420                     (0, "TSC_324m::SkewIndicationRecv lcn1(%d), lcn2(%d), skew(%d)",
    421                      indication->logicalChannelNumber1,
    422                      indication->logicalChannelNumber2,
    423                      indication->skew));
    424     uint16 skew = indication->skew;
    425     if (skew > PV_2WAY_MAX_SKEW_MS)
    426     {
    427         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    428                         (0, "TSC_324m::SkewIndicationRecv skew(%d) > max skew(%d)",
    429                          indication->skew, PV_2WAY_MAX_SKEW_MS));
    430         skew = PV_2WAY_MAX_SKEW_MS;
    431     }
    432 
    433     /* Validate the skew indication */
    434     OlcParam* olcparam = iTSCcomponent->FindOlc(INCOMING, PV_AUDIO, OLC_ESTABLISHED);
    435     if (!olcparam)
    436     {
    437         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
    438                         (0, "TSC_324m::SkewIndicationRecv Established incoming audio lcn not found"));
    439         return iTerminalStatus ;
    440     }
    441     if (indication->logicalChannelNumber2 != olcparam->GetChannelId())
    442     {
    443         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
    444                         (0, "TSC_324m::SkewIndicationRecv indication->logicalChannelNumber2=%d != audio lcn id=%d",
    445                          indication->logicalChannelNumber2, olcparam->GetChannelId()));
    446         //return iTerminalStatus ;
    447     }
    448 
    449     olcparam = iTSCcomponent->FindOlc(INCOMING, PV_VIDEO, OLC_ESTABLISHED);
    450     if (!olcparam)
    451     {
    452         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
    453                         (0, "TSC_324m::SkewIndicationRecv Established incoming video lcn not found"));
    454         return iTerminalStatus ;
    455     }
    456     if (indication->logicalChannelNumber1 != olcparam->GetChannelId())
    457     {
    458         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
    459                         (0, "TSC_324m::SkewIndicationRecv indication->logicalChannelNumber1=%d != video lcn id=%d",
    460                          indication->logicalChannelNumber1, olcparam->GetChannelId()));
    461         //return iTerminalStatus ;
    462     }
    463 
    464     if (iTSC_324mObserver)
    465     {
    466         iTSC_324mObserver->SkewIndicationReceived(indication->logicalChannelNumber1,
    467                 indication->logicalChannelNumber2, skew);
    468     }
    469     //Obtain logical channel #1, and transmit the skew duration
    470     OsclSharedPtr<H223IncomingChannel> channel;
    471     PVMFStatus retVal = iH223->GetIncomingChannel(indication->logicalChannelNumber1, channel);
    472 
    473     if (retVal != PVMFSuccess)
    474     {
    475         PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING, (0, "TSC_324m::SkewIndicationRecv Error - Failed to lookup logical channel %d", indication->logicalChannelNumber1));
    476         return iTerminalStatus;
    477     }
    478 
    479     channel->SetTimestampOffset(skew);
    480 
    481     return iTerminalStatus;
    482 }
    483 
    484 void TSC_324m::SendFunctionNotSupportedIndication(uint16 cause,
    485         uint8* function,
    486         uint16 len)
    487 {
    488     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    489                     (0, "TSC_324m::SendFunctionNotSupportedIndication"));
    490     S_ControlMsgHeader infHeader;
    491     S_FunctionNotSupported fnsIndication;
    492     oscl_memset(&fnsIndication, 0, sizeof(S_FunctionNotSupported));
    493     fnsIndication.fnsCause.index = cause;
    494     if (function && len)
    495     {
    496         fnsIndication.option_of_returnedFunction = 1;
    497         fnsIndication.returnedFunction.size = len;
    498         fnsIndication.returnedFunction.data = function;
    499     }
    500     Tsc_SendDataSet(&infHeader, H245_PRIMITIVE, E_PtvId_Idc_Fns, 0, 0,
    501                     (uint8*)&fnsIndication, sizeof(S_FunctionNotSupported));
    502     iH245->DispatchControlMessage(&infHeader);
    503     return;
    504 }
    505 
    506 uint32 TSC_324m::FunctionNotSupportedIndicationReceived(PS_ControlMsgHeader  pReceiveInf)
    507 {
    508     OSCL_UNUSED_ARG(pReceiveInf);
    509     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    510                     (0, "TSC_324m::FunctionNotSupportedIndicationReceived"));
    511     return iTerminalStatus;
    512 }
    513 
    514 uint32 TSC_324m::FlowControlIndicationReceived(PS_ControlMsgHeader  pReceiveInf)
    515 {
    516     OSCL_UNUSED_ARG(pReceiveInf);
    517     PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
    518                     (0, "TSC_324m::FlowControlIndicationReceived"));
    519     return iTerminalStatus;
    520 }
    521 
    522