MMI_VIDEO_CALL_SUPPORT_JRTC
authorCCC <2393524978@qq.com>
Thu, 29 Jun 2023 06:41:42 +0000 (14:41 +0800)
committerCCC <2393524978@qq.com>
Thu, 29 Jun 2023 06:41:42 +0000 (14:41 +0800)
18 files changed:
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_jrtc_client.c [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_video_call.c [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc.h [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc0.h [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/mmi_video_call.h [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc.a [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc_DEBUG.a [new file with mode: 0644]
MS_Code/MS_MMI_Main/source/mmi_app/app/mainmenu/c/mmi_mainmenu_data_240X280.c
MS_Code/MS_MMI_Main/source/mmi_app/app/mainmenu/c/mmi_mainmenu_item_func.c
MS_Code/MS_MMI_Main/source/mmi_app/app/mainmenu/h/mmi_mainmenu_item_func.h
MS_Code/MS_MMI_Main/source/mmi_app/common/h/common_mdu_def.h
MS_Code/MS_MMI_Main/source/mmi_app/common/h/mmi_id.def
MS_Code/MS_MMI_Main/source/mmi_app/common/h/mmi_menu_id.def
MS_Code/MS_MMI_Main/source/mmi_app/kernel/c/mmi_protocol_main_api.c
MS_Code/MS_MMI_Main/source/mmi_app/kernel/c/mmimain.c
MS_Code/MS_MMI_Main/source/resource/mmi_res_240x280.zip
MS_Code/Makefile.third-party
MS_Code/make/app_main/app_main.mk

diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_jrtc_client.c b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_jrtc_client.c
new file mode 100644 (file)
index 0000000..064adc4
--- /dev/null
@@ -0,0 +1,282 @@
+
+
+
+#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
+
+
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_video_call.c b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/c/mmi_video_call.c
new file mode 100644 (file)
index 0000000..a1fa639
--- /dev/null
@@ -0,0 +1,964 @@
+
+
+
+#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
+
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc.h b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc.h
new file mode 100644 (file)
index 0000000..6097a4a
--- /dev/null
@@ -0,0 +1,297 @@
+#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
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc0.h b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/jrtc0.h
new file mode 100644 (file)
index 0000000..18dff25
--- /dev/null
@@ -0,0 +1,154 @@
+#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
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/mmi_video_call.h b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/h/mmi_video_call.h
new file mode 100644 (file)
index 0000000..76810da
--- /dev/null
@@ -0,0 +1,68 @@
+
+
+
+#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
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc.a b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc.a
new file mode 100644 (file)
index 0000000..b833449
Binary files /dev/null and b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc.a differ
diff --git a/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc_DEBUG.a b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc_DEBUG.a
new file mode 100644 (file)
index 0000000..6b791fc
Binary files /dev/null and b/MS_Code/MS_MMI_Main/source/mmi_app/app/jrtc_video_call/lib/libjrtc_DEBUG.a differ
index 462588f..fb9ddeb 100644 (file)
@@ -238,17 +238,8 @@ static const MMI_MAINMENU_ITEM_T s_mainmenu_one_page_item_data[] =
 
        {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},
@@ -465,9 +456,81 @@ static const MMI_MAINMENU_ITEM_T s_mainmenu_one_page_item_data[] =
 #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},
index d01cb68..7df83e5 100644 (file)
@@ -2976,5 +2976,12 @@ 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)
+{
+       MMIAPI_EnterVideoCallMainWindow();
+}
+#endif
+
 
 
index 34705fa..7dd6fad 100644 (file)
@@ -1633,6 +1633,9 @@ PUBLIC void MMIMAINMENU_enter_DANGER_REPORT(uint32 param1, uint32 param2);
 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
 
 
 /**--------------------------------------------------------------------------*
index 3cc4a67..ade8c02 100644 (file)
@@ -8363,6 +8363,9 @@ RES_ADD_IMG(IMAGE_MAINMENU_DANGER_REPORT,"\\MMI_RES_##\\IMAG\\main_menu\\IMAGE_M
 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
@@ -8499,6 +8502,10 @@ RES_ADD_IMG(IMAGE_ONE_PAGE_IMEI_QRCODE,"\\MMI_RES_##\\IMAG\\main_menu\\one_page\
 #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)
@@ -13890,6 +13897,15 @@ RES_ADD_IMG(IMAGE_INSPECT_STATUS_1,"\\MMI_RES_##\\IMAG\\patrol_inspect\\IMAGE_IN
 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
 
 
 
index e8a61ed..ded1b9f 100644 (file)
@@ -403,5 +403,10 @@ WIN_ID_DEF(MMI_CHR_POWER_SAVE_QUERY_WIN_ID),
        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
 
 
index b194c9d..3635943 100644 (file)
        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
 
 
index 943bdef..2cedb66 100644 (file)
@@ -256,8 +256,10 @@ extern void MMIAPI_InbuiltSchedulePowerOnOffGet(ALARM_AUTO_POWER_STRUCT *out_ala
 #endif
 
 #if defined(MMI_MEREG_VIDEO_CALL_SUPPORT)
+#if defined(HERO_VIDEO_CHAT_SUPPORT) 
 extern BOOLEAN MMIHERO_VoiceChatServerRegister(void);
 #endif
+#endif
 
 
 /*****************************************************************************
@@ -9034,8 +9036,12 @@ void km_FZD_net_parse_CALLING(signed char *next_buf,int next_buf_len,signed char
                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
index a7ac131..df105f0 100644 (file)
@@ -2510,6 +2510,10 @@ void APP_Init(POWER_RESTART_CONDITION_E   restart_condition)
        #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
 }
 
 /*****************************************************************************/
index 97288eb..9d5245f 100644 (file)
Binary files a/MS_Code/MS_MMI_Main/source/resource/mmi_res_240x280.zip and b/MS_Code/MS_MMI_Main/source/resource/mmi_res_240x280.zip differ
index 443a484..e64a351 100644 (file)
@@ -1661,3 +1661,11 @@ ifeq ($(strip $(INCAR_ALIPAY_ADULT_SUPPORT)),TRUE)
 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
index bb774ea..e6369ad 100644 (file)
@@ -607,7 +607,7 @@ MINCPATH += external/libc
 MINCPATH += external/sqlite
 endif
 
-#APIÎļþ
+#API�ļ�
 ifeq ($(strip $(KURO_SUPPORT)), TRUE)
 MSRCPATH += $(MMI_DIR)/source/mmi_app/app/kuro/c
 endif
@@ -945,7 +945,7 @@ 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 \
@@ -1027,7 +1027,7 @@ SOURCES    += mmiaut_wintab.c  mmiaut_net.c  mmiaut_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
@@ -1483,7 +1483,7 @@ ifeq ($(strip $(CAMERA_SUPPORT)), TRUE)
     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
 
@@ -1665,7 +1665,7 @@ 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
@@ -1686,7 +1686,7 @@ ifeq ($(strip $(MMI_PDA_SUPPORT)), TRUE)
 
 #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
@@ -1814,9 +1814,9 @@ else
 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
@@ -1850,9 +1850,9 @@ MCFLAG_OPT_COMPLEX_TEMP           ?=  -DCOMPLEX_TEXT_SCRIPT
 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
@@ -1912,7 +1912,7 @@ ifeq ($(strip $(MMI_3DUI_SUPPORT)), TRUE)
     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)
@@ -1924,7 +1924,7 @@ endif
 
 ifeq ($(strip $(LOCK_SCREEN_SPECIAL_EFFECT_SUPPORT)),TRUE)
        SOURCES  +=  mmiss_screenclose_special.c
-endif#´æÔÚ¸´ÔÓÎı¾,ÐèÒªÑϸñµÄ¼ÆËã×Ö·û´®µÄ¿í¸ß
+endif#���ڸ����ı�,��Ҫ�ϸ�ļ����ַ����Ŀ���
 
 
 OPERA_SUPPORT=FALSE
@@ -1955,7 +1955,7 @@ endif
 
 
 
-#ͼƬä¯ÀÀÆ÷¿ìËÙä¯ÀÀ½çÃæ
+#ͼƬ����������������
 #ifeq ($(strip $(PIC_QUICKVIEW_SUPPORT)),TRUE)
 #SOURCES  += mmipicview_quickview.c
 #endif
@@ -1993,7 +1993,7 @@ 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))
@@ -2219,7 +2219,7 @@ ifeq ($(strip $(MMIAP_SUPPORT)), TRUE)
         endif
     endif
 
-    #@ºǫ́·Ç²¥·Å״̬(°üÀ¨ÔÝÍ£)£¬ÊÍ·Åaudio handle
+    #@��̨�Dz���״̬(������ͣ)���ͷ�audio handle
     MMI_AP_F_RELEASE_BG_AUDIO = TRUE
 
     ##==============================================##
@@ -2347,7 +2347,7 @@ MSRCPATH += MS_MMI_Main/source/mmi_app/app/alipay/alipayid2/hal/demo/crypto/src
 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
@@ -3036,3 +3036,11 @@ MSRCPATH += $(MMI_DIR)/source/mmi_app/app/blood_glucose/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
+