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 #ifndef PV_2WAY_ENGINE_H_INCLUDED
     19 #define PV_2WAY_ENGINE_H_INCLUDED
     20 
     21 #ifndef OSCL_BASE_H_INCLUDED
     22 #include "oscl_base.h"
     23 #endif
     24 
     25 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED
     26 #include "oscl_scheduler_ao.h"
     27 #endif
     28 
     29 #ifndef OSCL_TIMER_H_INCLUDED
     30 #include "oscl_timer.h"
     31 #endif
     32 
     33 #ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
     34 #include "pvmf_media_clock.h"
     35 #endif
     36 
     37 #ifndef OSCL_BYTE_ORDER_H_INCLUDED
     38 #include "oscl_byte_order.h"
     39 #endif
     40 
     41 #ifndef PV_2WAY_INTERFACE_H_INCLUDED
     42 #include "pv_2way_interface.h"
     43 #endif
     44 
     45 #ifndef PV_2WAY_BASIC_INTERFACES_H_INCLUDE
     46 #include "pv_2way_basic_interfaces.h"
     47 #endif
     48 
     49 #ifndef PVMF_NODE_INTERFACE_H_INCLUDED
     50 #include "pvmf_node_interface.h"
     51 #endif
     52 
     53 #ifndef PVLOGGER_H_INCLUDED
     54 #include "pvlogger.h"
     55 #endif
     56 
     57 #ifndef PV_MP4_H263_ENC_EXTENSION_H_INCLUDED
     58 #include "pvmp4h263encextension.h"
     59 #endif
     60 
     61 // COMM and Stack related
     62 #ifndef NO_2WAY_324
     63 #ifndef TSCMAIN_H_INCLUDED // Gkl
     64 #include "tscmain.h"
     65 #endif
     66 #endif
     67 
     68 #define MAX_TX_AUDIO_CODECS_SUPPORTED 2
     69 #define MAX_RX_AUDIO_CODECS_SUPPORTED 2
     70 #define MAX_TX_VIDEO_CODECS_SUPPORTED 3
     71 #define MAX_RX_VIDEO_CODECS_SUPPORTED 3
     72 
     73 #define MAX_LOGICAL_CHANNEL_PARAMS 3
     74 #define MAX_PENDING_2WAY_COMMANDS 20
     75 #define MAX_PENDING_2WAY_EVENTS 20 // Gkl
     76 #define MAX_PENDING_2WAY_ERRORS 20 // Gkl
     77 #define MAX_PENDING_2WAY_NODE_COMMANDS 20
     78 #define MAX_2WAY_SOURCESINK 2
     79 #define MAX_SESSION_CHANNELS 4
     80 #define MAX_SESSION_MEDIA_CAPS MAX_SESSION_CHANNELS*2
     81 
     82 
     83 #if defined (__WINS__)
     84 #define AUDIO_INPUT_FILENAME _STRLIT("c:\\audio_in.if2")
     85 #define AUDIO_OUTPUT_FILENAME _STRLIT("c:\\audio_out.if2")
     86 #else
     87 #define AUDIO_INPUT_FILENAME _STRLIT("e:\\audio_in.if2")
     88 #define AUDIO_OUTPUT_FILENAME _STRLIT("e:\\audio_out.if2")
     89 #endif
     90 
     91 #define MAX_AMR_BITRATE 12200
     92 #define MIN_AMR_BITRATE 12200
     93 #define MAX_AUDIO_BITRATE 12200
     94 
     95 #define DEFAULT_MIN_IFRAME_REQ_INT 1
     96 #define IFRAME_REQ_TIMERID 1
     97 
     98 
     99 #define END_SESSION_TIMER_ID 2
    100 #define END_SESSION_TIMER "end_session_timer"
    101 #define END_SESSION_TIMER_FREQUENCY 5
    102 #define END_SESSION_TIMER_VALUE 3
    103 /* End session interval = END_SESSION_TIMER_VALUE * 1000/END_SESSION_TIMER_FREQUENCY */
    104 
    105 #define REMOTE_DISCONNECT_TIMER_ID 3
    106 #define REMOTE_DISCONNECT_TIMER "remote_disconnect_timer"
    107 #define REMOTE_DISCONNECT_TIMER_FREQUENCY 5
    108 #define REMOTE_DISCONNECT_TIMER_VALUE 3
    109 
    110 
    111 
    112 #define MAX_VIDEO_BITRATE 40000
    113 
    114 #define VIDEO_ENCODER_WIDTH 176
    115 #define VIDEO_ENCODER_HEIGHT 144
    116 #if defined (__WINS__)
    117 #define VIDEO_ENCODER_FRAME_RATE 2
    118 #else
    119 #define VIDEO_ENCODER_FRAME_RATE 7.5
    120 #endif
    121 // TBD ARI: This should be removed when capability exchange between video encoder and video source is implemented
    122 #define VIDEO_INPUT_FRAME_RATE VIDEO_ENCODER_FRAME_RATE
    123 #define VIDEO_ENCODER_BITRATE 42000
    124 #define VIDEO_ENCODER_RVLC 0
    125 #define VIDEO_ENCODER_DATA_PARTITIONING 1
    126 #define VIDEO_ENCODER_I_FRAME_INTERVAL 5
    127 #define VIDEO_ENCODER_RATE_CONTROL PVMFVEN_RATE_CONTROL_CBR
    128 #define VIDEO_ENCODER_INPUT_FORMAT PVMFVEN_INPUT_YUV420
    129 #define VIDEO_ENCODER_SEGMENT_SIZE 256
    130 
    131 //Play defaults
    132 #define DEFAULT_PLAY_FROM_FILE_TYPE PVMF_MIME_MPEG4FF
    133 #define DEFAULT_PLAY_FROM_FILE_AUDIO PVMF_MIME_AMR_IETF
    134 #define DEFAULT_PLAY_FROM_FILE_VIDEO PVMF_MIME_YUV420
    135 
    136 //Gkl
    137 #if defined(PV_RECORD_TO_FILE_SUPPORT)
    138 #define RECORDED_FILESIZE_NOTIFICATION_TIMERID 2
    139 #define MIN_RECORDED_FILESIZE_NOTIFICATION_INTERVAL 500
    140 #endif
    141 
    142 #if defined(PV_PLAY_FROM_FILE_SUPPORT)
    143 //Play defaults
    144 #define DEFAULT_PLAY_FROM_FILE_TYPE PVMF_MIME_MPEG4FF
    145 #define DEFAULT_PLAY_FROM_FILE_AUDIO PVMF_MIME_AMR_IETF
    146 #define DEFAULT_PLAY_FROM_FILE_VIDEO PVMF_MIME_YUV420
    147 #endif
    148 
    149 
    150 class PvmfNodesSyncControlInterface;
    151 typedef enum
    152 {
    153     EPV2WayAudio = 0,
    154     EPV2WayVideo,
    155     EPV2WayMuxData
    156 } TPV2WayMediaType;
    157 
    158 typedef enum
    159 {
    160     EPV2WayAudioIn = 0,
    161     EPV2WayAudioOut,
    162     EPV2WayVideoIn,
    163     EPV2WayVideoOut
    164 } TPV2WayPortTagType;
    165 
    166 /**
    167  * TPV2WayCommandType enum
    168  *
    169  *  Enumeration of types of commands that can be issued to the pv2way(Used internall by engine).
    170  *  The comments for each command type specify the possible error codes that can be
    171  *  returned with the completion of each command.  For details on each command, pls refer the
    172  *  interface definition
    173  *
    174  **/
    175 
    176 enum TPV2WayCommandType
    177 {
    178     /**
    179      * Indicates completion of the initialization process.   If successful, the terminal
    180      * should be in the ESetup state.  If failed, the pv2way remains in the
    181      * Eidle state.  The derived class contains information about which
    182      * components failed to initialize.
    183      *
    184      * The application must wait for this callback after the terminal is instantiated
    185      * before calling any of the terminal APIs.
    186      *
    187      * If it fails, a system-wide error code is returned.
    188      *
    189      **/
    190     PVT_COMMAND_INIT,
    191     /**
    192      * Indicates completion of a GetSDKInfoL call. If successful, the reference to the
    193      * TPVSDKInfo struct passed in will be populated with version information pertaining
    194      * to the pv2way SDK
    195      * If it fails, a system-wide error code is returned.
    196      *
    197      **/
    198     PVT_COMMAND_GET_SDK_INFO,
    199     /**
    200      * Indicates completion of a GetSDKModuleInfoL call. If successful, the reference to the
    201      * TPVSDKModuleInfo struct passed in will be populated with version information pertaining
    202      * to the currently loaded modules
    203      * If it fails, a system-wide error code is returned.
    204      *
    205      **/
    206     PVT_COMMAND_GET_SDK_MODULE_INFO,
    207     /**
    208      * Indicates completion of a GetPV2WayStateL call. If successful, the reference to the
    209      * TPV2WayState struct passed in will be populated with current state information.
    210      * If it fails, a system-wide error code is returned.
    211      *
    212      **/
    213     PVT_COMMAND_GET_PV2WAY_STATE,
    214     /**
    215      * Indicates that the terminal has released all resources and is in the EIdle
    216      * state.  It is now ok to de-allocate the terminal.
    217      * If it fails, a system-wide error code is returned.
    218      **/
    219     PVT_COMMAND_RESET,
    220     /**
    221      * This indicates the completion status of a previously issued
    222      * AddDataSourceL command.
    223      *
    224      * If successful, the engine will start the source and either start demuxing (COMM source)
    225      * or, sending media data from the source (mic, camera etc).
    226      *
    227      * On failure, a system-wide error code is returned.
    228      * The application may either re-try AddDataSourceL, or disconnect
    229      * the call.   The application does not have to call RemoveDataSourceL.
    230      *
    231      * Information about the track - codec, bitrate etc.  are provided via the derived
    232      * class
    233      **/
    234     PVT_COMMAND_ADD_DATA_SOURCE,
    235     /**
    236      * This  indicates the completion status of a previously issued RemoveMediaSource command.
    237      *
    238      * If successful, the track is closed and all resources associated with the track
    239      * have been released.
    240      *
    241      * Once this callback is invoked for a track, the pointer to CPVTrackInfo
    242      * for the track will be invalid.
    243      *
    244      * If it fails, a system-wide error code is returned.
    245      *
    246      **/
    247     PVT_COMMAND_REMOVE_DATA_SOURCE,
    248     /**
    249      * This indicates the completion status of a previously issued
    250      * AddDataSinkL command.  It also provides track information.
    251      *
    252      * If successful, the engine will start sending media data to the sink.
    253      *
    254      * If it fails, a system-wide error code is returned.
    255      * The application may either re-try AddDataSinkL, or disconnect
    256      * the call.   The application does not have to call RemoveMediaSink.
    257      *
    258      * Information about the track - codec, bitrate etc.  are provided via the derived
    259      * class
    260      **/
    261     PVT_COMMAND_ADD_DATA_SINK,
    262     /**
    263      * Similar to RemoveMediaSource
    264      **/
    265     PVT_COMMAND_REMOVE_DATA_SINK,
    266     /**
    267      * Indicates completion of a pending Connect command.  If successful,
    268      * the application can open the media tracks using the AddMediaSource API.
    269      *
    270      * If Connnect fails, a system-wide error code is returned.
    271      * The application can either re-try Connect or de-allocate the terminal.
    272      * The Phone application does not have to call Disconnect if ConnectComplete is
    273      * called with a status that indicates failure.
    274      *
    275      **/
    276     PVT_COMMAND_CONNECT,
    277     /**
    278      * Indicates completion of a pending Disconnect command.   The terminal
    279      * transitions from EDisconnecting back to the ESetup state.   The Phone
    280      * application may now call Connect again or reset and de-allocate the terminal.
    281      * If it fails, a system-wide error code is returned.
    282      *
    283      **/
    284     PVT_COMMAND_DISCONNECT,
    285 
    286     /**
    287      * Indicates completion of a pending Pause command.
    288      *
    289      **/
    290     PVT_COMMAND_PAUSE,
    291     /**
    292      * Indicates completion of a pending Resume command.
    293      *
    294      **/
    295     PVT_COMMAND_RESUME,
    296     /**
    297      * Indicates completion of a pending SetLogAppenderL command.
    298      *
    299      **/
    300     PVT_COMMAND_SET_LOG_APPENDER,
    301     /**
    302      * Indicates completion of a pending RemoveLogAppenderL command.
    303      *
    304      **/
    305     PVT_COMMAND_REMOVE_LOG_APPENDER,
    306     /**
    307      * Indicates completion of a pending SetLogLevel command.
    308      *
    309      **/
    310     PVT_COMMAND_SET_LOG_LEVEL,
    311     /**
    312      * Indicates completion of a pending GetLogLevel command.
    313      *
    314      **/
    315     PVT_COMMAND_GET_LOG_LEVEL,
    316     /**
    317      * Indicates completion of QueryUUIDL command
    318      *
    319      **/
    320     PVT_COMMAND_QUERY_UUID,
    321     /**
    322      * Indicates completion of QueryInterfaceL command
    323      *
    324      **/
    325     PVT_COMMAND_QUERY_INTERFACE,
    326     /**
    327      * Indicates pending Init or Connect commands were cancelled
    328      *
    329      **/
    330     PVT_COMMAND_CANCEL_ALL_COMMANDS,
    331 
    332     PVT_LAST_COMMAND
    333 };
    334 
    335 // This function returns a priority index for each format type.
    336 uint32 GetPriorityIndexForPVMFFormatType(PVMFFormatType aFormatType);
    337 
    338 //Priority to MP4 over H.263
    339 template<class Alloc> struct PV2WayRegFormatTypeCompare
    340 {
    341     bool operator()(const PVMFFormatType& x, const PVMFFormatType& y) const
    342     {
    343         uint32 x_val = GetPriorityIndexForPVMFFormatType(x);
    344         uint32 y_val = GetPriorityIndexForPVMFFormatType(y);
    345 
    346         return (x_val < y_val) ? true : false;
    347     }
    348 };
    349 
    350 class TPV2WayNotificationInfo
    351 {
    352     public:
    353         enum TPV2WayNotificationInfoType
    354         {
    355             EPV2WayCommandType,
    356             EPV2WayEventType
    357         };
    358 
    359         TPV2WayNotificationInfo(TPV2WayNotificationInfoType aType) : notificationType(aType) {};
    360         virtual ~TPV2WayNotificationInfo() {};
    361 
    362         TPV2WayNotificationInfoType notificationType;
    363 };
    364 
    365 class TPV2WayCmdInfo : public TPV2WayNotificationInfo
    366 {
    367     public:
    368         TPV2WayCmdInfo() : TPV2WayNotificationInfo(EPV2WayCommandType),
    369                 type(PVT_COMMAND_INIT),
    370                 id(0),
    371                 contextData(NULL),
    372                 status(PVMFSuccess),
    373                 responseData(NULL),
    374                 responseDataSize(0),
    375                 iPvtCmdData(0)
    376         {};
    377 
    378         ~TPV2WayCmdInfo() {};
    379 
    380         void Clear()
    381         {
    382             type = PVT_COMMAND_INIT;
    383             id = 0;
    384             contextData = NULL;
    385             status = PVMFSuccess;
    386             responseData = NULL;
    387             responseDataSize = 0;
    388             iPvtCmdData = 0;
    389         }
    390 
    391         TPV2WayCommandType type;
    392         PVCommandId id;
    393         void *contextData;
    394         TPVCmnCommandStatus status;
    395         void* responseData;
    396         int32 responseDataSize;
    397         uint32 iPvtCmdData;
    398 };
    399 
    400 class TPV2WayEventInfo : public TPV2WayNotificationInfo
    401 {
    402     public:
    403         TPV2WayEventInfo() : TPV2WayNotificationInfo(EPV2WayEventType),
    404                 type(PVT_INDICATION_INCOMING_TRACK),
    405                 exclusivePtr(NULL),
    406                 localBufferSize(0)
    407 
    408         {
    409             oscl_memset(localBuffer, 0, PV_COMMON_ASYNC_EVENT_LOCAL_BUF_SIZE);
    410         };
    411 
    412         ~TPV2WayEventInfo() {};
    413 
    414         void Clear()
    415         {
    416             type = PVT_INDICATION_INCOMING_TRACK;
    417             exclusivePtr = NULL;
    418             localBufferSize = 0;
    419             oscl_memset(localBuffer, 0, PV_COMMON_ASYNC_EVENT_LOCAL_BUF_SIZE);
    420         }
    421 
    422         TPVTIndicationType type;
    423         TPVCmnExclusivePtr exclusivePtr;
    424         uint32 localBufferSize;
    425         uint8 localBuffer[PV_COMMON_ASYNC_EVENT_LOCAL_BUF_SIZE];
    426 };
    427 
    428 /**
    429  * TPV2WayPortStatus Class
    430  *
    431  * An enumeration of port status
    432  **/
    433 typedef enum
    434 {
    435     ENoPort = 0,
    436     ERequestPort,
    437     EHasPort,
    438     EReleasePort
    439 } TPV2WayPortStatus;
    440 
    441 class CPV2WayPort
    442 {
    443     public:
    444         CPV2WayPort() : iPort(NULL),
    445                 iPortStatus(ENoPort),
    446                 iPortCmdId(0)
    447         {};
    448 
    449         ~CPV2WayPort() {};
    450 
    451         PVMFPortInterface *GetPort()
    452         {
    453             return iPort;
    454         }
    455         TPV2WayPortStatus GetStatus()
    456         {
    457             return iPortStatus;
    458         }
    459         PVCommandId GetCmdId()
    460         {
    461             return iPortCmdId;
    462         }
    463 
    464         void SetPort(PVMFPortInterface *aPort)
    465         {
    466             if (aPort)
    467             {
    468                 iPortStatus = EHasPort;
    469             }
    470             else
    471             {
    472                 iPortStatus = ENoPort;
    473             }
    474             iPort = aPort;
    475         }
    476         void SetStatus(TPV2WayPortStatus aStatus)
    477         {
    478             iPortStatus = aStatus;
    479         }
    480         void SetCmdId(PVCommandId aId)
    481         {
    482             iPortCmdId = aId;
    483         }
    484 
    485     private:
    486         PVMFPortInterface *iPort;
    487         TPV2WayPortStatus iPortStatus;
    488         PVCommandId iPortCmdId;
    489 };
    490 
    491 
    492 typedef enum
    493 {
    494     PV2WAY_NODE_CMD_QUERY_INTERFACE,
    495     PV2WAY_NODE_CMD_INIT,
    496     PV2WAY_NODE_CMD_REQUESTPORT,
    497     PV2WAY_NODE_CMD_PREPARE,
    498     PV2WAY_NODE_CMD_START,
    499     PV2WAY_NODE_CMD_PAUSE,
    500     PV2WAY_NODE_CMD_STOP,
    501     PV2WAY_NODE_CMD_RELEASEPORT,
    502     PV2WAY_NODE_CMD_RESET,
    503     PV2WAY_NODE_CMD_CANCELCMD,
    504     PV2WAY_NODE_CMD_CANCELALL,
    505     PV2WAY_NODE_CMD_INVALID,
    506     PV2WAY_NODE_CMD_QUERY_UUID,
    507     PV2WAY_NODE_CMD_SKIP_MEDIA_DATA
    508 }  PV2WayNodeCmdType;
    509 
    510 class TPV2WayNodeQueryInterfaceParams
    511 {
    512     public:
    513         PVUuid *iUuid;
    514         PVInterface **iInterfacePtr;
    515 };
    516 
    517 class TPV2WayNodeQueryUuidParams
    518 {
    519     public:
    520         Oscl_Vector<PVUuid, OsclMemAllocator> *iUuids;
    521         OSCL_HeapString<OsclMemAllocator> mimetype;
    522 };
    523 
    524 
    525 
    526 class PV2WayNodeInterface
    527 {
    528     public:
    529         typedef enum
    530         {
    531             NoInterface,
    532             QueryInterface,
    533             HasInterface
    534         } InterfaceState;
    535 
    536         PV2WayNodeInterface() : iState(NoInterface),
    537                 iInterface(NULL),
    538                 iId(0)
    539         {};
    540 
    541         ~PV2WayNodeInterface() {};
    542 
    543         void Reset()
    544         {
    545             iState = NoInterface;
    546             iInterface = NULL;
    547             iId = 0;
    548         }
    549 
    550         InterfaceState iState;
    551         PVInterface *iInterface;
    552         PVMFCommandId iId;
    553 };
    554 
    555 class CPV2WayNodeCommandObserver
    556 {
    557     public:
    558         virtual void CommandHandler(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse) = 0;
    559 
    560 };
    561 
    562 class CPV2WayNodeContextData
    563 {
    564     public:
    565         CPV2WayNodeContextData() : iObserver(NULL),
    566                 iNode(NULL),
    567                 iContextData(NULL)
    568         {};
    569 
    570         void Clear()
    571         {
    572             iObserver = NULL;
    573             iNode = NULL;
    574             iContextData = NULL;
    575         }
    576 
    577         CPV2WayNodeCommandObserver *iObserver;
    578         PVMFNodeInterface   *iNode;
    579         void *iContextData;
    580 };
    581 
    582 class TPV2WayNodeCmdInfo
    583 {
    584     public:
    585         TPV2WayNodeCmdInfo() : type(PV2WAY_NODE_CMD_INIT),
    586                 id(0),
    587                 engineCmdInfo(NULL)
    588         {};
    589 
    590         ~TPV2WayNodeCmdInfo() {};
    591 
    592         void Clear()
    593         {
    594             type = PV2WAY_NODE_CMD_INIT;
    595             id = 0;
    596             context.Clear();
    597             engineCmdInfo = NULL;
    598         }
    599 
    600         PV2WayNodeCmdType type;
    601         PVMFCommandId id;
    602         CPV2WayNodeContextData context;
    603         TPV2WayCmdInfo *engineCmdInfo;
    604 };
    605 
    606 class TPV2WayNodeRequestPortParams
    607 {
    608     public:
    609         TPV2WayNodeRequestPortParams() : portTag(-1),
    610                 format(PVMF_MIME_FORMAT_UNKNOWN)
    611         {};
    612 
    613         int32 portTag;
    614         PVMFFormatType format;
    615 };
    616 
    617 class TPV2WayNode
    618 {
    619     public:
    620         TPV2WayNode() : iNode(NULL),
    621                 iSessionId(0)
    622         {};
    623 
    624         TPV2WayNode(PVMFNodeInterface *aNode) : iNode(aNode), iSessionId(0)
    625         {};
    626 
    627 
    628         TPV2WayNode(const TPV2WayNode &aNode) : iNode(aNode.iNode),
    629                 iSessionId(aNode.iSessionId)
    630         {};
    631 
    632         TPV2WayNode& operator=(const TPV2WayNode& a)
    633         {
    634             iNode = a.iNode;
    635             iSessionId = a.iSessionId;
    636             return *this;
    637         }
    638 
    639         void Clear()
    640         {
    641             iNode = NULL;
    642             iSessionId = 0;
    643         }
    644 
    645         operator PVMFNodeInterface *()
    646         {
    647             return iNode;
    648         }
    649 
    650         PVMFSessionId GetSessionId()
    651         {
    652             return iSessionId;
    653         }
    654 
    655         PVMFNodeInterface *iNode;
    656         PVMFSessionId iSessionId;
    657 };
    658 
    659 class SinkNodeIFList
    660 {
    661     public:
    662 
    663         SinkNodeIFList() : iSinkNode(NULL)
    664                 , iNodeInterface()
    665 
    666         {};
    667 
    668         ~SinkNodeIFList()
    669         {};
    670 
    671         SinkNodeIFList(const SinkNodeIFList& aList)
    672         {
    673             iSinkNode = aList.iSinkNode;
    674             iNodeInterface = aList.iNodeInterface;
    675         };
    676 
    677         void Clear()
    678         {
    679             iSinkNode = NULL;
    680             iNodeInterface.Reset();
    681         }
    682 
    683         TPV2WayNode* iSinkNode;
    684         PV2WayNodeInterface iNodeInterface;
    685 };
    686 
    687 class PlayFromFileNode;
    688 class CPVDatapathNode;
    689 class CPV2WayDecDataChannelDatapath;
    690 class CPV2WayEncDataChannelDatapath;
    691 class CPV2WayMuxDatapath;
    692 class CPV2WayPreviewDatapath;
    693 class CPV2WayRecDatapath;
    694 class CPV2WayInitDatapath;
    695 class PVCommandStatusObserver;
    696 class PVInformationalEventObserver;
    697 class PVErrorEventObserver;
    698 
    699 class CPV2WayNodeConfigurationObserver
    700 {
    701     public:
    702         virtual PVMFStatus ConfigureNode(CPVDatapathNode *aNode) = 0;
    703 };
    704 
    705 class CPV324m2Way : OsclActiveObject,
    706         public CPV2WayInterface,
    707         public PVMFNodeCmdStatusObserver,
    708         public PVMFNodeInfoEventObserver,
    709         public PVMFNodeErrorEventObserver,
    710         public CPV2WayNodeCommandObserver,
    711         public CPV2WayNodeConfigurationObserver,
    712 #ifndef NO_2WAY_324
    713         public TSCObserver,
    714 #endif
    715         public OsclTimerObserver
    716 {
    717     public:
    718         OSCL_IMPORT_REF static CPV324m2Way *NewL(PVMFNodeInterface* aTsc,
    719                 TPVTerminalType aTerminalType,
    720                 PVCommandStatusObserver* aCmdStatusObserver,
    721                 PVInformationalEventObserver *aInfoEventObserver,
    722                 PVErrorEventObserver *aErrorEventObserver);
    723 
    724         OSCL_EXPORT_REF static void Delete(CPV324m2Way *aTerminal);
    725 
    726         PVCommandId GetSDKInfo(PVSDKInfo &aSDKInfo, OsclAny* aContextData = NULL);
    727         PVCommandId GetSDKModuleInfo(PVSDKModuleInfo &aSDKModuleInfo, OsclAny* aContextData = NULL);
    728         PVCommandId Init(PV2WayInitInfo& aInitInfo, OsclAny* aContextData = NULL);
    729         PVCommandId Reset(OsclAny* aContextData = NULL);
    730         PVCommandId AddDataSource(PVTrackId aChannelId, PVMFNodeInterface& aDataSource, OsclAny* aContextData = NULL);
    731         PVCommandId RemoveDataSource(PVMFNodeInterface& aDataSource, OsclAny* aContextData = NULL);
    732         PVCommandId AddDataSink(PVTrackId aChannelId, PVMFNodeInterface& aDataSink, OsclAny* aContextData = NULL);
    733         PVCommandId RemoveDataSink(PVMFNodeInterface& aDataSink, OsclAny* aContextData = NULL);
    734         PVCommandId Connect(const PV2WayConnectOptions& aOptions, PVMFNodeInterface* aCommServer = NULL, OsclAny* aContextData = NULL);
    735         PVCommandId Disconnect(OsclAny* aContextData = NULL);
    736         PVCommandId GetState(PV2WayState& aState, OsclAny* aContextData = NULL);
    737         PVCommandId SetLatencyQualityTradeoff(PVMFNodeInterface& aTrack, int32 aTradeoff, OsclAny* aContextData = NULL);
    738         PVCommandId Pause(PV2WayDirection aDirection, PVTrackId aTrackId, OsclAny* aContextData = NULL);
    739         PVCommandId Resume(PV2WayDirection aDirection, PVTrackId aTrackId, OsclAny* aContextData = NULL);
    740         PVCommandId SetLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, OsclAny* aContextData = NULL);
    741         PVCommandId RemoveLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, OsclAny* aContextData = NULL);
    742         PVCommandId SetLogLevel(const char* aTag, int32 aLevel, bool aSetSubtree = false, OsclAny* aContextData = NULL);
    743         PVCommandId GetLogLevel(const char* aTag, int32& aLogInfo, OsclAny* aContextData = NULL);
    744         //PVCommandId SendUserInput(CPVUserInput& user_input, OsclAny* aContextData = NULL);
    745         //PVCommandId GetCallStatistics(CPVCmn2WayStatistics& aStats, OsclAny* aContextData = NULL);
    746         PVCommandId QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr, OsclAny* aContext = NULL);
    747         PVCommandId QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid, BasicAlloc>& aUuids,
    748                               bool aExactUuidsOnly = false, OsclAny* aContextData = NULL);
    749         PVCommandId CancelAllCommands(OsclAny* aContextData = NULL);
    750 
    751         // from PVMFNodeCmdEventObserver
    752         void NodeCommandCompleted(const PVMFCmdResp& aResponse);
    753 
    754         // from PVMFNodeInfoEventObserver
    755         void HandleNodeInformationalEvent(const PVMFAsyncEvent& aEvent);
    756 
    757         // from PVMFNodeErrorEventObserver
    758         void HandleNodeErrorEvent(const PVMFAsyncEvent& aEvent);
    759 
    760         // from CPV2WayNodeCommandObserver
    761         void CommandHandler(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    762 
    763         // from CPV2WayNodeConfigurationObserver
    764         PVMFStatus ConfigureNode(CPVDatapathNode *aNode);
    765 
    766         //TSC Observer Virtuals
    767         /* Responses to commands */
    768         void OutgoingChannelEstablished(TPVChannelId id, PVCodecType_t codec, uint8* fsi, uint32 fsi_len);
    769         /* Unsolicited indications */
    770         void ConnectComplete(PVMFStatus status);
    771         void InternalError();
    772         /* Requests engine to stop av codecs.  TSC will clean up logical channels by itself */
    773         void DisconnectRequestReceived();
    774         TPVStatusCode IncomingChannel(TPVChannelId aId,
    775                                       PVCodecType_t aCodec,
    776                                       uint8* aFormatSpecificInfo = NULL, uint32 aFormatSpecificInfoLen = 0);
    777         void ChannelClosed(TPVDirection direction, TPVChannelId id, PVCodecType_t codec, PVMFStatus status = PVMFSuccess);
    778         void RequestFrameUpdate(PVMFPortInterface *port);
    779 
    780         // OsclTimerObserver virtuals
    781         void TimeoutOccurred(int32 timerID, int32 timeoutInfo);
    782 
    783 #ifndef NO_2WAY_324
    784         bool AllChannelsOpened();
    785 #endif
    786         bool Supports(PVMFNodeCapability &capability, PVMFFormatType aFormat, bool isInput = true);
    787 #ifdef MEM_TRACK
    788         void MemStats();
    789 #endif
    790     private:
    791         CPV324m2Way();
    792         ~CPV324m2Way();
    793         void ClearVideoEncNode();
    794         void ConstructL(PVMFNodeInterface* aTsc,
    795                         TPVTerminalType aType,
    796                         PVCommandStatusObserver* aCmdStatusObserver,
    797                         PVInformationalEventObserver *aInfoEventObserver,
    798                         PVErrorEventObserver *aErrorEventObserver);
    799         void SetDefaults();
    800 
    801         void PreInit();
    802         // OsclActiveObject virtuals
    803         void DoCancel();
    804         void Run();
    805         void Dispatch(TPV2WayCmdInfo* aCmdInfo);
    806         void Dispatch(TPV2WayEventInfo* aEventInfo);
    807         void SetState(PV2WayState aState)
    808         {
    809             iLastState = iState;
    810             iState = aState;
    811         }
    812 
    813         void InitiateDisconnect();
    814         void InitiateReset();
    815         void CheckState();
    816         void CheckInit();
    817         void CheckConnect();
    818         void CheckDisconnect();
    819         void CheckReset();
    820 
    821         void RemoveAudioDecPath();
    822         void RemoveAudioEncPath();
    823         void RemoveVideoDecPath();
    824         void RemoveVideoEncPath();
    825 
    826         void HandleCommNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    827         void HandleTscNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    828         void HandleVideoDecNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    829         void HandleVideoEncNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    830         void HandleAudioEncNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
    831         void HandleSinkNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse, TPV2WayNode* aNode);
    832         void GenerateIFrame(PVMFPortInterface *aPort);
    833         void RequestRemoteIFrame(PVMFPortInterface *aPort);
    834 
    835         TPV2WayCmdInfo *GetCmdInfoL();
    836         void FreeCmdInfo(TPV2WayCmdInfo *info);
    837 
    838         TPV2WayEventInfo *GetEventInfoL();
    839         void FreeEventInfo(TPV2WayEventInfo *info);
    840 
    841         PVMFCommandId SendNodeCmdL(PV2WayNodeCmdType aCmd, TPV2WayNode *aNode,
    842                                    CPV2WayNodeCommandObserver *aObserver,
    843                                    void *aParam = NULL, TPV2WayCmdInfo *a2WayCmdInfo = NULL);
    844 
    845         TPV2WayNodeCmdInfo *FindPendingNodeCmd(PVMFNodeInterface *aNode, PVMFCommandId aId);
    846         void RemovePendingNodeCmd(PVMFNodeInterface *aNode, PVMFCommandId aId, bool aAllCmds = false);
    847 
    848         void FillSDKInfo(PVSDKInfo &aSDKInfo);
    849 
    850 
    851 
    852         int32 GetStackNodePortTag(TPV2WayPortTagType portType);
    853 
    854         bool CheckMandatoryCodecs(const PVMFFormatType *aMandatoryList, uint32 aMandatorySize, Oscl_Vector<PVMFFormatType, OsclMemAllocator> &aCodecList);
    855 
    856         void InitiateSession(TPV2WayNode& aNode);
    857 
    858         void SetPreferredCodecs(PV2WayInitInfo& aInitInfo);
    859 
    860         void SetPreferredCodecs(TPVDirection aDir,
    861                                 Oscl_Vector<const char*, OsclMemAllocator>& aAudioFormats,
    862                                 Oscl_Vector<const char*, OsclMemAllocator>& aVideoFormats);
    863 
    864         const char* FindFormatType(PVMFFormatType aFormatType,
    865                                    Oscl_Vector<const char*, OsclMemAllocator>& aAudioFormats,
    866                                    Oscl_Vector<const char*, OsclMemAllocator>& aVideoFormats);
    867 
    868         bool IsSupported(const PVMFFormatType& aInputFmtType, const PVMFFormatType& aOutputFmtType);
    869 
    870         const char* CanConvertFormat(TPVDirection aDir, const PVMFFormatType& aThisFmtType, Oscl_Vector<const char*, OsclMemAllocator>& aThatFormatList);
    871 
    872         void DoSelectFormat(TPVDirection aDir, PVMFFormatType aFormatType, const char* aFormatStr, TPVPriority aPriority, PVMFFormatType aFormatApp = PVMF_MIME_FORMAT_UNKNOWN);
    873 
    874         void DoAddDataSource(TPV2WayNode& aNode, const PVMFCmdResp& aResponse);
    875 
    876         void DoAddDataSink(TPV2WayNode& aNode, const PVMFCmdResp& aResponse);
    877 
    878         PVCommandId DoRemoveDataSourceSink(PVMFNodeInterface& aEndPt, OsclAny* aContextData);
    879 
    880         bool IsNodeInList(Oscl_Vector<TPV2WayNode*, OsclMemAllocator>& aList, PVMFNodeInterface* aNode);
    881 
    882         bool IsSourceNode(PVMFNodeInterface* aNode);
    883 
    884         bool IsSinkNode(PVMFNodeInterface* aNode);
    885 
    886 
    887         TPV2WayNode* GetTPV2WayNode(Oscl_Vector<TPV2WayNode*, OsclMemAllocator>& aList, PVMFNodeInterface* aNode);
    888 
    889         TPV2WayNode* RemoveTPV2WayNode(Oscl_Vector<TPV2WayNode*, OsclMemAllocator>& aList, PVMFNodeInterface* aNode);
    890 
    891         bool IsNodeReset(PVMFNodeInterface& aNode);
    892 
    893         void SupportedSinkNodeInterfaces(TPV2WayNode* aNode);
    894         typedef PV2WayRegFormatTypeCompare<OsclMemAllocator> pvmf_format_type_key_compare_class;
    895 
    896 
    897         void ConvertMapToVector(Oscl_Map<PVMFFormatType, FormatCapabilityInfo, OsclMemAllocator, pvmf_format_type_key_compare_class>& aCodecs, Oscl_Vector<FormatCapabilityInfo, OsclMemAllocator>& aFormatCapability);
    898 
    899         void AddVideoEncoderNode();
    900         void AddAudioEncoderNode();
    901         void AddVideoDecoderNode(uint8* aFormatSpecificInfo, uint32 aFormatSpecificInfoLen);
    902         void AddAudioDecoderNode();
    903         void RegisterMioLatency(const char* aMimeStr, bool aAudio, PVMFFormatType aFmtType);
    904         uint32 LookupMioLatency(PVMFFormatType aFmtType, bool aAudio);
    905 
    906 
    907         bool GetEventInfo(TPV2WayEventInfo*& event);
    908         static int32 Construct(CPV324m2Way* aRet,
    909                                PVMFNodeInterface* aTsc,
    910                                TPVTerminalType aTerminalType,
    911                                PVCommandStatusObserver* aCmdStatusObserver,
    912                                PVInformationalEventObserver *aInfoEventObserver,
    913                                PVErrorEventObserver *aErrorEventObserver);
    914 
    915         void GetStackSupportedFormats();
    916         PVMFStatus EstablishChannel(TPVDirection aDir,
    917                                     TPVChannelId aId,
    918                                     PVCodecType_t aCodec,
    919                                     uint8* fsi, uint32 fsi_len);
    920 #ifdef PV_USE_DSP_AMR_CODECS
    921         void InitializeDsp();
    922         void ReleaseDsp();
    923         CPVDsp* iDsp; // owned.
    924 #endif // PV_USE_DSP_AMR_CODECS
    925 
    926         // Loopback mode
    927         TPVLoopbackMode iLoopbackMode;
    928 
    929         // Current state
    930         PV2WayState iState;
    931         PV2WayState iLastState;
    932 
    933         // Command status observer
    934         PVCommandStatusObserver* iCmdStatusObserver;
    935 
    936         // Observer for informational messages
    937         PVInformationalEventObserver *iInfoEventObserver;
    938 
    939         // Observer for errors
    940         PVErrorEventObserver *iErrorEventObserver;
    941 
    942         /* For milestone 2, we will not use the proxy framework.  This will be replaced for Milestone 3 */
    943         Oscl_Vector<TPV2WayNotificationInfo*, BasicAlloc> iPendingNotifications;
    944 
    945         PVCommandId iCommandId;
    946 
    947         PVUuid iCapConfigPVUuid;
    948 
    949         Oscl_Vector<PVUuid, OsclMemAllocator> iSipMgrNodeUuidVec;
    950 
    951         // Video data path
    952         CPV2WayEncDataChannelDatapath *iVideoEncDatapath;
    953         CPV2WayDecDataChannelDatapath *iVideoDecDatapath;
    954 
    955         // Audio data path
    956         CPV2WayEncDataChannelDatapath *iAudioEncDatapath;
    957         CPV2WayDecDataChannelDatapath *iAudioDecDatapath;
    958 
    959         // COMM Datapath
    960         bool iIsStackConnected;
    961         CPV2WayMuxDatapath *iMuxDatapath;
    962         TPV2WayNode iTscNode;
    963         TSC* iTscNodePtr;
    964         TPV2WayNode iCommNode;
    965 
    966         TPV2WayNode iAudioSinkNode;
    967         TPV2WayNode iAudioSrcNode;
    968 
    969 #if defined(PV_PLAY_FROM_FILE_SUPPORT)
    970         TPV2WayNode iAudioSrcSplitterNode;
    971         TPV2WayNode iVideoSrcSplitterNode;
    972 #endif
    973 
    974         TPV2WayNode iVideoEncNode;
    975         PV2WayNodeInterface iVideoEncNodeInterface;
    976 
    977         TPV2WayNode iVideoDecNode;
    978         TPV2WayNode iVideoParserNode;
    979 
    980 #if defined(PV_RECORD_TO_FILE_SUPPORT)
    981         TPV2WayNode iVideoDecSplitterNode;
    982 #endif
    983 
    984         TPV2WayNode iAudioEncNode;
    985         TPV2WayNode iAudioDecNode;
    986         PV2WayNodeInterface iAudioEncNodeInterface;
    987 
    988         PV2WayNodeInterface iClockSyncInterface;
    989 
    990         Oscl_Vector<SinkNodeIFList, OsclMemAllocator> iSinkNodeList;
    991 
    992         Oscl_Vector<TPV2WayNode*, OsclMemAllocator> iSourceNodes;
    993         Oscl_Vector<TPV2WayNode*, OsclMemAllocator> iSinkNodes;
    994 
    995         PVUuid iSyncControlPVUuid;
    996 
    997         Oscl_Vector<TPV2WayCmdInfo *, BasicAlloc> iFreeCmdInfo;
    998         TPV2WayCmdInfo iCmdInfo[MAX_PENDING_2WAY_COMMANDS];
    999 
   1000         Oscl_Vector<TPV2WayEventInfo *, BasicAlloc> iFreeEventInfo;
   1001         TPV2WayEventInfo iEventInfo[MAX_PENDING_2WAY_EVENTS];
   1002 
   1003         Oscl_Vector<TPV2WayNodeCmdInfo *, BasicAlloc> iFreeNodeCmdInfo;
   1004         Oscl_Vector<TPV2WayNodeCmdInfo *, BasicAlloc> iPendingNodeCmdInfo;
   1005         TPV2WayNodeCmdInfo iNodeCmdInfo[MAX_PENDING_2WAY_NODE_COMMANDS];
   1006 
   1007         // pending Init info
   1008         TPV2WayCmdInfo *iInitInfo;
   1009 
   1010         // pending Connect info
   1011         TPV2WayCmdInfo *iConnectInfo;
   1012 
   1013         // Is a disconnect pending ?
   1014         TPV2WayCmdInfo *iDisconnectInfo;
   1015 
   1016         // Is a reset pending ?
   1017         TPV2WayCmdInfo *iResetInfo;
   1018 
   1019         // Is a cancel pending ?
   1020         TPV2WayCmdInfo *iCancelInfo;
   1021 
   1022         // Is a get session params call pending ?
   1023         TPV2WayCmdInfo *iSessionParamsInfo;
   1024 
   1025         PVLogger *iLogger;
   1026 
   1027 
   1028         //Minimum time between making successive I frame requests (sec).
   1029         uint32 iMinIFrameRequestInterval;
   1030         OsclTimer<OsclMemAllocator> iIFrameReqTimer;
   1031         OsclTimer<OsclMemAllocator>* iEndSessionTimer;
   1032         OsclTimer<OsclMemAllocator>* iRemoteDisconnectTimer;
   1033         bool isIFrameReqTimerActive;
   1034 
   1035 #ifndef NO_2WAY_324
   1036         Oscl_Vector<H324ChannelParameters, PVMFTscAlloc> iIncomingChannelParams;
   1037         Oscl_Map<PVMFFormatType, FormatCapabilityInfo, OsclMemAllocator, pvmf_format_type_key_compare_class> iIncomingAudioCodecs;
   1038         Oscl_Map<PVMFFormatType, FormatCapabilityInfo, OsclMemAllocator, pvmf_format_type_key_compare_class> iIncomingVideoCodecs;
   1039         Oscl_Map<PVMFFormatType, FormatCapabilityInfo, OsclMemAllocator, pvmf_format_type_key_compare_class> iOutgoingAudioCodecs;
   1040         Oscl_Map<PVMFFormatType, FormatCapabilityInfo, OsclMemAllocator, pvmf_format_type_key_compare_class> iOutgoingVideoCodecs;
   1041 
   1042         Oscl_Map<char*, uint32, OsclMemAllocator> iAudioLatency;
   1043         Oscl_Map<char*, uint32, OsclMemAllocator> iVideoLatency;
   1044 
   1045         Oscl_Vector<FormatCapabilityInfo, OsclMemAllocator> iFormatCapability;
   1046 
   1047         /* A list of formats supported by the stack in a certain order of priority.  This list should ideally come from the stack but
   1048         for now we can generate it internally in the engine and later we will have an API for the stack to return it.
   1049         For the current version, the list would look like this:
   1050         {AMR, Mpeg-4, H.263}
   1051         */
   1052         Oscl_Map<PVMFFormatType, CPvtMediaCapability*, OsclMemAllocator, pvmf_format_type_key_compare_class> iStackSupportedFormats;
   1053         /* App Format is the format of the Node/MIO that the application needs to pass in for an incoming/outgoing datapath.
   1054            These maps track which application formats are expected by the engine for formats(codecs) supported by the engine
   1055            for the current call.
   1056            */
   1057         Oscl_Map<PVMFFormatType, PVMFFormatType, OsclMemAllocator, pvmf_format_type_key_compare_class> iAppFormatForEngineFormatIncoming;
   1058         Oscl_Map<PVMFFormatType, PVMFFormatType, OsclMemAllocator, pvmf_format_type_key_compare_class> iAppFormatForEngineFormatOutgoing;
   1059 
   1060         Oscl_Vector<FormatCapabilityInfo, OsclMemAllocator> iIncomingUserInputFormats;
   1061         Oscl_Vector<H324ChannelParameters, PVMFTscAlloc> iOutgoingChannelParams;
   1062         int32 iIncomingAudioTrackTag;
   1063         int32 iIncomingVideoTrackTag;
   1064         int32 iOutgoingAudioTrackTag;
   1065         int32 iOutgoingVideoTrackTag;
   1066 #endif
   1067         PVUuid iVideoEncPVUuid;
   1068         PVUuid iAudioEncPVUuid;
   1069         PVMFCommandId iVideoEncQueryIntCmdId;
   1070 
   1071         typedef enum
   1072         {
   1073             File2WayIdle,
   1074             File2WayInitializing,
   1075             File2WayInitialized,
   1076             File2WayResetting
   1077         } File2WayState;
   1078 
   1079 
   1080 #if defined(PV_RECORD_TO_FILE_SUPPORT)
   1081         void HandleFFComposerNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
   1082         void RemoveAudioRecPath();
   1083         void RemoveVideoRecPath();
   1084         void CheckRecordFileState();
   1085         void CheckRecordFileInit();
   1086         void CheckRecordFileReset();
   1087         void InitiateResetRecordFile();
   1088 
   1089         OSCL_wHeapString<OsclMemAllocator> iRecFilename;
   1090         File2WayState iRecordFileState;
   1091 
   1092         // Is a init record file pending ?
   1093         TPV2WayCmdInfo *iInitRecFileInfo;
   1094 
   1095         // Is a reset record file pending ?
   1096         TPV2WayCmdInfo *iResetRecFileInfo;
   1097 
   1098         TPV2WayNode iFFComposerNode;
   1099         PV2WayNodeInterface iFFClipConfig;
   1100         PV2WayNodeInterface iFFTrackConfig;
   1101         PV2WayNodeInterface iFFSizeAndDuration;
   1102 
   1103         PVUuid iFFClipConfigPVUuid;
   1104         PVUuid iFFTrackConfigPVUuid;
   1105         PVUuid iFFSizeAndDurationPVUuid;
   1106         CPV2WayRecDatapath *iAudioRecDatapath;
   1107         CPV2WayRecDatapath *iVideoRecDatapath;
   1108 
   1109         uint32 iRecFileSizeNotificationInterval; //Interval in msec
   1110         OsclTimer<OsclMemAllocator> iRecFileSizeNotificationTimer;
   1111         bool isRecFileSizeNotificationTimerActive;
   1112 #endif
   1113 
   1114 #if defined(PV_PLAY_FROM_FILE_SUPPORT)
   1115         void RemoveAudioPreviewPath();
   1116         void RemoveVideoPreviewPath();
   1117 
   1118         CPV2WayPreviewDatapath *iAudioPreviewDatapath;
   1119         CPV2WayPreviewDatapath *iVideoPreviewDatapath;
   1120 
   1121         void HandlePFFNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
   1122         void CheckPlayFileState();
   1123         void CheckPlayFileInit();
   1124         void CheckPlayFileReset();
   1125         void InitiateResetPlayFile();
   1126         void CheckAudioSourceMixingPort();
   1127         void HandleAudioSrcNodeCmd(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
   1128 
   1129         OSCL_wHeapString<OsclMemAllocator> iPlayFilename;
   1130         File2WayState iPlayFileState;
   1131         bool iUsePlayFileAsSource;
   1132 
   1133         // Is a init play file pending ?
   1134         TPV2WayCmdInfo *iInitPlayFileInfo;
   1135 
   1136         // Is a reset play file pending ?
   1137         TPV2WayCmdInfo *iResetPlayFileInfo;
   1138 
   1139         // Play file cmd ?
   1140         TPV2WayCmdInfo *iPlayFileCmdInfo;
   1141 
   1142         PlayFromFileNode *iPlayFromFileNode;
   1143         CPV2WayPort iAudioPlayPort;
   1144         CPV2WayPort iVideoPlayPort;
   1145 #endif
   1146 
   1147         /* Common clock to be shared with nodes that support the PvmfNodesSyncControlInterface interface */
   1148         PVMFMediaClock iClock;
   1149         PVMFTimebase_Tickcount iTickCountTimeBase;
   1150 
   1151         friend class CPV2WayCmdControlDatapath;
   1152         friend class CPV2WayDatapath;
   1153         friend class CPV2WayDataChannelDatapath;
   1154         friend class CPV2WayDecDataChannelDatapath;
   1155         friend class CPV2WayEncDataChannelDatapath;
   1156         friend class CPV2WayMuxDatapath;
   1157 
   1158 #if defined(PV_PLAY_FROM_FILE_SUPPORT)
   1159         friend class CPV2WayPreviewDatapath;
   1160 #endif
   1161 
   1162 #if defined(PV_RECORD_TO_FILE_SUPPORT)
   1163         friend class CPV2WayRecDatapath;
   1164 #endif
   1165 
   1166         TSC *iTSCInterface;
   1167         TSC_324m *iTSC324mInterface;
   1168 
   1169         TPVTerminalType iTerminalType;
   1170 
   1171         int32 iPendingTscReset;
   1172         int32 iPendingAudioEncReset;
   1173         int32 iPendingVideoEncReset;
   1174         int32 iAudioDatapathLatency;
   1175         int32 iVideoDatapathLatency;
   1176 
   1177         /* The AddDataSource command for video will be pending untill the extension interface for the encoder is queried and the
   1178             encoder is configured */
   1179         TPV2WayCmdInfo *iAddDataSourceVideoCmd;
   1180 };
   1181 
   1182 #endif
   1183 
   1184