• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (C) 2022 The Android Open Source Project
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 express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <SocketWriterNode.h>
18 #include <ImsMediaTrace.h>
19 
SocketWriterNode(BaseSessionCallback * callback)20 SocketWriterNode::SocketWriterNode(BaseSessionCallback* callback) :
21         BaseNode(callback)
22 {
23     mSocket = nullptr;
24     mSocketOpened = false;
25     mDisableSocket = false;
26 }
27 
~SocketWriterNode()28 SocketWriterNode::~SocketWriterNode()
29 {
30     if (mSocket != nullptr)
31     {
32         IMLOGE0("[~SocketWriterNode] socket is not closed");
33     }
34 }
35 
GetNodeId()36 kBaseNodeId SocketWriterNode::GetNodeId()
37 {
38     return kNodeIdSocketWriter;
39 }
40 
Start()41 ImsMediaResult SocketWriterNode::Start()
42 {
43     IMLOGD1("[Start] media[%d]", mMediaType);
44     mSocket = ISocket::GetInstance(mLocalAddress.port, mPeerAddress.ipAddress, mPeerAddress.port);
45 
46     if (mSocket == nullptr)
47     {
48         IMLOGE0("[Start] can't create socket instance");
49         return RESULT_NOT_READY;
50     }
51 
52     // set local/peer address here
53     mSocket->SetLocalEndpoint(mLocalAddress.ipAddress, mLocalAddress.port);
54     mSocket->SetPeerEndpoint(mPeerAddress.ipAddress, mPeerAddress.port);
55 
56     if (!mSocket->Open(mLocalFd))
57     {
58         IMLOGE0("[Start] can't open socket");
59         mSocketOpened = false;
60         return RESULT_PORT_UNAVAILABLE;
61     }
62 
63     mSocket->SetSocketOpt(kSocketOptionIpTos, mDscp);
64     mSocketOpened = true;
65     mNodeState = kNodeStateRunning;
66     return RESULT_SUCCESS;
67 }
68 
Stop()69 void SocketWriterNode::Stop()
70 {
71     IMLOGD1("[Stop] media[%d]", mMediaType);
72 
73     if (mSocket != nullptr)
74     {
75         if (mSocketOpened)
76         {
77             mSocket->Close();
78             mSocketOpened = false;
79         }
80 
81         ISocket::ReleaseInstance(mSocket);
82         mSocket = nullptr;
83     }
84 
85     mNodeState = kNodeStateStopped;
86 }
87 
IsRunTime()88 bool SocketWriterNode::IsRunTime()
89 {
90     return true;
91 }
92 
IsSourceNode()93 bool SocketWriterNode::IsSourceNode()
94 {
95     return true;
96 }
97 
SetConfig(void * config)98 void SocketWriterNode::SetConfig(void* config)
99 {
100     if (config == nullptr)
101     {
102         return;
103     }
104 
105     RtpConfig* pConfig = reinterpret_cast<RtpConfig*>(config);
106 
107     if (mProtocolType == kProtocolRtp)
108     {
109         mPeerAddress = RtpAddress(pConfig->getRemoteAddress().c_str(), pConfig->getRemotePort());
110     }
111     else if (mProtocolType == kProtocolRtcp)
112     {
113         mPeerAddress =
114                 RtpAddress(pConfig->getRemoteAddress().c_str(), pConfig->getRemotePort() + 1);
115     }
116 
117     mDscp = pConfig->getDscp();
118 }
119 
IsSameConfig(void * config)120 bool SocketWriterNode::IsSameConfig(void* config)
121 {
122     if (config == nullptr)
123     {
124         return true;
125     }
126 
127     RtpConfig* pConfig = reinterpret_cast<RtpConfig*>(config);
128     RtpAddress peerAddress;
129 
130     if (mProtocolType == kProtocolRtp)
131     {
132         peerAddress = RtpAddress(pConfig->getRemoteAddress().c_str(), pConfig->getRemotePort());
133     }
134     else if (mProtocolType == kProtocolRtcp)
135     {
136         peerAddress = RtpAddress(pConfig->getRemoteAddress().c_str(), pConfig->getRemotePort() + 1);
137     }
138 
139     return (mPeerAddress == peerAddress && mDscp == pConfig->getDscp());
140 }
141 
OnDataFromFrontNode(ImsMediaSubType subtype,uint8_t * pData,uint32_t nDataSize,uint32_t nTimestamp,bool bMark,uint32_t nSeqNum,ImsMediaSubType nDataType,uint32_t arrivalTime)142 void SocketWriterNode::OnDataFromFrontNode(ImsMediaSubType subtype, uint8_t* pData,
143         uint32_t nDataSize, uint32_t nTimestamp, bool bMark, uint32_t nSeqNum,
144         ImsMediaSubType nDataType, uint32_t arrivalTime)
145 {
146     (void)nDataType;
147     (void)bMark;
148     (void)arrivalTime;
149 
150     if (mDisableSocket == true && subtype != MEDIASUBTYPE_RTCPPACKET_BYE)
151     {
152         IMLOGW3("[OnDataFromFrontNode] media[%d] subtype[%d] socket is disabled, bytes[%d]",
153                 mMediaType, subtype, nDataSize);
154     }
155 
156     IMLOGD_PACKET3(IM_PACKET_LOG_SOCKET, "[OnDataFromFrontNode] TS[%d], SeqNum[%u], size[%u]",
157             nTimestamp, nSeqNum, nDataSize);
158 
159     if (mSocket == nullptr)
160     {
161         return;
162     }
163 
164     mSocket->SendTo(pData, nDataSize);
165 }
166 
SetLocalFd(int fd)167 void SocketWriterNode::SetLocalFd(int fd)
168 {
169     mLocalFd = fd;
170 }
171 
SetLocalAddress(const RtpAddress & address)172 void SocketWriterNode::SetLocalAddress(const RtpAddress& address)
173 {
174     mLocalAddress = address;
175 }
176 
SetPeerAddress(const RtpAddress & address)177 void SocketWriterNode::SetPeerAddress(const RtpAddress& address)
178 {
179     mPeerAddress = address;
180 }