/* ------------------------------------------------------------------
 * 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.
 * -------------------------------------------------------------------
 */
// ----------------------------------------------------------------------
//
// This Software is an original work of authorship of PacketVideo Corporation.
// Portions of the Software were developed in collaboration with NTT  DoCoMo,
// Inc. or were derived from the public domain or materials licensed from
// third parties.  Title and ownership, including all intellectual property
// rights in and to the Software shall remain with PacketVideo Corporation
// and NTT DoCoMo, Inc.
//
// -----------------------------------------------------------------------
/*****************************************************************************/
/*  file name            : tsc_command.c                                     */
/*  file contents        : Terminal State Control routine                    */
/*  draw                 : '96.10.04                                         */
/*---------------------------------------------------------------------------*/
/*  amendment                                                                */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
#include    "oscl_base.h"
#include    "h245def.h"
#include    "tsc_sub.h"         /* Sub Routine Information Header            */
#include    "tscmain.h"

/*****************************************************************************/
/*  function name        : Tsc_EndSessionCommand                             */
/*  function outline     : Command (Change or EndSession) procedure          */
/*  function discription : Tsc_EndSessionCommand( void )                     */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
void TSC_324m::EndSessionCommand()
{
    PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
                    (0, "TSC_324m::EndSessionCommand"));
    S_ControlMsgHeader infHeader;
    S_EndSessionCommand endSessionCommand;

    oscl_memset(&endSessionCommand, 0, sizeof(S_EndSessionCommand));
    endSessionCommand.index = 1;  // disconnect

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Es,
                    0,
                    0,
                    (uint8*)&endSessionCommand,
                    sizeof(S_EndSessionCommand));
    iH245->DispatchControlMessage(&infHeader);
}

/*****************************************************************************/
/*  function name        : Tsc_CmdStcs                                       */
/*  function outline     : Command (SendTerminalCapabilitySet) procedure     */
/*  function discription : Tsc_CmdStcs( void )                               */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
OSCL_EXPORT_REF void TSC_324m::SendTerminalCapabilitySetCommand()
{
    S_ControlMsgHeader infHeader;
    S_SendTerminalCapabilitySet sendTerminalCapabilitySet;

    oscl_memset(&sendTerminalCapabilitySet, 0,
                sizeof(S_SendTerminalCapabilitySet));

    sendTerminalCapabilitySet.index = 1; // genericRequest

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Stcs,
                    0,
                    0,
                    (uint8*)&sendTerminalCapabilitySet,
                    sizeof(S_SendTerminalCapabilitySet));
    iH245->DispatchControlMessage(&infHeader);
}


/*****************************************************************************/
/*  function name        : Tsc_CmdEcrpt                                      */
/*  function outline     : Command (Encryption) procedure                    */
/*  function discription : Tsc_CmdEcrpt( void )                              */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
void TSC_324m::CmdEcrpt()
{
    S_ControlMsgHeader infHeader;
    S_EncryptionCommand encryptionCommand;

    oscl_memset(&encryptionCommand, 0, sizeof(S_EncryptionCommand));

    encryptionCommand.index = 1; // encryptionIVRequest

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Ecrpt,
                    0,
                    0,
                    (uint8*)&encryptionCommand,
                    sizeof(S_EncryptionCommand));
    iH245->DispatchControlMessage(&infHeader);
}

/*****************************************************************************/
/*  function name        : Tsc_CmdFc                                         */
/*  function outline     : Command (FlowControl) procedure                   */
/*  function discription : Tsc_CmdFc( void )                                 */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
void TSC_324m::CmdFc()
{
    S_ControlMsgHeader infHeader;
    S_FlowControlCommand flowControlCommand;

    oscl_memset(&flowControlCommand, 0, sizeof(S_FlowControlCommand));

    /// ORIGINAL CODEWORD : {wholeMultiplex, noRestriction}
    //pFlowControlCommand->fccScope.index = 2;  // wholeMultiplex
    //pFlowControlCommand->fccRestriction.index = 1; // noRestriction

    // ALTERNATE CODEWORD: {logicalChannelNumber=3,maximumBitRate=1000}
    flowControlCommand.fccScope.index = 0;  // logicalChannelNumber
    flowControlCommand.fccScope.logicalChannelNumber = 3;
    flowControlCommand.fccRestriction.index = 0; // maximumBitRate
    flowControlCommand.fccRestriction.maximumBitRate = 1000;

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Fc,
                    0,
                    0,
                    (uint8*)&flowControlCommand,
                    sizeof(S_FlowControlCommand));
    iH245->DispatchControlMessage(&infHeader);
}

