Crash app on video call using PJSIP in ios

52 Views Asked by At

enter image description hereWhen I am using pod 'pjsip','2.8.0' then the video call is working fine on My Mac(Designed for iPhone) but when I am trying to make a video call on a real iPhone device crash the app.

libsp.dylib`spd_checkin_socket.cold.1:
    0x1f9211364 <+0>:  adrp   x8, 150347
    0x1f9211368 <+4>:  adrp   x9, 0
    0x1f921136c <+8>:  add    x9, x9, #0xa3f            ; "Linked against modern SDK, VOIP socket will not wake. Use Local Push Connectivity instead"
    0x1f9211370 <+12>: str    x9, [x8, #0xd80]
->  0x1f9211374 <+16>: brk    #0x1

And when I upgrade pod pjsip, '2.9.0' then it works on a real device but the video is not coming clear. I configured the codec but again blur video is coming.

    func intislizePJSIP(){
        /* Create pjsua */
        var status: pj_status_t;
        status = pjsua_create();
        if (status != PJ_SUCCESS.rawValue) {
            NSLog("Failed creating pjsua");
        }
        /* Init configs */
        var cfg = pjsua_config();
        var log_cfg = pjsua_logging_config();
        var media_cfg = pjsua_media_config();
        pjsua_config_default(&cfg);
        pjsua_logging_config_default(&log_cfg);
        pjsua_media_config_default(&media_cfg);
        /* Initialize application callbacks */
        cfg.cb.on_call_state = on_call_state;
        cfg.cb.on_call_media_state = on_call_media_state;
        cfg.cb.on_incoming_call = on_incoming_call;
     
        /* Init pjsua */
        status = pjsua_init(&cfg, &log_cfg, &media_cfg);
     
     
        
        /* Create transport */
        var transport_id = pjsua_transport_id();
        var tcp_cfg = pjsua_transport_config();
        pjsua_transport_config_default(&tcp_cfg);
        tcp_cfg.port = 5060;
     
        status = pjsua_transport_create(PJSIP_TRANSPORT_UDP,
                                     &tcp_cfg, &transport_id);
        status = pjsua_transport_create(PJSIP_TRANSPORT_TCP,
                                        &tcp_cfg, &transport_id);
     
     
        /* Init account config */
        let id = strdup(userdomain);
        let username = strdup(userName);
        let passwd = strdup(password);
        let realm = strdup("*");
        let registrar = strdup(domain);
    
        var acc_cfg = pjsua_acc_config();
        pjsua_acc_config_default(&acc_cfg);
        acc_cfg.id = pj_str(id);
        acc_cfg.cred_count = 1;
        acc_cfg.cred_info.0.username = pj_str(username);
        acc_cfg.cred_info.0.realm = pj_str(realm);
        acc_cfg.cred_info.0.data = pj_str(passwd);
        acc_cfg.reg_uri = pj_str(registrar);
     
         acc_cfg.vid_in_auto_show = pj_bool_t(PJ_TRUE.rawValue)
         acc_cfg.vid_out_auto_transmit = pj_bool_t(PJ_TRUE.rawValue)

   videoQuality()
     
        /* Add account */
        pjsua_acc_add(&acc_cfg, pj_bool_t(PJ_TRUE.rawValue), nil);
        /* Free strings */
        free(id); free(username); free(passwd); free(realm);
        free(registrar);
     
        /* Start pjsua */
        status = pjsua_start();
    }
    
    
    
    
       private func on_call_state(call_id: pjsua_call_id, e: UnsafeMutablePointer<pjsip_event>?) {
           var ci = pjsua_call_info();
           pjsua_call_get_info(call_id, &ci);
           if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {
               /* UIView update must be done in the main thread */
               DispatchQueue.main.sync {
                   AppDelegate.Shared.vinfo.vid_win = nil;
               }
           }
       }
       private func tupleToArray<Tuple, Value>(tuple: Tuple) -> [Value] {
           let tupleMirror = Mirror(reflecting: tuple)
           return tupleMirror.children.compactMap { (child: Mirror.Child) -> Value? in
               return child.value as? Value
           }
       }
       private func on_call_media_state(call_id: pjsua_call_id) {
           var ci = pjsua_call_info();
           pjsua_call_get_info(call_id, &ci);
           for mi in 0...ci.media_cnt {
               let media: [pjsua_call_media_info] = tupleToArray(tuple: ci.media);
               if (media[Int(mi)].status == PJSUA_CALL_MEDIA_ACTIVE ||
                   media[Int(mi)].status == PJSUA_CALL_MEDIA_REMOTE_HOLD)
               {
                   switch (media[Int(mi)].type) {
                   case PJMEDIA_TYPE_AUDIO:
                       var call_conf_slot: pjsua_conf_port_id;
                       call_conf_slot = media[Int(mi)].stream.aud.conf_slot;
                       pjsua_conf_connect(call_conf_slot, 0);
                       pjsua_conf_connect(0, call_conf_slot);
                       break;
               
                   case PJMEDIA_TYPE_VIDEO:
                       let wid = media[Int(mi)].stream.vid.win_in;
                       var wi = pjsua_vid_win_info();
                           
                       if (pjsua_vid_win_get_info(wid, &wi) == PJ_SUCCESS.rawValue) {
                           
                           let vid_win:UIView =
                           Unmanaged<UIView>.fromOpaque(wi.hwnd.info.ios.window).takeUnretainedValue();
                           /* UIView update must be done in the main thread */
                           DispatchQueue.main.sync {
                               AppDelegate.Shared.vinfo.vid_win = vid_win;
                           }
                       }
                       break;
                   
                   default:
                       break;
                   }
               }
           }
       }
    
    
    func on_incoming_call(acc_id: pjsua_acc_id, call_id: pjsua_call_id, rdata: UnsafeMutablePointer<pjsip_rx_data>?) {
        var ci = pjsua_call_info()
        var opt = pjsua_call_setting()
        pjsua_call_setting_default(&opt)
        var p_param = pjsua_vid_preview_param()
        pjsua_vid_preview_param_default(&p_param)
        
        p_param.show = pj_bool_t(PJ_TRUE.rawValue)
        opt.aud_cnt = 1 // Number of simultaneous audio calls
        opt.vid_cnt = 1 // Number of simultaneous video calls
    
        pjsua_call_get_info(call_id, &ci) // Retrieve call information
    
        if ci.remote_info.ptr != nil {
            if let callerNumber = String(cString: ci.remote_contact.ptr) as String? {
                NotificationCenter.default.post(name: Notification.Name("IncomingCall"), object: callerNumber)
                // Assuming currentCallId is a global variable
                pjsua_call_answer(call_id, 200, nil, nil)
            }
        } else {
            print("Remote info pointer is NULL")
        }
        
    func videoQuality(){
        let codec = strdup("H264, 4")
        var codec_id:pj_str_t = pj_str(codec);
        var param = pjmedia_vid_codec_param()
        pjsua_vid_codec_get_param(&codec_id, &param)
    
        /* Sending 1280 x 720 */
        param.enc_fmt.det.vid.size.w = 640; //1280
        param.enc_fmt.det.vid.size.h = 480; //720
    
        param.dec_fmt.det.vid.size.w = 640; //1280
        param.dec_fmt.det.vid.size.h = 480; //720
    
        /* Sending @30fps */
        param.enc_fmt.det.vid.fps.num   = 15;
        param.enc_fmt.det.vid.fps.denum = 1;
    
        param.dec_fmt.det.vid.fps.num   = 30;
        param.dec_fmt.det.vid.fps.denum = 1;
    
        /* Bitrate range preferred: 512-1024kbps */
        param.enc_fmt.det.vid.avg_bps = 512000;
        param.enc_fmt.det.vid.max_bps = 1024000;
    
        param.dec_fmt.det.vid.avg_bps = 512000;
        param.dec_fmt.det.vid.max_bps = 1024000;
    
        /* 3000/(1.001*2) fps for CIF */
        let cif = strdup("CIF")
        let two = strdup("1")
        param.dec_fmtp.param.1.name = pj_str(cif);
        param.dec_fmtp.param.1.val = pj_str(two);
    
        /* 3000/(1.001*1) fps for QCIF */
        let qcif = strdup("QCIF")
        let one = strdup("1")
        param.dec_fmtp.param.0.name = pj_str(qcif);
        param.dec_fmtp.param.0.val = pj_str(one);
    
        /* Can receive up to 1280×720 @30fps */
        let profile = strdup("profile-level-id")
        let xxxxx = strdup("xxxx1f")
        param.dec_fmtp.param.0.name = pj_str(profile);
        param.dec_fmtp.param.0.val = pj_str(xxxxx);
    
        /* H263 specific maximum bitrate 512kbps */
        let maxBR = strdup("MaxBR")
        let rate = strdup("5120")
        param.dec_fmtp.param.0.name = pj_str(maxBR);
        param.dec_fmtp.param.0.val = pj_str(rate); /* = max_bps / 100 */
    
        param.ignore_fmtp =  pj_bool_t(PJ_TRUE.rawValue);
    
        pjsua_vid_codec_set_param(&codec_id, &param)
    }
0

There are 0 best solutions below