--- /dev/null
+
+
+
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+
+#include <string.h>
+#include <os_api.h>
+
+#include "mmi_video_call.h"
+#include "jrtc.h"
+
+// for network
+#include <socket_api.h>
+#include <stdint.h>
+
+#include "mn_type.h"
+#include "mmk_type.h"
+#include "mmk_timer.h"
+#include "mmi_module.h"
+#include "mmiconnection_export.h"
+#include "mmiphone_export.h"
+#include "mmipdp_export.h"
+
+
+typedef enum jrtc_state video_call_jrtc_state_e;
+typedef enum jrtc_error video_call_jrtc_error_e;
+typedef struct jrtc_image_t video_call_jrtc_image_t;
+
+typedef struct
+{
+ void * state_task;
+ video_call_jrtc_image_t video_frame;
+ video_call_jrtc_image_t camera_frame;
+ void * jrtc_ptr;
+ TIMER_ID closed_timer_id;
+ uint8_t closing;
+} video_call_jrtc_t;
+
+
+extern voip_phone_call_params_t voipcall_params;
+static video_call_jrtc_t s_video_call_jrtc = {0};
+
+
+static uint8_t voip_jrtc_get_image(void * preview_buf);
+
+
+void mmi_video_call_jrtc_config_init(void)
+{
+ char appkey[24+1] = "dc1db81c19d1da4f5fb4a197";
+ char key[16+1] = "K75A1vS562671d38";
+ char uid[64+1] = {0};
+ char tokens[128+1] = "";
+ MN_DUAL_SYS_E dual_sys = MN_DUAL_SYS_1;
+ MN_IMEI_T imei_arr = {0};
+ uint8 imei_str[20] = {0};
+
+ MNNV_GetIMEIEx(dual_sys, imei_arr);
+ ConvertBcdToDigitalStr(MN_MAX_IMEI_LENGTH, imei_arr, imei_str);
+ sprintf ( (char*) uid, "%s", imei_str);
+
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ jrtc_config(appkey, uid, key, tokens);
+}
+
+static void mmi_video_call_jrtc_clean_up(void)
+{
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ if(NULL != s_video_call_jrtc.state_task)
+ {
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ lv_task_del(s_video_call_jrtc.state_task);
+ }
+
+ Hal_Mem_Set(&voip_jrtc, 0, sizeof(video_call_jrtc_t));
+}
+
+static void mmi_video_call_jrtc_timeout_cb(void * para)
+{
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+ mmi_video_call_jrtc_clean_up();
+}
+
+static void mmi_video_call_jrtc_on_state(lv_task_t * task)
+{
+ static int8_t oldstate = -1;
+ video_call_jrtc_state_e state = jrtc_state(s_video_call_jrtc.jrtc_ptr);
+
+ if(state != oldstate)
+ {
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: oldstate=%d,state=%d\n", __FUNCTION__, __LINE__, oldstate, state);
+ }
+
+ switch(state)
+ {
+ case JRTC_CLOSED:
+ if((NULL != s_video_call_jrtc.jrtc_ptr) && (NULL == s_video_call_jrtc.closed_timer_id))
+ {
+ video_call_jrtc_error_e err = jrtc_error(s_video_call_jrtc.jrtc_ptr);
+
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: error=%d\n", __FUNCTION__, __LINE__, err);
+
+ if(!s_video_call_jrtc.closing)
+ {
+ jrtc_close(s_video_call_jrtc.jrtc_ptr, JRTC_ENIL);
+ s_video_call_jrtc.closing = 1;
+ }
+
+ s_video_call_jrtc.closed_timer_id = Hal_Timer_Start(100, mmi_video_call_jrtc_timeout_cb, NULL, 0);
+ }
+
+ if(MMI_VOIP_CALL_STATE_NULL != voipcall_params.state)
+ {
+ watch_voip_call_response_no_carrier(0, 1);
+ }
+ break;
+
+ case JRTC_LEAVING:
+ break;
+
+ case JRTC_OPENED:
+ break;
+
+ case JRTC_JOINING:
+ break;
+
+ case JRTC_JOINED:
+ break;
+
+ case JRTC_TALKING:
+ if(MMI_VOIP_CALL_STATE_ACTIVE != voipcall_params.state)
+ {
+ watch_voip_call_response_connect(0);
+ }
+
+ /* Get image */
+ if (MMI_VIDEO_CALL_TYPE_VIDEO == voipcall_params.voip_call_type)
+ {
+ void *buf = voip_phone_get_video_buffer();
+ if(voip_jrtc_get_image(buf))
+ {
+ lv_canvas_set_buffer(voip_phone_get_ext()->canvas, buf, canvas_width, canvas_heigh, LV_IMG_CF_TRUE_COLOR);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ oldstate = state;
+}
+
+
+static int8_t mmi_video_call_jrtc_open(const char* roomid, MMI_VIDEO_CALL_TYPE_E calltype)
+{
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: %s,%d\n", __FUNCTION__, __LINE__, roomid, calltype);
+
+ Hal_Mem_Set(&voip_jrtc, 0, sizeof(video_call_jrtc_t));
+
+ if (MMI_VIDEO_CALL_TYPE_VIDEO == calltype)
+ {
+ s_video_call_jrtc.rxframe.width = s_video_call_jrtc.txframe.width = 176; // 240; // 176;
+ s_video_call_jrtc.rxframe.height = s_video_call_jrtc.txframe.height = 144; // 320; // 144;
+ s_video_call_jrtc.rxframe.fps = s_video_call_jrtc.txframe.fps = 8; // 10;
+ s_video_call_jrtc.rxframe.kbps = s_video_call_jrtc.txframe.kbps = 120; // 240;
+
+ mci_videocall_camera_set_sensor(1); // 0:rear camera; 1:front camera
+
+ s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, 0, &s_video_call_jrtc.rxframe, &s_video_call_jrtc.txframe);
+ }
+ else
+ {
+ s_video_call_jrtc.jrtc_ptr= jrtc_open(roomid, 0, NULL, NULL);
+ }
+
+ if (!s_video_call_jrtc.jrtc_ptr)
+ {
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: \n", __FUNCTION__, __LINE__);
+ mmi_video_call_jrtc_clean_up();
+ return -1;
+ }
+ jrtc_activate(s_video_call_jrtc.jrtc_ptr, JRTC_AUDIO|JRTC_CAMERA);
+
+ s_video_call_jrtc.state_task = lv_task_create(mmi_video_call_jrtc_on_state, VIDEO_RENDER_PERIOD, LV_TASK_PRIO_HIGH, NULL);
+ return 0;
+}
+
+int8 mmi_video_call_dial(char * number, MMI_VIDEO_CALL_TYPE_E calltype)
+{
+ int8 ret = -1;
+
+ if (NULL == s_video_call_jrtc.jrtc_ptr)
+ ret = mmi_video_call_jrtc_open(number, calltype);
+
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: %s,%d,%d\n", __FUNCTION__, __LINE__, number, calltype, ret);
+ return ret;
+}
+
+void mmi_video_call_hangup(BOOL bye)
+{
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, bye);
+
+ if (NULL != s_video_call_jrtc.jrtc_ptr)
+ {
+ video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
+
+ jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+ s_video_call_jrtc.closing = 1;
+ }
+ else
+ {
+ watch_voip_call_response_no_carrier(0, 0);
+ }
+}
+
+int8_t mmi_video_call_answer_req(void)
+{
+ int8_t ret = -1;
+
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: %p\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr);
+ if (NULL == s_video_call_jrtc.jrtc_ptr)
+ ret = mmi_video_call_jrtc_open(voipcall_params.number, voipcall_params.voip_call_type);
+
+ return ret;
+}
+
+void mmi_video_call_reject_req(BOOL bye)
+{
+ SCI_TRACE_LOW("[@CHENG_VIDEO_CALL][%s][%d]: %p,%d\n", __FUNCTION__, __LINE__, s_video_call_jrtc.jrtc_ptr, bye);
+
+ if (NULL != s_video_call_jrtc.jrtc_ptr)
+ {
+ video_call_jrtc_error_e err = (TRUE == bye) ? JRTC_EBYE : JRTC_EAUDIOCALL;
+
+ jrtc_close(s_video_call_jrtc.jrtc_ptr, err);
+ s_video_call_jrtc.closing = 1;
+ }
+ else
+ {
+ watch_voip_call_response_no_carrier(0, 0);
+ }
+}
+
+
+//extern unsigned yuv420_scale(int src_width, int src_height, int dst_width, int dst_height, unsigned char *src_buf, unsigned char *dst_buf, unsigned char semi);
+//extern unsigned rgb565_scale(int32_t src_width, int32_t src_height, int32_t dst_width, int32_t dst_height, uint8_t *src_buf, uint8_t *dst_buf);
+//extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
+
+static uint8_t voip_jrtc_get_image(void * preview_buf)
+{
+ uint8_t ret = 0;
+ lv_voip_phone_obj_ext_t * ext = voip_phone_get_ext();
+ LV_ASSERT_MEM(ext);
+
+ video_call_jrtc_image_t * frame = NULL;
+ if(ext->local_remote_switch_flag == VOIP_REMOTE_SWITCH_REMOTE)
+ frame = &s_video_call_jrtc.rxframe;
+ else
+ frame = &s_video_call_jrtc.txframe;
+
+ if (frame->put != frame->get) {
+#if (ENABLE_VIDEO_SCALE == 0)
+ yuv420_2_rgb565(frame->width, frame->height, frame->data, preview_buf, frame->format);
+#else
+ Hal_Yuv420_Render(frame->width, frame->height, canvas_width, canvas_heigh, frame->data, preview_buf, frame->format);
+#endif
+
+ frame->get = frame->put;
+ ret = 1;
+ voip_fps_check(frame->fps);
+ }
+
+ return ret;
+}
+
+#endif
+
+
--- /dev/null
+
+
+
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+
+#include <string.h>
+#include <os_api.h>
+
+#include "video_call_demo.h"
+#include "agora_video_call.h"
+
+
+// for network
+#include <socket_api.h>
+#include <stdint.h>
+
+#include "mn_type.h"
+#include "mmk_type.h"
+#include "mmk_timer.h"
+#include "mmi_module.h"
+#include "mmiconnection_export.h"
+#include "mmiphone_export.h"
+#include "mmipdp_export.h"
+
+typedef struct {
+ int32_t activated;
+ MMIPDP_INTERFACE_E ps_interface;
+ uint32 net_id;
+ uint32 net_type;
+} net_state_t;
+
+static net_state_t* get_net_state_instance()
+{
+ static net_state_t _net_state = { 0, MMIPDP_INTERFACE_GPRS, -1, -1 };
+ return &_net_state;
+}
+
+static void net_msg_handler(MMIPDP_CNF_INFO_T *m)
+{
+ net_state_t *p_net_state = get_net_state_instance();
+
+ LOGD(TAG, "enter");
+
+ if (m == NULL || m->ps_interface != p_net_state->ps_interface)
+ {
+ LOGE(TAG, "invalid argument");
+ return;
+ }
+
+ switch (m->msg_id)
+ {
+ case MMIPDP_ACTIVE_CNF:
+ if (m->result == MMIPDP_RESULT_SUCC)
+ {
+ p_net_state->net_type = p_net_state->ps_interface;
+ p_net_state->net_id = m->nsapi;
+ p_net_state->activated = 1;
+ LOGD(TAG, "activate success, type %u id %u", p_net_state->net_type, p_net_state->net_id);
+ }
+ else
+ {
+ LOGD(TAG, "activate failed");
+ }
+ break;
+
+ case MMIPDP_ACTIVE_TIMOUT_IND:
+ LOGD(TAG, "activate failed");
+ break;
+
+ case MMIPDP_DEACTIVE_IND:
+ case MMIPDP_DEACTIVE_CNF:
+ case MMIPDP_SERVICE_CHANGE_IND:
+ case MMIPDP_SUSPEND_IND:
+ case MMIPDP_RESUME_IND:
+ case MMIPDP_REACTIVE_TIMER_IND:
+ case MMIPDP_PS_ACTIVE_CNF:
+ case MMIPDP_PS_DEACTIVE_CNF:
+ case MMIPDP_PS_DEACTIVE_IND:
+ default:
+ LOGD(TAG, "Unknown Event: msg_id = %d", m->msg_id);
+ break;
+ }
+
+ LOGD(TAG, "exit");
+}
+
+static int __activate_gprs(net_state_t *s)
+{
+ MMIPDP_ACTIVE_INFO_T active_info = { 0 };
+ char *apn = NULL;
+ int n, i;
+
+ if (!MMIAPIPHONE_IsSimAvailable (0))
+ {
+ LOGE(TAG, "can't find any sim card");
+ return -1;
+ }
+
+ n = MMIAPICONNECTION_GetLinkSettingNum(0);
+
+ for (i = 0; i < n; i++)
+ {
+ MMICONNECTION_LINKSETTING_DETAIL_T *ls = MMIAPICONNECTION_GetLinkSettingItemByIndex(0, i);
+
+ if (ls != NULL && ls->apn_len)
+ {
+ apn = (char *)ls->apn;
+ break;
+ }
+ }
+
+ if (apn == NULL)
+ {
+ LOGE(TAG, "can't find any apn");
+ return -1;
+ }
+
+ active_info.app_handler = MMI_MODULE_CAMERA;
+ active_info.dual_sys = 0;
+ active_info.apn_ptr = apn;
+ active_info.user_name_ptr = NULL;
+ active_info.psw_ptr = NULL;
+ active_info.priority = 3;
+ active_info.ps_service_rat = MN_UNSPECIFIED;
+ active_info.ps_interface = MMIPDP_INTERFACE_GPRS;
+ active_info.handle_msg_callback = net_msg_handler;
+ active_info.ps_service_type = IM_E;
+ active_info.storage = MN_GPRS_STORAGE_ALL;
+ active_info.ip_type = MMICONNECTION_IP_V4;
+
+ return (MMIAPIPDP_Active (&active_info)) ? 0 : -1;
+}
+
+static int __activate_wifi(net_state_t *s)
+{
+ MMIPDP_ACTIVE_INFO_T active_info = {0};
+ active_info.app_handler = MMI_MODULE_CAMERA;
+ active_info.handle_msg_callback = net_msg_handler;
+ active_info.ps_interface = MMIPDP_INTERFACE_WIFI;
+
+ return (MMIAPIPDP_Active(&active_info)) ? 0 : -1;
+}
+
+int32_t video_call_activate_net(net_state_t *s)
+{
+ int i;
+
+ if (s->ps_interface == MMIPDP_INTERFACE_GPRS)
+ {
+ __activate_gprs(s);
+ }
+ else
+ {
+ __activate_wifi(s);
+ }
+
+ for (i = 0; i < 50; i++)
+ {
+ SCI_Sleep(200);
+
+ if (s->net_id != -1)
+ {
+ break;
+ }
+ }
+
+ if (s->net_id == -1)
+ {
+ LOGE(TAG, "net %s activate failed", (s->ps_interface == MMIPDP_INTERFACE_GPRS ? "GPRS" : "WIFI"));
+ return -1;
+ }
+
+EXIT:
+ return 0;
+}
+
+typedef enum
+{
+ CMD_START,
+ CMD_STOP,
+} cmd_e;
+
+typedef struct
+{
+ cmd_e cmd;
+} video_call_cmd_t;
+
+static void avc_msg_notify_callback(avc_msg_t *p_msg)
+{
+ LOGD(TAG, "recv msg. code=%d", p_msg->code);
+
+ switch (p_msg->code)
+ {
+ case AVC_MSG_JOIN_CHANNEL_SUCCESS:
+ break;
+
+ case AVC_MSG_USER_JOINED:
+ break;
+
+ case AVC_MSG_USER_OFFLINE:
+ break;
+
+ case AVC_MSG_CONNECTION_LOST:
+ break;
+
+ case AVC_MSG_INVALID_APP_ID:
+ break;
+
+ case AVC_MSG_INVALID_CHANNEL_NAME:
+ break;
+
+ case AVC_MSG_INVALID_TOKEN:
+ break;
+
+ case AVC_MSG_TOKEN_EXPIRED:
+ break;
+
+ default:
+ LOGW(TAG, "no msg handler, code %d", p_msg->code);
+ break;
+ }
+
+ MMIAPI_HandleAgoraVideoCallNotifyMsg(p_msg->code);
+}
+
+#define CERTIFICATE_MAX_LEN (2048)
+static void worker_task_entry(uint32 argc, void* argv)
+{
+ int rval = 0;
+ avc_init_t init = {0};
+ char str_certificate[CERTIFICATE_MAX_LEN] = {0};
+ uint32_t str_certificate_len;
+ avc_config_t config = {0};
+ video_call_cmd_t *sig_ptr = NULL;
+ uint32_t *p_b_thread_created = (uint32_t *)argv;
+
+ *p_b_thread_created = 1;
+
+ while (1)
+ {
+ sig_ptr = (video_call_cmd_t *)SCI_GetSignal(SCI_IdentifyThread());
+ assert(sig_ptr);
+
+ if (sig_ptr->cmd == CMD_START)
+ {
+ // step 0: activate net if net_id is invalid
+ // Vendor SHOULD set net params directly from their own network manager
+ net_state_t *p_net_state = get_net_state_instance();
+
+ if (!p_net_state->activated)
+ {
+ video_call_activate_net(p_net_state);
+ }
+
+ // check whether net is activated
+ if (!p_net_state->activated)
+ {
+ LOGE(TAG, "net isn't activated, pls activate first to obtain net_type & net_id");
+ goto START_FAIL;
+ }
+
+ // step 1: avc init, contain license activate
+ str_certificate_len = sizeof(str_certificate);
+
+ init.net_id = p_net_state->net_id;
+ init.enable_license_activate = false; init.license.str_customer_key = "a0be1cc6bdba446c8010756e1eb41c57";
+ init.license.str_customer_secret = "a12dfaa0469f4c38a661718270ad3cdb";
+ init.license.str_license_key = "test_163";
+ init.license.str_certificate = str_certificate;
+
+ rval = avc_init(&init);
+
+ if (rval != 0)
+ {
+ LOGE(TAG, "avc init failed");
+ goto INIT_FAIL;
+ }
+
+ // step 2: Vendor SHOULD config correctly
+ config.p_appid = "ce534ffc2a5e4883a492279afdba20fe";
+ config.p_token = NULL;
+ config.p_log_dir = NULL;
+ config.p_channel_name = "avc_demo_8910";
+ config.enable_net_param = false;
+ config.net_param_type = -1;
+ config.net_param_id = -1;
+ config.msg_notify_cb = avc_msg_notify_callback;
+ config.enable_net_param = p_net_state->activated;
+ config.net_param_type = p_net_state->net_type;
+ config.net_param_id = p_net_state->net_id;
+ config.enable_bwe_param = true;
+ config.uid = 0;
+ config.bwe_param_max_bps = 1000 * 1000;
+ config.str_certificate = str_certificate;
+
+ // step 3: validate config
+ // a. check appid, if certificate is disabled, appid is MUST
+ // b. check token, if certificate is enabled, token is MUST
+ // c. check channel name, MUST
+ // Vendor can check certificate enable on website: https://console.agora.io
+ if (config.p_appid == NULL || strcmp(config.p_appid, "") == 0)
+ {
+ LOGW(TAG, "invalid appid in config");
+ goto START_FAIL;
+ }
+
+ if (config.p_appid == NULL && (config.p_token == NULL || strcmp(config.p_token, "") == 0))
+ {
+ LOGW(TAG, "invalid token in config");
+ goto START_FAIL;
+ }
+
+ if (!config.enable_net_param || config.net_param_type < 0 || config.net_param_id < 0)
+ {
+ LOGW(TAG, "invalid net param in config");
+ goto START_FAIL;
+ }
+
+ // step 4: call avc_start
+ rval = avc_start(&config);
+ if (rval < 0)
+ {
+ LOGE(TAG, "avc start failed, reason:%s", avc_err_2_str(rval));
+ goto START_FAIL;
+ }
+
+ LOGI(TAG, "avc start success");
+
+ INIT_FAIL:
+ START_FAIL:
+ LOGI(TAG, "avc start, rval %d", rval);
+
+ }
+ else if (sig_ptr->cmd == CMD_STOP)
+ {
+ avc_stop();
+ avc_fini();
+ }
+
+ SCI_FREE(sig_ptr);
+ }
+
+ SCI_ThreadExit();
+}
+
+#define CALL_TASK_THREAD_NAME "VIDEO_CALL_WORKER_TASK"
+#define CALL_TASK_QUEUE_NAME "Q_VIDEO_CALL_WORKER_TASK"
+#define CALL_TASK_STACK_SIZE (8 * 1024)
+#define CALL_TASK_QUEUE_NUM (4 * 30)
+#define CALL_TASK_TASK_PRIV (67)
+
+static uint32_t gs_worker_task_id = -1;
+static void _create_worker_task(void)
+{
+ static uint32_t b_thread_created = 0;
+
+ if (b_thread_created)
+ {
+ return;
+ }
+
+ gs_worker_task_id = SCI_CreateAppThread(CALL_TASK_THREAD_NAME, // Name string of the thread
+ CALL_TASK_QUEUE_NAME, // Queue name string of the thread
+ worker_task_entry, // Entry function of the thread
+ 1, // First parameter for entry function,
+ &b_thread_created, // Second parameter for entry function,
+ CALL_TASK_STACK_SIZE, // Size of the thread stack in bytes
+ CALL_TASK_QUEUE_NUM, // Number of messages which can be enqueued
+ CALL_TASK_TASK_PRIV, // Priority of the thread.
+ SCI_PREEMPT, // Indicates if the thread is preemptable.
+ SCI_AUTO_START);
+
+ while (!b_thread_created)
+ {
+ SCI_Sleep(20);
+ }
+}
+
+int video_call_start(void)
+{
+ video_call_cmd_t *cmd_ptr = NULL;
+
+ LOGD(TAG, "enter");
+
+ _create_worker_task();
+
+ cmd_ptr = (video_call_cmd_t *)SCI_ALLOCA(sizeof(video_call_cmd_t));
+ cmd_ptr->cmd = CMD_START;
+ SCI_SendSignal((xSignalHeader)cmd_ptr, gs_worker_task_id);
+ LOGD(TAG, "exit");
+
+ return 0;
+}
+
+int video_call_stop(void)
+{
+ video_call_cmd_t *cmd_ptr = NULL;
+
+ if (-1 == gs_worker_task_id)
+ {
+ LOGW(TAG, "video call not start now.");
+ return 0;
+ }
+
+ LOGD(TAG, "enter");
+ cmd_ptr = (video_call_cmd_t *)SCI_ALLOCA(sizeof(video_call_cmd_t));
+ cmd_ptr->cmd = CMD_STOP;
+ SCI_SendSignal((xSignalHeader)cmd_ptr, gs_worker_task_id);
+ LOGD(TAG, "video call stop");
+
+ return 0;
+}
+
+
+
+
+
+#include "sci_types.h"
+#include "mmi_common.h"
+#include "mmi_font.h"
+#include "mmiset_nv.h"
+#include "mmi_id.h"
+#include "mmiset_id.h"
+#include "window_parse.h"
+#include "mmidisplay_data.h"
+#include "mereg_videocall.h"
+#include "mmiset_text.h"
+#include "gps_at6558r_ref.h"
+#include "mmi_protocol_customer_api.h"
+#include "mmi_protocol_main_api.h"
+#include "mmipub.h"
+#include "Mmicc_text.h"
+
+
+#include "videochatservice.h"
+
+/**---------------------------------------------------------------------------*
+ ** Compiler Flag *
+ **---------------------------------------------------------------------------*/
+#ifdef __cplusplus
+ extern "C"
+ {
+#endif
+
+
+static MEREG_LOCAL_USER_ID_STRUCT_T s_userId = {0};
+
+static VC_CONTACTS_DATA_T s_video_call_contact_info = {0};
+static uint8 s_video_call_contact_index = 0;
+static uint8 s_video_call_win_status = 0; // 0-contact list menu; 1-call button select
+static MMI_VIDEO_CALL_PARAMS_T s_video_call_params = {0};
+
+
+
+
+
+
+
+PUBLIC void MMIAPI_InitMeregUserId(void)
+{
+ MN_RETURN_RESULT_E return_value = MN_RETURN_FAILURE;
+
+ MMINV_READ(MMINV_MEREG_USER_ID, &s_userId, return_value);
+
+ if (MN_RETURN_SUCCESS != return_value)
+ {
+ memset(&s_userId, 0x0, sizeof(MEREG_LOCAL_USER_ID_STRUCT_T));
+ MMINV_WRITE(MMINV_MEREG_USER_ID, &s_userId);
+ }
+}
+
+PUBLIC BOOLEAN MMIAPI_GetMeregUserId(uint32 * local_userId)
+{
+ MN_RETURN_RESULT_E return_value = MN_RETURN_FAILURE;
+
+ MMINV_READ(MMINV_MEREG_USER_ID, &s_userId, return_value);
+
+ if (MN_RETURN_SUCCESS != return_value)
+ {
+ memset(&s_userId, 0x0, sizeof(MEREG_LOCAL_USER_ID_STRUCT_T));
+ MMINV_WRITE(MMINV_MEREG_USER_ID, &s_userId);
+ }
+
+ *local_userId = s_userId.id_number;
+
+ return s_userId.id_valid;
+}
+
+PUBLIC void MMIAPI_SetMeregUserId(uint32 server_userId)
+{
+ SPRD_TRACE_INFO("MMIAPI_SetMeregUserId: server_userId = %d", server_userId);
+
+ if(server_userId)
+ {
+ s_userId.id_valid = TRUE;
+ s_userId.id_number = server_userId;
+
+ MMINV_WRITE(MMINV_MEREG_USER_ID, &s_userId);
+ }
+}
+
+PUBLIC void MMIAPI_ResetMeregUserId(void)
+{
+ memset(&s_userId, 0x0, sizeof(MEREG_LOCAL_USER_ID_STRUCT_T));
+ MMINV_WRITE(MMINV_MEREG_USER_ID, &s_userId);
+}
+
+
+PUBLIC void MMIAPI_SetMeregVideoCallContactInfo(VC_CONTACTS_DATA_T *vc_contact)
+{
+ uint8 vc_contact_num = vc_contact->vc_contact_num >= MMIAPI_VC_CONTACT_MAX_NUM ? MMIAPI_VC_CONTACT_MAX_NUM : vc_contact->vc_contact_num;
+
+ SPRD_TRACE_INFO("MMIAPI_SetMeregVideoCallContactInfo: vc_contact_num = %d", vc_contact_num);
+
+ memset(&s_vc_contact_info, 0x0, sizeof(VC_CONTACTS_DATA_T));
+
+ if(vc_contact_num)
+ {
+ memcpy(&s_vc_contact_info, vc_contact, sizeof(VC_CONTACTS_DATA_T));
+
+ SPRD_TRACE_INFO("MMIAPI_SetMeregVideoCallContactInfo: s_vc_contact_info.vc_contact_num = %d", s_vc_contact_info.vc_contact_num);
+
+ MMK_SendMsg(MMISET_MEREG_VIDEOCALL_WIN_ID, MSG_FULL_PAINT, PNULL);
+
+ }
+}
+
+PUBLIC void MMIAPI_GetUserId(char* id_buf)
+{
+ char tempBuf[64] = {0};
+
+ sprintf ((char*) tempBuf, "%u",s_userId.id_number);
+
+ SPRD_TRACE_INFO("MMIAPI_GetUserId tempBuf =%s",tempBuf);
+
+ strcat(id_buf, tempBuf);
+}
+
+PUBLIC void MMIAPI_GetContactInfo(char* id_buf)
+{
+ char tempBuf[64] = {0};
+
+ sprintf ((char*) tempBuf, "%s",s_vc_contact_info.vc_data[s_video_call_contact_index].vc_user_id);
+
+ SPRD_TRACE_INFO("MMIAPI_GetContactInfo tempBuf =%s",tempBuf);
+
+ strcat(id_buf, tempBuf);
+}
+
+PUBLIC void MMIAPI_SendVoiceCall(BOOLEAN call)
+{
+
+ int32 user_id = 0;
+
+ SPRD_TRACE_INFO("MMIAPI_SendVoiceCall: voice");
+
+ sscanf(s_vc_contact_info.vc_data[s_video_call_contact_index].vc_user_id,"%d",&user_id);
+
+ SPRD_TRACE_INFO("MMIAPI_SendVoiceCall user_id =%d",user_id);
+
+ km_FZD_net_action_TALK(call, user_id); //voice
+
+}
+
+PUBLIC void MMIAPI_PlayVideoCallRing(void)
+{
+ uint8 s_agora_call_volume = 0;
+
+ MMIDEFAULT_TurnOnBackLight();
+ MMIDEFAULT_AllowTurnOffBackLight(FALSE);
+ MMIAPISET_StopAllRing(TRUE);
+
+ if(MMIAPIENVSET_GetActiveModeId() != MMIENVSET_SILENT_MODE)
+ {
+ s_agora_call_volume = MMIAPISET_GetCallRingVolume();
+ MMIAPISET_PlayCallRingByVol(s_agora_call_volume, 1, AUD_PLAY_FOREVER, MMISET_RING_TYPE_CALL, PNULL);
+ }
+}
+
+
+PUBLIC void MMIAPI_StopVideoCallRing(void)
+{
+ if(MMIAPISET_IsPlayingAppRing())
+ {
+ MMIAPISET_StopAppRing();
+ }
+}
+
+
+
+
+
+
+
+static MMI_RESULT_E mmi_video_call_hangup_button_cb(void)
+{
+ //mmi_video_call_button_call(MMI_VIDEO_CALL_TYPE_VIDEO);
+
+ return 0;
+}
+
+static void mmi_video_call_dialing_win_display(MMI_WIN_ID_T win_id, MMI_CTRL_ID_T ctrl_id)
+{
+ GUI_LCD_DEV_INFO lcd_dev_info = {GUI_MAIN_LCD_ID, GUI_BLOCK_MAIN};
+ GUI_RECT_T full_rect = MMITHEME_GetFullScreenRect();
+ GUI_RECT_T ctrl_rect = {MMI_MAINSCREEN_HEIGHT-70, MMI_MAINSCREEN_HEIGHT-10-125, MMI_MAINSCREEN_WIDTH-30, MMI_MAINSCREEN_HEIGHT-10};
+ GUI_BG_T ctrl_bg = {0};
+ GUI_POINT_T image_point = {0};
+ MMI_IMAGE_ID_T image_id = IMAGE_NULL;
+ uint16 image_width = 0, image_height = 0;
+
+ //background
+ GUI_FillRect(&lcd_dev_info, full_rect, MMI_BLACK_COLOR);
+
+ image_id = IMAGE_VIDEO_CALL_CONTACT_PHOTO;
+ GUIRES_GetImgWidthHeight(&image_width,&image_height, image_id, win_id);
+ image_point.x = (MMI_MAINSCREEN_WIDTH - image_width) / 2;
+ image_point.y = 40;
+ IMG_EnableTransparentColor(TRUE);
+ GUIRES_DisplayImg(&image_point, PNULL, PNULL, win_id, image_id, &lcd_dev_info);
+ IMG_EnableTransparentColor(FALSE);
+
+ //button
+ GUIBUTTON_SetRect( ctrl_id, &ctrl_rect);
+ //GUIBUTTON_SetFont( ctrl_id, &font_all);
+
+ //MMI_GetLabelTextByLang(TXT_GO_TO_WORK, &display_text);
+ //ctrl_bg.bg_type = GUI_BG_COLOR;
+ //ctrl_bg.color = GUI_RGB8882RGB565(0X0ECC92); //GUI_RGB2RGB565(0x40, 0x40, 0x40);
+ //GUIBUTTON_SetBg(ctrl_id, &ctrl_bg);
+ GUIBUTTON_SetGrayed(ctrl_id, FALSE, &ctrl_bg, FALSE);
+
+ GUIBUTTON_SetRunSheen(ctrl_id, FALSE);
+ //GUIBUTTON_SetText( ctrl_id, display_text.wstr_ptr, display_text.wstr_len);
+ GUIBUTTON_SetCallBackFunc(ctrl_id, mmi_video_call_hangup_button_cb);
+ GUIBUTTON_SetVisible(ctrl_id, TRUE, FALSE);
+}
+
+LOCAL MMI_RESULT_E HandleVideoCallDialingWindow(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param)
+{
+ MMI_RESULT_E result = MMI_RESULT_TRUE;
+ GUI_POINT_T dis_point = {0, 0};
+ MMI_CTRL_ID_T ctrl_id = MMI_COMMON_BUTTON_CTRL_ID;
+
+ switch (msg_id)
+ {
+ case MSG_OPEN_WINDOW:
+ break;
+
+ case MSG_FULL_PAINT:
+ mmi_video_call_dialing_win_display(win_id, ctrl_id);
+ break;
+
+ case MSG_CTL_PENOK:
+ case MSG_CTL_MIDSK:
+ case MSG_APP_WEB:
+ break;
+
+ case MSG_KEYDOWN_CANCEL:
+ case MSG_CTL_CANCEL:
+ MMK_CloseWin(win_id);
+ break;
+
+ case MSG_KEYDOWN_OK:
+ case MSG_CTL_OK:
+ break;
+
+ case MSG_CLOSE_WINDOW:
+ break;
+
+ default:
+ result = MMI_RESULT_FALSE;
+ break;
+ }
+
+ return result;
+}
+
+WINDOW_TABLE(MMI_VIDEO_CALL_DIALING_WIN_TAB) =
+{
+ WIN_FUNC( (uint32)HandleVideoCallDialingWindow),
+ WIN_ID( MMI_VIDEO_CALL_DIALING_WIN_ID ),
+ WIN_HIDE_STATUS,
+ //WIN_TITLE(TXT_MAINMENU_VIDEO_CALL),
+ CREATE_BUTTON_CTRL(IMAGE_VIDEO_CALL_HANGUP_BUTTON, MMI_COMMON_BUTTON_CTRL_ID),
+ END_WIN
+};
+
+
+static void mmi_win_init_video_call_main(MMI_WIN_ID_T win_id, MMI_CTRL_ID_T ctrl_id)
+{
+ s_video_call_contact_index = 0;
+ s_video_call_win_status = 0;
+ memset(&s_video_call_params, 0x0, sizeof(s_video_call_params));
+
+ //get video call contact members from server
+ km_FZD_net_action_MEMBERS();
+}
+
+static void mmi_win_display_video_call_contact_list(MMI_WIN_ID_T win_id, MMI_CTRL_ID_T ctrl_id)
+{
+ uint8 index = 0;
+ uint8 total_item = s_video_call_contact_info.vc_contact_num > MMIAPI_VC_CONTACT_MAX_NUM ? MMIAPI_VC_CONTACT_MAX_NUM : s_vc_contact_info.vc_contact_num;
+
+ GUILIST_RemoveAllItems(ctrl_id);
+ GUILIST_SetMaxItem( ctrl_id, total_item, FALSE ); //max item MMIAPI_VC_CONTACT_MAX_NUM = 50
+
+ for (index = 0; index < total_item; index++)
+ {
+ BOOLEAN is_update = FALSE;
+ GUILIST_ITEM_T item_t = {0};
+ GUILIST_ITEM_DATA_T item_data = {0};
+ char t_str[32] = {0};
+ wchar temp_wstr[32] = {0};
+ //MMI_IMAGE_ID_T t_image = IMAGE_NULL;
+ //MMI_STRING_T t_text = {0};
+
+ if(NULL != s_video_call_contact_info.vc_data[index].vc_name)
+ {
+ MMIAPICOM_Wstrcpy(temp_wstr, s_video_call_contact_info.vc_data[index].vc_name);
+ }
+ else
+ {
+ MMIAPICOM_StrToWstr(s_video_call_contact_info.vc_data[index].vc_number, temp_wstr);
+ }
+
+ item_t.item_data_ptr = &item_data;
+
+ //set item style
+ item_t.item_style = GUIITEM_STYLE_ONE_LINE_TEXT; // GUIITEM_STYLE_ONE_LINE_TEXT_ICON;
+ item_t.item_state |= GUIITEM_STATE_SELFADAPT_RECT|GUIITEM_STATE_CONTENT_CHECK;
+
+ item_data.item_content[0].item_data_type = GUIITEM_DATA_TEXT_BUFFER; //GUIITEM_DATA_TEXT_ID;
+ item_data.item_content[0].item_data.text_buffer.wstr_len = MMIAPICOM_Wstrlen(temp_wstr);
+ item_data.item_content[0].item_data.text_buffer.wstr_ptr = temp_wstr;
+
+ item_data.softkey_id[LEFT_BUTTON] = TXT_NULL;
+ item_data.softkey_id[RIGHT_BUTTON] = TXT_NULL;
+ item_data.softkey_id[MIDDLE_BUTTON] = TXT_NULL;
+
+ if( is_update )
+ {
+ GUILIST_ReplaceItem(ctrl_id, &item_t, index);
+ }
+ else
+ {
+ GUILIST_AppendItem(ctrl_id, &item_t);
+ }
+ }
+
+ GUILIST_SetCurItemIndex(ctrl_id, s_video_call_contact_index);
+ MMK_SetAtvCtrl(win_id, ctrl_id);
+}
+
+static void mmi_video_call_dial_timeout_cb(void)
+{
+ if(0 != s_video_call_params.dial_timer_id)
+ MMK_StopTimer(s_video_call_params.dial_timer_id);
+
+ memset(&s_video_call_params, 0x0, sizeof(s_video_call_params));
+
+}
+
+static void mmi_video_call_button_call(MMI_VIDEO_CALL_TYPE_E calltype)
+{
+ int dial_ret = -1;
+
+ if(0 != s_video_call_params.dial_timer_id)
+ MMK_StopTimer(s_video_call_params.dial_timer_id);
+
+ if(0 != s_video_call_params.incoming_timer_id)
+ MMK_StopTimer(s_video_call_params.incoming_timer_id);
+
+ memset(&s_video_call_params, 0x0, sizeof(s_video_call_params));
+
+ s_video_call_params.state = MMI_VIDEO_CALL_STATE_DIALING;
+ s_video_call_params.calltype = calltype;
+ s_video_call_params.is_mt = FALSE;
+ strcpy(s_video_call_params.number, s_video_call_contact_info.vc_data[s_video_call_contact_index].vc_number);
+ MMIAPICOM_Wstrcpy(s_video_call_params.name, s_video_call_contact_info.vc_data[s_video_call_contact_index].vc_name)
+
+ dial_ret = mmi_video_call_dial(s_video_call_params.number, calltype);
+ if(0 == s_video_call_params.dial_timer_id)
+ {
+ uint32 time_out = (-1 == dial_ret) ? 1*1000 : 60 * 1000;
+
+ s_video_call_params.dial_timer_id = MMK_CreateTimerCallback(time_out, mmi_video_call_dial_timeout_cb, PNULL, FALSE);
+ }
+
+ MMK_CreateWin((uint32*)MMI_VIDEO_CALL_DIALING_WIN_TAB, PNULL);
+
+ return 0;
+}
+
+static MMI_RESULT_E mmi_video_call_voice_button_cb(void)
+{
+ mmi_video_call_button_call(MMI_VIDEO_CALL_TYPE_VOICE);
+
+ return 0;
+}
+
+static MMI_RESULT_E mmi_video_call_video_button_cb(void)
+{
+ mmi_video_call_button_call(MMI_VIDEO_CALL_TYPE_VIDEO);
+
+ return 0;
+}
+
+static void mmi_win_display_video_call_button(MMI_WIN_ID_T win_id, MMI_CTRL_ID_T button_ctrl0, MMI_CTRL_ID_T button_ctrl1)
+{
+ GUI_RECT_T ctrl_rect0 = {30, 10, MMI_MAINSCREEN_WIDTH-30, 10+125}, ctrl_rect1 = {30, MMI_MAINSCREEN_HEIGHT-10-125, MMI_MAINSCREEN_WIDTH-30, MMI_MAINSCREEN_HEIGHT-10};
+ GUI_BG_T ctrl_bg = {0};
+
+ GUIAPICTRL_SetState(button_ctrl0, GUICTRL_STATE_INVISIBLE, FALSE);
+ GUIAPICTRL_SetState(button_ctrl1, GUICTRL_STATE_INVISIBLE, FALSE);
+
+ //button 0
+ GUIBUTTON_SetRect( button_ctrl0, &ctrl_rect0);
+ //GUIBUTTON_SetFont( button_ctrl0, &font_all);
+
+ //MMI_GetLabelTextByLang(TXT_GO_TO_WORK, &display_text);
+ //ctrl_bg.bg_type = GUI_BG_COLOR;
+ //ctrl_bg.color = GUI_RGB8882RGB565(0X0ECC92); //GUI_RGB2RGB565(0x40, 0x40, 0x40);
+ //GUIBUTTON_SetBg(button_ctrl0, &ctrl_bg);
+ GUIBUTTON_SetGrayed(button_ctrl0, FALSE, &ctrl_bg, FALSE);
+
+ GUIBUTTON_SetRunSheen(button_ctrl0, FALSE);
+ //GUIBUTTON_SetText( button_ctrl0, display_text.wstr_ptr, display_text.wstr_len);
+ GUIBUTTON_SetCallBackFunc(button_ctrl0, mmi_video_call_voice_button_cb);
+ //GUIBUTTON_SetVisible(button_ctrl0, FALSE, FALSE);
+
+ //button 1
+ GUIBUTTON_SetRect( button_ctrl1, &ctrl_rect1);
+ //GUIBUTTON_SetFont( button_ctrl1, &font_all);
+
+ //MMI_GetLabelTextByLang(TXT_GO_OFF_WORK, &display_text);
+ //ctrl_bg.bg_type = GUI_BG_COLOR;
+ //ctrl_bg.color = GUI_RGB8882RGB565(0X0ECC92); //GUI_RGB2RGB565(0x40, 0x40, 0x40);
+ //GUIBUTTON_SetBg(button_ctrl1, &ctrl_bg);
+ GUIBUTTON_SetGrayed(button_ctrl1, FALSE, &ctrl_bg, FALSE);
+
+ GUIBUTTON_SetRunSheen(button_ctrl1, FALSE);
+ //GUIBUTTON_SetText( button_ctrl1, display_text.wstr_ptr, display_text.wstr_len);
+ GUIBUTTON_SetCallBackFunc(button_ctrl1, mmi_video_call_video_button_cb);
+ //GUIBUTTON_SetVisible(button_ctrl1, FALSE, FALSE);
+}
+
+static void mmi_win_display_video_call_main(MMI_WIN_ID_T win_id, MMI_CTRL_ID_T ctrl_id, MMI_CTRL_ID_T button_ctrl0, MMI_CTRL_ID_T button_ctrl1)
+{
+ GUI_LCD_DEV_INFO lcd_dev_info = {GUI_MAIN_LCD_ID, GUI_BLOCK_MAIN};
+ GUI_RECT_T full_rect = MMITHEME_GetFullScreenRect();
+
+ //background
+ GUI_FillRect(&lcd_dev_info, full_rect, MMI_BLACK_COLOR);
+ GUIAPICTRL_SetState(ctrl_id, GUICTRL_STATE_INVISIBLE, TRUE);
+ GUIAPICTRL_SetState(button_ctrl0, GUICTRL_STATE_INVISIBLE, TRUE);
+ GUIAPICTRL_SetState(button_ctrl1, GUICTRL_STATE_INVISIBLE, TRUE);
+
+ if(0 == s_video_call_win_status)
+ {
+ GUIAPICTRL_SetState(ctrl_id, GUICTRL_STATE_INVISIBLE, FALSE);
+ mmi_win_display_video_call_contact_list(win_id, ctrl_id);
+ }
+ else if(1 == s_video_call_win_status)
+ {
+ GUIAPICTRL_SetState(button_ctrl0, GUICTRL_STATE_INVISIBLE, FALSE);
+ GUIAPICTRL_SetState(button_ctrl1, GUICTRL_STATE_INVISIBLE, FALSE);
+ mmi_win_display_video_call_button(win_id, button_ctrl0, button_ctrl1);
+ }
+}
+
+LOCAL MMI_RESULT_E HandleVideoCallMainWindow(MMI_WIN_ID_T win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param)
+{
+ MMI_RESULT_E result = MMI_RESULT_TRUE;
+ MMI_CTRL_ID_T ctrl_id = MMI_COMMON_LIST_CTRL_ID, button_ctrl0 = MMI_COMMON_BUTTON_0_CTRL_ID, button_ctrl1 = MMI_COMMON_BUTTON_1_CTRL_ID;
+
+ switch (msg_id)
+ {
+ case MSG_OPEN_WINDOW:
+ mmi_win_init_video_call_main(win_id, ctrl_id, button_ctrl0, button_ctrl1);
+ break;
+
+ case MSG_FULL_PAINT:
+ mmi_win_display_video_call_main(win_id, ctrl_id, button_ctrl0, button_ctrl1);
+ break;
+
+ case MSG_CTL_PENOK:
+ case MSG_CTL_MIDSK:
+ case MSG_APP_WEB:
+ //user make a call by press or long press green key
+ if(0 != GUILIST_GetTotalItemNum(ctrl_id)) // && (GUILIST_GetSelectedItemIndex(ctrl_id, PNULL, 0) == 0))
+ {
+ s_video_call_contact_index = GUILIST_GetCurItemIndex(ctrl_id);
+ s_video_call_win_status = 1; // display button
+
+ MMK_SendMsg(win_id, MSG_FULL_PAINT, PNULL);
+ }
+ break;
+
+ case MSG_KEYDOWN_CANCEL:
+ case MSG_CTL_CANCEL:
+ MMK_CloseWin(win_id);
+ break;
+
+ case MSG_KEYDOWN_OK:
+ case MSG_CTL_OK:
+ break;
+
+ case MSG_CLOSE_WINDOW:
+ //stop hero server
+ MMIHERO_VoiceChatServerExit();
+ break;
+
+ default:
+ result = MMI_RESULT_FALSE;
+ break;
+ }
+
+ return (result);
+}
+
+WINDOW_TABLE(MMI_VIDEO_CALL_MAIN_WIN_TAB) =
+{
+ WIN_FUNC( (uint32)HandleVideoCallMainWindow ),
+ WIN_ID( MMI_VIDEO_CALL_MAIN_WIN_ID ),
+ WIN_HIDE_STATUS,
+ WIN_TITLE(TXT_MAINMENU_VIDEO_CALL),
+ CREATE_LISTBOX_CTRL(GUILIST_TEXTLIST_E, MMI_COMMON_LIST_CTRL_ID),
+ CREATE_BUTTON_CTRL(IMAGE_VIDEO_CALL_VOICE_BUTTON, MMI_COMMON_BUTTON_0_CTRL_ID),
+ CREATE_BUTTON_CTRL(IMAGE_VIDEO_CALL_VIDEO_BUTTON, MMI_COMMON_BUTTON_1_CTRL_ID),
+ END_WIN
+};
+
+PUBLIC BOOLEAN MMIAPI_EnterVideoCallMainWindow(void)
+{
+ MN_DUAL_SYS_E dual_sys = MN_DUAL_SYS_1;
+
+ if(0 == MNPHONE_GetAttState(dual_sys)) // or use (FALSE == MMIAPIPHONE_GetDataServiceSIM(&dual_sys))
+ {
+ MMIPUB_OpenAlertWarningWin(STR_SIM_SEARCH_FAIL);
+ return FALSE;
+ }
+
+ if(FALSE == MMIAPIPHONE_IsSimAvailable(dual_sys))
+ {
+ MMIPUB_OpenAlertWarningWin(STR_SIM_NOT_SIM_EXT01);
+ return FALSE;
+ }
+
+ MMK_CreateWin((uint32*)MMI_VIDEO_CALL_MAIN_WIN_TAB, PNULL);
+ return TRUE;
+}
+
+
+/**---------------------------------------------------------------------------*
+ ** Compiler Flag *
+ **---------------------------------------------------------------------------*/
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif
+
--- /dev/null
+#ifndef __JRTC_H__
+#define __JRTC_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * ºô½ÐÁ÷³Ì: ¼ÙÉè `É豸A' ºô½Ð `É豸B'
+ *
+ * Æô¶¯Á¬½ÓÁ÷³Ì
+ * - A ÐèÒª "ijÖÖÍÆËÍ»úÖÆ" (³¤Á¬½Ó,ÍÆËÍ·½Ê½) ֪ͨµ½B,
+ * - A ´ò¿ªÍ¨ÐÅ(jrtc_open), ³õʼ״̬Ϊ JRTC_OPENED
+ * - B ÊÕµ½ "¸ÃÖÖÍÆËÍ֪ͨ" ºóÒ²´ò¿ªÍ¨ÐÅ(jrtc_open), ³õʼ״̬Ϊ JRTC_OPENED
+ * - A Ö÷¶¯¼¤»îýÌåÉ豸,ÒÔ±ã×Ô¶¯½ÓÌý
+ * jrtc_activate(jc, JRTC_AUDIO|JRTC_CAMERA)
+ *
+ * ³É¹¦½¨Á¢ÍøÂçͨµÀ
+ * - A ºÍ B ÔÚ·þÎñÆ÷É϶ԺôºóÁ¬Í¨, ͨ»°×´Ì¬¶¼±äΪ JRTC_JOINED
+ * - A ¿ÉÒÔ¿ªÊ¼äÖȾ¾µÍ·Ô¤ÀÀ(äÖȾÁ÷³Ì)
+ *
+ * ±»½ÐÁ÷³Ì
+ * - B ÊÕµ½AµÄÒôÊÓÆµÊý¾Ý, ͨ»°×´Ì¬±äΪ JRTC_TALKING
+ * - B ¿ÉÒÔ¿ªÊ¼äÖȾ¶Ô¶ËÊÓÆµ(äÖȾÁ÷³Ì)
+ * - B µ¯³ö½ÓÌýÌáʾ, ÈôÓû§Ñ¡Ôñ"¾Ü½Ó"Ôò½øÈë¹Ò¶ÏÁ÷³Ì
+ * - B ÔÚ½çÃæÑ¡Ôñ½ÓÌýºó, Ò²¼¤»îýÌåÉ豸
+ * jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA)
+ *
+ * Ö÷½ÐÁ÷³Ì
+ * - A ÔÚÊÕµ½ÒôÊÓÆµÊý¾Ýºó, ״̬±äΪJRTC_TALKING
+ * - A Ò²¿ªÊ¼äÖȾ¶Ô¶ËÊÓÆµ(äÖȾÁ÷³Ì)
+ *
+ * ¹Ò¶ÏÁ÷³Ì
+ * - A µ÷Óà jrtc_close Ö÷¶¯¹Ò¶Ï
+ * - B ͨ»°×´Ì¬½«±äΪ JRTC_LEAVING »ò JRTC_CLOSED
+ * - ͨ¹ý jrtc_error() ¿ÉÒÔ»ñÈ¡¹Ò¶ÏµÄÔÒò(³ö´íÖµ)
+ * - B µ÷Óà jrtc_close ½áÊøÍ¨»°
+ *
+ * ×î¼òº¯ÊýÁ÷³Ì
+ * - jrtc_config(...); // ÅäÖû·¾³,Ö»Ðèµ÷ÓÃÒ»´Î
+ * - jc = jrtc_open(...);// ´ò¿ªÍ¨»°,·µ»Ø¶ÔÏó
+ * - jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA);//¼¤»îÉ豸
+ * - ÔÚ UI Ïß³Ì,¸üÐÂÊÓÆµ»òÔ¤ÀÀ,²Î¿¼ÏÂÃæµÄ`äÖȾÁ÷³Ì'
+ * - jrtc_close(jc, JRTC_EBYE); //Ö÷¶¯¹Ò¶Ï, ²¢ÇҵȴýÍøÂçÏ߳̽áÊø
+ *
+ * ÊÕµ½À´µçÖжϵĴ¦Àí
+ * - jrtc_close(jc, JRTC_EAUDIOCALL);//½áÊøÍ¨»°,µÈ´ýÍøÂçÏ߳̽áÊø
+ */
+
+/** ͨ»°×´Ì¬ */
+enum jrtc_state
+{
+ JRTC_CLOSED=0,/*< ³õʼ״̬ */
+ JRTC_LEAVING, /*< jrtc_leave »òÄÚ²¿³ö´íºóµÄ״̬ */
+ JRTC_OPENED, /*< µ÷ÓÃjrtc_open ºóµÄ״̬ */
+ JRTC_JOINING, /*< ¼ÓÈëÖеÄ״̬ */
+ JRTC_JOINED, /*< ³É¹¦¼ÓÈë»á»° */
+ JRTC_TALKING, /*< ÊÕµ½Ã½ÌåºóµÄ״̬ */
+};
+
+/** ͨ»°´íÎóÖµ */
+enum jrtc_error
+{
+ JRTC_ENIL = 0, /* unknown error */
+ JRTC_EPERM = 1, /* Operation not permitted */
+ JRTC_ENONET = 64, /* Machine is not on the network */
+ JRTC_EPROTO = 71, /* Protocol error */
+ JRTC_EMSGSIZE = 90, /* Message too long */
+ JRTC_ECONNRESET=104, /* Connection reset by peer */
+ JRTC_ETIMEDOUT =101, /* Connection timed out */
+ JRTC_ECONNREFUSED=111,/* Connection refused or closed */
+
+ JRTC_EOFFLINE = 128, /* Peer offline or over */
+ JRTC_EDECLINE = 129, /* Peer decline the call */
+ JRTC_EINVOKETIMEOUT = 130, /* IoTUnit invoke timeout */
+ JRTC_ECALLSERVERERROR = 131, /* Call server error */
+ JRTC_EROOMNOTFND = 132, /* Room or callee not found */
+ JRTC_ECALLTIMEOUT = 133, /* Call timeout */
+ JRTC_ENOTREG = 134, /* device id not registered */
+ JRTC_ELOGIN = 135, /* device id login failed */
+ JRTC_ETOKEN_NOTFOUND = 136, /* secret not found */
+ JRTC_ETOKEN_INV = 137, /* token invalid */
+ JRTC_ETOKEN_EXPIRE = 138, /* token expire */
+ JRTC_ECODECINVALID = 139, /* Codec params invalid */
+
+ JRTC_EAUDIOCALL = 252, /* external audio call, don't close audio deivce */
+ JRTC_EAUDIO=253, /* Audio device error */
+ JRTC_EVIDEO=254, /* Video device error */
+
+ JRTC_EBYE = 255, /* Success, Closed by peer leave */
+};
+
+/** ͨ»°ÖеÄýÌåÉ豸 */
+enum jrtc_device
+{
+ JRTC_SPEAKER = 1,
+ JRTC_MICROPHONE = 2,
+ JRTC_CAMERA = 4,
+ JRTC_AUDIO = 3,
+};
+
+enum jrtc_netstat
+{
+ JRTC_NET_NORMAL = 0, /* network is normal or unknown */
+ JRTC_LOCAL_POOR = 1,
+ JRTC_REMOTE_POOR = 2,
+};
+
+/** Êý¾ÝÀàÐÍ
+ * @note
+ * | Èí¼þϵͳ | ƽ̨ | ²É¼¯¸ñʽ | ±àÂëºó¸ñʽ | ½âÂëºó¸ñʽ |
+ * | ------------ | -------- | ---------- | ---------- | ------------ |
+ * | Unisoc Mocor | UIS8910 | JRTC_UYVY | JRTC_JPEG | JRTC_UYVY, JRTC_JPEG [^1] |
+ *
+ * [^1]: ¿Éͨ¹ý video.format = JRTC_JPEG; jrtc_open(..., &video); ÉèÖÃ
+ */
+enum jrtc_dtype
+{
+ JRTC_I420 = 0, /*< ͼÏñ×Ö½ÚÊý=W*H*3/2 */
+ JRTC_NV12 = 1, /*< ͼÏñ×Ö½ÚÊý=W*H*3/2 */
+ JRTC_UYVY = 2, /*< ͼÏñ×Ö½ÚÊý=W*H*2 */
+ JRTC_JPEG = 3, /*< ±£³Ö¼æÈÝÐÔ */
+ JRTC_NV16 = 4, /*< ͼÏñ×Ö½ÚÊý=W*H*2 */
+
+ JRTC_RGB565 = 64,
+
+ JRTC_H264 = 96,
+ JRTC_H263 = 97,
+};
+
+/** äÖȾÁ÷³Ì:
+ * jrtc_image_t* img ´ú±í jrtc_open Öд«Èë video »ò camera
+ * - ¼ì²âµ±Ç°ÎªÍ¨»°×´Ì¬, ·ñÔòÎÞÐëäÖȾ
+ * if (jrtc_state(jc) < JRTC_JOINED) break;
+ *
+ * - ÄÚ²¿×Ô¶¯¸üÐÂͼÏñ:
+ * if (img->get == img->put) {
+ * '¸üÐÂͼÏñÄÚÈÝ: ¼´¶ÔimgÖеÄdata, width, height, format ¸³Öµ'
+ * img->put++;//Ôö¼Óд¼ÆÊý
+ * }
+ *
+ * - ÉϲãUIÏß³Ì(App ½çÃæ²ã)¸ºÔð»æÖÆÍ¼Ïñ:
+ * if (img->get != img->put) {
+ * '½çÃæ»æÖƲÙ×÷: ¼´Ê¹ÓÃimgÖеÄdata, ¸üнçÃæ¿Ø¼þ'
+ * img->get = img->put;//Ôö¼Ó¶Á¼ÆÊý
+ * }
+ *
+ * ÔÚjrtc_open()ÖÐÓÃÓÚÉèÖý¨ÒéÖµ, ͨ»°¹ý³ÌÖÐÓÃÓÚ»ñȡͼÏñÊý¾Ý.
+ * ÀýÈç, Ï£Íû½ÓÊպͷ¢ËͶ¼ÊÇ240x240, 8Ö¡/ÃëµÄÊÓÆµÍ¨»°:
+ * static struct jrtc_image_t video, camera;
+ * video.width = camera.width = 240;
+ * video.height = camera.height = 240;
+ * video.fps = camera.fps = 8;
+ * video.kbps = camera.kbps = 120;
+ * //×¢Òâ,ÒÔÉϽöÊǽ¨ÒéÖµ, ÔÚ×îÖÕ½Óͨʱ, ÓÉ·þÎñÆ÷¾ö¶¨Êµ¼ÊÖµ
+ * //ÈôÄÚ²¿Ê¹ÓÃjpeg ±àÂë,Ôò»áºöÂÔ kbps Öµ
+ *
+ * jc = jrtc_open(roomid, 0, &video, &camera);
+ */
+struct jrtc_image_t
+{/* ¿ÉǿתΪ jrtc_photo_t ʹÓà */
+ void* data;
+ unsigned bytes;
+ unsigned short width, height;
+ char format;/*< enum jrtc_dtype */
+ char fps;
+ unsigned short kbps;
+ volatile char put, get;
+ char reserve[2];
+};
+
+/** µ±Ç°µÄ°æ±¾ºÅ */
+#define JRTC_VERSION "1.7.0.0"
+
+/** ÅäÖÃÈ«¾Ö²ÎÊý,Ö»Ðèµ÷ÓÃÒ»´Î.
+ * ×¢Òâ:
+ * - appkey ¹Ì¶¨³¤¶ÈΪ24
+ * - key ¹Ì¶¨³¤¶ÈΪ16
+ * - uid ÏÞÖÆ×î´ó×Ö·ûÊýΪ64
+ * - tokens ÏÞÖÆ×î´ó×Ö·ûÊýΪ128
+ *
+ * @param[in] appkey µ±Ç°APPÌØÓеıêʶ, ÐèÏòJuphoonÉêÇë»ñµÃ
+ * @param[in] uid ÕË»§
+ * @param[in] key ͨѶÃÜÔ¿, ±ØÐëÓëappkeyÆ¥Åä, ÐèÏòJuphoonÉêÇë»ò×¢²á
+ * @param[in] ÓÃÓÚ¼øÈ¨µÄtokens,ĬÈÏΪ""
+ */
+void jrtc_config (const char* appkey, const char* uid, const char key[16], const char* tokens);
+
+/**Õ¹Èñ UIX8910 ƽ̨ ÐèÒªÉèÖÃPDPÁ÷³Ìºó»ñµÃµÄÍøÂç ID */
+extern unsigned _jrtc_net_id;
+/**Õ¹Èñ UIX8910 ƽ̨µÄ¾µÍ·½Ç¶È,¼´²É¼¯Í¼ÏñÐèҪ˳ʱÕëÐýת¸ÃÖµ,²ÅÄÜÕýÁ¢. ĬÈÏ90 */
+extern unsigned _jrtc_cam_angle;
+
+/** ·ÖÅäͨ»°×ÊÔ´²¢Æô¶¯ÍøÂçÏß³Ì
+ * ×¢Òâ:
+ * - ¶Ôticket³¤¶ÈºÍ²ÎÊýroomid¶¼ÏÞÖÆ×î´ó×Ö·ûÊýΪ64
+ * - ÄÚ²¿É豸³õʼûÓ줻î,ºóÐøÐèÒªµ÷ÈçÏ¿ªÆô
+ * jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA)
+ *
+ * ticket ×÷Ϊͨ»°ID, Ψһ±êʶÿ´Îͨ»°:
+ * - ²»Äܰüº¬JSONÐèתÒåµÄ×Ö·û
+ * - ÿ´Îͨ»°, ҪʹÓò»Í¬µÄ ticket,(Ëæ»ú²úÉú»òÏò·þÎñÆ÷ÉêÇë)
+ * - A ºô½Ðǰ,ÉêÇë»ñµÃ ticket
+ * - A ÐèҪͨ"ijÖÖÍÆËÍ»úÖÆ"(³¤Á¬½Ó,ÍÆËÍ·½Ê½) ½« ticket ֪ͨµ½B
+ * - A ºÍB ¶Ôºôʱ, ±ØÐëʹÓÃÏàͬµÄticket, ÒÔ±ã·þÎñÆ÷¾«È·±êʶ»á»°
+ *
+ * @param[in] id ¼ÓÈëÒ»¶ÔÒ»»á»°(¶Ô·½µÄuid)»ò·¿¼ä(ÒÔroom:ǰ׺µÄ·¿¼äµØÖ·)
+ * @param[in] ticket hashÖµ,¿Éͨ¹ýÆäËû·¾¶»ñµÃ,ĬÈÏΪNULL,½öÓÃÓÚµ÷ÊÔ.
+ * @param[in,out] video ÆÚÍû½ÓÊÕµÄÊÓÆµ³ß´çºÍÖ¡ËÙ,ÂëÂÊ. Èô NULL,Ôò²»½ÓÊÕÊÓÆµ
+ * @param[in,out] camera ÓÃÓÚÔ¤ÀÀͼÏñ,½¨ÒéµÄ·¢ËͳߴçºÍÖ¡ËÙ,ÂëÂÊ. Èô NULL, Ôò²»Ê¹ÓþµÍ·.
+ * ×îÖÕµÄÊÓÆµ³ß´çºÍ¾µÍ·µÄ³ß´ç,¶¼ÓÉ·þÎñÆ÷ÐÉ̾ö¶¨.
+ */
+struct jrtc_t* jrtc_open (const char* id, const char* ticket, struct jrtc_image_t* video, struct jrtc_image_t* camera);
+
+/** ÊÍ·Åͨ»°×ÊÔ´,²¢µÈ´ýÍøÂçÏ߳̽áÊø.
+ *
+ * @param[in] err Ö÷¶¯¹Ò¶ÏΪ JRTC_EBYE
+ * µ«µ±ÓïÒôµç»°ÖжÏʱ, ÐëÉèÖÃΪJRTC_EAUDIOCALL,
+ * ÆäËûδ֪Çé¿ö,¿ÉÉèÖÃΪ JRTC_ENIL(²»Ð޸ĹҶÏÔÒò)
+ */
+void jrtc_close (struct jrtc_t* jc, enum jrtc_error err);
+
+/** ±àÂëǰµÄµÄÊÓÆµÖ¡ */
+struct jrtc_photo_t
+{
+ void* data;
+ unsigned bytes;
+ unsigned short width,height;
+ char format;/*< enum jrtc_dtype */
+ char reserve[3];
+};
+
+/** ¶¯Ì¬ÉèÖÃǰºó¾µÍ·
+ * @param[in] camera 0Ϊºó¾µÍ·,1ÊÇǰ¾µÍ·
+ * @param[in] effect ±àÂëǰͼÏñµÄ´¦Àí»Øµ÷
+ * ½ûÖ¹¸Ä±äͼÏñ³ß´çºÍ¸ñʽ.
+ * ¿ÉÉèÖÃΪ NULL
+ * @code
+ * static char* encoding = NULL;
+ * //Ö»¾µÏñ·¢ËÍͼÏñ
+ * jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
+ * auto preview = frame->data;
+ * if (!encoding) encoding = new char[frame->bytes];
+ *
+ * assert (frame->format == JRTC_UYVY && "¸ù¾Ýƽ̨ѡÔñת»»º¯Êý");
+ * jrtc_uyvy_mirror(frame, frame->width, frame->height, encoding);
+ * frame->data = encoding;
+ * });
+ * //Ö»¾µÏñÔ¤ÀÀͼÏñ
+ * jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
+ * auto preview = frame->data;
+ * if (!encoding) encoding = new char[frame->bytes];
+ * frame->data = memcpy(encoding, preview, frame->bytes);
+ *
+ * assert (frame->format == JRTC_UYVY && "¸ù¾Ýƽ̨ѡÔñת»»º¯Êý");
+ * jrtc_uyvy_mirror(frame, frame->width, frame->height, preview);
+ * });
+ * //ͬʱ¾µÏñÔ¤ÀÀºÍ·¢ËÍͼÏñ
+ * jrtc_set_camera(jc, 1, [](struct jrtc_photo_t* frame){
+ * auto preview = frame->data;
+ * if (!encoding) encoding = new char[frame->bytes];
+ * frame->data = memcpy(encoding, preview, frame->bytes);
+ *
+ * assert (frame->format == JRTC_UYVY && "¸ù¾Ýƽ̨ѡÔñת»»º¯Êý");
+ * jrtc_uyvy_mirror(frame, frame->width, frame->height, preview);
+ * frame->data = preview;
+ * });
+ * @endcode
+ */
+void jrtc_set_camera (struct jrtc_t* jc, int camera,
+ void (*effect) (struct jrtc_photo_t* frame));
+
+/** ¼¤»îÉ豸, ¿ªÆô·¢ËÍÄÜÁ¦
+ * @param[in] devices jrtc_device µÄ¼¯ºÏ
+ */
+void jrtc_activate (struct jrtc_t* jc, int devices);
+
+/** ½û»îÉ豸, ¹Ø±Õ·¢ËÍÄÜÁ¦
+ * @param[in] devices jrtc_device µÄ¼¯ºÏ
+ */
+void jrtc_deactivate (struct jrtc_t* jc, int devices);
+
+/** ·µ»ØÍ¨»°×´Ì¬ */
+enum jrtc_state jrtc_state (const struct jrtc_t *jc);
+
+/** ·µ»Ø×î½üµÄ³ö´íÖµ */
+enum jrtc_error jrtc_error (const struct jrtc_t *jc);
+
+/** ·µ»ØÍøÂç״̬
+ * @param[out] remote_active_devices ¶Ô¶ËµÄµÄÊý¾ÝÁ÷״̬. jrtc_device µÄ¼¯ºÏ
+ * ÔÊÐí NULL.
+ */
+enum jrtc_netstat jrtc_netstat(struct jrtc_t* jc, int *remote_active_devices);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+#ifndef __JRTC_0_H__
+#define __JRTC_0_H__
+#include "jrtc.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** ͨ»°×´Ì¬
+ * jrtc_alloc jrtc_schedule jrtc_schedule
+ * JRTC_CLOSED ----------> JRTC_OPENED -------------> JRTC_JOINING -------------> JRTC_JOINED
+ * ^ |
+ * | jrtc_step | jrtc_schedule
+ * | jrtc_leave »ò ÄÚ²¿³ö´í | ÊÕµ½Ã½ÌåÊý¾Ý
+ * JRTC_LEAVING <---------------------------+------------- JRTC_TALKING <-------------+
+ * | ^
+ * | jrtc_schedule |
+ * +------------------+
+ */
+
+/** ÖØÖ÷þÎñÆ÷µØÖ·
+ * ×¢Òâ:
+ * - ÊÖ¹¤ÉèÖÃеØÖ·,ͨ³£Ö»ÓÃÓÚ²âÊÔ
+ * - srvURL ÏÞÖÆ×î´ó×Ö·ûÊýΪ128
+ * - srvURL Ϊ¿Õʱ, »Ö¸´ÎªÄÚÖõÄĬÈÏ·þÎñÆ÷µØÖ·
+ *
+ * @param[in] srvURL ·þÎñÆ÷µØÖ·
+ */
+void jrtc_config_server (const char* srvURL);
+
+/** ·ÖÅäͨ»°×ÊÔ´
+ * ×¢Òâ:
+ * - ÄÚ²¿Ö±½ÓÒýÓõØÖ·,ÓÉÍⲿ±£Ö¤ÄÚ´æµÄÓÐЧÐÔ
+ * - ÄÚ²¿Ã»ÓÐÆô¶¯ÍøÂçÏß³Ì,ÐèÒª²»¶ÏµÄµ÷ÓÃÈçÏÂÇý¶¯
+ * jrtc_schedule(jc, nowMs);
+ * - ÄÚ²¿É豸³õʼûÓ줻î,ºóÐøÐèÒªµ÷ÈçÏ¿ªÆô
+ * jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA)
+ *
+ * ticket ×÷Ϊͨ»°ID, Ψһ±êʶÿ´Îͨ»°:
+ * - ²»Äܰüº¬JSONÐèתÒåµÄ×Ö·û
+ * - ÿ´Îͨ»°, ҪʹÓò»Í¬µÄ ticket,(Ëæ»ú²úÉú»òÏò·þÎñÆ÷ÉêÇë)
+ * - A ºô½Ðǰ,ÉêÇë»ñµÃ ticket
+ * - A ÐèҪͨ"ijÖÖÍÆËÍ»úÖÆ"(³¤Á¬½Ó,ÍÆËÍ·½Ê½) ½« ticket ֪ͨµ½B
+ * - A ºÍB ¶Ôºôʱ, ±ØÐëʹÓÃÏàͬµÄticket, ÒÔ±ã·þÎñÆ÷¾«È·±êʶ»á»°
+ *
+ * @param[in] roomid ¼ÓÈëµÄ·¿¼äºÅ(¶Ô·½ÕË»§)
+ * @param[in] ticket ÓÃÓÚ·¿¼äµÄhashÖµ,¿Éͨ¹ýÆäËû·¾¶»ñµÃ,ĬÈÏΪNULL,½öÓÃÓÚµ÷ÊÔ.
+ * @param[in] video ÆÚÍû½ÓÊÕµÄÊÓÆµ³ß´çºÍÖ¡ËÙ,ÂëÂÊ. Èô NULL,Ôò²»½ÓÊÕÊÓÆµ
+ * @param[in] camera ÓÃÓÚÔ¤ÀÀͼÏñ,½¨ÒéµÄ·¢ËͳߴçºÍÖ¡ËÙ,ÂëÂÊ. Èô NULL, Ôò²»Ê¹ÓþµÍ·.
+ * ×îÖÕµÄÊÓÆµ³ß´çºÍ¾µÍ·µÄ³ß´ç,¶¼ÓÉ·þÎñÆ÷ÐÉ̾ö¶¨.
+ */
+struct jrtc_t* jrtc_alloc (const char* roomid, const char* ticket, struct jrtc_image_t* video, struct jrtc_image_t* camera);
+
+/** µ¥²½¸üÐÂͨ»°
+ * ÒªÇóʵʱÐÔ´¦Àí, Îñ±ØÔÚ¶ÀÁ¢Ïß³ÌÖгÖÐø¸üÐÂ,
+ * µ±·µ»Ø JRTC_CLOSED ʱ, ¿ÉÒÔÍ˳ö¸ÃÏß³Ì.
+ * ÀýÈç:
+ * Æô¶¯ÍøÂçÏß³Ì([jc]{
+ * do {
+ * state = jrtc_schedule(jc, µ±Ç°ºÁÃë);
+ * } while(state != JRTC_CLOSED);
+ * }
+ *
+ * @param[in] ms µ±Ç°ºÁÃë
+ */
+enum jrtc_state jrtc_schedule (struct jrtc_t* jc, unsigned ms);
+
+/** Ö÷¶¯À뿪/¹Ò¶Ï
+ * ×¢Òâ: ÕâÀïÖ»¸Ä±ä״̬, Ïú»Ù½«ÔÚjrtc_schedule()ÖÐ×Ô¶¯´¦Àí
+ *
+ * @param[in] err Ö÷¶¯¹Ò¶ÏΪ JRTC_EBYE
+ * µ«µ±ÓïÒôµç»°ÖжÏʱ, ÐëÉèÖÃΪJRTC_EAUDIOCALL,
+ * ÆäËûδ֪Çé¿ö,¿ÉÉèÖÃΪ JRTC_ENIL(²»Ð޸ĹҶÏÔÒò)
+ */
+enum jrtc_state jrtc_leave (struct jrtc_t *jc, enum jrtc_error err);
+
+/** ¾µÏñ
+ * @param[in] dst_w Ä¿±ê¿í¶È, »á×Ô¶¯²Ã¼ô,µ«²»Ëõ·Å
+ * @param[in] dst_h Ä¿±ê¸ß¶È, ¸ºÊýʱ»áÏÈÉÏÏ·ת(µÈ¼ÛÓÚÐýת180¶È)
+ * @param[out] dst Ä¿±êÄÚ´æ
+ */
+void jrtc_i420_mirror(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv12_mirror(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_uyvy_mirror(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv16_mirror(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+
+/** ˳ʱÕëת90¶È
+ * @param[in] dst_w Ä¿±ê¿í¶È, »á×Ô¶¯²Ã¼ô,µ«²»Ëõ·Å
+ * @param[in] dst_h Ä¿±ê¸ß¶È, ¸ºÊýʱ»áÏÈÉÏÏ·ת(µÈ¼ÛÓÚת90ºóˮƽ¾µÏñ)
+ * @param[out] dst Ä¿±êÄÚ´æ
+ */
+void jrtc_i420_rotate90(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv12_rotate90(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_uyvy_rotate90(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv16_rotate90(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+
+/** ˳ʱÕëת270¶È
+ * @param[in] dst_w Ä¿±ê¿í¶È, »á×Ô¶¯²Ã¼ô,µ«²»Ëõ·Å
+ * @param[in] dst_h Ä¿±ê¸ß¶È, ¸ºÊýʱ»áÏÈÉÏÏ·ת(µÈ¼ÛÓÚת270ºóˮƽ¾µÏñ)
+ * @param[out] dst Ä¿±êÄÚ´æ
+ */
+void jrtc_i420_rotate270(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv12_rotate270(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_uyvy_rotate270(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv16_rotate270(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+
+/** ²Ã¼ô
+ * @param[in] dst_w Ä¿±ê¿í¶È, »á×Ô¶¯²Ã¼ô,µ«²»Ëõ·Å
+ * @param[in] dst_h Ä¿±ê¸ß¶È, ¸ºÊýʱ»áÏÈÉÏÏ·ת
+ * @param[out] dst Ä¿±êÄÚ´æ
+ */
+void jrtc_i420_copy(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv12_copy(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_uyvy_copy(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv16_copy(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+
+/** ת»»Îª RGB565
+ * @param[in] dst_w Ä¿±ê¿í¶È, »á×Ô¶¯²Ã¼ô,µ«²»Ëõ·Å
+ * @param[in] dst_h Ä¿±ê¸ß¶È, ¸ºÊýʱ»áÏÈÉÏÏ·ת
+ * @param[out] dst Ä¿±êÄÚ´æ, Êä³ö³¤¶ÈΪ dst_w*dst_h*sizeof(short)
+ */
+void jrtc_i420_torgb565(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv12_torgb565(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_uyvy_torgb565(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+void jrtc_nv16_torgb565(const struct jrtc_photo_t* src, int dst_w, int dst_h, char* dst);
+
+/** ¿ÉÓÅ»¯ÅäÖõIJÎÊý @{ */
+extern unsigned JRTC_SESSION_TIMEOUT; /*< ½¨Á¢Í¨»°×ܵij¬Ê±·§Öµ,ĬÈÏ 300 Ãë*/
+extern unsigned JRTC_REPLY_TIMEOUT; /*< ½¨Á¢Í¨»°Öеȴý·þÎñÆ÷Ó¦´ðµÄ³¬Ê±·§Öµ,ĬÈÏ120 Ãë */
+extern unsigned JRTC_MEDIA_TIMEOUT; /*< ½ÓÊÕýÌåÊý¾ÝµÄ³¬Ê±·§Öµ, ĬÈÏ 20 Ãë */
+extern unsigned JRTC_MAX_RTP_SIZE; /*< ·¢Ë͵Ä×î´ó RTP °ü·§Öµ, ĬÈÏ1200,²»ÄÜ´óÓÚ1500 */
+extern unsigned JRTC_AUDIO_RED_LOSS;/*< ¿ªÆôÒôƵÈßÓà±àÂëµÄ¶ª°üÂÊ·§Öµ, ĬÈÏ 10 % */
+extern unsigned JRTC_VIDEO_FEC_LOSS; /*< ¿ªÆôÊÓÆµÈßÓà±àÂëµÄ¶ª°üÂÊ·§Öµ, ĬÈÏ 5 % */
+extern unsigned JRTC_VIDEO_FEC_MAX_RTT;/*< ¿ªÆôÊÓÆµÈßÓà±àÂëµÄRTTÉÏÏÞ, ĬÈÏ 3000 ms, 0 ÔòÇ¿ÖÆ¹Ø±ÕFEC */
+extern unsigned JRTC_VIDEO_FEC_MAX_BW_RATIO; /*< ¿ªÆôÊÓÆµÈßÓà±àÂëµÄ¶îÍâµÄÂëÂÊÕ¼±È, ĬÈÏ 80 %, 0 ÔòÇ¿ÖÆ¹Ø±ÕFEC */
+extern unsigned JRTC_VIDEO_INIT_GOP; /*< ³õʼĬÈϵÄÊÓÆµ¹Ø¼üÖ¡¼ä¸ô, ĬÈÏ2000 ms */
+extern unsigned JRTC_TASK_STACK_KB; /*< ÄÚ²¿Ï̵߳ÄÕ»´óС,ÓëÆ½Ì¨Ïà¹Ø */
+extern unsigned JRTC_TASK_PRIORITY; /*< ÄÚ²¿Ï̵߳ÄÓÅÏȼ¶,ÓëÆ½Ì¨Ïà¹Ø */
+/** @} */
+
+/** ¿É¸¨Öúµ÷ÊÔµÄÈ«¾ÖÖµ @{ */
+extern char _jrtc_errstr[256]; /* ×î½ü´íÎóÃèÊö */
+extern const char* _jrtc_version; /* µ±Ç°°æ±¾ºÅ */
+/* ÒÔÏÂÊÇjrtc_config(...)ÖеÄÈë²ÎÖµ */
+extern char _jrtc_appkey[25];
+extern char _jrtc_uid[65];
+extern char _jrtc_srvURL[129];
+extern char _jrtc_aeskey[17];
+extern char _jrtc_tokens[129];
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+
+
+
+#ifndef __MMI_VIDEO_CALL_H__
+#define __MMI_VIDEO_CALL_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+
+
+#define __VIDEO_CALL_DEBUG__
+#ifdef __VIDEO_CALL_DEBUG__
+#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...) SCI_TRACE_LOW("[VIDEO_CALL]"fmt, ##__VA_ARGS__)
+#else
+#define VIDEO_CALL_DEBUG_PRINTF(fmt, ...)
+#endif
+
+typedef enum
+{
+ MMI_VIDEO_CALL_TYPE_VOICE = 0,
+ MMI_VIDEO_CALL_TYPE_VIDEO,
+ MMI_VIDEO_CALL_TYPE_MAX
+}MMI_VIDEO_CALL_TYPE_E;
+
+
+typedef enum
+{
+ MMI_VIDEO_CALL_STATE_NULL = 0,
+ MMI_VIDEO_CALL_STATE_ACTIVE = 1,
+ MMI_VIDEO_CALL_STATE_HOLDING = 2,
+ MMI_VIDEO_CALL_STATE_DIALING = 3, /* MO call only */
+ MMI_VIDEO_CALL_STATE_ALERTING = 4, /* MO call only */
+ MMI_VIDEO_CALL_STATE_INCOMING = 5, /* MT call only */
+ MMI_VIDEO_CALL_STATE_WAITING = 6, /* MT call only */
+ MMI_VIDEO_CALL_STATE_INVALID = 0xFF
+} MMI_VIDEO_CALL_STATE_E;
+
+#define MMI_VIDEO_CALL_NUMBER_LEN (32)
+typedef struct {
+ MMI_VIDEO_CALL_STATE_E state;
+ MMI_VIDEO_CALL_TYPE_E calltype;
+ BOOLEAN is_mt; /* true if MT call */
+ BOOLEAN ring_off; /* true if ring off by user */
+ BOOLEAN ring_off_timeout; /* true if ring off timeout */
+ char number[MMI_VIDEO_CALL_NUMBER_LEN];
+ wchar name[MMI_VIDEO_CALL_NUMBER_LEN];
+ uint8 dial_timer_id;
+ uint8 incoming_timer_id;
+ uint8 speaker_volume; /* speaker volume during call procedure */
+} MMI_VIDEO_CALL_PARAMS_T;
+
+
+void mmi_video_call_jrtc_config_init(void);
+PUBLIC BOOLEAN MMIAPI_EnterVideoCallMainWindow(void);
+
+
+int mmi_video_call_start(void);
+int mmi_video_call_stop(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
{ID_MAINMENU_TOOLS, TXT_MAINMENU_ICON_APPS, IMAGE_ONE_PAGE_TOOLS, IMAGE_MAINMENU_ICON_SELECT, MMIMANMENU_EnterTools, 0},
-#if defined(HERO_ENGINE_SUPPORT)
-#ifdef HERO_APP_SMART_OPEN
- {ID_HERO_APP_SMART, TXT_HERO_APP_SMART, IMAGE_ONE_PAGE_VOICE, IMAGE_NULL, MMIMAINMENU_StartHeroAppSmart, 0},
-#endif
-#ifdef HERO_APP_WSTORE_OPEN
- {ID_HERO_APP_WSTORE, TXT_HERO_APP_WSTORE, IMAGE_ONE_PAGE_APP_WSTORE, IMAGE_NULL, MMIMAINMENU_StartHeroAppWstore, 0},
- {ID_HERO_APP_WSTORE_MANAGE, TXT_HERO_APP_WSTORE_MANAGE, IMAGE_ONE_PAGE_APP_WSTORE_MANAGE, IMAGE_NULL, MMIMAINMENU_StartHeroAppWstoreManage, 0},
-#endif
-#ifdef HERO_VIDEO_CHAT_SUPPORT
- {ID_HERO_APP_VOICE_CHAT, TXT_HERO_APP_VOICE_CHAT, IMAGE_ONE_PAGE_VIDEOCHAT, IMAGE_NULL, MMIMAINMENU_StartHeroVideoChat, 0},
-#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+ {ID_MAINMENU_VIDEO_CALL, TXT_MAINMENU_VIDEO_CALL, IMAGE_ONE_PAGE_VIDEO_CALL, IMAGE_NULL, MMIMAINMENU_StartVideoCall, 0},
#endif
{ID_SETTINGS_PHONE, STXT_HEADER_SETTINGS, IMAGE_ONE_PAGE_SETTINGS, IMAGE_MAINMENU_ICON_SELECT, MMIMAINMENU_StartPhoneSetting, 0},
#endif
#endif
-//#if defined(MMI_PROJECT_C55_DS_D11XG_DT_FZD)||defined(MMI_PROJECT_C55_DS_D11G_DT_FZD)||defined(MMI_PROJECT_C55_DS_D11W_DT_FZD)||defined(MMI_PROJECT_C55_DS_D11W_QCB_FZD)\
-// ||defined(MMI_PROJECT_C55_DS_D11G_PRO18_FZD)||defined(MMI_PROJECT_C55_DS_D11XG_QCB_FZD)
-#if defined(MMI_C55_D11_MENU_STYLE_SUPPORT) && !defined(MMI_PROJECT_C55_ZHMF_Q7)
+
+#if defined(MMI_PROJECT_C55_ZHMF_Q7)
+static const MMI_MAINMENU_ITEM_T s_mainmenu_item_data[] =
+{
+ {ID_COMMUNICATION_DIAL, TXT_COMM_DIALPAD, IMAGE_MAINMENU_DIAL, IMAGE_NULL, MMIMAINMENU_StartDial, 0},
+ {ID_COMMUNICATION_PB, TXT_MAINMENU_PB, IMAGE_MAINMENU_PB, IMAGE_NULL, MMIMAINMENU_StartPB, 0},
+ {ID_COMMUNICATION_MESSAGE, STXT_HEADER_MESSAGES, IMAGE_MAINMENU_MESSAGE, IMAGE_NULL, MMIMAINMENU_StartMessage, 0},
+
+ #ifdef MMI_WECHAT_SUPPORT
+ {ID_MENU_WECHAHT, TXT_MAINMENU_WECHAT, IMAGE_MAINMENU_WECHAT, IMAGE_NULL, MMIMAINMENU_StartWechat, 0},
+ #endif
+
+ #if defined(MMI_HEART_RATE_ONLY_DETECT_SUPPORT)
+ {ID_MENU_HEARTRATE_DETECT, TXT_MAINMENU_HEART, IMAGE_MAINMENU_HEARTRATE, IMAGE_NULL, MMIMAINMENU_StartHeartRateDetectWin, 0},
+ #endif
+
+ #if defined(MMI_SPO2_ONLY_DETECT_SUPPORT)
+ {ID_MENU_SPO2_DETECT, TXT_MAINMENU_SPO2, IMAGE_MAINMENU_SPO2, IMAGE_NULL, MMIMAINMENU_StartSpo2DetectWin, 0},
+ #endif
+
+ #if defined(MMI_STEP_SUPPORT)
+ {ID_MAINMENU_STEP, TXT_MAINMENU_STEP, IMAGE_MAINMENU_STEP, IMAGE_NULL, MMIMAINMENU_StartStep, 0},
+ #endif
+ #if defined(MMI_SPORTS_SUPPORT)
+ {ID_MAINMENU_SPORTS, TXT_MAINMENU_STEP, IMAGE_MAINMENU_STEP, IMAGE_NULL, MMIMAINMENU_StartSports, 0},
+ #endif
+
+ #if defined(MMI_TEMP_LIST_STYLE_SUPPORT)
+ {ID_MENU_TEMPERATURE, TXT_MAINMENU_TEMPERATURE, IMAGE_MAINMENU_TEMPERATURE, IMAGE_NULL, MMIMAINMENU_StartTempListStyle, 0},
+ #endif
+
+ #ifdef CAMERA_SUPPORT
+ {ID_ENTERTAIMENT_CAMERA, STR_MENU_CAMERA, IMAGE_MAINMENU_CAMERA, IMAGE_NULL, MMIMAINMENU_StartDCPhoto, 0},
+ #ifdef PIC_VIEWER_SUPPORT
+ {ID_PIC_VIEWER, TXT_COMMON_PIC, IMAGE_MAINMENU_PHOTOS, IMAGE_NULL, MMIMAINMENU_StartPicViewer, 0},
+ #endif
+ #endif
+
+ #if defined(MMI_WEATHER_SUPPORT)
+ {ID_MAINMENU_WEATHER, TXT_MAINMENU_WEATHER, IMAGE_MAINMENU_WEATHER, IMAGE_NULL, MMIMAINMENU_StartWeather, 0},
+ #endif
+
+ #if defined(MMI_SLEEP_SUPPORT)
+ {ID_MAINMENU_SLEEP, TXT_MAINMENU_SLEEP, IMAGE_MAINMENU_SLEEP, IMAGE_NULL, MMIMAINMENU_StartPedometer, 0},
+ #endif
+
+ {ID_TOOLS_ALARM, TXT_MAINMENU_ALARM, IMAGE_MAINMENU_ALARM, IMAGE_NULL, MMIMANMENU_OpenAlarmMainWin, 0},
+
+ #if defined(MMI_COUNTDOWN_SUPPORT)
+ {ID_MAINMENU_COUNTDOWN, TXT_MAINMENU_COUNTDOWN, IMAGE_MAINMENU_COUNTDOWN, IMAGE_NULL, MMIMAINMENU_StartCountdown, 0},
+ #endif
+
+ #ifdef MMI_INDIAN_SOS_SUPPORT
+ {ID_SETTINGS_SOS, TXT_SETTINGS_SOS, IMAGE_MAINMENU_SOS, IMAGE_NULL, MMIMAINMENU_StartSOSSetting, 0},
+ #endif
+
+ #if defined(MMI_STOPWATCH_SUPPORT)
+ {ID_MAINMENU_STOPWATCH, TXT_MAINMENU_STOPWATCH, IMAGE_MAINMENU_STOPWATCH, IMAGE_NULL, MMIMAINMENU_StartStopwatch, 0},
+ #endif
+
+ #if defined(MMI_TIMEREMIND_SUPPORT)
+ {ID_MAINMENU_TIMEREMIND, TXT_MAINMENU_TIMEREMIND, IMAGE_MAINMENU_TIMEREMIND, IMAGE_NULL, MMIMAINMENU_StartTimeremind, 0},
+ #endif
+
+ #if defined(MMI_AGORA_VIDEO_CALL_SUPPORT)
+ {ID_AGORA_VIDEO_CALL, TXT_VIDEO_CALL, IMAGE_AGORA_MAINMENU_ICON, IMAGE_NULL, MMIMAINMENU_StartAgoraVideoCall, 0},
+ #endif
+
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+ {ID_MAINMENU_VIDEO_CALL, TXT_MAINMENU_VIDEO_CALL, IMAGE_MAINMENU_VIDEO_CALL, IMAGE_NULL, MMIMAINMENU_StartVideoCall, 0},
+#endif
+
+ {ID_SETTINGS_PHONE, TXT_MAINMENU_SETTINGS, IMAGE_MAINMENU_SETTINGS, IMAGE_NULL, MMIMAINMENU_StartPhoneSetting, 0},
+};
+#elif defined(MMI_C55_D11_MENU_STYLE_SUPPORT)
static const MMI_MAINMENU_ITEM_T s_mainmenu_item_data[] =
{
{ID_COMMUNICATION_PB, TXT_MAINMENU_PB, IMAGE_MAINMENU_PB, IMAGE_NULL, MMIMAINMENU_StartPB, 0},
}
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+PUBLIC void MMIMAINMENU_StartVideoCall(uint32 param1, uint32 param2)
+{
+ MMIAPI_EnterVideoCallMainWindow();
+}
+#endif
+
PUBLIC void MMIMAINMENU_enter_INSPECT_MESSAGE(uint32 param1, uint32 param2);
PUBLIC void MMIMAINMENU_enter_BEIDOU_TIME_SERVICE(uint32 param1, uint32 param2);
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+PUBLIC void MMIMAINMENU_StartVideoCall(uint32 param1, uint32 param2);
+#endif
/**--------------------------------------------------------------------------*
RES_ADD_IMG(IMAGE_MAINMENU_INSPECT_MESSAGE,"\\MMI_RES_##\\IMAG\\main_menu\\IMAGE_MAINMENU_INSPECT_MESSAGE.png",IMG_CMP_PNG_ARGB_RLE,0)
RES_ADD_IMG(IMAGE_MAINMENU_BEIDOU_TIME_SERVICE,"\\MMI_RES_##\\IMAG\\main_menu\\IMAGE_MAINMENU_BEIDOU_TIME_SERVICE.png",IMG_CMP_PNG_ARGB_RLE,0)
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+RES_ADD_IMG(IMAGE_MAINMENU_VIDEO_CALL,"\\MMI_RES_##\\IMAG\\main_menu\\IMAGE_MAINMENU_VIDEO_CALL.png",IMG_CMP_PNG_ARGB_RLE,0)
+#endif
#endif //MMI_REMOVE_IMAGE_DIR_MAIN_MENU
#endif
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+RES_ADD_IMG(IMAGE_ONE_PAGE_VIDEO_CALL,"\\MMI_RES_##\\IMAG\\main_menu\\one_page\\IMAGE_ONE_PAGE_VIDEOCHAT.png",IMG_CMP_PNG_ARGB_RLE,0)
+#endif
+
#ifdef MMI_PROJECT_C55T_FXFT_N55
RES_ADD_IMG(IMAGE_ONE_PAGE_WORK_CLOCK_IN,"\\MMI_RES_##\\IMAG\\main_menu\\one_page\\IMAGE_ONE_PAGE_WORK_CLOCK_IN.png",IMG_CMP_PNG_ARGB_RLE,0)
RES_ADD_IMG(IMAGE_ONE_PAGE_INSPECT_CLOCK_IN,"\\MMI_RES_##\\IMAG\\main_menu\\one_page\\IMAGE_ONE_PAGE_INSPECT_CLOCK_IN.png",IMG_CMP_PNG_ARGB_RLE,0)
RES_ADD_IMG(IMAGE_INSPECT_STATUS_2,"\\MMI_RES_##\\IMAG\\patrol_inspect\\IMAGE_INSPECT_STATUS_2.png",IMG_CMP_PNG_ARGB_RLE,0) //
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+RES_ADD_STRING(TXT_MAINMENU_VIDEO_CALL,"Video call")
+
+RES_ADD_IMG(IMAGE_VIDEO_CALL_VOICE_BUTTON,"\\MMI_RES_##\\IMAG\\video_call\\IMAGE_VIDEO_CALL_VOICE_BUTTON.png",IMG_CMP_PNG_ARGB_RLE,0)
+RES_ADD_IMG(IMAGE_VIDEO_CALL_VIDEO_BUTTON,"\\MMI_RES_##\\IMAG\\video_call\\IMAGE_VIDEO_CALL_VIDEO_BUTTON.png",IMG_CMP_PNG_ARGB_RLE,0)
+RES_ADD_IMG(IMAGE_VIDEO_CALL_HANGUP_BUTTON,"\\MMI_RES_##\\IMAG\\video_call\\IMAGE_VIDEO_CALL_VIDEO_BUTTON.png",IMG_CMP_PNG_ARGB_RLE,0)
+RES_ADD_IMG(IMAGE_VIDEO_CALL_ANSWER_BUTTON,"\\MMI_RES_##\\IMAG\\video_call\\IMAGE_VIDEO_CALL_ANSWER_BUTTON.png",IMG_CMP_PNG_ARGB_RLE,0)
+RES_ADD_IMG(IMAGE_VIDEO_CALL_CONTACT_PHOTO,"\\MMI_RES_##\\IMAG\\video_call\\IMAGE_VIDEO_CALL_CONTACT_PHOTO.png",IMG_CMP_PNG_ARGB_RLE,0)
+#endif
WIN_ID_DEF(MMI_DANGER_TYPE_REPORTING_WIN_ID),
WIN_ID_DEF(MMI_INSPECT_MESSAGE_CONTENT_WIN_ID),
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+ WIN_ID_DEF(MMI_VIDEO_CALL_MAIN_WIN_ID),
+ WIN_ID_DEF(MMI_VIDEO_CALL_DIALING_WIN_ID),
+ WIN_ID_DEF(MMI_VIDEO_CALL_INCOMING_WIN_ID),
+#endif
MENU_ID_DEF(ID_MAINMENU_INSPECT_MESSAGE),
MENU_ID_DEF(ID_MAINMENU_BEIDOU_TIME_SERVICE),
#endif
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+ MENU_ID_DEF(ID_MAINMENU_VIDEO_CALL),
+#endif
#endif
#if defined(MMI_MEREG_VIDEO_CALL_SUPPORT)
+#if defined(HERO_VIDEO_CHAT_SUPPORT)
extern BOOLEAN MMIHERO_VoiceChatServerRegister(void);
#endif
+#endif
/*****************************************************************************
MMIAPIDC_Exit();
}
+ #if defined(HERO_VIDEO_CHAT_SUPPORT)
if(TRUE == MMIHERO_VoiceChatServerRegister())
km_FZD_net_action_CALLING();
+ #elif defined(MMI_VIDEO_CALL_SUPPORT_JRTC)
+
+ #endif
#else
km_FZD_net_action_CALLING();
#endif
#if defined(FOTA_SUPPORT_ABUP) && !defined(WIN32)
abup_boot_hal_init();
#endif
+
+#ifdef MMI_VIDEO_CALL_SUPPORT_JRTC
+ mmi_video_call_jrtc_config_init();
+#endif
}
/*****************************************************************************/
endif
#==========================================================================================
+
+ifeq ($(strip $(MMI_VIDEO_CALL_SUPPORT_JRTC)), TRUE)
+ ifeq ($(strip $(VERSION_TYPE)), RELEASE)
+ 3RD_LIBS += MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc.a
+ else
+ 3RD_LIBS += MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc_DEBUG.a
+ endif
+endif
MINCPATH += external/sqlite
endif
-#APIÎļþ
+#API�ļ�
ifeq ($(strip $(KURO_SUPPORT)), TRUE)
MSRCPATH += $(MMI_DIR)/source/mmi_app/app/kuro/c
endif
endif
-#APIÎļþ
+#API�ļ�
SOURCES += mmipim_export.c mmiocr_export.c \
mmidm_export.c mmiengtd_export.c mmifm_export.c mmidcd_export.c mmimms_export.c mmipb_export.c mmipic_edit_export.c \
endif
### mmi slide support
-SOURCES += mmi_slide.c #.cºÍ.h¾ùÓÃMMI_SLIDE_SUPPORT ¿ØÖÆ£¬Èç¹ûMMI_SLIDE_SUPPORTÆÁ±Î£¬ÔòËùÓÐslideÏà¹Øcode²»²ÎÓë±àÒëºÍlink
+SOURCES += mmi_slide.c #.c��.h����MMI_SLIDE_SUPPORT ���ƣ����MMI_SLIDE_SUPPORT���Σ�������slide���code����������link
ifeq ($(strip $(CMCC_UI_STYLE)), TRUE)
SOURCES += mmics_export.c mmics_id.c mmics_main.c mmics_menutable.c mmics_nv.c mmics_wintab.c
ifeq ($(strip $(MMI_CAMERA_LAST_IMAGE)), TRUE)
MCFLAG_OPT += -DMMIDC_F_LAST_IMAGE
ifeq ($(strip $(VIDEO_PLAYER_SUPPORT)), TRUE)
- MCFLAG_OPT += -DVIDEOTHUMBNAIL_SUPPORT #ÊÓÆµÎļþËõÂÔͼÌáȡ
+ MCFLAG_OPT += -DVIDEOTHUMBNAIL_SUPPORT #��Ƶ�ļ�����ͼ��ȡ
endif
endif
#SOURCES += mmikl_qqvgalock.c #MMI_KEY_LOCK_EFFECT_QQVGA
#keylock effect end
-#ÃðÆÁ¼´ËøÆÁ
+#����������
ifeq ($(strip $(__MMI_KEYLOCK_BACKLIGHT_MENU_SEPARATE__)), TRUE)
MMI_KEYLOCK_BACKLIGHT_MENU_SEPARATE = TRUE
endif
#MCFLAG_OPT += -DEFFECT_LIGHT_GRID_WALLPAPER_SUPPORT
-#call log²»ÏÔʾÖ÷²Ëµ¥
+#call log����ʾ���˵�
MCFLAG_OPT += -DMMI_CALLLOG_HIDE_MAINMENU
MSRCPATH += $(MMI_DIR)/source/mmi_app/app/mmise/c
SOURCES += mmivirtualarray.c mmifilearray.c
endif
-#´æÔÚ¸´ÔÓÎı¾,ÐèÒªÑϸñµÄ¼ÆËã×Ö·û´®µÄ¿í¸ß
-#ÐèÒªÁÙʱ±äÁ¿×ö»òÅжÏ
-#arabic, thai, hindi, hebrew, tibetµÈÓïÑÔΪ¸´ÔÓÎı¾
+#���ڸ����ı�,��Ҫ�ϸ�ļ����ַ����Ŀ���
+#��Ҫ��ʱ���������ж�
+#arabic, thai, hindi, hebrew, tibet������Ϊ�����ı�
ifeq ($(strip $(IM_ARABIC_SUPPORT)), TRUE)
MCFLAG_OPT_COMPLEX_TEMP ?= -DCOMPLEX_TEXT_SCRIPT
endif
endif
MCFLAG_OPT += $(MCFLAG_OPT_COMPLEX_TEMP)
-#´æÔÚ¸´ÔÓÎı¾,ÐèÒªÑϸñµÄ¼ÆËã×Ö·û´®µÄ¿í¸ß
+#���ڸ����ı�,��Ҫ�ϸ�ļ����ַ����Ŀ���
-#ÏÂÀ´°¿Ú
+#��������
ifeq ($(strip $(PDA_UI_DROPDOWN_WIN)), TRUE)
MSRCPATH += $(MMI_DIR)/source/mmi_app/app/dropdownwin/c
MINCPATH += $(MMI_DIR)/source/mmi_app/app/dropdownwin/h
MINCPATH += $(MMI_DIR)/source/mmi_app/app/mmise/h
endif
-#Ôö¼ÓÃðÆÁÌØÐ§µÄºê
+#����������Ч�ĺ�
ifeq ($(strip $(UI_P3D_SUPPORT)), TRUE)
ifeq ($(strip $(SE_CRT_SUPPORT)), TRUE)
ifeq ($(strip $(MMI_PDA_SUPPORT)),TRUE)
ifeq ($(strip $(LOCK_SCREEN_SPECIAL_EFFECT_SUPPORT)),TRUE)
SOURCES += mmiss_screenclose_special.c
-endif#´æÔÚ¸´ÔÓÎı¾,ÐèÒªÑϸñµÄ¼ÆËã×Ö·û´®µÄ¿í¸ß
+endif#���ڸ����ı�,��Ҫ�ϸ�ļ����ַ����Ŀ���
OPERA_SUPPORT=FALSE
-#ͼƬä¯ÀÀÆ÷¿ìËÙä¯ÀÀ½çÃæ
+#ͼƬ����������������
#ifeq ($(strip $(PIC_QUICKVIEW_SUPPORT)),TRUE)
#SOURCES += mmipicview_quickview.c
#endif
ifeq ($(strip $(HERO_ENGINE_SUPPORT)), TRUE)
- ifeq ($(strip $(HERO_ENGINE_SUPPORT_CLIENT_INFO)),TRUE) #¿Í»§¶¨ÖÆÅäÖÃÒªÇó;Ҫȥ³ýǰһ¶¨ÒªºÍ¿Í»§È·ÈÏ;
+ ifeq ($(strip $(HERO_ENGINE_SUPPORT_CLIENT_INFO)),TRUE) #�ͻ���������Ҫ��;Ҫȥ��ǰһ��Ҫ�Ϳͻ�ȷ��;
#MCFLAG_OPT += -D__HERO_ENGINE_SUPPORT_CLIENT_INFO__
MCFLAG_OPT += -DHERO_ENGINE_CFG_VAR_HANDSETID_FIRST=$(strip $(HERO_ENGINE_CFG_VAR_HANDSETID_FIRST))
endif
endif
- #@ºǫ́·Ç²¥·Å״̬(°üÀ¨ÔÝÍ£)£¬ÊÍ·Åaudio handle
+ #@��̨�Dz���״̬(������ͣ)���ͷ�audio handle
MMI_AP_F_RELEASE_BG_AUDIO = TRUE
##==============================================##
SOURCES += aesx.c sha1x.c md5x.c sha256x.c ls_hal_aes.c ls_hal_hash.c ls_hal_rand.c ls_hal_sst.c ls_osa.c prov_base64.c
endif
-#֧³ÖMocorʾÀý´úÂë
+#֧��Mocorʾ������
ifeq ($(strip $(MMI_REFACTOR_SAMPLE)), TRUE)
SOURCES += mmiappsample_menutable.c mmiappsample_nv.c mmiappsample_id.c mmiappsample_appmain.c mmiappsample_mainwin.c mmiappsample_windatawin.c mmiappsample_eventwin.c mmiappsample_filterwin.c
SOURCES += blood_glucose.c
endif
+
+ifeq ($(strip $(MMI_VIDEO_CALL_SUPPORT_JRTC)), TRUE)
+MINCPATH += $(MMI_DIR)/source/mmi_app/app/jrtc_video_call/h
+MSRCPATH += $(MMI_DIR)/source/mmi_app/app/jrtc_video_call/c
+
+SOURCES += mmi_video_call.c mmi_jrtc_client.c
+endif
+