diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java index 1aa47fc455d8ae6da6483fdf5de7249719983abf..2164d88e23103268a2a443bb6654a3bab712b333 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java +++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java @@ -43,6 +43,8 @@ public class ConnectInfos implements Parcelable { public static class ConnectInfo implements Parcelable { @SerializedName("phone_id") private String phoneId; + @SerializedName("udid") + private String udid; @SerializedName("access_info") public AccessInfo accessInfo; @@ -50,6 +52,10 @@ public class ConnectInfos implements Parcelable { return phoneId; } + public String getUdid() { + return udid; + } + public void setPhoneId(String phoneId) { this.phoneId = phoneId; } diff --git a/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java b/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java index 3a087261dda356a037c0bede247e69e3c822832d..3d91e802b881f0ef64b9264cf67f483f49e3ff74 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java +++ b/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java @@ -103,13 +103,24 @@ public class ConnectInfoModel implements IConnectInfoModel { throw new CustomException.FailedToGetConnectInfoException(rsp.getErrors().get(0).getErrorMsg()); } ConnectInfos.ConnectInfo ConnectInfo = rsp.getConnectInfos().get(0); - return Collections.singletonList( - GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), - String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), - ConnectInfo.getAccessInfo().getSessionId(), - ConnectInfo.getAccessInfo().getTicket(), - ConnectInfo.getAccessInfo().getSessionId(), - ConnectInfo.getAccessInfo().getTimestamp())); + if (ConnectInfo.getUdid() != null) { + return Collections.singletonList( + GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), + String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTicket(), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTimestamp())); + } else { + return Collections.singletonList( + GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), + String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTicket(), + ConnectInfo.getPhoneId(), + ConnectInfo.getAccessInfo().getTimestamp())); + } + } else { CPHError rsp; try { diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp index db259bc1105aeef212475bed434e0b9cf8ac4f73..18f5d9291c025f668ba98c98ded49f3617d9b928 100644 --- a/cloudphone/src/main/cpp/CasController.cpp +++ b/cloudphone/src/main/cpp/CasController.cpp @@ -47,6 +47,7 @@ int32_t OnRecvAudioStreamData(uint8_t* data, uint32_t length); int32_t OnRecvAudioDecodeCallback(int32_t streamId, AudioJbDecode* audioJbDecode); int32_t OnRecvCmdData(uint8_t* data, uint32_t length); void OnGotTransLog(const char* str, uint32_t length); +void OnRecvBitrate(uint32_t encBitrate, uint32_t totalBitrate); void OnNeedKeyFrameCallback(); OpusDecoder *g_opusDecoder = nullptr; shared_ptr hrtpLogger = nullptr; @@ -441,8 +442,10 @@ bool CasController::CreateWorkers() #if MTRANS_ENABLED if (m_mtrans == nullptr) { TransConfigParam param; - param.minVideoSendBitrate = 500; - param.maxVideoSendBitrate = 10000; + param.minVideoSendBitrate = 750; + param.maxVideoSendBitrate = 5000; + param.curBandwidth = 5000; + param.maxBandwidth = 20000; if (!m_logInit) { m_logInit = true; @@ -454,7 +457,7 @@ bool CasController::CreateWorkers() m_mtrans = new (std::nothrow) NetTrans(); m_mtrans->EnableLog(HRTP_LOG_PATH + "hrtp_log.txt", TRANS_LOG_LEVEL_INFO); - m_mtrans->Init(PEER_CLIENT, m_conf.ip.c_str(), m_conf.port, param, + int res = m_mtrans->Init(PEER_CLIENT, m_conf.ip.c_str(), m_conf.port, param, OnRecvVideoStreamData, OnRecvAudioStreamData, nullptr, @@ -462,6 +465,7 @@ bool CasController::CreateWorkers() OnRecvCmdData, OnRecvAudioDecodeCallback, OnGotTransLog); + INFO("m_mtrans->Init result = %d", res); } #endif @@ -750,6 +754,51 @@ uint64_t CasController::GetLag() return 0; } +// 由于mtrans中,TouchInput,KeyEventInput,MotionEventInput数据通过一个stream流传递,因此传输此类Input数据时需要传递消息头用于区分输入类型 +bool CasController::SendInputData(stream_msg_head_t msgHead, uint8_t *pkgdata) { + size_t pkgLen = static_cast(msgHead.GetPayloadSize()); + size_t dataLen = sizeof(stream_msg_head_t) + pkgLen; + + char *outBuffer = (char *)malloc(dataLen); + if (outBuffer == nullptr) { + ERR("Failed to malloc out buffer, InputData type: %d.", (int)msgHead.type); + return false; + } + + if (EOK != memcpy_s(outBuffer, dataLen, &msgHead, sizeof(stream_msg_head_t))) { + ERR("Copy msg head fail, InputData type: %d.", (int)msgHead.type); + free(outBuffer); + return false; + } + if (EOK != memcpy_s(outBuffer + sizeof(stream_msg_head_t), pkgLen, pkgdata, pkgLen)) { + ERR("Copy msg data fail. InputData type: %d.", (int)msgHead.type); + free(outBuffer); + return false; + } + + int ret; + switch (msgHead.type) { + case (TouchInput): + ret = m_mtrans->SendTouchEventData(reinterpret_cast(outBuffer), dataLen); + break; + case (KeyEventInput): + ret = m_mtrans->SendKeyEventData(reinterpret_cast(outBuffer), dataLen); + break; + case (MotionEventInput): + ret = m_mtrans->SendMotionEventData(reinterpret_cast(outBuffer), dataLen); + break; + default: + break; + } + if (ret != static_cast(dataLen)) { + ERR("Failed to send InputEvent %d, aimed to send dataLen:%d, but actually send:%d", (int)msgHead.type, (int)dataLen, ret); + free(outBuffer); + return false; + } + free(outBuffer); + return true; +} + bool CasController::SendTouchEvent(int id, int action, int x, int y, int pressure, long time, int orientation, int height, int width) { int new_time = (int) time; @@ -763,6 +812,31 @@ bool CasController::SendTouchEvent(int id, int action, int x, int y, int pressur return false; } +#if MTRANS_ENABLED + if (m_mtrans != nullptr && m_isMTransValid) { + size_t pkgLen = sizeof(TouchEventParam); + stream_msg_head_t msgHead; + msgHead.checksum = CAS_MSG_CHECKSUM_TOUCH_INPUT; + msgHead.SetPayloadSize(pkgLen); + msgHead.magicword = CAS_STREAM_DELIMITER_MAGICWORD; + msgHead.type = TouchInput; + + TouchEventParam touchEventParam{}; + touchEventParam.id = static_cast(id); + touchEventParam.action = static_cast(action); + touchEventParam.x = (unsigned short)htons(x); + touchEventParam.y = (unsigned short)htons(y); + touchEventParam.pressure = (unsigned short)htons(pressure); + touchEventParam.time = htonl(time); + touchEventParam.orientation = static_cast(orientation); + touchEventParam.height = (unsigned short)htons(height); + touchEventParam.width = (unsigned short)htons(width); + + size_t dataLen = sizeof(stream_msg_head_t) + pkgLen; + return SendInputData(msgHead, reinterpret_cast(&touchEventParam)); + } +#endif + if (m_touch == nullptr) { return false; } @@ -781,6 +855,24 @@ bool CasController::SendKeyEvent(uint16_t keycode, uint16_t action) return false; } +#if MTRANS_ENABLED + if (m_mtrans != nullptr && m_isMTransValid) { + size_t pkgLen = sizeof(KeyEventParam); + stream_msg_head_t msgHead; + msgHead.checksum = CAS_MSG_CHECKSUM_KEYEVENTINPUT; + msgHead.SetPayloadSize(pkgLen); + msgHead.magicword = CAS_STREAM_DELIMITER_MAGICWORD; + msgHead.type = KeyEventInput; + + KeyEventParam keyEventParam{}; + keyEventParam.keycode = (unsigned short) htons(keycode); + keyEventParam.action = (unsigned short) htons(action); + + size_t dataLen = sizeof(stream_msg_head_t) + pkgLen; + return SendInputData(msgHead, reinterpret_cast(&keyEventParam)); + } +#endif + if (m_touch == nullptr) { return false; } @@ -816,29 +908,7 @@ bool CasController::SendMotionEvent(uint16_t masterAxis, int32_t masterValue, ui motionEventParam.secondaryValue = secondaryValue; size_t dataLen = sizeof(stream_msg_head_t) + pkgLen; - - char *outBuffer = (char *)malloc(dataLen); - if (outBuffer == nullptr) { - ERR("Failed to malloc out buffer."); - return 0; - } - if (EOK != memcpy_s(outBuffer, dataLen, &msgHead, sizeof(stream_msg_head_t))) { - ERR("Copy msg head fail."); - free(outBuffer); - return 0; - } - if (EOK != memcpy_s(outBuffer + sizeof(stream_msg_head_t), pkgLen, &motionEventParam, pkgLen)) { - ERR("Copy msg data fail."); - free(outBuffer); - return 0; - } - - int ret = m_mtrans->SendMotionEventData(reinterpret_cast(outBuffer), dataLen); - if (ret != static_cast(dataLen)) { - ERR("Error: failed to send motion event, aimed to Send:%d, sent:%d", (int)sizeof(CasMotionEventMsg), ret); - return false; - } - return true; + return SendInputData(msgHead, reinterpret_cast(&motionEventParam)); } #endif diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h index 86def0032e52c774a3a4f92f7f2543d4eff9af06..f057dad5e16b39004edda66793763c2cc7163b41 100644 --- a/cloudphone/src/main/cpp/CasController.h +++ b/cloudphone/src/main/cpp/CasController.h @@ -54,6 +54,16 @@ public: void SetJniConf(std::string key, std::string value); + /** + * @功能描述:传送触控输入事件 + * @参数: dataLen 总数据长度(消息头+消息体) + * msgHead 消息头 + * pkgLen 消息体长度 + * pkgdata 消息体数据 + */ + bool SendInputData(stream_msg_head_t msgHead, uint8_t *pkgdata); + + bool SendTouchEvent(int id, int action, int x, int y, int pressure, long time, int orientation, int height, int width); bool SendKeyEvent(uint16_t keycode, uint16_t action); diff --git a/cloudphone/src/main/cpp/libs/Arm32/libmtrans.a b/cloudphone/src/main/cpp/libs/Arm32/libmtrans.a index c5ea687fc5b3b4d8e3f0d0ae71b159764423fe2a..7cefc847f1f8fc9625a19023384d49b256e5779e 100644 Binary files a/cloudphone/src/main/cpp/libs/Arm32/libmtrans.a and b/cloudphone/src/main/cpp/libs/Arm32/libmtrans.a differ diff --git a/cloudphone/src/main/cpp/libs/Arm64/libmtrans.a b/cloudphone/src/main/cpp/libs/Arm64/libmtrans.a index 5cc7394353ed5939ec60b3dc2ef982209d5b98e5..b0e8295dfb10bb188598d1e88135f18c1cdf5638 100644 Binary files a/cloudphone/src/main/cpp/libs/Arm64/libmtrans.a and b/cloudphone/src/main/cpp/libs/Arm64/libmtrans.a differ