diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java index 00c7e4093982ad45c14a09312907a00a8a20d888..9f9c3e0956c4e23b5fe6c503d0dd129cc4ea5a2b 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -306,17 +306,15 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl } }); - if (!isSupportH265()) { - if (mMediaConfig == null) { - mMediaConfig = new HashMap(); - } - mMediaConfig.put(FRAME_TYPE, "h264"); + if (mMediaConfig == null) { + mMediaConfig = new HashMap(); } - - if (mMediaConfig != null && mMediaConfig.size() != 0) { - mCloudPhone.setMediaConfig(mMediaConfig); + if (isSupportH265()) { + mMediaConfig.put(FRAME_TYPE, "h265"); + } else { + mMediaConfig.put(FRAME_TYPE, "h264"); } - + mCloudPhone.setMediaConfig(mMediaConfig); mCloudPhone.startCloudPhone(this, mFrameLayout, parasMap); } catch (IllegalArgumentException e) { showDialog(getResources().getString(R.string.cas_phone_input_param_invalid)); diff --git a/build.gradle b/build.gradle index 815c69d2f129417b1d5337c38eeade79624ab3ff..79c017c68cc1e6c2fc57b093a94c679744e68d5c 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,7 @@ allprojects { repositories { google() jcenter() + maven { url 'https://jitpack.io' } } } diff --git a/cloudphone/src/main/cpp/CasCommon.h b/cloudphone/src/main/cpp/CasCommon.h index 3b75466cd3c56cd0f5a570e273e2e6e47128528a..7ac8ad2f20712c690e4dbb3ea8e3985dcb107426 100644 --- a/cloudphone/src/main/cpp/CasCommon.h +++ b/cloudphone/src/main/cpp/CasCommon.h @@ -75,6 +75,7 @@ enum { CAS_ENCODE_ERROR = 0x1100, CAS_ENGINE_START_FAILED = 0x1101, + CAS_H265_NOT_SUPPORT = 0x1102, CAS_SWITCH_BACKGROUND_SUCCESS = 0x1200, CAS_SWITCH_BACKGROUND_ERROR = 0x1301, diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp index 8ea1aedfcdbadf04b2109db8990ff859ddf53e67..da8b3bf1c748ac12bb362e9f8f4820b3e7c02636 100644 --- a/cloudphone/src/main/cpp/CasController.cpp +++ b/cloudphone/src/main/cpp/CasController.cpp @@ -161,10 +161,6 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome) m_clientType = CLIENT_TYPE; m_maxDisconnectDuration = CalcMaxDisconnectDuration(m_conf.backgroundTimeout); - std::string mediaConfigStr = ""; - if (IsValidMediaConfig(m_mediaConfig)) { - mediaConfigStr = CasAppCtrlCmdUtils::MakeCommand(m_mediaConfig, SUB_COMMAND_SEPARATOR); - } if (m_mediaConfig.find(KEY_FRAME_TYPE) != m_mediaConfig.end()) { m_frameType = m_mediaConfig[KEY_FRAME_TYPE] == "h264" ? FrameType::H264 : FrameType::H265; } @@ -178,7 +174,6 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome) res = CreateWorkers(); if (!res) { DestroyWorkers(); - StopDecWorker(false); CloseDataStream(); return false; } @@ -187,29 +182,13 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome) if (!res) { ERR("Failed to build connection"); DestroyWorkers(); - StopDecWorker(false); CloseDataStream(); return false; } StartWorkers(); - std::string startCmd = CMD_START_APP; - map parameters = { { KEY_COMMAND, startCmd }, - { KEY_TICKET, m_ticket }, - { KEY_AUTH_TS, m_authTs }, - { KEY_VERIFY_DATA, m_verifyData }, - { KEY_ENCRYPTED_DATA, m_encryptedData }, - { KEY_SESSION_ID, m_sessionId }, - { KEY_AES_IV, m_aesIv }, - { KEY_SDK_VERSION, m_conf.sdkVersion }, - { KEY_PROTOCOL_VERSION, m_conf.protocolVersion }, - { KEY_CLIENT_TYPE, m_clientType }, - { KEY_MEDIA_CONFIG, mediaConfigStr }, - { KEY_MAX_DISCONNECT_DURATION, m_maxDisconnectDuration } }; - - res = SendCommand(parameters); - if (!res) { + if (!SendStartCmd()) { ERR("Failed to send start command"); return false; } @@ -824,7 +803,7 @@ void CasController::IsNeedRotation(int orientation) } std::lock_guard lockGuard(this->m_decoderLock); - ResetDecoder(); + ResetDecoder(m_isNotifyFirstFrame); ForceIFrame(); m_orientation = orientation; } @@ -960,19 +939,48 @@ void CasController::NotifyFirstVideoFrame() void CasController::OnCmdRecv(int code, string msg) { - NotifyCommand(code, msg); - std::lock_guard lockGuard(this->m_decoderLock); - if (code == CAS_START_SUCCESS) { - m_frameType = msg.find("h265") != string::npos ? FrameType::H265 : FrameType::H264; - ResetDecoder(); - ForceIFrame(); + if (code == CAS_H265_NOT_SUPPORT) { + m_frameType = FrameType::H264; + m_mediaConfig[KEY_FRAME_TYPE] = "h264"; + if (!SendStartCmd()) { + this->SetState(START_FAILURE); + NotifyCommand(CAS_ENGINE_START_FAILED, CasMsgCode::GetMsg(CAS_ENGINE_START_FAILED)); + ERR("Failed to send start command"); + } + } else { + NotifyCommand(code, msg); } } -void CasController::ResetDecoder() +void CasController::ResetDecoder(bool isClearStream) { StopDecWorker(false); - ClearDataStream(); + if (isClearStream) { + ClearDataStream(); + } CreateDecWorker(m_nativeWindow, m_needVideoDecode); StartDecWorker(false); +} + +bool CasController::SendStartCmd() +{ + std::string mediaConfigStr = ""; + if (IsValidMediaConfig(m_mediaConfig)) { + mediaConfigStr = CasAppCtrlCmdUtils::MakeCommand(m_mediaConfig, SUB_COMMAND_SEPARATOR); + } + std::string startCmd = CMD_START_APP; + map parameters = { { KEY_COMMAND, startCmd }, + { KEY_TICKET, m_ticket }, + { KEY_AUTH_TS, m_authTs }, + { KEY_VERIFY_DATA, m_verifyData }, + { KEY_ENCRYPTED_DATA, m_encryptedData }, + { KEY_SESSION_ID, m_sessionId }, + { KEY_AES_IV, m_aesIv }, + { KEY_SDK_VERSION, m_conf.sdkVersion }, + { KEY_PROTOCOL_VERSION, m_conf.protocolVersion }, + { KEY_CLIENT_TYPE, m_clientType }, + { KEY_MEDIA_CONFIG, mediaConfigStr }, + { KEY_MAX_DISCONNECT_DURATION, m_maxDisconnectDuration } }; + + return SendCommand(parameters); } \ No newline at end of file diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h index 7fbe82ab72b08ddae6669ca5de679cb6fc79fec1..6698ed334e30971f597d3343f88a6a8f216b5c62 100644 --- a/cloudphone/src/main/cpp/CasController.h +++ b/cloudphone/src/main/cpp/CasController.h @@ -83,7 +83,9 @@ private: void IsNeedRotation(int orientation); - void ResetDecoder(); + void ResetDecoder(bool isClearStream); + + bool SendStartCmd(); bool CreateWorkers();