1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "anonymous_string.h"
17 #include "dcamera_hisysevent_adapter.h"
18 #include "dcamera_sink_frame_info.h"
19 #include "dcamera_softbus_adapter.h"
20 #include "distributed_camera_constants.h"
21 #include "distributed_camera_errno.h"
22 #include "distributed_hardware_log.h"
23 #include <securec.h>
24 #include "softbus_bus_center.h"
25 #include "softbus_common.h"
26 #include "softbus_error_code.h"
27 #include "dcamera_utils_tools.h"
28 #include "dcamera_frame_info.h"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 namespace {
33 static QosTV g_qosInfo[] = {
34 { .qos = QOS_TYPE_MIN_BW, .value = DCAMERA_QOS_TYPE_MIN_BW },
35 { .qos = QOS_TYPE_MAX_LATENCY, .value = DCAMERA_QOS_TYPE_MAX_LATENCY },
36 { .qos = QOS_TYPE_MIN_LATENCY, .value = DCAMERA_QOS_TYPE_MIN_LATENCY}
37 };
38 static uint32_t g_QosTV_Param_Index = static_cast<uint32_t>(sizeof(g_qosInfo) / sizeof(QosTV));
39 const static std::pair<std::string, std::string> LOCAL_TO_PEER_SESS_NAME_MAP[] = {
40 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_CONTROL,
41 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_CONTROL},
42 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_DATA_SNAPSHOT,
43 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_DATA_SNAPSHOT},
44 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_DATA_CONTINUE,
45 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_DATA_CONTINUE},
46 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_CONTROL,
47 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_CONTROL},
48 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_DATA_SNAPSHOT,
49 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_DATA_SNAPSHOT},
50 {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_DATA_CONTINUE,
51 SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_DATA_CONTINUE},
52 };
53 }
54 IMPLEMENT_SINGLE_INSTANCE(DCameraSoftbusAdapter);
55
DCameraSourceOnBind(int32_t socket, PeerSocketInfo info)56 static void DCameraSourceOnBind(int32_t socket, PeerSocketInfo info)
57 {
58 return;
59 }
60
DCameraSourceOnShutDown(int32_t socket, ShutdownReason reason)61 static void DCameraSourceOnShutDown(int32_t socket, ShutdownReason reason)
62 {
63 DCameraSoftbusAdapter::GetInstance().SourceOnShutDown(socket, reason);
64 return;
65 }
66
DCameraSourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)67 static void DCameraSourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
68 {
69 DCameraSoftbusAdapter::GetInstance().SourceOnBytes(socket, data, dataLen);
70 return;
71 }
72
DCameraSourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)73 static void DCameraSourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
74 {
75 DCameraSoftbusAdapter::GetInstance().SourceOnMessage(socket, data, dataLen);
76 return;
77 }
78
DCameraSourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)79 static void DCameraSourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
80 const StreamFrameInfo *param)
81 {
82 DCameraSoftbusAdapter::GetInstance().SourceOnStream(socket, data, ext, param);
83 return;
84 }
85
86 // sink
DCameraSinkOnBind(int32_t socket, PeerSocketInfo info)87 static void DCameraSinkOnBind(int32_t socket, PeerSocketInfo info)
88 {
89 DCameraSoftbusAdapter::GetInstance().SinkOnBind(socket, info);
90 return;
91 }
92
DCameraSinkOnShutDown(int32_t socket, ShutdownReason reason)93 static void DCameraSinkOnShutDown(int32_t socket, ShutdownReason reason)
94 {
95 DCameraSoftbusAdapter::GetInstance().SinkOnShutDown(socket, reason);
96 return;
97 }
98
DCameraSinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)99 static void DCameraSinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
100 {
101 DCameraSoftbusAdapter::GetInstance().SinkOnBytes(socket, data, dataLen);
102 return;
103 }
104
DCameraSinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)105 static void DCameraSinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
106 {
107 DCameraSoftbusAdapter::GetInstance().SinkOnMessage(socket, data, dataLen);
108 return;
109 }
110
DCameraSinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)111 static void DCameraSinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
112 const StreamFrameInfo *param)
113 {
114 DCameraSoftbusAdapter::GetInstance().SinkOnStream(socket, data, ext, param);
115 return;
116 }
117
DCameraSoftbusAdapter()118 DCameraSoftbusAdapter::DCameraSoftbusAdapter()
119 {
120 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_CTRL] = TransDataType::DATA_TYPE_BYTES;
121 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_VIDEO] = TransDataType::DATA_TYPE_VIDEO_STREAM;
122 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_JPEG] = TransDataType::DATA_TYPE_BYTES;
123
124 ISocketListener sourceListener;
125 sourceListener.OnBind = DCameraSourceOnBind;
126 sourceListener.OnShutdown = DCameraSourceOnShutDown;
127 sourceListener.OnBytes = DCameraSourceOnBytes;
128 sourceListener.OnMessage = DCameraSourceOnMessage;
129 sourceListener.OnStream = DCameraSourceOnStream;
130 sessListeners_[DCAMERA_CHANNLE_ROLE_SOURCE] = sourceListener;
131
132 ISocketListener sinkListener;
133 sinkListener.OnBind = DCameraSinkOnBind;
134 sinkListener.OnShutdown = DCameraSinkOnShutDown;
135 sinkListener.OnBytes = DCameraSinkOnBytes;
136 sinkListener.OnMessage = DCameraSinkOnMessage;
137 sinkListener.OnStream = DCameraSinkOnStream;
138 sessListeners_[DCAMERA_CHANNLE_ROLE_SINK] = sinkListener;
139 }
140
~DCameraSoftbusAdapter()141 DCameraSoftbusAdapter::~DCameraSoftbusAdapter()
142 {
143 }
144
CreatSoftBusSinkSocketServer(std::string mySessionName, DCAMERA_CHANNEL_ROLE role, DCameraSessionMode sessionMode, std::string peerDevId, std::string peerSessionName)145 int32_t DCameraSoftbusAdapter::CreatSoftBusSinkSocketServer(std::string mySessionName, DCAMERA_CHANNEL_ROLE role,
146 DCameraSessionMode sessionMode, std::string peerDevId, std::string peerSessionName)
147 {
148 DHLOGI("create socket server start, mySessionName: %{public}s,peerSessionName: %{public}s",
149 GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
150 SocketInfo serverSocketInfo {};
151 if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
152 serverSocketInfo = {
153 .name = const_cast<char*>(mySessionName.c_str()),
154 .peerName = const_cast<char*>(peerSessionName.c_str()),
155 .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
156 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
157 .dataType = sessionModeAndDataTypeMap_[sessionMode],
158 };
159 } else {
160 serverSocketInfo = {
161 .name = const_cast<char*>(mySessionName.c_str()),
162 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
163 .dataType = sessionModeAndDataTypeMap_[sessionMode],
164 };
165 }
166 int32_t socketId = Socket(serverSocketInfo);
167 if (socketId < 0) {
168 DHLOGE("create socket server error, socket is invalid, socketId: %{public}d", socketId);
169 return DCAMERA_BAD_VALUE;
170 }
171 {
172 std::lock_guard<std::mutex> autoLock(mySocketSetLock_);
173 if (mySocketSet_.find(socketId) != mySocketSet_.end()) {
174 DHLOGI("current socketId had Listened");
175 return DCAMERA_OK;
176 }
177 mySocketSet_.insert(socketId);
178 }
179 int32_t ret = Listen(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
180 if (ret != DCAMERA_OK) {
181 DHLOGE("create socket server error, ret: %{public}d", ret);
182 Shutdown(socketId);
183 return DCAMERA_BAD_VALUE;
184 }
185 if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
186 std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
187 std::string peerDevIdMySessionName = peerDevId + std::string("_") + mySessionName;
188 peerDevIdMySessionNameMap_[peerDevIdMySessionName] = mySessionName;
189 }
190 DHLOGI("create socket server end, mySessionName: %{public}s, peerSessionName: %{public}s",
191 GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
192 return DCAMERA_OK;
193 }
194
CreateSoftBusSourceSocketClient(std::string myDevId, std::string peerSessionName, std::string peerDevId, DCameraSessionMode sessionMode, DCAMERA_CHANNEL_ROLE role)195 int32_t DCameraSoftbusAdapter::CreateSoftBusSourceSocketClient(std::string myDevId, std::string peerSessionName,
196 std::string peerDevId, DCameraSessionMode sessionMode, DCAMERA_CHANNEL_ROLE role)
197 {
198 DHLOGI("create socket client start, myDevId: %{public}s, peerSessionName: %{public}s",
199 GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
200 SocketInfo clientSocketInfo {};
201 std::string myDevIdPeerSessionName = "";
202 std::string srcSessionName = "";
203 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
204 myDevIdPeerSessionName = myDevId + std::string("_") + peerSessionName;
205 clientSocketInfo = {
206 .name = const_cast<char*>(myDevIdPeerSessionName.c_str()),
207 .peerName = const_cast<char*>(peerSessionName.c_str()),
208 .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
209 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
210 .dataType = sessionModeAndDataTypeMap_[sessionMode],
211 };
212 } else {
213 srcSessionName = peerSessionName + "_receiver";
214 peerSessionName = peerSessionName + "_sender";
215 clientSocketInfo = {
216 .name = const_cast<char*>(srcSessionName.c_str()),
217 .peerName = const_cast<char*>(peerSessionName.c_str()),
218 .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
219 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
220 .dataType = sessionModeAndDataTypeMap_[sessionMode],
221 };
222 }
223 int socketId = Socket(clientSocketInfo);
224 if (socketId < 0) {
225 DHLOGE("create socket client error, socket is invalid");
226 return DCAMERA_BAD_VALUE;
227 }
228 int ret = Bind(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
229 if (ret != DCAMERA_OK) {
230 DHLOGE("create socket client error");
231 Shutdown(socketId);
232 return DCAMERA_BAD_VALUE;
233 }
234 sourceSocketId_ = socketId;
235 DHLOGI("create socket client end, myDevId: %{public}s, peerSessionName: %{public}s",
236 GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
237 return socketId;
238 }
239
DestroySoftbusSessionServer(std::string sessionName)240 int32_t DCameraSoftbusAdapter::DestroySoftbusSessionServer(std::string sessionName)
241 {
242 std::lock_guard<std::mutex> autoLock(optLock_);
243 if (sessionTotal_.find(sessionName) == sessionTotal_.end()) {
244 DHLOGI("current sessionName already destroy, sessionName: %{public}s", GetAnonyString(sessionName).c_str());
245 return DCAMERA_OK;
246 }
247
248 sessionTotal_[sessionName]--;
249 DHLOGI("sessionName destroy %{public}s totalnum: %{public}d", GetAnonyString(sessionName).c_str(),
250 sessionTotal_[sessionName]);
251 uint32_t total_ = sessionTotal_[sessionName];
252 if (total_ == 0) {
253 sessionTotal_.erase(sessionName);
254 }
255 return DCAMERA_OK;
256 }
257
CloseSoftbusSession(int32_t socket)258 int32_t DCameraSoftbusAdapter::CloseSoftbusSession(int32_t socket)
259 {
260 DHLOGI("Shutdown softbus socket start: %{public}d", socket);
261 Shutdown(socket); // shutdown socket
262 {
263 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
264 sinkSocketSessionMap_.erase(socket);
265 }
266 {
267 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
268 sourceSocketSessionMap_.erase(socket);
269 }
270 DHLOGI("Shutdown softbus socket: %{public}d end", socket);
271 return DCAMERA_OK;
272 }
273
SendSofbusBytes(int32_t socket, std::shared_ptr<DataBuffer>& buffer)274 int32_t DCameraSoftbusAdapter::SendSofbusBytes(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
275 {
276 CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
277 return SendBytes(socket, buffer->Data(), buffer->Size());
278 }
279
SendSofbusStream(int32_t socket, std::shared_ptr<DataBuffer>& buffer)280 int32_t DCameraSoftbusAdapter::SendSofbusStream(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
281 {
282 CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
283 StreamData streamData = { reinterpret_cast<char *>(buffer->Data()), buffer->Size() };
284 int64_t timeStamp;
285 if (!buffer->FindInt64(TIME_STAMP_US, timeStamp)) {
286 DHLOGD("SendSofbusStream find %{public}s failed.", TIME_STAMP_US.c_str());
287 }
288 int32_t frameType;
289 if (!buffer->FindInt32(FRAME_TYPE, frameType)) {
290 DHLOGD("SendSofbusStream find %{public}s failed.", FRAME_TYPE.c_str());
291 }
292 int32_t index;
293 if (!buffer->FindInt32(INDEX, index)) {
294 DHLOGD("SendSofbusStream find %{public}s failed.", INDEX.c_str());
295 }
296 int64_t startEncodeT;
297 if (!buffer->FindInt64(START_ENCODE_TIME_US, startEncodeT)) {
298 DHLOGD("SendSofbusStream find %{public}s failed.", START_ENCODE_TIME_US.c_str());
299 }
300 int64_t finishEncodeT;
301 if (!buffer->FindInt64(FINISH_ENCODE_TIME_US, finishEncodeT)) {
302 DHLOGD("SendSofbusStream find %{public}s failed.", FINISH_ENCODE_TIME_US.c_str());
303 }
304 std::string jsonStr = "";
305 DCameraSinkFrameInfo sinkFrameInfo;
306 sinkFrameInfo.pts_ = timeStamp;
307 sinkFrameInfo.type_ = frameType;
308 sinkFrameInfo.index_ = index;
309 sinkFrameInfo.startEncodeT_ = startEncodeT;
310 sinkFrameInfo.finishEncodeT_ = finishEncodeT;
311 sinkFrameInfo.sendT_ = GetNowTimeStampUs();
312 sinkFrameInfo.Marshal(jsonStr);
313 StreamData ext = { const_cast<char *>(jsonStr.c_str()), jsonStr.length() };
314 StreamFrameInfo param = { 0 };
315 int32_t ret = SendStream(socket, &streamData, &ext, ¶m);
316 if (ret != SOFTBUS_OK) {
317 DHLOGD("SendSofbusStream failed, ret is %{public}d", ret);
318 return DCAMERA_BAD_VALUE;
319 }
320 return DCAMERA_OK;
321 }
322
DCameraSoftbusSourceGetSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession>& session)323 int32_t DCameraSoftbusAdapter::DCameraSoftbusSourceGetSession(int32_t socket,
324 std::shared_ptr<DCameraSoftbusSession>& session)
325 {
326 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
327 auto iter = sourceSocketSessionMap_.find(socket);
328 if (iter == sourceSocketSessionMap_.end()) {
329 DHLOGE("source can not find current socket %{public}d", socket);
330 return DCAMERA_NOT_FOUND;
331 }
332 session = iter->second;
333 return DCAMERA_OK;
334 }
335
336 // source
SourceOnBind(int32_t socket, PeerSocketInfo info)337 int32_t DCameraSoftbusAdapter::SourceOnBind(int32_t socket, PeerSocketInfo info)
338 {
339 DHLOGI("source bind socket begin, socket: %{public}d", socket);
340 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
341 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
342 if (ret != DCAMERA_OK || session == nullptr) {
343 DHLOGE("source bind socket can not find socket %{public}d", socket);
344 return DCAMERA_NOT_FOUND;
345 }
346 ret = session->OnSessionOpened(socket, info.networkId);
347 if (ret != DCAMERA_OK) {
348 DHLOGE("source bind socket failed, ret: %{public}d socket: %{public}d", ret, socket);
349 }
350 DHLOGI("source bind socket end, socket: %{public}d end", socket);
351 return ret;
352 }
353
SourceOnShutDown(int32_t socket, ShutdownReason reason)354 void DCameraSoftbusAdapter::SourceOnShutDown(int32_t socket, ShutdownReason reason)
355 {
356 DHLOGI("source on shutdown socket start, socket: %{public}d", socket);
357 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
358 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
359 if (ret != DCAMERA_OK || session == nullptr) {
360 DHLOGE("SourceOnShutDown can not find socket %{public}d", socket);
361 return;
362 }
363 session->OnSessionClose(socket);
364 DHLOGI("source on shutdown socket end socket: %{public}d end", socket);
365 return;
366 }
367
SourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)368 void DCameraSoftbusAdapter::SourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
369 {
370 if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
371 DHLOGE("source callback send bytes error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
372 return;
373 }
374 DHLOGI("source callback send bytes start, socket: %{public}d", socket);
375 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
376 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
377 if (ret != DCAMERA_OK || session == nullptr) {
378 DHLOGE("source callback send bytes not find session %{public}d", socket);
379 return;
380 }
381
382 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
383 ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
384 if (ret != EOK) {
385 DHLOGE("source callback send bytes memcpy_s failed ret: %{public}d", ret);
386 return;
387 }
388 session->OnDataReceived(buffer);
389 DHLOGI("source callback send bytes end, socket: %{public}d", socket);
390 return;
391 }
392
SourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)393 void DCameraSoftbusAdapter::SourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
394 {
395 (void)socket;
396 (void)data;
397 (void)dataLen;
398 return;
399 }
400
SourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)401 void DCameraSoftbusAdapter::SourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
402 const StreamFrameInfo *param)
403 {
404 int64_t recvT = GetNowTimeStampUs();
405 if (data == nullptr) {
406 DHLOGE("SourceOnStream Error, data is null, socket: %{public}d.", socket);
407 return;
408 }
409 int32_t dataLen = data->bufLen;
410 if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
411 DHLOGE("SourceOnStream Error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
412 return;
413 }
414 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
415 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
416 if (ret != DCAMERA_OK || session == nullptr) {
417 DHLOGE("SourceOnStream not find socket %{public}d", socket);
418 return;
419 }
420
421 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
422 buffer->SetInt64(RECV_TIME_US, recvT);
423 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
424 if (ret != EOK) {
425 DHLOGE("SourceOnStream memcpy_s failed ret: %{public}d", ret);
426 return;
427 }
428 ret = HandleSourceStreamExt(buffer, ext);
429 if (ret != DCAMERA_OK) {
430 DHLOGE("Handle source stream ext failed, ret is: %{public}d", ret);
431 }
432 session->OnDataReceived(buffer);
433 }
434
HandleSourceStreamExt(std::shared_ptr<DataBuffer>& buffer, const StreamData *ext)435 int32_t DCameraSoftbusAdapter::HandleSourceStreamExt(std::shared_ptr<DataBuffer>& buffer, const StreamData *ext)
436 {
437 if (ext == nullptr) {
438 DHLOGE("Source stream ext is null.");
439 return DCAMERA_BAD_VALUE;
440 }
441 int32_t extLen = ext->bufLen;
442 if (extLen <= 0 || extLen > DCAMERA_MAX_RECV_EXT_LEN) {
443 DHLOGD("ExtLen is: %{public}d.", extLen);
444 return DCAMERA_BAD_VALUE;
445 }
446
447 std::string jsonStr(reinterpret_cast<const char*>(ext->buf), ext->bufLen);
448 DCameraSinkFrameInfo sinkFrameInfo;
449 int32_t ret = sinkFrameInfo.Unmarshal(jsonStr);
450 if (ret != DCAMERA_OK) {
451 DHLOGE("Unmarshal sinkFrameInfo failed.");
452 return DCAMERA_BAD_VALUE;
453 }
454 int64_t recvT;
455 CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
456 if (!buffer->FindInt64(RECV_TIME_US, recvT)) {
457 DHLOGD("HandleSourceStreamExt find %{public}s failed.", RECV_TIME_US.c_str());
458 }
459 DCameraFrameInfo frameInfo;
460 frameInfo.type = sinkFrameInfo.type_;
461 frameInfo.pts = sinkFrameInfo.pts_;
462 frameInfo.index = sinkFrameInfo.index_;
463 frameInfo.ver = sinkFrameInfo.ver_;
464 frameInfo.timePonit.startEncode = sinkFrameInfo.startEncodeT_;
465 frameInfo.timePonit.finishEncode = sinkFrameInfo.finishEncodeT_;
466 frameInfo.timePonit.send = sinkFrameInfo.sendT_;
467 frameInfo.timePonit.recv = recvT;
468 buffer->frameInfo_ = frameInfo;
469 return DCAMERA_OK;
470 }
471
RecordSourceSocketSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession> session)472 void DCameraSoftbusAdapter::RecordSourceSocketSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession> session)
473 {
474 if (session == nullptr) {
475 DHLOGE("RecordSourceSocketSession error, session is null");
476 return;
477 }
478 {
479 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
480 sourceSocketSessionMap_[socket] = session;
481 }
482 }
483
DCameraSoftbusSinkGetSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession>& session)484 int32_t DCameraSoftbusAdapter::DCameraSoftbusSinkGetSession(int32_t socket,
485 std::shared_ptr<DCameraSoftbusSession>& session)
486 {
487 DHLOGI("sink find session start, socket: %{public}d", socket);
488 {
489 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
490 auto iter = sinkSocketSessionMap_.find(socket);
491 if (iter == sinkSocketSessionMap_.end()) {
492 DHLOGE("sink can not find socket %{public}d", socket);
493 return DCAMERA_NOT_FOUND;
494 }
495 session = iter->second;
496 CHECK_AND_RETURN_RET_LOG(session == nullptr, DCAMERA_BAD_VALUE, "Softbus session is null");
497 if (session->GetSessionId() < 0) {
498 DHLOGE("sink find session error, current sessionId is invalid");
499 return DCAMERA_BAD_VALUE;
500 }
501 }
502 DHLOGI("sink find session end, socket: %{public}d", socket);
503 return DCAMERA_OK;
504 }
505
FindSessNameByPeerSessName(const std::string peerSessionName)506 std::string DCameraSoftbusAdapter::FindSessNameByPeerSessName(const std::string peerSessionName)
507 {
508 auto foundItem = std::find_if(std::begin(LOCAL_TO_PEER_SESS_NAME_MAP), std::end(LOCAL_TO_PEER_SESS_NAME_MAP),
509 [&](const auto& item) { return item.first == peerSessionName; });
510 if (foundItem != std::end(LOCAL_TO_PEER_SESS_NAME_MAP)) {
511 return foundItem->second;
512 }
513 return "";
514 }
515
DCameraSoftBusGetSessionByPeerSocket(int32_t socket, std::shared_ptr<DCameraSoftbusSession> &session, PeerSocketInfo info)516 int32_t DCameraSoftbusAdapter::DCameraSoftBusGetSessionByPeerSocket(int32_t socket,
517 std::shared_ptr<DCameraSoftbusSession> &session, PeerSocketInfo info)
518 {
519 DHLOGI("find session by peer socket start, socket %{public}d", socket);
520 std::string mySessionName = "";
521 if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
522 std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
523 auto sessionNameIter = peerDevIdMySessionNameMap_.find(info.name);
524 if (sessionNameIter == peerDevIdMySessionNameMap_.end()) {
525 DHLOGE("find session by peer socket error, socket %{public}d", socket);
526 return DCAMERA_NOT_FOUND;
527 }
528 mySessionName = sessionNameIter->second;
529 } else {
530 mySessionName = FindSessNameByPeerSessName(info.name);
531 }
532 if (mySessionName.empty()) {
533 DHLOGE("find mySessionName is empty");
534 return DCAMERA_BAD_VALUE;
535 }
536 auto iter = sinkSessions_.find(std::string(mySessionName));
537 if (iter == sinkSessions_.end()) {
538 DHLOGE("find session by peer socket error, mySessionName %{public}s",
539 GetAnonyString(mySessionName).c_str());
540 return DCAMERA_NOT_FOUND;
541 }
542 session = iter->second;
543 {
544 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
545 sinkSocketSessionMap_[socket] = session;
546 }
547 DHLOGI("find session by peer socket end, socket %{public}d", socket);
548 return DCAMERA_OK;
549 }
550
551 // sink
SinkOnBind(int32_t socket, PeerSocketInfo info)552 int32_t DCameraSoftbusAdapter::SinkOnBind(int32_t socket, PeerSocketInfo info)
553 {
554 DHLOGI("sink bind socket start, socket: %{public}d", socket);
555 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
556 int32_t ret = DCameraSoftBusGetSessionByPeerSocket(socket, session, info);
557 if (ret != DCAMERA_OK || session == nullptr) {
558 DHLOGE("sink bind socket error, can not find socket %{public}d", socket);
559 return DCAMERA_NOT_FOUND;
560 }
561 ret = session->OnSessionOpened(socket, info.networkId);
562 if (ret != DCAMERA_OK) {
563 DHLOGE("sink bind socket error, not find socket %{public}d", socket);
564 }
565 DHLOGI("sink bind socket end, socket: %{public}d", socket);
566 return ret;
567 }
568
SinkOnShutDown(int32_t socket, ShutdownReason reason)569 void DCameraSoftbusAdapter::SinkOnShutDown(int32_t socket, ShutdownReason reason)
570 {
571 DHLOGI("sink on shutdown socket start, socket: %{public}d", socket);
572 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
573 int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
574 if (ret != DCAMERA_OK || session == nullptr) {
575 DHLOGE("sink on shutdown socket can not find socket %{public}d", socket);
576 return;
577 }
578 session->OnSessionClose(socket);
579 DHLOGI("sink on shutdown socket end, socket: %{public}d", socket);
580 return;
581 }
582
SinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)583 void DCameraSoftbusAdapter::SinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
584 {
585 if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
586 DHLOGE("sink on bytes error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
587 return;
588 }
589 DHLOGI("sink on bytes start, socket: %{public}d", socket);
590 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
591 int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
592 if (ret != DCAMERA_OK || session == nullptr) {
593 DHLOGE("sink on bytes error, can not find session %{public}d", socket);
594 return;
595 }
596 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
597 ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
598 if (ret != EOK) {
599 DHLOGE("sink on bytes memcpy_s failed ret: %{public}d", ret);
600 return;
601 }
602 session->OnDataReceived(buffer);
603 DHLOGI("sink on bytes end, socket: %{public}d", socket);
604 return;
605 }
606
SinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)607 void DCameraSoftbusAdapter::SinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
608 {
609 return;
610 }
611
SinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)612 void DCameraSoftbusAdapter::SinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
613 const StreamFrameInfo *param)
614 {
615 if (data == nullptr) {
616 DHLOGE("SinkOnStream error, data is null, socket: %{public}d.", socket);
617 return;
618 }
619 int32_t dataLen = data->bufLen;
620 if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
621 DHLOGE("SinkOnStream error, dataLen: %{public}d socket: %{public}d", dataLen, socket);
622 return;
623 }
624 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
625 int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
626 if (ret != DCAMERA_OK || session == nullptr) {
627 DHLOGE("SinkOnStream error, can not find socket %{public}d", socket);
628 return;
629 }
630
631 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
632 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
633 if (ret != EOK) {
634 DHLOGE("SinkOnStream error, memcpy_s failed ret: %{public}d", ret);
635 return;
636 }
637 session->OnDataReceived(buffer);
638 return;
639 }
640
GetLocalNetworkId(std::string& myDevId)641 int32_t DCameraSoftbusAdapter::GetLocalNetworkId(std::string& myDevId)
642 {
643 NodeBasicInfo basicInfo = { { 0 } };
644 int32_t ret = GetLocalNodeDeviceInfo(PKG_NAME.c_str(), &basicInfo);
645 if (ret != DCAMERA_OK) {
646 DHLOGE("GetLocalNodeDeviceInfo failed ret: %{public}d", ret);
647 return ret;
648 }
649
650 myDevId = std::string(basicInfo.networkId);
651 return DCAMERA_OK;
652 }
653 } // namespace DistributedHardware
654 } // namespace OHOS
655