/*****************************************************************************/
/*  function name        : Tsc_CmdHmr                                  (RAN) */
/*  function outline     : H223MultiplexReconfiguration procedure            */
/*---------------------------------------------------------------------------*/
/*  This routine initiates transmission of H223MultiplexReconfiguration.     */
/*  The option argument is in [0...5] corresponding to:                      */
/*    {toLevel0, toLevel1, toLevel2, toLevel2Hdr, dFlagStart, dFlagStop}     */
/*****************************************************************************/
void TSC_324m::CmdHmr(int32 option)
{
    S_ControlMsgHeader infHeader;
    S_H223MultiplexReconfiguration hmr;
    S_H223ModeChange modeChange;
    S_H223AnnexADoubleFlag doubleFlag;

    oscl_memset(&hmr, 0, sizeof(S_H223MultiplexReconfiguration));

    if (option < 4)
    {
        hmr.index = 0; // h223ModeChange
        hmr.h223ModeChange = &modeChange;
        hmr.h223ModeChange->index = (uint16)option;
    }
    else
    {
        hmr.index = 1; // h223AnnexADoubleFlag
        hmr.h223AnnexADoubleFlag = &doubleFlag;
        hmr.h223AnnexADoubleFlag->index = (uint16)(option - 4);
    }

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Hmr,
                    0,
                    0,
                    (uint8*)&hmr,
                    sizeof(S_H223MultiplexReconfiguration));
    iH245->DispatchControlMessage(&infHeader);
}

/*****************************************************************************/
/*  function name        : Tsc_CmdMscl                                       */
/*  function outline     : Command (MiscellaneousCommands) procedure         */
/*  function discription : Tsc_CmdMscl( int32 )                                */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  NOTE: Input CommandIndex specifies one of the sample commands to transmit*/
/*        Currently these are:                                               */
/*          0 --> videoFastUpdatePicture for Lcn=3                           */
/*          1 --> videoTemporalSpatialTradeOff=29 for Lcn=3                  */
/*          2 --> maxH223MUXPDUsize=256 for Lcn=3                            */
/*****************************************************************************/
void TSC_324m::CmdMisc(TCmdMisc type, TPVChannelId channelId, uint32 param)
{
    S_ControlMsgHeader infHeader;
    S_MiscellaneousCommand miscellaneousCommand;

    oscl_memset(&miscellaneousCommand, 0, sizeof(S_MiscellaneousCommand));

    switch (type)
    {
        case EVideoFastUpdatePicture:
            miscellaneousCommand.logicalChannelNumber = (uint16)channelId;
            miscellaneousCommand.mcType.index = 5; // videoFastUpdatePicture
            break;
        case EVideoTemporalSpatialTradeOff:
            miscellaneousCommand.logicalChannelNumber = (uint16)channelId;
            miscellaneousCommand.mcType.index = 7; // videoTemporalSpatialTradeOff
            miscellaneousCommand.mcType.videoTemporalSpatialTradeOff = (uint8)param;
            break;
        case EMaxH223MUXPDUsize:
            miscellaneousCommand.logicalChannelNumber = (uint16)channelId;
            miscellaneousCommand.mcType.index = 11; // maxH223MUXPDUsize
            miscellaneousCommand.mcType.maxH223MUXPDUsize = (uint16)param;
            break;
        default:
            break;
    }

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Cmd_Mscl,
                    0,
                    0,
                    (uint8*)&miscellaneousCommand,
                    sizeof(S_MiscellaneousCommand));
    iH245->DispatchControlMessage(&infHeader);
}

