From 7adea368bbd7b08b37e59ecd013ea9a1d0cf23e0 Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Mon, 10 Jul 2023 17:03:44 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BA=91=E6=9C=BA?=
=?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=87=AA=E9=80=82=E5=BA=94=E9=9F=B3=E8=A7=86?=
=?UTF-8?q?=E9=A2=91=E5=8F=82=E6=95=B0=EF=BC=8C=E4=BC=98=E5=8C=96=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 2 +
app/src/main/AndroidManifest.xml | 9 +-
.../common/CasImageQualityManager.java | 8 +-
.../cloudapp/ui/CasCloudMainActivity.java | 129 ++++----------
.../cloudapp/ui/CasCloudPhoneActivity.java | 167 ++++++++++--------
.../cloudapp/ui/CasCloudPhoneWebActivity.java | 120 +++++++++++++
.../huawei/cloudapp/utils/CasQualityUtil.java | 65 +++++++
.../res/layout/activity_cas_cloud_main.xml | 155 ++--------------
.../layout/activity_cas_cloud_phone_web.xml | 10 ++
app/src/main/res/layout/cas_ctrl_view.xml | 41 ++---
app/src/main/res/values/strings.xml | 9 +-
app/src/main/res/values/styles.xml | 5 +
cloudphone/src/main/cpp/CasCommon.h | 4 +-
cloudphone/src/main/cpp/CasController.cpp | 95 +++++-----
cloudphone/src/main/cpp/CasController.h | 7 +-
.../main/cpp/cas_service/CasAppCtrlCmdUtils.h | 3 +-
.../cas_service/CasHeartbeatController.cpp | 4 +-
.../cloudphone/apiimpl/CloudPhoneImpl.java | 11 +-
.../cloudphone/utils/CasConstantsUtil.java | 14 +-
.../cloudphone/utils/CasMediaUtils.java | 24 ++-
config.gradle | 2 +-
21 files changed, 466 insertions(+), 418 deletions(-)
create mode 100644 app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java
create mode 100644 app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java
create mode 100644 app/src/main/res/layout/activity_cas_cloud_phone_web.xml
diff --git a/app/build.gradle b/app/build.gradle
index 176191d..0146823 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -73,5 +73,7 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.13.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.14.0'
implementation 'com.hyman:flowlayout-lib:1.1.2'
+ implementation 'com.android.support:design:28.0.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
implementation project(':cloudphone')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 839ab18..2421b1b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="com.huawei.cloudapp">
+
@@ -35,12 +36,18 @@
android:label="@string/cas_title_activity_fullscreen"
android:theme="@style/CasCloudAppMainActivityTheme"
android:windowSoftInputMode="adjustResize" />
+
+ android:process=":remote" />
\ No newline at end of file
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java b/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
index d4cd222..30746f2 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
@@ -18,11 +18,9 @@ package com.huawei.cloudapp.common;
public class CasImageQualityManager {
- public static final int QUALITY_1080P = 1080;
- public static final int QUALITY_720P = 720;
- public static final int QUALITY_540P = 540;
- public static final int QUALITY_480P = 480;
- public static final int QUALITY_AUTO = 0;
+ public static final int QUALITY_BEST = 0;
+ public static final int QUALITY_MAIN = 1;
+ public static final int QUALITY_BASIC = 2;
private volatile static CasImageQualityManager manager = null;
private int imageQualityStatus = 0;
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
index 2fdeeac..30392fa 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
@@ -16,15 +16,11 @@
package com.huawei.cloudapp.ui;
-import static com.huawei.cloudapp.ui.CasCloudPhoneActivity.MEDIA_CONFIG;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.ENCODE_TYPE;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.FRAME_TYPE;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.REMOTE_SCHEDULING_ELB_IP;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.REMOTE_SCHEDULING_ELB_PORT;
-
import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
+import android.content.IntentFilter;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
@@ -33,9 +29,7 @@ import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.RadioGroup;
+import android.widget.Button;
import android.widget.TextView;
import com.huawei.cloudapp.R;
@@ -46,10 +40,7 @@ import com.zhy.view.flowlayout.FlowLayout;
import com.zhy.view.flowlayout.TagAdapter;
import com.zhy.view.flowlayout.TagFlowLayout;
-import java.io.Serializable;
import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
import java.util.UUID;
public class CasCloudMainActivity extends Activity {
@@ -57,16 +48,17 @@ public class CasCloudMainActivity extends Activity {
private static final String TAG = "CasCloudMainActivity";
private AutoCompleteTextView mCloudPhoneIp;
private AutoCompleteTextView mCloudPhonePort;
- private RadioGroup mEncodeTypeGroup;
- private int mEncodeType = 0;
- private String mFrameType = "h264";
- private LinearLayout mRemoteEncodeServerIpLayout;
- private LinearLayout mRemoteEncodeServerPortLayout;
- private EditText mRemoteEncodeServerIp;
- private EditText mRemoteEncodeServerPort;
- private RadioGroup mFrameTypeGroup;
private TagFlowLayout mFlowLayout;
private CasHistory mCasHistory;
+ private Button appConnect;
+ private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed")) {
+ appConnect.setEnabled(true);
+ }
+ }
+ };
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -83,6 +75,14 @@ public class CasCloudMainActivity extends Activity {
initAutoCompleteTextView("ip", mCloudPhoneIp);
initAutoCompleteTextView("port", mCloudPhonePort);
setAdapter(mFlowLayout);
+ registerReceiver(mBroadcastReceiver,
+ new IntentFilter("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed"));
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ unregisterReceiver(mBroadcastReceiver);
}
private void initView() {
@@ -90,63 +90,23 @@ public class CasCloudMainActivity extends Activity {
initAutoCompleteTextView("ip", mCloudPhoneIp);
mCloudPhonePort = findViewById(R.id.cloud_phone_port);
initAutoCompleteTextView("port", mCloudPhonePort);
- mEncodeTypeGroup = findViewById(R.id.encodeTypeRadioButtonGroup);
- mFrameTypeGroup = findViewById(R.id.frameTypeRadioButtonGroup);
- mRemoteEncodeServerIpLayout = findViewById(R.id.remote_ip_view_layout);
- mRemoteEncodeServerPortLayout = findViewById(R.id.remote_port_view_layout);
- mRemoteEncodeServerIp = findViewById(R.id.edit_text_remote_ip);
- mRemoteEncodeServerPort = findViewById(R.id.edit_text_remote_port);
mFlowLayout = findViewById(R.id.flow);
setAdapter(mFlowLayout);
+ appConnect = findViewById(R.id.cloud_phone_connect);
- mEncodeTypeGroup.check(R.id.radioButtonCpu);
- mEncodeTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int i) {
- switch (i) {
- case R.id.radioButtonCpu:
- mEncodeType = 1;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- case R.id.radioButtonGpu:
- mEncodeType = 2;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- case R.id.radioButtonRemote:
- mRemoteEncodeServerIpLayout.setVisibility(View.VISIBLE);
- mRemoteEncodeServerPortLayout.setVisibility(View.VISIBLE);
- break;
- default:
- mEncodeType = 0;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- }
- }
- });
-
- mFrameTypeGroup.check(R.id.radioButtonH264);
- mFrameTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int i) {
- if (i == R.id.radioButtonH265) {
- mFrameType = "h265";
- } else {
- mFrameType = "h264";
- }
- }
- });
}
public void cloudPhoneConnect(View view) {
+ startCloudPhoneActivity(CasCloudPhoneActivity.class);
+ appConnect.setEnabled(false);
+ }
+
+
+ public void cloudPhoneConnectWeb(View view) {
+ startCloudPhoneActivity(CasCloudPhoneWebActivity.class);
+ }
+
+ private void startCloudPhoneActivity(Class> cls) {
String phoneIp = mCloudPhoneIp.getText().toString().trim();
if (TextUtils.isEmpty(phoneIp)) {
CASLog.e(TAG, "输入Ip为空");
@@ -157,32 +117,11 @@ public class CasCloudMainActivity extends Activity {
CASLog.e(TAG, "输入Port为空");
return;
}
- String remoteEncodeServerIp = mRemoteEncodeServerIp.getText().toString().trim();
- String remoteEncodeServerPort = mRemoteEncodeServerPort.getText().toString().trim();
- if (mEncodeType == 3) {
- if (remoteEncodeServerIp.isEmpty() || remoteEncodeServerPort.isEmpty()) {
- CASLog.e(TAG, "远编服务器信息不全");
- return;
- }
- }
-
- startCloudPhoneActivity(phoneIp, phonePort, remoteEncodeServerIp, remoteEncodeServerPort);
- }
-
- private void startCloudPhoneActivity(String phoneIp, String phonePort, String remoteEncodeServerIp, String remoteEncodeServerPort) {
-
- Intent intent = new Intent(CasCloudMainActivity.this, CasCloudPhoneActivity.class);
+ Intent intent = new Intent(CasCloudMainActivity.this, cls);
CasConnectInfo connectorInfo = getCasConnectorInfo(phoneIp, phonePort);
- Map mediaConfig = new HashMap();
- mediaConfig.put(FRAME_TYPE, mFrameType);
- mediaConfig.put(ENCODE_TYPE, String.valueOf(mEncodeType));
- if (!remoteEncodeServerIp.isEmpty() && !remoteEncodeServerPort.isEmpty()) {
- mediaConfig.put(REMOTE_SCHEDULING_ELB_IP, remoteEncodeServerIp);
- mediaConfig.put(REMOTE_SCHEDULING_ELB_PORT, remoteEncodeServerPort);
- }
intent.putExtra(CasConnectInfo.BUNDLE_KEY, connectorInfo);
- intent.putExtra(MEDIA_CONFIG, (Serializable) mediaConfig);
startActivity(intent);
+ overridePendingTransition(0, 0);
}
private CasConnectInfo getCasConnectorInfo(String phoneIp, String phonePort) {
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 92b1362..20f1eb6 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -16,7 +16,6 @@
package com.huawei.cloudapp.ui;
-import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
@@ -29,11 +28,8 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
-import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
@@ -48,6 +44,7 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
+import com.google.gson.Gson;
import com.huawei.cloudapp.BuildConfig;
import com.huawei.cloudapp.R;
import com.huawei.cloudapp.common.CASLog;
@@ -58,6 +55,7 @@ import com.huawei.cloudapp.common.CasImageQualityManager;
import com.huawei.cloudapp.common.CasListener;
import com.huawei.cloudapp.common.CasState;
import com.huawei.cloudapp.utils.CasAdaptPhoneUtils;
+import com.huawei.cloudapp.utils.CasQualityUtil;
import com.huawei.cloudphone.api.CloudAppDataListener;
import com.huawei.cloudphone.api.CloudPhoneManager;
import com.huawei.cloudphone.api.CloudPhoneOrientationChangeListener;
@@ -70,12 +68,10 @@ import com.huawei.cloudphone.virtualdevice.common.RingBufferVirtualDeviceIO;
import java.util.HashMap;
-import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
import static android.os.SystemClock.sleep;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_480P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_540P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_720P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_AUTO;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_MAIN;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_BASIC;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_BEST;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AES_KEY;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AUTH_TS;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AVAILABLE_PLAYTIME;
@@ -86,9 +82,19 @@ import static com.huawei.cloudapp.utils.CasConstantsUtil.SESSION_ID;
import static com.huawei.cloudapp.utils.CasConstantsUtil.TICKET;
import static com.huawei.cloudapp.utils.CasConstantsUtil.TOUCH_TIMEOUT;
import static com.huawei.cloudapp.utils.CasConstantsUtil.USER_ID;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_BEST;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_MAIN;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_BASIC;
+import static com.huawei.cloudapp.utils.CasQualityUtil.FRAME_TYPE_H264;
+import static com.huawei.cloudapp.utils.CasQualityUtil.FRAME_TYPE_H265;
+import static com.huawei.cloudapp.utils.CasQualityUtil.RESOLUTION_1080P;
import static com.huawei.cloudphone.api.CloudPhoneParas.DevType.DEV_PHONE;
-import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_HEIGHT;
-import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_WIDTH;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.BITRATE;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.FRAME_TYPE;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.STREAM_HEIGHT;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.STREAM_WIDTH;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.WIDTH;
+import static com.huawei.cloudphone.utils.CasMediaUtils.isSupportH265;
import static com.huawei.cloudphone.virtualdevice.camera.VirtualCameraManager.GRANT_CAMERA_PERMISSION_SUCCESS_ACTION;
import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager.DEV_TYPE_CAMERA;
import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager.DEV_TYPE_MICROPHONE;
@@ -125,7 +131,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
public volatile boolean rebuildDone = false;
public boolean doCheckConnection = false;
private int mDevType;
- private HashMap mediaConfig = null;
+ private HashMap mMediaConfig = null;
private ImageView loadingView = null;
private int currentRotation = -1;
private CasCommonDialog quitDialog;
@@ -147,13 +153,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
// intent trans value
private CasConnectInfo connectInfo;
private RadioGroup qualityRadioViewGroup;
- private RadioButton radioView720p;
- private RadioButton radioView540p;
- private RadioButton radioView480p;
- private RadioButton radioViewAuto;
+ private RadioButton radioViewBest;
+ private RadioButton radioViewMain;
+ private RadioButton radioViewBasic;
private boolean bIsStart = false;
private boolean isGotCameraAndRecordPermission = true;
private int mOrientation = 0;
+ private String mFrameType = FRAME_TYPE_H265;
+ private String mResolution = RESOLUTION_1080P;
private int mDisplayMode;
private FrameLayout mFrameLayout = null;
private FrameLayout mFloatContainer = null;
@@ -167,27 +174,17 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
if (group.getCheckedRadioButtonId() != checkedId) {
CASLog.e("CasMainActivity", "group.getCheckedRadioButtonId() != checkedId");
} else {
- int selectType = QUALITY_720P;
- String virtualWidth = "720";
- String virtualHeight = "1280";
- if (radioView720p.getId() == checkedId) {
- selectType = QUALITY_720P;
- virtualWidth = "720";
- virtualHeight = "1280";
- } else if (radioView540p.getId() == checkedId) {
- selectType = QUALITY_540P;
-
- // 音视频层规范要求虚拟宽高为8的倍数
- virtualWidth = "544";
- virtualHeight = "960";
- } else if (radioView480p.getId() == checkedId) {
- selectType = QUALITY_480P;
- virtualWidth = "480";
- virtualHeight = "640";
- } else if (radioViewAuto.getId() == checkedId) {
- selectType = QUALITY_AUTO;
- virtualWidth = "720";
- virtualHeight = "1280";
+ int selectType = QUALITY_BEST;
+ String[] quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BEST);
+ if (radioViewBest.getId() == checkedId) {
+ selectType = QUALITY_BEST;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BEST);
+ } else if (radioViewMain.getId() == checkedId) {
+ selectType = QUALITY_MAIN;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_MAIN);
+ } else if (radioViewBasic.getId() == checkedId) {
+ selectType = QUALITY_BASIC;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BASIC);
}
int oldSelectType = CasImageQualityManager.getInstance().getImageQualityStatus();
@@ -195,8 +192,9 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CasImageQualityManager.getInstance().setImageQualityStatus(selectType);
checkImageQualityStatus(selectType);
HashMap config = new HashMap<>();
- config.put(VIRTUAL_WIDTH, virtualWidth);
- config.put(VIRTUAL_HEIGHT, virtualHeight);
+ config.put(BITRATE, quality[0]);
+ config.put(STREAM_WIDTH, quality[1]);
+ config.put(STREAM_HEIGHT, quality[2]);
mCloudPhone.setMediaConfig(config);
}
if (ctrView != null && ctrView.getVisibility() == View.VISIBLE) {
@@ -220,7 +218,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
showDialog(getResources().getString(R.string.cas_phone_play_timeout_tip_message));
break;
case MSG_STATE_CHANGE:
- processStateChangeMsg(msg.arg1);
+ processStateChangeMsg(msg.arg1, (String) msg.obj);
break;
case MSG_RECONNECT_FAILED:
showDialog(getResources().getString(R.string.cas_phone_reconnect_server_fail_tip_message));
@@ -271,10 +269,10 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mQuitCloudPhone.setOnClickListener(CasCloudPhoneActivity.this);
// ctrlView
qualityRadioViewGroup = findViewById(R.id.pic_quality_choose_layout);
- radioView720p = findViewById(R.id.pic_quality_720p);
- radioView540p = findViewById(R.id.pic_quality_540p);
- radioView480p = findViewById(R.id.pic_quality_480p);
- radioViewAuto = findViewById(R.id.pic_quality_auto);
+ radioViewBest = findViewById(R.id.pic_quality_best);
+ radioViewMain = findViewById(R.id.pic_quality_main);
+ radioViewBasic = findViewById(R.id.pic_quality_basic);
+ qualityRadioViewGroup.setVisibility(View.GONE);
qualityRadioViewGroup.setOnCheckedChangeListener(qualityCheckedChangeListener);
setRotation(mOrientation);
@@ -306,8 +304,15 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
}
});
- if (mediaConfig != null && mediaConfig.size() != 0) {
- mCloudPhone.setMediaConfig(mediaConfig);
+ if (!isSupportH265()) {
+ if (mMediaConfig == null) {
+ mMediaConfig = new HashMap();
+ }
+ mMediaConfig.put(FRAME_TYPE, "h264");
+ }
+
+ if (mMediaConfig != null && mMediaConfig.size() != 0) {
+ mCloudPhone.setMediaConfig(mMediaConfig);
}
mCloudPhone.startCloudPhone(this, mFrameLayout, parasMap);
@@ -392,6 +397,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
} catch (Exception e) {
CASLog.e(TAG, "destroy failed. " + e.getMessage());
}
+ Intent intent = new Intent("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed");
+ sendBroadcast(intent);
}
@Override
@@ -420,7 +427,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mOrientation = bundle.getInt(ORIENTATION);
mDisplayMode = bundle.getInt(DISPLAY_MODE);
mDevType = bundle.getInt(DEV_TYPE);
- mediaConfig = (HashMap) bundle.getSerializable(MEDIA_CONFIG);
+ mMediaConfig = (HashMap) bundle.getSerializable(MEDIA_CONFIG);
}
}
@@ -431,13 +438,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mVirtualDeviceSession.setVirtualDeviceIoHook(mRingBufferVirtualDeviceIO);
}
- private void processStateChangeMsg(int code) {
+ private void processStateChangeMsg(int code, String msg) {
CASLog.i(TAG, "processStateChangeMsg code = " + code);
switch (code) {
case CasState.CAS_START_SUCCESS:
lag.setVisibility(View.VISIBLE);
loadingView.setVisibility(View.GONE);
startSuccessThreadTask();
+ handleStartSuccessMsg(msg);
mCasHistory.setHistory("ip", connectInfo.getConnectIp());
mCasHistory.setHistory("port", connectInfo.getConnectPort());
mCasHistory.setHistory("ip:port", connectInfo.getConnectIp() + ":" + connectInfo.getConnectPort());
@@ -496,6 +504,31 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
}
}
+ private void handleStartSuccessMsg(String msg) {
+ if (mMediaConfig == null) {
+ mMediaConfig = new HashMap();
+ }
+
+ Gson gson = new Gson();
+ HashMap cloudMediaConfig = gson.fromJson(msg, new HashMap().getClass());
+ mResolution = String.valueOf(((Double) cloudMediaConfig.get(WIDTH)).intValue());
+ mFrameType = (String) cloudMediaConfig.get(FRAME_TYPE);
+ CASLog.i(TAG, "mResolution = " + mResolution + ", mFrameType = " + mFrameType);
+ if (mResolution.equals(RESOLUTION_1080P)) {
+ radioViewBest.setText(R.string.quality_UHD);
+ radioViewMain.setText(R.string.quality_HD);
+ radioViewBasic.setText(R.string.quality_SD);
+ }
+ String[] qualityStr = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_MAIN);
+
+ mMediaConfig.put(BITRATE, qualityStr[0]);
+ mMediaConfig.put(STREAM_WIDTH, qualityStr[1]);
+ mMediaConfig.put(STREAM_HEIGHT, qualityStr[2]);
+ mCloudPhone.setMediaConfig(mMediaConfig);
+ qualityRadioViewGroup.check(radioViewMain.getId());
+ qualityRadioViewGroup.setVisibility(View.VISIBLE);
+ }
+
/**
* set full screen display
*/
@@ -572,17 +605,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
*/
private void checkImageQualityStatus(int selectType) {
switch (selectType) {
- case QUALITY_AUTO:
- radioViewAuto.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
- break;
- case QUALITY_480P:
- radioView480p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_BASIC:
+ radioViewBasic.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
- case QUALITY_540P:
- radioView540p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_MAIN:
+ radioViewMain.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
- case QUALITY_720P:
- radioView720p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_BEST:
+ radioViewBest.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
default:
break;
@@ -594,17 +624,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
*/
private void resumeImageQualityStatus(int selectType) {
switch (selectType) {
- case QUALITY_AUTO:
- radioViewAuto.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_BASIC:
+ radioViewBasic.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
- case QUALITY_480P:
- radioView480p.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_MAIN:
+ radioViewMain.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
- case QUALITY_540P:
- radioView540p.setTextColor(this.getResources().getColor(R.color.cas_white));
- break;
- case QUALITY_720P:
- radioView720p.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_BEST:
+ radioViewBest.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
default:
break;
@@ -648,18 +675,17 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CASLog.d(TAG, "stop cloud phone");
doCheckConnection = false; //
dismissAllDialogs();
- setResult(RESULT_OK);
finish();
gAcitivity = null;
+ if (mVirtualDeviceSession != null) {
+ mVirtualDeviceSession.stop();
+ }
new Thread(new Runnable() {
@Override
public void run() {
bIsStart = false;
try {
mCloudPhone.exitCloudPhone();
- if (mVirtualDeviceSession != null) {
- mVirtualDeviceSession.stop();
- }
} catch (Exception e) {
CASLog.e(TAG, "stop cloud phone failed " + e.getMessage());
}
@@ -819,6 +845,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
Message message = new Message();
message.what = MSG_STATE_CHANGE;
message.arg1 = code;
+ message.obj = msg;
handler.sendMessage(message);
if (mCasListener != null) {
mCasListener.onStateChange(code, msg);
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java
new file mode 100644
index 0000000..301d3c7
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java
@@ -0,0 +1,120 @@
+package com.huawei.cloudapp.ui;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebSettings;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.huawei.cloudapp.R;
+import com.huawei.cloudapp.common.CASLog;
+import com.huawei.cloudapp.common.CasConnectInfo;
+import com.huawei.cloudapp.common.CasHistory;
+import com.just.agentweb.AgentWeb;
+import com.just.agentweb.DefaultWebClient;
+import com.just.agentweb.WebChromeClient;
+
+public class CasCloudPhoneWebActivity extends AppCompatActivity {
+ private static final String TAG = "CasCloudWebFragment";
+ private AgentWeb mAgentWeb;
+ private LinearLayout mLinearLayout;
+ private CasConnectInfo mConnectInfo;
+ public static String urlStr = "https://110.41.19.175:10086/index?"; //h5 sdk部署地址
+
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_cas_cloud_phone_web);
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_FULLSCREEN);
+ mLinearLayout = findViewById(R.id.web_view);
+
+ mAgentWeb = AgentWeb.with(this)
+ .setAgentWebParent(mLinearLayout, -1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT))
+ .useDefaultIndicator(-1, 3)
+ .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
+ .setWebViewClient(mWebViewClient)
+ .setWebChromeClient(mWebChromeClient)
+ .setMainFrameErrorView(R.layout.agentweb_error_page, -1)
+ .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.DISALLOW)
+ .interceptUnkownUrl()
+ .createAgentWeb()
+ .ready()
+ .go(getConnectUrl());
+ mAgentWeb.getWebCreator().getWebView().setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ mAgentWeb.getJsInterfaceHolder().addJavaObject("CasCallback", new CasCallbackInterface());
+ WebSettings webSettings = mAgentWeb.getWebCreator().getWebView().getSettings();
+ webSettings.setJavaScriptEnabled(true);
+ webSettings.setDomStorageEnabled(true);
+ webSettings.setMediaPlaybackRequiresUserGesture(false);
+ }
+
+ private com.just.agentweb.WebViewClient mWebViewClient = new com.just.agentweb.WebViewClient();
+ private WebChromeClient mWebChromeClient = new WebChromeClient() {
+ @Override
+ public void onShowCustomView(View view, CustomViewCallback customViewCallback) {
+ super.onShowCustomView(view, customViewCallback);
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ }
+ };
+
+ @Override
+ public void onResume() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onResume();
+ }
+ super.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onPause();
+ }
+ super.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onDestroy();
+ }
+ super.onDestroy();
+ }
+
+
+ /**
+ * get data with intent
+ */
+ private String getConnectUrl() {
+ CASLog.i(TAG, "getIntentData");
+ Intent intent = getIntent();
+ Bundle bundle = intent.getExtras();
+ if (bundle != null) {
+ mConnectInfo = intent.getParcelableExtra(CasConnectInfo.BUNDLE_KEY);
+ return urlStr + "ip=" + mConnectInfo.getConnectIp() + "&port=" + ((Integer.parseInt(mConnectInfo.getConnectPort()) + 1));
+ }
+ return null;
+ }
+
+ class CasCallbackInterface {
+ @JavascriptInterface
+ public void startSuccessCallback() {
+ CasHistory mCasHistory = new CasHistory(getSharedPreferences("input_history", MODE_PRIVATE));
+ mCasHistory.setHistory("ip", mConnectInfo.getConnectIp());
+ mCasHistory.setHistory("port", mConnectInfo.getConnectPort());
+ mCasHistory.setHistory("ip:port", mConnectInfo.getConnectIp() + ":" + mConnectInfo.getConnectPort());
+ }
+
+ @JavascriptInterface
+ public void exit() {
+ CasCloudPhoneWebActivity.this.finish();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java b/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java
new file mode 100644
index 0000000..d410c75
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java
@@ -0,0 +1,65 @@
+package com.huawei.cloudapp.utils;
+
+import java.util.HashMap;
+
+public class CasQualityUtil {
+
+ public static final String FRAME_TYPE_H265 = "h265";
+ public static final String FRAME_TYPE_H264 = "h264";
+
+ public static final String RESOLUTION_720P = "720";
+ public static final String RESOLUTION_1080P = "1080";
+
+ public static final String DEFINITION_BEST = "best";
+ public static final String DEFINITION_MAIN = "main";
+ public static final String DEFINITION_BASIC = "basic";
+
+ private static final String H264_720P_BEST = "2000000,720,1280";
+ private static final String H264_720P_MAIN = "1300000,720,1280";
+ private static final String H264_720P_BASIC = "1000000,544,960";
+
+ private static final String H264_1080P_BEST = "4000000,1080,1920";
+ private static final String H264_1080P_MAIN = "2600000,1080,1920";
+ private static final String H264_1080P_BASIC = "2000000,720,1280";
+
+ private static final String H265_720P_BEST = "1300000,720,1280";
+ private static final String H265_720P_MAIN = "1000000,720,1280";
+ private static final String H265_720P_BASIC = "700000,544,960";
+
+ private static final String H265_1080P_BEST = "2600000,1080,1920";
+ private static final String H265_1080P_MAIN = "2000000,1080,1920";
+ private static final String H265_1080P_BASIC = "1400000,720,1280";
+
+ private static HashMap>> quality =
+ new HashMap>>();
+
+ static {
+ quality.put(FRAME_TYPE_H264, new HashMap>());
+
+ quality.get(FRAME_TYPE_H264).put(RESOLUTION_720P, new HashMap());
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_BEST, H264_720P_BEST);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_MAIN, H264_720P_MAIN);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_BASIC, H264_720P_BASIC);
+
+ quality.get(FRAME_TYPE_H264).put(RESOLUTION_1080P, new HashMap());
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_BEST, H264_1080P_BEST);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_MAIN, H264_1080P_MAIN);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_BASIC, H264_1080P_BASIC);
+
+ quality.put(FRAME_TYPE_H265, new HashMap>());
+
+ quality.get(FRAME_TYPE_H265).put(RESOLUTION_720P, new HashMap());
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_BEST, H265_720P_BEST);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_MAIN, H265_720P_MAIN);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_BASIC, H265_720P_BASIC);
+
+ quality.get(FRAME_TYPE_H265).put(RESOLUTION_1080P, new HashMap());
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_BEST, H265_1080P_BEST);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_MAIN, H265_1080P_MAIN);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_BASIC, H265_1080P_BASIC);
+ }
+
+ public static String[] GetQuality(String frameType, String resolution, String definition) {
+ return quality.get(frameType).get(resolution).get(definition).split(",");
+ }
+}
diff --git a/app/src/main/res/layout/activity_cas_cloud_main.xml b/app/src/main/res/layout/activity_cas_cloud_main.xml
index 6dcf8df..465e9d1 100644
--- a/app/src/main/res/layout/activity_cas_cloud_main.xml
+++ b/app/src/main/res/layout/activity_cas_cloud_main.xml
@@ -65,150 +65,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/cas_ctrl_view.xml b/app/src/main/res/layout/cas_ctrl_view.xml
index 94064a8..82531f7 100644
--- a/app/src/main/res/layout/cas_ctrl_view.xml
+++ b/app/src/main/res/layout/cas_ctrl_view.xml
@@ -20,48 +20,41 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
- android:orientation="vertical"
- android:paddingLeft="50dp"
- android:paddingRight="50dp">
+ android:orientation="horizontal"
+ android:paddingLeft="10dp"
+ android:paddingRight="10dp"
+ android:paddingTop="10dp"
+ android:paddingBottom="10dp">
-
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d4fc14e..2a051e4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,8 +25,11 @@
试玩时间已到
由于您长时间未操作游戏,服务断开
输入的参数不合法
+ 初始化状态错误,请重试
+ 初始化失败,请重试
云手机ip:
- 连接
+ APP连接
+ H5连接
云手机port:
关闭时延数据
显示时延数据
@@ -34,6 +37,10 @@
软编
硬编
远编
+ 超清
+ 高清
+ 标清
+ 流畅
编码服务器ip:
编码服务器port:
视频格式:
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 1699f81..137f663 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -12,6 +12,11 @@
- true
+
+
diff --git a/cloudphone/src/main/cpp/CasCommon.h b/cloudphone/src/main/cpp/CasCommon.h
index 3b75466..6f0c671 100644
--- a/cloudphone/src/main/cpp/CasCommon.h
+++ b/cloudphone/src/main/cpp/CasCommon.h
@@ -37,8 +37,8 @@ const std::string KEY_USER_ID = "user_id";
const std::string KEY_FRAME_RATE = "frame_rate";
const std::string KEY_FRAME_TYPE = "frame_type";
const std::string KEY_BITRATE = "bitrate";
-const std::string KEY_VIRTUAL_WIDTH = "virtual_width";
-const std::string KEY_VIRTUAL_HEIGHT = "virtual_height";
+const std::string KEY_STREAM_WIDTH = "stream_width";
+const std::string KEY_STREAM_HEIGHT = "stream_height";
enum VirtualDevice {
VIRTUAL_CAMERA,
diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp
index ff3ba1f..af8f67e 100644
--- a/cloudphone/src/main/cpp/CasController.cpp
+++ b/cloudphone/src/main/cpp/CasController.cpp
@@ -25,7 +25,7 @@
using namespace std;
const int BITRATE_MAX = 10000000;
-const int BITRATE_MIN = 1000000;
+const int BITRATE_MIN = 100000;
const int WIDTH_MAX = 4096;
const int WIDTH_MIN = 240;
const int HEIGHT_MAX = 4096;
@@ -122,11 +122,12 @@ void CasController::SetState(JNIState state)
bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
{
+ m_nativeWindow = nativeWindow;
bool res = false;
if (isHome && this->GetState() != STOPPED && m_casClientSocket->GetStatus() != SOCKET_STATUS_RUNNING) {
res = Reconnect();
if (res) {
- CreateDecWorker(nativeWindow, m_needVideoDecode);
+ CreateDecWorker(m_nativeWindow, m_needVideoDecode);
StartDecWorker(!m_retainVideoDecode);
return true;
} else {
@@ -136,7 +137,7 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
}
std::lock_guard lockGuard(this->m_lock);
if (isHome) {
- return ProcessEnterForeground(nativeWindow);
+ return ProcessEnterForeground(m_nativeWindow);
}
if (this->GetState() == STOPPED) {
@@ -169,18 +170,24 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
return false;
}
- res = CreateWorkers(nativeWindow, m_needVideoDecode);
+ res = CreateWorkers();
if (!res) {
- DestroyWorkers(false);
+ DestroyWorkers();
+ StopDecWorker(false);
+ CloseDataStream();
return false;
}
res = BuildConnection();
if (!res) {
+ ERR("Failed to build connection");
+ DestroyWorkers();
+ StopDecWorker(false);
+ CloseDataStream();
return false;
}
- StartWorkers(!m_retainVideoDecode);
+ StartWorkers();
std::string startCmd = CMD_START_APP;
map parameters = { { KEY_COMMAND, startCmd },
@@ -228,18 +235,18 @@ bool CasController::IsValidMediaConfig(map mediaConfig)
}
// 校验虚拟宽高,虚拟宽高需满足同时设置或同时未设置,且大于等于240,小于等于4096,与8对齐
- bool containsVirtualWidth = mediaConfig.find(KEY_VIRTUAL_WIDTH) != mediaConfig.end();
- bool containsVirtualHeight = mediaConfig.find(KEY_VIRTUAL_HEIGHT) != mediaConfig.end();
- if (containsVirtualWidth && containsVirtualHeight) {
- uint32_t virtualWidth = static_cast(atoi(mediaConfig[KEY_VIRTUAL_WIDTH].c_str()));
- uint32_t virtualHeight = static_cast(atoi(mediaConfig[KEY_VIRTUAL_HEIGHT].c_str()));
- if (virtualWidth > virtualHeight || virtualWidth < WIDTH_MIN || virtualWidth > WIDTH_MAX ||
- virtualWidth % TIMES != 0 || virtualHeight < HEIGHT_MIN || virtualHeight > HEIGHT_MAX ||
- virtualHeight % TIMES != 0) {
- ERR("Virtual width or virtual height is invalid, virtual width %u virtual height %u", virtualWidth, virtualHeight);
+ bool containsStreamWidth = mediaConfig.find(KEY_STREAM_WIDTH) != mediaConfig.end();
+ bool containsStreamHeight = mediaConfig.find(KEY_STREAM_HEIGHT) != mediaConfig.end();
+ if (containsStreamWidth && containsStreamHeight) {
+ uint32_t streamWidth = static_cast(atoi(mediaConfig[KEY_STREAM_WIDTH].c_str()));
+ uint32_t streamHeight = static_cast(atoi(mediaConfig[KEY_STREAM_HEIGHT].c_str()));
+ if (streamWidth > streamHeight || streamWidth < WIDTH_MIN || streamWidth > WIDTH_MAX ||
+ streamWidth % TIMES != 0 || streamHeight < HEIGHT_MIN || streamHeight > HEIGHT_MAX ||
+ streamHeight % TIMES != 0) {
+ ERR("Virtual width or virtual height is invalid, virtual width %u virtual height %u", streamWidth, streamHeight);
return false;
}
- } else if (containsVirtualWidth || containsVirtualHeight) {
+ } else if (containsStreamWidth || containsStreamHeight) {
ERR("Virtual width or virtual height is not included");
return false;
}
@@ -277,7 +284,8 @@ bool CasController::Stop(bool isHome)
usleep(200000);
this->SetState(STOPPED);
- DestroyWorkers(!m_retainVideoDecode);
+ DestroyWorkers();
+ StopDecWorker(!m_retainVideoDecode);
CloseDataStream();
m_isNotifyFirstFrame = false;
@@ -294,7 +302,8 @@ bool CasController::Release()
return false;
}
- DestroyWorkers(m_retainVideoDecode);
+ DestroyWorkers();
+ StopDecWorker(m_retainVideoDecode);
ClearDataStream();
return true;
}
@@ -313,9 +322,9 @@ bool CasController::Reconnect()
return false;
}
- res = CreateWorkers(nullptr, !m_needVideoDecode);
+ res = CreateWorkers();
if (!res) {
- DestroyWorkers(false);
+ DestroyWorkers();
return false;
}
@@ -344,11 +353,12 @@ bool CasController::Reconnect()
return false;
}
- StartWorkers(m_retainVideoDecode);
+ StartWorkers();
+ StartDecWorker(m_retainVideoDecode);
return true;
}
-bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDecode)
+bool CasController::CreateWorkers()
{
m_casClientSocket = new (std::nothrow) CasTcpClientSocket(m_ip, m_port);
if (m_casClientSocket == nullptr) {
@@ -409,15 +419,6 @@ bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDec
m_streamParser->SetServiceHandle(CasMsgType::VirtualDevice, m_virtualDeviceStream);
m_streamParser->SetServiceHandle(CasMsgType::ImeData, m_imeDataStream);
- if (needVideoDecode) {
- m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType);
- if (m_videoDecodeThread == nullptr) {
- ERR("Failed to new video decode thread.");
- return false;
- }
- m_videoDecodeThread->SetDecodePktHandle(m_videoPacketStream);
- }
-
m_touch = new (std::nothrow) CasTouch(m_casClientSocket);
if (m_touch == nullptr) {
ERR("Failed to new touch.");
@@ -427,25 +428,16 @@ bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDec
return true;
}
-bool CasController::StartWorkers(bool retainVideoDecode)
+bool CasController::StartWorkers()
{
m_streamParseThread->Start();
-
- if (retainVideoDecode) {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Restart();
- }
- } else {
- m_videoDecodeThread->Start();
- }
-
m_heartbeatThread->Start();
m_controlThread->Start();
INFO("Succeed to start workers");
return true;
}
-bool CasController::DestroyWorkers(bool retainVideoDecode)
+bool CasController::DestroyWorkers()
{
if (m_streamParseThread != nullptr) {
m_streamParseThread->Stop();
@@ -486,18 +478,6 @@ bool CasController::DestroyWorkers(bool retainVideoDecode)
m_cmdController = nullptr;
}
- if (retainVideoDecode) {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Stop();
- }
- } else {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Exit();
- delete m_videoDecodeThread;
- m_videoDecodeThread = nullptr;
- }
- }
-
if (m_streamBuildSender != nullptr) {
delete m_streamBuildSender;
m_streamBuildSender = nullptr;
@@ -873,6 +853,7 @@ bool CasController::CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoD
if (needVideoDecode) {
m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType);
if (m_videoDecodeThread == nullptr) {
+ ERR("Failed to new video decode thread.");
return false;
}
m_videoDecodeThread->SetDecodePktHandle(m_videoPacketStream);
@@ -947,5 +928,11 @@ void CasController::NotifyFirstVideoFrame()
void CasController::OnCmdRecv(int code, string msg)
{
+ if (code == CAS_START_SUCCESS) {
+ m_frameType = msg.find("h265") != string::npos ? FrameType::H265 : FrameType::H264;
+ StopDecWorker(false);
+ CreateDecWorker(m_nativeWindow, m_needVideoDecode);
+ StartDecWorker(!m_retainVideoDecode);
+ }
NotifyCommand(code, msg);
}
\ No newline at end of file
diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h
index 835a883..3890598 100644
--- a/cloudphone/src/main/cpp/CasController.h
+++ b/cloudphone/src/main/cpp/CasController.h
@@ -81,11 +81,11 @@ public:
private:
bool Release();
- bool CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDecode);
+ bool CreateWorkers();
- bool StartWorkers(bool retainVideoDecode);
+ bool StartWorkers();
- bool DestroyWorkers(bool retainVideoDecode);
+ bool DestroyWorkers();
bool CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoDecode);
@@ -154,6 +154,7 @@ private:
std::string m_clientType;
std::string m_maxDisconnectDuration;
FrameType m_frameType;
+ ANativeWindow *m_nativeWindow;
unsigned int m_ip = 0;
unsigned short m_port = 0;
const bool m_retainVideoDecode = true;
diff --git a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
index 3495f6a..62f910d 100644
--- a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
+++ b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
@@ -24,7 +24,8 @@ const std::string KEY_COMMAND = "command";
const std::string KEY_RESULT = "result";
const std::string KEY_CODE = "code";
const std::string KEY_MSG = "msg";
-const std::string CMD_HEARTBEAT_REQUEST = "0";
+const std::string KEY_HEARTBEAT = "heartbeat";
+const std::string CMD_VERIFY = "0";
const std::string CMD_START_APP = "1";
const std::string CMD_STOP_APP = "2";
const std::string CMD_RECONNECT = "3";
diff --git a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
index 45dcaa9..7bbb110 100644
--- a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
+++ b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
@@ -60,9 +60,7 @@ bool CasHeartbeatController::HeartBeatRequest(int timeout)
{
std::lock_guard lockGuard(this->m_lock);
this->m_recvStream->Clear();
- map parameters = { { KEY_COMMAND, CMD_HEARTBEAT_REQUEST } };
- string msg = CasAppCtrlCmdUtils::MakeCommand(parameters);
- return Send(msg) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
+ return Send(KEY_HEARTBEAT) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
}
bool CasHeartbeatController::Send(string msg)
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
index 323f84a..52936a8 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
@@ -57,6 +57,7 @@ import com.huawei.cloudphone.common.CasState;
import com.huawei.cloudphone.service.CASClient;
import com.huawei.cloudphone.service.CASService;
+import java.net.BindException;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
@@ -65,7 +66,6 @@ import java.util.TimerTask;
import static android.view.KeyEvent.KEYCODE_BACK;
import static android.view.KeyEvent.KEYCODE_VOLUME_DOWN;
import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
-import static android.view.KeyEvent.META_ALT_ON;
import static com.huawei.cloudphone.api.CloudPhoneParas.DisplayMode.DISPLAY_MODE_FILL;
import static com.huawei.cloudphone.common.CasState.CAS_CONNECT_EXCEPTION;
import static com.huawei.cloudphone.utils.CasMediaUtils.isValidMediaConfig;
@@ -145,10 +145,11 @@ public class CloudPhoneImpl implements ICloudPhone {
}
@Override
- public void init(Context context, CloudPhoneParas.DevType type) {
+ public void init(Context context, CloudPhoneParas.DevType type) throws Exception {
CASLog.i(TAG, "init called mCurrentState = " + mCurrentState);
if (mCurrentState != STATE_DEINIT) {
- return;
+ CASLog.e(TAG, "Not ready for init. current state is " + mCurrentState);
+ throw new IllegalStateException("Not ready for init.");
}
mConnection = new CloudPhoneServiceConnection();
mCASClient = new CASClient();
@@ -159,12 +160,12 @@ public class CloudPhoneImpl implements ICloudPhone {
boolean ret = mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
if (!ret) {
CASLog.e(TAG, "Bind service failed.");
- return;
+ throw new BindException("Bind service failed.");
}
mCmdHandlerThread = new HandlerThread("cmd process");
if (mCmdHandlerThread == null) {
CASLog.e(TAG,"Create handler thread failed.");
- return;
+ throw new RuntimeException("Bind service failed.");
}
mCmdHandlerThread.start();
mCmdHandler = new CmdHandler(mCmdHandlerThread.getLooper());
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
index f31b49f..40e67d9 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
@@ -116,12 +116,22 @@ public class CasConstantsUtil {
/**
* virtual_width
*/
- public static final String VIRTUAL_WIDTH = "virtual_width";
+ public static final String STREAM_WIDTH = "stream_width";
/**
* virtual_height
*/
- public static final String VIRTUAL_HEIGHT = "virtual_height";
+ public static final String STREAM_HEIGHT = "stream_height";
+
+ /**
+ * Physical_width
+ */
+ public static final String WIDTH = "width";
+
+ /**
+ * Physical_height
+ */
+ public static final String HEIGHT = "height";
/**
* rgb2yuv rgb转yuv 0:编码时转换 1:抓图时转换
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
index bae3a27..1d7c289 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
@@ -21,13 +21,16 @@ import com.huawei.cloudphone.common.CASLog;
import java.util.HashMap;
import static com.huawei.cloudphone.utils.CasConstantsUtil.BITRATE;
-import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_HEIGHT;
-import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_WIDTH;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.STREAM_HEIGHT;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.STREAM_WIDTH;
+
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
public class CasMediaUtils {
public static final String TAG = "CasMediaUtils";
- public static final int BITRATE_MIN = 1000000;
+ public static final int BITRATE_MIN = 100000;
public static final int BITRATE_MAX = 10000000;
public static final int MIN = 240;
public static final int MAX = 4096;
@@ -49,11 +52,11 @@ public class CasMediaUtils {
}
// 校验分辨率
- boolean containsVirtualWidth = mediaConfig.containsKey(VIRTUAL_WIDTH);
- boolean containsVirtualHeight = mediaConfig.containsKey(VIRTUAL_HEIGHT);
+ boolean containsVirtualWidth = mediaConfig.containsKey(STREAM_WIDTH);
+ boolean containsVirtualHeight = mediaConfig.containsKey(STREAM_HEIGHT);
if (containsVirtualWidth && containsVirtualHeight) {
- int virtualWidth = Integer.parseInt(mediaConfig.get(VIRTUAL_WIDTH));
- int virtualHeight = Integer.parseInt(mediaConfig.get(VIRTUAL_HEIGHT));
+ int virtualWidth = Integer.parseInt(mediaConfig.get(STREAM_WIDTH));
+ int virtualHeight = Integer.parseInt(mediaConfig.get(STREAM_HEIGHT));
if (virtualWidth > virtualHeight || virtualWidth < MIN || virtualWidth > MAX || virtualWidth % TIMES != 0
|| virtualHeight < MIN || virtualHeight > MAX || virtualHeight % TIMES != 0) {
CASLog.e(TAG, "the virtual width or virtual height is valid");
@@ -67,4 +70,11 @@ public class CasMediaUtils {
}
return true;
}
+
+ public static boolean isSupportH265() {
+ MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ String mimeType = "video/hevc";
+ return mediaCodecList.findDecoderForFormat(
+ MediaFormat.createVideoFormat(mimeType, 1920, 1080)) != null;
+ }
}
\ No newline at end of file
diff --git a/config.gradle b/config.gradle
index c17e923..ed1c329 100644
--- a/config.gradle
+++ b/config.gradle
@@ -5,5 +5,5 @@ ext.versions = [
compileSdkVersion : 28,
buildToolsVersion : '28.0.3',
versionCode : 1,
- versionName : '23.5.5',
+ versionName : '23.6.0',
]
\ No newline at end of file
--
Gitee
From b4da91fe01853473ba6ceec3e4c9e1c7e083feab Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Tue, 11 Jul 2023 14:36:16 +0800
Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BB=E9=A2=98?=
=?UTF-8?q?=EF=BC=8C=E6=98=BE=E7=A4=BA=E5=8A=A0=E8=BD=BD=E4=B8=ADview?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 1 +
.../huawei/cloudapp/ui/CasCloudPhoneActivity.java | 9 +++++----
app/src/main/res/layout/cas_activity_fullscreen.xml | 12 ++++++------
app/src/main/res/values/styles.xml | 2 +-
cloudphone/src/main/cpp/CasCommon.h | 2 +-
.../huawei/cloudphone/utils/CasConstantsUtil.java | 2 +-
6 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 0146823..06c5168 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -75,5 +75,6 @@ dependencies {
implementation 'com.hyman:flowlayout-lib:1.1.2'
implementation 'com.android.support:design:28.0.0'
implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
+ implementation 'com.github.shem8:material-login:2.1.1'
implementation project(':cloudphone')
}
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 20f1eb6..ddae251 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -38,6 +38,7 @@ import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
@@ -132,7 +133,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
public boolean doCheckConnection = false;
private int mDevType;
private HashMap mMediaConfig = null;
- private ImageView loadingView = null;
+ private ProgressBar mProgressBar = null;
private int currentRotation = -1;
private CasCommonDialog quitDialog;
private CasCommonDialog mDialog;
@@ -255,7 +256,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
initVirtualDeviceSession();
mCasHistory = new CasHistory(getSharedPreferences("input_history", MODE_PRIVATE));
// get views
- loadingView = (ImageView) findViewById(R.id.loadingView);
+ mProgressBar = findViewById(R.id.loading_progress_bar);
mFrameLayout = (FrameLayout) findViewById(R.id.frame_layout);
mFloatContainer = (FrameLayout) findViewById(R.id.floatContainer);
lag = (TextView) findViewById(R.id.lag);
@@ -273,6 +274,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
radioViewMain = findViewById(R.id.pic_quality_main);
radioViewBasic = findViewById(R.id.pic_quality_basic);
qualityRadioViewGroup.setVisibility(View.GONE);
+ qualityRadioViewGroup.check(radioViewMain.getId());
qualityRadioViewGroup.setOnCheckedChangeListener(qualityCheckedChangeListener);
setRotation(mOrientation);
@@ -443,7 +445,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
switch (code) {
case CasState.CAS_START_SUCCESS:
lag.setVisibility(View.VISIBLE);
- loadingView.setVisibility(View.GONE);
+ mProgressBar.setVisibility(View.GONE);
startSuccessThreadTask();
handleStartSuccessMsg(msg);
mCasHistory.setHistory("ip", connectInfo.getConnectIp());
@@ -525,7 +527,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mMediaConfig.put(STREAM_WIDTH, qualityStr[1]);
mMediaConfig.put(STREAM_HEIGHT, qualityStr[2]);
mCloudPhone.setMediaConfig(mMediaConfig);
- qualityRadioViewGroup.check(radioViewMain.getId());
qualityRadioViewGroup.setVisibility(View.VISIBLE);
}
diff --git a/app/src/main/res/layout/cas_activity_fullscreen.xml b/app/src/main/res/layout/cas_activity_fullscreen.xml
index c7978fb..6866007 100644
--- a/app/src/main/res/layout/cas_activity_fullscreen.xml
+++ b/app/src/main/res/layout/cas_activity_fullscreen.xml
@@ -13,12 +13,12 @@
android:background="@color/cas_black"
android:focusable="true">
-
+
@color/colorAccent
-
diff --git a/cloudphone/src/main/cpp/CasCommon.h b/cloudphone/src/main/cpp/CasCommon.h
index 6f0c671..b61c423 100644
--- a/cloudphone/src/main/cpp/CasCommon.h
+++ b/cloudphone/src/main/cpp/CasCommon.h
@@ -34,7 +34,7 @@ const std::string KEY_CLIENT_TYPE = "client_type";
const std::string KEY_MEDIA_CONFIG = "media_config";
const std::string KEY_USER_ID = "user_id";
-const std::string KEY_FRAME_RATE = "frame_rate";
+const std::string KEY_FRAME_RATE = "fps";
const std::string KEY_FRAME_TYPE = "frame_type";
const std::string KEY_BITRATE = "bitrate";
const std::string KEY_STREAM_WIDTH = "stream_width";
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
index 40e67d9..2d9af8e 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
@@ -91,7 +91,7 @@ public class CasConstantsUtil {
/**
* frame_rate 帧率,大于等于10小于等于60,且为10的倍数
*/
- public static final String FRAME_RATE = "frame_rate";
+ public static final String FRAME_RATE = "fps";
/**
* bitrate 码率,大于等于1000000小于等于10000000
--
Gitee
From b8c08a8e0e23d0261134169307c5106f74c64ccd Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Fri, 14 Jul 2023 16:52:06 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=BB=E5=B1=8F?=
=?UTF-8?q?=E6=97=8B=E8=BD=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 1 -
.../cloudapp/ui/CasCloudPhoneActivity.java | 3 +-
cloudphone/src/main/cpp/CasCommon.h | 6 +-
cloudphone/src/main/cpp/CasController.cpp | 61 +++++++++++++++----
cloudphone/src/main/cpp/CasController.h | 7 +++
.../cpp/cas_decoder/CasDecodeController.cpp | 6 +-
.../cpp/cas_decoder/CasDecodeController.h | 2 +-
.../src/main/cpp/cas_decoder/CasDecoder.cpp | 19 ++++--
.../src/main/cpp/cas_decoder/CasDecoder.h | 4 +-
.../main/cpp/cas_decoder/CasVideoEngine.cpp | 4 +-
.../src/main/cpp/cas_decoder/CasVideoEngine.h | 2 +-
.../main/cpp/cas_service/CasAppCtrlCmdUtils.h | 3 +-
.../cas_service/CasHeartbeatController.cpp | 4 +-
.../cpp/cas_service/CasVideoHDecodeThread.cpp | 9 ++-
.../cpp/cas_service/CasVideoHDecodeThread.h | 3 +-
15 files changed, 98 insertions(+), 36 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 06c5168..0146823 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -75,6 +75,5 @@ dependencies {
implementation 'com.hyman:flowlayout-lib:1.1.2'
implementation 'com.android.support:design:28.0.0'
implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
- implementation 'com.github.shem8:material-login:2.1.1'
implementation project(':cloudphone')
}
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 ddae251..bae6cff 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -564,7 +564,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
* main thread set rotation
*/
public void setRotation(int rotation) {
- if (rotation > 3) {
+ if (rotation > 8) {
return;
}
if (currentRotation != rotation) {
@@ -573,6 +573,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case 1:
+ case 8:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
break;
case 2:
diff --git a/cloudphone/src/main/cpp/CasCommon.h b/cloudphone/src/main/cpp/CasCommon.h
index b61c423..3b75466 100644
--- a/cloudphone/src/main/cpp/CasCommon.h
+++ b/cloudphone/src/main/cpp/CasCommon.h
@@ -34,11 +34,11 @@ const std::string KEY_CLIENT_TYPE = "client_type";
const std::string KEY_MEDIA_CONFIG = "media_config";
const std::string KEY_USER_ID = "user_id";
-const std::string KEY_FRAME_RATE = "fps";
+const std::string KEY_FRAME_RATE = "frame_rate";
const std::string KEY_FRAME_TYPE = "frame_type";
const std::string KEY_BITRATE = "bitrate";
-const std::string KEY_STREAM_WIDTH = "stream_width";
-const std::string KEY_STREAM_HEIGHT = "stream_height";
+const std::string KEY_VIRTUAL_WIDTH = "virtual_width";
+const std::string KEY_VIRTUAL_HEIGHT = "virtual_height";
enum VirtualDevice {
VIRTUAL_CAMERA,
diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp
index af8f67e..7a79428 100644
--- a/cloudphone/src/main/cpp/CasController.cpp
+++ b/cloudphone/src/main/cpp/CasController.cpp
@@ -79,6 +79,9 @@ CasController::CasController()
m_state = INIT;
m_touch = nullptr;
cmdCallBack = nullptr;
+ m_orientation = 0;
+ m_frameType = FrameType::H264;
+ m_isRotation = false;
}
CasController::~CasController()
@@ -102,6 +105,7 @@ CasController::~CasController()
m_state = INIT;
m_touch = nullptr;
cmdCallBack = nullptr;
+ m_orientation = 0;
}
void CasController::SetJniConf(string key, string value)
@@ -122,6 +126,7 @@ void CasController::SetState(JNIState state)
bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
{
+ m_orientation = 0;
m_nativeWindow = nativeWindow;
bool res = false;
if (isHome && this->GetState() != STOPPED && m_casClientSocket->GetStatus() != SOCKET_STATUS_RUNNING) {
@@ -235,11 +240,11 @@ bool CasController::IsValidMediaConfig(map mediaConfig)
}
// 校验虚拟宽高,虚拟宽高需满足同时设置或同时未设置,且大于等于240,小于等于4096,与8对齐
- bool containsStreamWidth = mediaConfig.find(KEY_STREAM_WIDTH) != mediaConfig.end();
- bool containsStreamHeight = mediaConfig.find(KEY_STREAM_HEIGHT) != mediaConfig.end();
+ bool containsStreamWidth = mediaConfig.find(KEY_VIRTUAL_WIDTH) != mediaConfig.end();
+ bool containsStreamHeight = mediaConfig.find(KEY_VIRTUAL_HEIGHT) != mediaConfig.end();
if (containsStreamWidth && containsStreamHeight) {
- uint32_t streamWidth = static_cast(atoi(mediaConfig[KEY_STREAM_WIDTH].c_str()));
- uint32_t streamHeight = static_cast(atoi(mediaConfig[KEY_STREAM_HEIGHT].c_str()));
+ uint32_t streamWidth = static_cast(atoi(mediaConfig[KEY_VIRTUAL_WIDTH].c_str()));
+ uint32_t streamHeight = static_cast(atoi(mediaConfig[KEY_VIRTUAL_HEIGHT].c_str()));
if (streamWidth > streamHeight || streamWidth < WIDTH_MIN || streamWidth > WIDTH_MAX ||
streamWidth % TIMES != 0 || streamHeight < HEIGHT_MIN || streamHeight > HEIGHT_MAX ||
streamHeight % TIMES != 0) {
@@ -289,6 +294,8 @@ bool CasController::Stop(bool isHome)
CloseDataStream();
m_isNotifyFirstFrame = false;
+ m_isRotation = false;
+ m_orientation = 0;
m_mediaConfig.clear();
m_jniConf.clear();
return true;
@@ -745,6 +752,7 @@ int CasController::JniSendData(CasMsgType type, uint8_t *data, int length)
int CasController::JniRecvData(CasMsgType type, uint8_t *data, int length)
{
void *pPkt = nullptr;
+ bool isGetOrientation = false;
switch (type) {
case CasMsgType::Audio:
if (m_audioPacketStream != nullptr) {
@@ -754,6 +762,7 @@ int CasController::JniRecvData(CasMsgType type, uint8_t *data, int length)
case CasMsgType::Orientation:
if (m_orientationStream != nullptr) {
pPkt = m_orientationStream->GetNextPkt();
+ isGetOrientation = true;
}
break;
case CasMsgType::Channel:
@@ -792,9 +801,33 @@ int CasController::JniRecvData(CasMsgType type, uint8_t *data, int length)
if (EOK != memcpy_s(data, dataLen, pPayload, dataLen)) {
ERR("Failed to copy.");
}
+
+ if (isGetOrientation) {
+ IsNeedRotation((int) (*pPayload));
+ }
+
return dataLen;
}
+void CasController::IsNeedRotation(int orientation)
+{
+
+ INFO("ORIENTATION is %d, old ORIENTATION is %d.", orientation, m_orientation);
+ if (orientation == m_orientation) {
+ return;
+ }
+ if (orientation == 8) {
+ m_isRotation = true;
+ } else {
+ m_isRotation = false;
+ }
+
+ std::lock_guard lockGuard(this->m_decoderLock);
+ ResetDecoder();
+ ForceIFrame();
+ m_orientation = orientation;
+}
+
bool CasController::GetConnectStatus()
{
#if defined(RECONNECT) || (SOCKET_RECONNECT)
@@ -829,7 +862,6 @@ void CasController::ProcessEnterBackground()
bool CasController::ProcessEnterForeground(ANativeWindow *nativeWindow)
{
ClearDataStream();
- CreateDecWorker(nativeWindow, m_needVideoDecode);
if (m_sessionId.empty()) {
ERR("SessionId is empty.");
@@ -844,14 +876,13 @@ bool CasController::ProcessEnterForeground(ANativeWindow *nativeWindow)
ERR("Failed to send resume command");
return false;
}
- StartDecWorker(!m_retainVideoDecode);
return true;
}
bool CasController::CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoDecode)
{
if (needVideoDecode) {
- m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType);
+ m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType, m_isRotation);
if (m_videoDecodeThread == nullptr) {
ERR("Failed to new video decode thread.");
return false;
@@ -928,11 +959,19 @@ 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;
- StopDecWorker(false);
- CreateDecWorker(m_nativeWindow, m_needVideoDecode);
- StartDecWorker(!m_retainVideoDecode);
+ ResetDecoder();
+ ForceIFrame();
}
- NotifyCommand(code, msg);
+}
+
+void CasController::ResetDecoder()
+{
+ StopDecWorker(false);
+ ClearDataStream();
+ CreateDecWorker(m_nativeWindow, m_needVideoDecode);
+ StartDecWorker(false);
}
\ No newline at end of file
diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h
index 3890598..57bde7b 100644
--- a/cloudphone/src/main/cpp/CasController.h
+++ b/cloudphone/src/main/cpp/CasController.h
@@ -81,6 +81,10 @@ public:
private:
bool Release();
+ void IsNeedRotation(int orientation);
+
+ void ResetDecoder();
+
bool CreateWorkers();
bool StartWorkers();
@@ -145,6 +149,7 @@ private:
std::mutex m_jniConfLock;
std::mutex m_lock;
std::mutex m_callbackLock;
+ std::mutex m_decoderLock;
std::string m_sessionId;
std::string m_ticket;
std::string m_encryptedData;
@@ -161,6 +166,8 @@ private:
const bool m_needVideoDecode = true;
bool m_isNotifyFirstFrame = false;
std::map m_mediaConfig;
+ int m_orientation = 0;
+ bool m_isRotation = false;
};
#endif // CLOUDAPPSDK_CASCONTROLLRT_H
\ No newline at end of file
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
index 16290b7..9c197cd 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
@@ -90,6 +90,7 @@ void OutputTaskEntry(CasDecodeController *controller)
if (casVideoUtil != nullptr) {
startUs = casVideoUtil->GetNow();
}
+
iRet = static_cast(controller->m_decoder->OutputAndDisplay());
if (iRet == DECODER_OUTPUT_ERR) {
ERR("Sub-Thread exited.");
@@ -98,6 +99,7 @@ void OutputTaskEntry(CasDecodeController *controller)
if (!isDecodeFirstFrame) {
isDecodeFirstFrame = true;
if (controller->m_firstFrameListener != nullptr) {
+ ERR("isDecodeFirstFrame-----------------------%d", isDecodeFirstFrame);
controller->m_firstFrameListener->OnFirstFrame();
}
}
@@ -121,7 +123,7 @@ void OutputTaskEntry(CasDecodeController *controller)
* @return errno: SUCCESS
* VIDEO_ENGINE_CLIENT_INIT_FAIL
*/
-uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameType)
+uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
{
if (!IsStatus(EngineStat::ENGINE_INVALID)) {
ERR("Destroy needed first.");
@@ -132,7 +134,7 @@ uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameT
ERR("Failed to instantiate CasDecoder.");
return VIDEO_ENGINE_CLIENT_INIT_FAIL;
}
- uint32_t ret = m_decoder->Init(nativeWindow, frameType);
+ uint32_t ret = m_decoder->Init(nativeWindow, frameType, isNeedRotation);
if (ret != DECODER_SUCCESS) {
Destroy();
if (ret == DECODER_SDK_UNSUPPORTED) {
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
index 2201c50..1efe220 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
@@ -45,7 +45,7 @@ public:
* @return errno: SUCCESS
* VIDEO_ENGINE_CLIENT_INIT_FAIL
*/
- uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType);
+ uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
/*
* @fn Start
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
index fce69c8..22304e8 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
@@ -78,7 +78,7 @@ CasDecoder::~CasDecoder()
* @return errno: DECODER_SUCCESS
* DECODER_INIT_ERR
*/
-uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType)
+uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
{
m_casVideoUtil = CasVideoUtil::GetInstance();
if (m_casVideoUtil == nullptr || !m_casVideoUtil->Init()) {
@@ -107,7 +107,7 @@ uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType)
ERR("Failed to create MediaCodec.");
return DECODER_INIT_ERR;
}
- AMediaFormat *fmt = CreateMediaCodecFmt();
+ AMediaFormat *fmt = CreateMediaCodecFmt(isNeedRotation);
if (fmt == nullptr) {
ERR("Failed to create MediaCodec format.");
return DECODER_INIT_ERR;
@@ -267,6 +267,8 @@ uint32_t CasDecoder::GetFps() const
void CasDecoder::Destroy() noexcept
{
if (m_mediaCodec != nullptr) {
+ AMediaCodec_stop(m_mediaCodec);
+ AMediaCodec_flush(m_mediaCodec);
AMediaCodec_delete(m_mediaCodec);
m_mediaCodec = nullptr;
}
@@ -279,13 +281,20 @@ void CasDecoder::Destroy() noexcept
* @brief to create AMediaFormat for MediaCodec configuration.
* @return AMediaFormat *, AMediaFormat object for MediaCodec configuration
*/
-AMediaFormat *CasDecoder::CreateMediaCodecFmt() const
+AMediaFormat *CasDecoder:: CreateMediaCodecFmt(bool isNeedRotation) const
{
AMediaFormat *fmt = AMediaFormat_new();
if (fmt != nullptr) {
+ int width = MediaCodecResolution::KEY_WIDTH;
+ int height = MediaCodecResolution::KEY_HEIGHT;
+ if (isNeedRotation) {
+ AMediaFormat_setInt32(fmt, "rotation-degrees", 270);
+ INFO("ORIENTATION set degree 270");
+ }
+
AMediaFormat_setString(fmt, AMEDIAFORMAT_KEY_MIME, m_mimeType);
- AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_WIDTH, MediaCodecResolution::KEY_WIDTH);
- AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_HEIGHT, MediaCodecResolution::KEY_HEIGHT);
+ AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_WIDTH, width);
+ AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_HEIGHT, height);
// Operate at maximum rate to lower latency as much as possible on
// some Qualcomm platforms. We could also set KEY_PRIORITY to 0 (realtime)
// but that will actually result in the decoder crashing if it can't satisfy
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
index 60df65e..b055caf 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
@@ -50,7 +50,7 @@ public:
* @return errno: DECODER_SUCCESS
* DECODER_INIT_ERR
*/
- uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType);
+ uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
/*
* @fn Start
@@ -100,7 +100,7 @@ private:
* @brief to create AMediaFormat for MediaCodec configuration.
* @return AMediaFormat for MediaCodec configuration
*/
- AMediaFormat *CreateMediaCodecFmt() const;
+ AMediaFormat *CreateMediaCodecFmt(bool isNeedRotation) const;
/*
* @fn AssembleMemory
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
index e7eedc9..0ce5905 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
@@ -42,7 +42,7 @@ CasVideoEngine::~CasVideoEngine() = default;
* VIDEO_ENGINE_CLIENT_PARAM_INVALID
* VIDEO_ENGINE_CLIENT_PARAM_UNSUPPORTED
*/
-uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType)
+uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, bool isNeedRotation)
{
std::lock_guard lockGuard(m_lock);
if (nativeWindow == nullptr) {
@@ -58,7 +58,7 @@ uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType ty
ERR("Failed to instantiate.");
return VIDEO_ENGINE_CLIENT_INIT_FAIL;
}
- return decodeController->Init(nativeWindow, frameType);
+ return decodeController->Init(nativeWindow, frameType, isNeedRotation);
}
/*
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
index 8a374b1..05d8f88 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
@@ -44,7 +44,7 @@ public:
* VIDEO_ENGINE_CLIENT_PARAM_INVALID
* VIDEO_ENGINE_CLIENT_PARAM_UNSUPPORTED
*/
- uint32_t InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType);
+ uint32_t InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, bool isNeedRotation);
/*
* @fn StartDecoder
diff --git a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
index 62f910d..3495f6a 100644
--- a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
+++ b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
@@ -24,8 +24,7 @@ const std::string KEY_COMMAND = "command";
const std::string KEY_RESULT = "result";
const std::string KEY_CODE = "code";
const std::string KEY_MSG = "msg";
-const std::string KEY_HEARTBEAT = "heartbeat";
-const std::string CMD_VERIFY = "0";
+const std::string CMD_HEARTBEAT_REQUEST = "0";
const std::string CMD_START_APP = "1";
const std::string CMD_STOP_APP = "2";
const std::string CMD_RECONNECT = "3";
diff --git a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
index 7bbb110..45dcaa9 100644
--- a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
+++ b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
@@ -60,7 +60,9 @@ bool CasHeartbeatController::HeartBeatRequest(int timeout)
{
std::lock_guard lockGuard(this->m_lock);
this->m_recvStream->Clear();
- return Send(KEY_HEARTBEAT) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
+ map parameters = { { KEY_COMMAND, CMD_HEARTBEAT_REQUEST } };
+ string msg = CasAppCtrlCmdUtils::MakeCommand(parameters);
+ return Send(msg) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
}
bool CasHeartbeatController::Send(string msg)
diff --git a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
index 6417558..441e096 100644
--- a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
+++ b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
@@ -40,7 +40,7 @@ public:
}
};
-CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType)
+CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
{
this->m_nativeWindow = nativeWindow;
this->m_videoEngine = nullptr;
@@ -50,6 +50,7 @@ CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameT
this->m_decodeTask = nullptr;
this->m_threadStatus = CAS_THREAD_INIT;
this->m_frameType = frameType;
+ this->m_isNeedRotation = isNeedRotation;
}
CasVideoHDecodeThread::~CasVideoHDecodeThread()
@@ -198,7 +199,8 @@ int CasVideoHDecodeThread::Start()
}
this->m_videoEngine->SetVideoDecodeStatListener(m_videoDecodeStat);
- uint32_t initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW, m_frameType);
+ uint32_t initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW,
+ m_frameType, m_isNeedRotation);
if (initRet != 0) {
ERR("Init error %u", initRet);
EngineStat status;
@@ -213,7 +215,8 @@ int CasVideoHDecodeThread::Start()
INFO("Get decoder status error.");
return initRet;
}
- initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW, m_frameType);
+ initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW,
+ m_frameType, m_isNeedRotation);
if (initRet != 0) {
ERR("Init again return error %u.", initRet);
return initRet;
diff --git a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
index 23b5941..8611d96 100644
--- a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
+++ b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
@@ -25,7 +25,7 @@ class CasVideoDecodeStatImpl;
class CasVideoHDecodeThread {
public:
- explicit CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType);
+ explicit CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
~CasVideoHDecodeThread();
@@ -57,6 +57,7 @@ private:
std::thread *m_decodeTask;
ANativeWindow *m_nativeWindow;
FrameType m_frameType;
+ bool m_isNeedRotation;
};
#endif // CLOUDAPPSDK_CASVIDEODECODETHREAD_H
--
Gitee
From 59ad1ef50b6bd3cf83aa4ada87644e70edd89a79 Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Fri, 14 Jul 2023 16:52:06 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=BB=E5=B1=8F?=
=?UTF-8?q?=E6=97=8B=E8=BD=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cloudapp/ui/CasCloudMainActivity.java | 2 +-
.../cloudapp/ui/CasCloudPhoneActivity.java | 8 +++-
cloudphone/src/main/cpp/CasController.cpp | 14 ++++---
cloudphone/src/main/cpp/CasController.h | 2 +-
.../cpp/cas_decoder/CasDecodeController.cpp | 5 ++-
.../cpp/cas_decoder/CasDecodeController.h | 3 +-
.../src/main/cpp/cas_decoder/CasDecoder.cpp | 13 +++----
.../src/main/cpp/cas_decoder/CasDecoder.h | 5 ++-
.../main/cpp/cas_decoder/CasVideoEngine.cpp | 5 ++-
.../src/main/cpp/cas_decoder/CasVideoEngine.h | 2 +-
.../cpp/cas_service/CasVideoHDecodeThread.cpp | 8 ++--
.../cpp/cas_service/CasVideoHDecodeThread.h | 4 +-
.../cloudphone/apiimpl/CloudPhoneImpl.java | 37 ++++++++-----------
13 files changed, 56 insertions(+), 52 deletions(-)
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
index 30392fa..1c28242 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
@@ -98,7 +98,6 @@ public class CasCloudMainActivity extends Activity {
public void cloudPhoneConnect(View view) {
startCloudPhoneActivity(CasCloudPhoneActivity.class);
- appConnect.setEnabled(false);
}
@@ -122,6 +121,7 @@ public class CasCloudMainActivity extends Activity {
intent.putExtra(CasConnectInfo.BUNDLE_KEY, connectorInfo);
startActivity(intent);
overridePendingTransition(0, 0);
+ appConnect.setEnabled(false);
}
private CasConnectInfo getCasConnectorInfo(String phoneIp, String phonePort) {
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 bae6cff..00c7e40 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -564,7 +564,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
* main thread set rotation
*/
public void setRotation(int rotation) {
- if (rotation > 8) {
+ if (rotation > 24) {
return;
}
if (currentRotation != rotation) {
@@ -577,12 +577,16 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
break;
case 2:
+ case 16:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case 3:
- default:
+ case 24:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
+ default:
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ break;
}
currentRotation = rotation;
}
diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp
index 7a79428..6df5056 100644
--- a/cloudphone/src/main/cpp/CasController.cpp
+++ b/cloudphone/src/main/cpp/CasController.cpp
@@ -81,7 +81,7 @@ CasController::CasController()
cmdCallBack = nullptr;
m_orientation = 0;
m_frameType = FrameType::H264;
- m_isRotation = false;
+ m_rotationDegrees = 0;
}
CasController::~CasController()
@@ -294,7 +294,7 @@ bool CasController::Stop(bool isHome)
CloseDataStream();
m_isNotifyFirstFrame = false;
- m_isRotation = false;
+ m_rotationDegrees = 0;
m_orientation = 0;
m_mediaConfig.clear();
m_jniConf.clear();
@@ -817,9 +817,13 @@ void CasController::IsNeedRotation(int orientation)
return;
}
if (orientation == 8) {
- m_isRotation = true;
+ m_rotationDegrees = 270;
+ } else if (orientation == 24) {
+ m_rotationDegrees = 90;
+ } else if (orientation == 16) {
+ m_rotationDegrees = 180;
} else {
- m_isRotation = false;
+ m_rotationDegrees = 0;
}
std::lock_guard lockGuard(this->m_decoderLock);
@@ -882,7 +886,7 @@ bool CasController::ProcessEnterForeground(ANativeWindow *nativeWindow)
bool CasController::CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoDecode)
{
if (needVideoDecode) {
- m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType, m_isRotation);
+ m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType, m_rotationDegrees);
if (m_videoDecodeThread == nullptr) {
ERR("Failed to new video decode thread.");
return false;
diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h
index 57bde7b..7fbe82a 100644
--- a/cloudphone/src/main/cpp/CasController.h
+++ b/cloudphone/src/main/cpp/CasController.h
@@ -167,7 +167,7 @@ private:
bool m_isNotifyFirstFrame = false;
std::map m_mediaConfig;
int m_orientation = 0;
- bool m_isRotation = false;
+ int m_rotationDegrees = 0;
};
#endif // CLOUDAPPSDK_CASCONTROLLRT_H
\ No newline at end of file
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
index 9c197cd..1f0fae9 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.cpp
@@ -120,10 +120,11 @@ void OutputTaskEntry(CasDecodeController *controller)
* @brief to initialise CasDecodeController instance
* @param[in] nativeWindow View to display of (type ANativeWindow *)
* @param[in] type Method to decode, fixed to DECODER_TYPE_HW, of (type enum DecoderType)
+ * @param[in] rotation degrees
* @return errno: SUCCESS
* VIDEO_ENGINE_CLIENT_INIT_FAIL
*/
-uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
+uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees)
{
if (!IsStatus(EngineStat::ENGINE_INVALID)) {
ERR("Destroy needed first.");
@@ -134,7 +135,7 @@ uint32_t CasDecodeController::Init(ANativeWindow *nativeWindow, FrameType frameT
ERR("Failed to instantiate CasDecoder.");
return VIDEO_ENGINE_CLIENT_INIT_FAIL;
}
- uint32_t ret = m_decoder->Init(nativeWindow, frameType, isNeedRotation);
+ uint32_t ret = m_decoder->Init(nativeWindow, frameType, rotationDegrees);
if (ret != DECODER_SUCCESS) {
Destroy();
if (ret == DECODER_SDK_UNSUPPORTED) {
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
index 1efe220..391c7c6 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecodeController.h
@@ -42,10 +42,11 @@ public:
* @brief to initialise CasDecodeController instance
* @param[in] nativeWindow View to display of (type ANativeWindow *)
* @param[in] type Method to decode, fixed to DECODER_TYPE_HW, of (type enum DecoderType)
+ * @param[in] rotation degrees
* @return errno: SUCCESS
* VIDEO_ENGINE_CLIENT_INIT_FAIL
*/
- uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
+ uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees);
/*
* @fn Start
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
index 22304e8..0fab717 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
@@ -78,7 +78,7 @@ CasDecoder::~CasDecoder()
* @return errno: DECODER_SUCCESS
* DECODER_INIT_ERR
*/
-uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
+uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees)
{
m_casVideoUtil = CasVideoUtil::GetInstance();
if (m_casVideoUtil == nullptr || !m_casVideoUtil->Init()) {
@@ -107,7 +107,7 @@ uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType, bool
ERR("Failed to create MediaCodec.");
return DECODER_INIT_ERR;
}
- AMediaFormat *fmt = CreateMediaCodecFmt(isNeedRotation);
+ AMediaFormat *fmt = CreateMediaCodecFmt(rotationDegrees);
if (fmt == nullptr) {
ERR("Failed to create MediaCodec format.");
return DECODER_INIT_ERR;
@@ -281,17 +281,14 @@ void CasDecoder::Destroy() noexcept
* @brief to create AMediaFormat for MediaCodec configuration.
* @return AMediaFormat *, AMediaFormat object for MediaCodec configuration
*/
-AMediaFormat *CasDecoder:: CreateMediaCodecFmt(bool isNeedRotation) const
+AMediaFormat *CasDecoder:: CreateMediaCodecFmt(int rotationDegrees) const
{
AMediaFormat *fmt = AMediaFormat_new();
if (fmt != nullptr) {
int width = MediaCodecResolution::KEY_WIDTH;
int height = MediaCodecResolution::KEY_HEIGHT;
- if (isNeedRotation) {
- AMediaFormat_setInt32(fmt, "rotation-degrees", 270);
- INFO("ORIENTATION set degree 270");
- }
-
+ AMediaFormat_setInt32(fmt, "rotation-degrees", rotationDegrees);
+ INFO("ORIENTATION set degree %d", rotationDegrees);
AMediaFormat_setString(fmt, AMEDIAFORMAT_KEY_MIME, m_mimeType);
AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_WIDTH, width);
AMediaFormat_setInt32(fmt, AMEDIAFORMAT_KEY_HEIGHT, height);
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
index b055caf..d0a1629 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.h
@@ -50,7 +50,7 @@ public:
* @return errno: DECODER_SUCCESS
* DECODER_INIT_ERR
*/
- uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
+ uint32_t Init(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees);
/*
* @fn Start
@@ -98,9 +98,10 @@ private:
/*
* @fn CreateMediaCodecFmt
* @brief to create AMediaFormat for MediaCodec configuration.
+ * @param[in] rotation degrees
* @return AMediaFormat for MediaCodec configuration
*/
- AMediaFormat *CreateMediaCodecFmt(bool isNeedRotation) const;
+ AMediaFormat *CreateMediaCodecFmt(int rotationDegrees) const;
/*
* @fn AssembleMemory
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
index 0ce5905..a3d49e2 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.cpp
@@ -37,12 +37,13 @@ CasVideoEngine::~CasVideoEngine() = default;
* @brief initialisation interface
* @param[in] nativeWindow View to display of (type ANativeWindow*)
* @param[in] type Method to decode, fixed to DECODER_TYPE_HW, of (type enum DecoderType)
+ * @param[in] rotation degrees
* @return errno: SUCCESS
* VIDEO_ENGINE_CLIENT_INIT_FAIL
* VIDEO_ENGINE_CLIENT_PARAM_INVALID
* VIDEO_ENGINE_CLIENT_PARAM_UNSUPPORTED
*/
-uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, bool isNeedRotation)
+uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, int rotationDegrees)
{
std::lock_guard lockGuard(m_lock);
if (nativeWindow == nullptr) {
@@ -58,7 +59,7 @@ uint32_t CasVideoEngine::InitDecoder(ANativeWindow *nativeWindow, DecoderType ty
ERR("Failed to instantiate.");
return VIDEO_ENGINE_CLIENT_INIT_FAIL;
}
- return decodeController->Init(nativeWindow, frameType, isNeedRotation);
+ return decodeController->Init(nativeWindow, frameType, rotationDegrees);
}
/*
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
index 05d8f88..18a954e 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
+++ b/cloudphone/src/main/cpp/cas_decoder/CasVideoEngine.h
@@ -44,7 +44,7 @@ public:
* VIDEO_ENGINE_CLIENT_PARAM_INVALID
* VIDEO_ENGINE_CLIENT_PARAM_UNSUPPORTED
*/
- uint32_t InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, bool isNeedRotation);
+ uint32_t InitDecoder(ANativeWindow *nativeWindow, DecoderType type, FrameType frameType, int rotationDegrees);
/*
* @fn StartDecoder
diff --git a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
index 441e096..8cc327e 100644
--- a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
+++ b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.cpp
@@ -40,7 +40,7 @@ public:
}
};
-CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation)
+CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees)
{
this->m_nativeWindow = nativeWindow;
this->m_videoEngine = nullptr;
@@ -50,7 +50,7 @@ CasVideoHDecodeThread::CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameT
this->m_decodeTask = nullptr;
this->m_threadStatus = CAS_THREAD_INIT;
this->m_frameType = frameType;
- this->m_isNeedRotation = isNeedRotation;
+ this->m_rotationDegrees = rotationDegrees;
}
CasVideoHDecodeThread::~CasVideoHDecodeThread()
@@ -200,7 +200,7 @@ int CasVideoHDecodeThread::Start()
this->m_videoEngine->SetVideoDecodeStatListener(m_videoDecodeStat);
uint32_t initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW,
- m_frameType, m_isNeedRotation);
+ m_frameType, m_rotationDegrees);
if (initRet != 0) {
ERR("Init error %u", initRet);
EngineStat status;
@@ -216,7 +216,7 @@ int CasVideoHDecodeThread::Start()
return initRet;
}
initRet = this->m_videoEngine->InitDecoder(this->m_nativeWindow, DecoderType::DECODER_TYPE_HW,
- m_frameType, m_isNeedRotation);
+ m_frameType, m_rotationDegrees);
if (initRet != 0) {
ERR("Init again return error %u.", initRet);
return initRet;
diff --git a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
index 8611d96..be697bf 100644
--- a/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
+++ b/cloudphone/src/main/cpp/cas_service/CasVideoHDecodeThread.h
@@ -25,7 +25,7 @@ class CasVideoDecodeStatImpl;
class CasVideoHDecodeThread {
public:
- explicit CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, bool isNeedRotation);
+ explicit CasVideoHDecodeThread(ANativeWindow *nativeWindow, FrameType frameType, int rotationDegrees);
~CasVideoHDecodeThread();
@@ -57,7 +57,7 @@ private:
std::thread *m_decodeTask;
ANativeWindow *m_nativeWindow;
FrameType m_frameType;
- bool m_isNeedRotation;
+ int m_rotationDegrees;
};
#endif // CLOUDAPPSDK_CASVIDEODECODETHREAD_H
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
index 52936a8..e09dd32 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
@@ -101,12 +101,8 @@ public class CloudPhoneImpl implements ICloudPhone {
private Activity mActivity;
private ViewGroup mViewGroup;
private SurfaceView mSurfaceView = null;
- private int mDisplayWidth = 9;
+ private int mDisplayWidth = 0;
private int mDisplayHeight = 0;
- private int mInputWidth = 720;
- private int mInputHeight = 1280;
- private float mInputXScale;
- private float mInputYScale;
private int mCurrentState;
private DisplayMode mDisplayMode = DISPLAY_MODE_FILL;
private boolean mServiceConnect = false;
@@ -355,16 +351,10 @@ public class CloudPhoneImpl implements ICloudPhone {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- CASLog.i(TAG, "width = " + width + " height = " + height);
- mDisplayWidth = width;
- mDisplayHeight = height;
- if (mDisplayWidth > mDisplayHeight) {
- mInputYScale = (float) mDisplayWidth / (float) mInputHeight;
- mInputXScale = (float) mDisplayHeight / (float) mInputWidth;
- } else {
- mInputXScale = (float) mDisplayWidth / (float) mInputWidth;
- mInputYScale = (float) mDisplayHeight / (float) mInputHeight;
- }
+
+ mDisplayWidth = Math.min(width, height);
+ mDisplayHeight = Math.max(width, height);
+ CASLog.i(TAG, "width = " + mDisplayWidth + " height = " + mDisplayHeight);
if (!mIsNewCreated) {
return;
@@ -661,7 +651,7 @@ public class CloudPhoneImpl implements ICloudPhone {
private boolean sendTouchEvent(int id, int action, final int x1, final int y1, final int pressure, long time) {
int orientation = 0;
- int new_orientation = 0;
+ int newOrientation = 0;
if (mActivity != null) {
try {
orientation = mActivity.getRequestedOrientation();
@@ -674,24 +664,29 @@ public class CloudPhoneImpl implements ICloudPhone {
switch (orientation) {
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
- new_orientation = 0;
+ newOrientation = 0;
break;
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
- new_orientation = 1;
+ newOrientation = 1;
break;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
- new_orientation = 2;
+ newOrientation = 2;
break;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
- new_orientation = 3;
+ newOrientation = 3;
break;
default:
CASLog.i(TAG, "invalid directation " + orientation);
break;
}
- return mCASClient.sendTouchEvent(id, action, x1, y1, pressure, time, new_orientation, mDisplayHeight, mDisplayWidth);
+ int x = x1, y = y1;
+ if (newOrientation == 1 || newOrientation == 3) {
+ x = x1 * mDisplayWidth / mDisplayHeight;
+ y = y1 * mDisplayHeight / mDisplayWidth;
+ }
+ return mCASClient.sendTouchEvent(id, action, x, y, pressure, time, newOrientation, mDisplayHeight, mDisplayWidth);
}
public static class JNIState {
--
Gitee
From bfcebe2b8bd64f9c548bba67a256a7845b08ad3e Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Fri, 14 Jul 2023 16:52:06 +0800
Subject: [PATCH 5/6] =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=BB=E5=B1=8F?=
=?UTF-8?q?=E6=97=8B=E8=BD=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/huawei/cloudapp/ui/CasCloudMainActivity.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
index 1c28242..61aed88 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
@@ -97,6 +97,7 @@ public class CasCloudMainActivity extends Activity {
}
public void cloudPhoneConnect(View view) {
+ appConnect.setEnabled(false);
startCloudPhoneActivity(CasCloudPhoneActivity.class);
}
@@ -109,11 +110,13 @@ public class CasCloudMainActivity extends Activity {
String phoneIp = mCloudPhoneIp.getText().toString().trim();
if (TextUtils.isEmpty(phoneIp)) {
CASLog.e(TAG, "输入Ip为空");
+ appConnect.setEnabled(true);
return;
}
String phonePort = mCloudPhonePort.getText().toString().trim();
if (TextUtils.isEmpty(phonePort)) {
CASLog.e(TAG, "输入Port为空");
+ appConnect.setEnabled(true);
return;
}
Intent intent = new Intent(CasCloudMainActivity.this, cls);
@@ -121,7 +124,6 @@ public class CasCloudMainActivity extends Activity {
intent.putExtra(CasConnectInfo.BUNDLE_KEY, connectorInfo);
startActivity(intent);
overridePendingTransition(0, 0);
- appConnect.setEnabled(false);
}
private CasConnectInfo getCasConnectorInfo(String phoneIp, String phonePort) {
--
Gitee
From 3fdab417855b3f0f36bbdd919f31effadbb6e001 Mon Sep 17 00:00:00 2001
From: wangshuo <584363327@qq.com>
Date: Fri, 14 Jul 2023 16:52:06 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=BB=E5=B1=8F?=
=?UTF-8?q?=E6=97=8B=E8=BD=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
cloudphone/src/main/cpp/CasController.cpp | 3 ---
1 file changed, 3 deletions(-)
diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp
index 6df5056..8ea1aed 100644
--- a/cloudphone/src/main/cpp/CasController.cpp
+++ b/cloudphone/src/main/cpp/CasController.cpp
@@ -813,9 +813,6 @@ void CasController::IsNeedRotation(int orientation)
{
INFO("ORIENTATION is %d, old ORIENTATION is %d.", orientation, m_orientation);
- if (orientation == m_orientation) {
- return;
- }
if (orientation == 8) {
m_rotationDegrees = 270;
} else if (orientation == 24) {
--
Gitee