/*****************************************************************************/
/*  function name        : Tsc_RtdTrfReq                                     */
/*  function outline     : Tsc_RtdTrfReq                                     */
/*  function discription : Tsc_RtdTrfReq( void )                             */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
void TSC_324m::RtdTrfReq()
{
    S_ControlMsgHeader infHeader;

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Rtd_Trf_Req,
                    0, 0, NULL, 0);

    // Primitive Send
    iH245->DispatchControlMessage(&infHeader);

    return;
}

OSCL_EXPORT_REF void TSC_324m::SendModeRequestCommand()
{
    S_ControlMsgHeader infHeader;
    PS_RequestMode          pParameter;
    PS_ModeDescription      pModeDescription;
    PS_ModeElement          pModeElement, pModeElement2;
    PS_VideoMode            pVideoMode; /* RAN */
    PS_AudioMode            pAudioMode; /* WWURM */
    PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
                    (0, "TSC_324m::SendModeRequestCommand"));

    // Buffer Allocate
    pParameter = (PS_RequestMode)OSCL_DEFAULT_MALLOC(sizeof(S_RequestMode));

    // TRANSFER.request primitive - Parameter[MODE-ELEMENT]
    pParameter->size_of_requestedModes = 1;

    // Buffer Allocate
    pModeDescription = (PS_ModeDescription)OSCL_DEFAULT_MALLOC(
                           sizeof(S_ModeDescription));

    // ModeDescription
    pModeDescription->size = 2;

    // Buffer Allocate
    pModeElement = (PS_ModeElement)OSCL_DEFAULT_MALLOC(
                       pModeDescription->size * sizeof(S_ModeElement));


    pModeElement->option_of_h223ModeParameters = false;
    pModeElement->option_of_v76ModeParameters = false;
    pModeElement->option_of_h2250ModeParameters = false;
    pModeElement->option_of_genericModeParameters = false;
    pModeElement->modeType.index = 1;  // videoMode
    pModeElement->modeType.videoMode =
        pVideoMode = (PS_VideoMode) OSCL_DEFAULT_MALLOC(sizeof(S_VideoMode));

    pVideoMode->index = 3;   // H.263 Video
    pVideoMode->h263VideoMode = (PS_H263VideoMode) OSCL_DEFAULT_MALLOC(sizeof(S_H263VideoMode));
    pVideoMode->h263VideoMode->h263Resolution.index = 1; // QCIF
    pVideoMode->h263VideoMode->bitRate = 480;       // 48000 bits/sec
    pVideoMode->h263VideoMode->unrestrictedVector = false;
    pVideoMode->h263VideoMode->arithmeticCoding = false;
    pVideoMode->h263VideoMode->advancedPrediction = false;
    pVideoMode->h263VideoMode->pbFrames = false;
    pVideoMode->h263VideoMode->option_of_errorCompensation = false;
    pVideoMode->h263VideoMode->option_of_enhancementLayerInfo = false;
    pVideoMode->h263VideoMode->option_of_h263Options = false;

    pModeElement2 = &pModeElement[1];
    pModeElement2->option_of_h223ModeParameters = false;
    pModeElement2->option_of_v76ModeParameters = false;
    pModeElement2->option_of_h2250ModeParameters = false;
    pModeElement2->option_of_genericModeParameters = false;
    pModeElement2->modeType.index = 2;  // audioMode
    pModeElement2->modeType.audioMode =

        pAudioMode = (PS_AudioMode) OSCL_DEFAULT_MALLOC(sizeof(S_AudioMode));
    PS_GenericCapability    genericCap;
    pAudioMode->index = 20;
    pAudioMode->genericAudioMode = genericCap =
                                       (PS_GenericCapability) OSCL_DEFAULT_MALLOC(sizeof(S_GenericCapability));
    genericCap->capabilityIdentifier.index = 0;
    genericCap->capabilityIdentifier.standard =
        (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
    genericCap->capabilityIdentifier.standard->size = 7;
    genericCap->capabilityIdentifier.standard->data =
        (uint8*) OSCL_DEFAULT_MALLOC(7 * sizeof(uint8));
    genericCap->capabilityIdentifier.standard->data[0] = 0x00;
    genericCap->capabilityIdentifier.standard->data[1] = 0x08;
    genericCap->capabilityIdentifier.standard->data[2] = 0x81;
    genericCap->capabilityIdentifier.standard->data[3] = 0x75;
    genericCap->capabilityIdentifier.standard->data[4] = 0x01;
    genericCap->capabilityIdentifier.standard->data[5] = 0x01;
    genericCap->capabilityIdentifier.standard->data[6] = 0x01;
    genericCap->option_of_maxBitRate = true;
    genericCap->maxBitRate = 122;
    genericCap->option_of_collapsing = true;
    genericCap->size_of_collapsing = 1;
    genericCap->collapsing =
        (PS_GenericParameter) OSCL_DEFAULT_MALLOC(sizeof(S_GenericParameter));
    genericCap->collapsing[0].parameterIdentifier.index = 0;
    genericCap->collapsing[0].parameterIdentifier.standard = 0;
    genericCap->collapsing[0].parameterValue.index = 2;
    genericCap->collapsing[0].parameterValue.unsignedMin = 1;
    genericCap->collapsing[0].option_of_supersedes = false;
    genericCap->option_of_nonCollapsing = true;
    genericCap->size_of_nonCollapsing = 1;
    genericCap->nonCollapsing =
        (PS_GenericParameter) OSCL_DEFAULT_MALLOC(sizeof(S_GenericParameter));
    genericCap->nonCollapsing[0].parameterIdentifier.index = 0;
    genericCap->nonCollapsing[0].parameterIdentifier.standard = 1;
    genericCap->nonCollapsing[0].parameterValue.index = 2;
    genericCap->nonCollapsing[0].parameterValue.unsignedMin = 1;
    genericCap->nonCollapsing[0].option_of_supersedes = false;

    genericCap->option_of_nonCollapsingRaw = false;
    genericCap->option_of_transport = false;


    // Link the sub-objects together
    pModeDescription->item = pModeElement;
    pParameter->requestedModes = pModeDescription;

    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Mr_Trf_Req,
                    0,
                    0,
                    (uint8*)pParameter,
                    sizeof(S_RequestMode));

    // Primitive Send
    iH245->DispatchControlMessage(&infHeader);

    Delete_RequestMode(pParameter);
    OSCL_DEFAULT_FREE(pParameter);

    return;
}

/*****************************************************************************/
/*  function name        : MrRjtReq                                     */
/*  function outline     : MrRjtReq                                     */
/*  function discription : MrRjtReq( void )                             */
/*  input data           : None                                              */
/*  output data          : None                                              */
/*  draw time            : '96.10.09                                         */
/*---------------------------------------------------------------------------*/
/*  amendent career      :                                                   */
/*                                                                           */
/*              Copyright (C) 1996 NTT DoCoMo                                */
/*****************************************************************************/
void TSC_324m::MrRjtReq()
{
    PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
                    (0, "TSC_324m::MrRjtReq"));
    S_ControlMsgHeader infHeader;
    S_RmRejectCause     parameter;
    oscl_memset(&parameter, 0, sizeof(S_RmRejectCause));

    // REJECT.request primitive - Parameter[CAUSE]
    parameter.index = 2; // requestDenied
    Tsc_SendDataSet(&infHeader,
                    H245_PRIMITIVE,
                    E_PtvId_Mr_Rjt_Req,
                    0,
                    0,
                    (uint8*)&parameter,
                    sizeof(S_RmRejectCause));

    // Primitive Send
    iH245->DispatchControlMessage(&infHeader);

    return;

}

