Changeset 3657 for pjproject


Ignore:
Timestamp:
Jul 15, 2011 7:41:02 AM (13 years ago)
Author:
nanang
Message:

Re #1263:

  • Replaced video stream operation DISABLE into REMOVE.
  • Replaced video stream operation ENABLE into CHANGEDIR.
  • Added new param: media direction, used in operation ADD and CHANGEDIR.
  • Updated video stream operation START_TRANSMIT to ignore capture device param (as changing capture device is handled by CHANGE_CAP_DEV operation).
Location:
pjproject/branches/projects/2.0-dev
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjsip-apps/src/pjsua/pjsua_app.c

    r3652 r3657  
    33243324    puts("|                                                                             |"); 
    33253325    puts("| vid help                  Show this help screen                             |"); 
    3326     puts("| vid call rx on|off        Enable/disable incoming video for current call    |"); 
    3327     puts("| vid call tx on|off        Enable/disable video tx for current call          |"); 
     3326    puts("| vid call rx on|off N      Enable/disable video rx for stream N in curr call |"); 
     3327    puts("| vid call tx on|off N      Enable/disable video tx for stream N in curr call |"); 
    33283328    puts("| vid call add              Add video stream for current call                 |"); 
    3329     puts("| vid call enable/disable N Enable/disable stream #N for current call         |"); 
    3330     puts("| vid call set-cap N ID     Set capture dev ID for stream #N for current call |"); 
     3329    puts("| vid call enable/disable N Enable/disable stream #N in current call          |"); 
     3330    puts("| vid call set-cap N ID     Set capture dev ID for stream #N in current call |"); 
    33313331    puts("| vid dev list              List all video devices                            |"); 
    33323332    puts("| vid dev refresh           Refresh video device list                         |"); 
     
    37693769        pjsua_call_vid_strm_op_param param; 
    37703770 
    3771         if (argc == 4 && strcmp(argv[2], "rx")==0) { 
     3771        if (argc == 5 && strcmp(argv[2], "rx")==0) { 
     3772            pjsua_stream_info si; 
    37723773            pj_bool_t on = (strcmp(argv[3], "on") == 0); 
    3773             PJ_TODO(vid_enable_disable_video_RX_on_call); 
    3774             PJ_LOG(1,(THIS_FILE, "Not implemented")); 
     3774 
     3775            param.med_idx = atoi(argv[4]); 
     3776            if (pjsua_call_get_stream_info(current_call, param.med_idx, &si) || 
     3777                si.type != PJMEDIA_TYPE_VIDEO) 
     3778            { 
     3779                PJ_PERROR(1,(THIS_FILE, PJ_EINVAL, "Invalid stream")); 
     3780                return; 
     3781            } 
     3782 
     3783            if (on) param.dir = (si.info.vid.dir | PJMEDIA_DIR_DECODING); 
     3784            else param.dir = (si.info.vid.dir & PJMEDIA_DIR_ENCODING); 
     3785 
     3786            pjsua_call_set_vid_strm(current_call, PJSUA_CALL_VID_STRM_CHANGE_DIR, &param); 
    37753787        } 
    3776         else if (argc == 4 && strcmp(argv[2], "tx")==0) { 
     3788        else if (argc == 5 && strcmp(argv[2], "tx")==0) { 
    37773789            pj_bool_t on = (strcmp(argv[3], "on") == 0); 
    37783790            pjsua_call_vid_strm_op op = on? PJSUA_CALL_VID_STRM_START_TRANSMIT : 
    37793791                                            PJSUA_CALL_VID_STRM_STOP_TRANSMIT; 
    3780             pjsua_call_set_vid_strm(current_call, op, NULL); 
     3792 
     3793            param.med_idx = atoi(argv[4]); 
     3794 
     3795            pjsua_call_set_vid_strm(current_call, op, &param); 
    37813796        } 
    37823797        else if (argc == 3 && strcmp(argv[2], "add")==0) { 
    37833798            pjsua_call_set_vid_strm(current_call, PJSUA_CALL_VID_STRM_ADD, NULL); 
    37843799        } 
    3785         else if (argc == 4 &&  
     3800        else if (argc >= 3 &&  
    37863801                 (strcmp(argv[2], "disable")==0 || strcmp(argv[2], "enable")==0)) 
    37873802        { 
    37883803            pj_bool_t enable = (strcmp(argv[2], "enable") == 0); 
    3789             pjsua_call_vid_strm_op op = enable? PJSUA_CALL_VID_STRM_ENABLE : 
    3790                                                 PJSUA_CALL_VID_STRM_DISABLE; 
     3804            pjsua_call_vid_strm_op op = enable? PJSUA_CALL_VID_STRM_CHANGE_DIR : 
     3805                                                PJSUA_CALL_VID_STRM_REMOVE; 
     3806 
    37913807            param.med_idx = argc >= 4? atoi(argv[3]) : -1; 
     3808            param.dir = PJMEDIA_DIR_ENCODING_DECODING; 
    37923809            pjsua_call_set_vid_strm(current_call, op, &param); 
    37933810        } 
    3794         else if (argc == 5 && strcmp(argv[2], "set-cap")==0) { 
     3811        else if (argc >= 3 && strcmp(argv[2], "set-cap")==0) { 
    37953812            param.med_idx = argc >= 4? atoi(argv[3]) : -1; 
    37963813            param.cap_dev = argc >= 5? atoi(argv[4]) : PJMEDIA_VID_DEFAULT_CAPTURE_DEV; 
     
    37983815        } else 
    37993816            goto on_error; 
    3800     } else if (strcmp(argv[1], "dev")==0) { 
     3817    } else if (argc >= 3 && strcmp(argv[1], "dev")==0) { 
    38013818        if (strcmp(argv[2], "list")==0) { 
    38023819            vid_list_devs(); 
  • pjproject/branches/projects/2.0-dev/pjsip/include/pjsua-lib/pjsua.h

    r3652 r3657  
    382382 
    383383    /** 
    384      * Disable/remove an existing video stream. 
    385      */ 
    386     PJSUA_CALL_VID_STRM_DISABLE, 
    387  
    388     /** 
    389      * Enable video stream. 
    390      */ 
    391     PJSUA_CALL_VID_STRM_ENABLE, 
    392  
    393     /** 
    394      * Changing capture device of a video stream. 
     384     * Remove/disable an existing video stream. 
     385     */ 
     386    PJSUA_CALL_VID_STRM_REMOVE, 
     387 
     388    /** 
     389     * Change direction of a video stream. 
     390     */ 
     391    PJSUA_CALL_VID_STRM_CHANGE_DIR, 
     392 
     393    /** 
     394     * Change capture device of a video stream. 
    395395     */ 
    396396    PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV, 
     
    421421     * This field is valid for all video stream operations, except 
    422422     * PJSUA_CALL_VID_STRM_ADD. 
     423     * 
     424     * Default: -1 (first active video stream, or any first video stream 
     425     *              if none is active) 
    423426     */ 
    424427    int med_idx; 
     428  
     429    /** 
     430     * Specify the media stream direction. 
     431     * 
     432     * This field is valid for the following video stream operations: 
     433     * PJSUA_CALL_VID_STRM_ADD and PJSUA_CALL_VID_STRM_CHANGE_DIR. 
     434     * 
     435     * Default: PJMEDIA_DIR_ENCODING_DECODING 
     436     */ 
     437    pjmedia_dir dir; 
    425438  
    426439    /** 
     
    430443     * 
    431444     * This field is valid for the following video stream operations: 
    432      * PJSUA_CALL_VID_STRM_ADD, PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV, and 
    433      * PJSUA_CALL_VID_STRM_START_TRANSMIT. 
     445     * PJSUA_CALL_VID_STRM_ADD and PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV. 
     446     * 
     447     * Default: capture device configured in account. 
    434448     */ 
    435449    pjmedia_vid_dev_index cap_dev; 
     
    37733787 * @param op            The video stream operation to be performed, 
    37743788 *                      possible values are #pjsua_call_vid_strm_op. 
    3775  * @param param         The parameters for the video stream operation. 
     3789 * @param param         The parameters for the video stream operation, 
     3790 *                      or NULL for the default parameter values 
     3791 *                      (see #pjsua_call_vid_strm_op_param). 
    37763792 * 
    37773793 * @return              PJ_SUCCESS on success or the appropriate error. 
  • pjproject/branches/projects/2.0-dev/pjsip/src/pjsua-lib/pjsua_vid.c

    r3656 r3657  
    777777    pjmedia_event_unsubscribe(&call_med->esub_cap); 
    778778 
    779     if (call_med->strm.v.cap_win_id != PJSUA_INVALID_ID) { 
     779    if (call_med->dir & PJMEDIA_DIR_ENCODING && 
     780        call_med->strm.v.cap_win_id != PJSUA_INVALID_ID) 
     781    { 
    780782        pjmedia_port *media_port; 
    781783        pjsua_vid_win *w = 
     
    794796    } 
    795797 
    796     if (call_med->strm.v.rdr_win_id != PJSUA_INVALID_ID) { 
     798    if (call_med->dir & PJMEDIA_DIR_DECODING && 
     799        call_med->strm.v.rdr_win_id != PJSUA_INVALID_ID) 
     800    { 
    797801        dec_vid_win(call_med->strm.v.rdr_win_id); 
    798802    } 
     
    11371141/* Add a new video stream into a call */ 
    11381142static pj_status_t call_add_video(pjsua_call *call, 
    1139                                   pjmedia_vid_dev_index cap_dev) 
     1143                                  pjmedia_vid_dev_index cap_dev, 
     1144                                  pjmedia_dir dir) 
    11401145{ 
    11411146    pj_pool_t *pool = call->inv->pool_prov; 
     
    11931198    sdp->media[sdp->media_count++] = sdp_m; 
    11941199 
     1200    /* Update media direction, if it is not 'sendrecv' */ 
     1201    if (dir != PJMEDIA_DIR_ENCODING_DECODING) { 
     1202        pjmedia_sdp_attr *a; 
     1203 
     1204        /* Remove sendrecv direction attribute, if any */ 
     1205        pjmedia_sdp_media_remove_all_attr(sdp_m, "sendrecv"); 
     1206 
     1207        if (dir == PJMEDIA_DIR_ENCODING) 
     1208            a = pjmedia_sdp_attr_create(pool, "sendonly", NULL); 
     1209        else if (dir == PJMEDIA_DIR_DECODING) 
     1210            a = pjmedia_sdp_attr_create(pool, "recvonly", NULL); 
     1211        else 
     1212            a = pjmedia_sdp_attr_create(pool, "inactive", NULL); 
     1213 
     1214        pjmedia_sdp_media_add_attr(sdp_m, a); 
     1215    } 
     1216 
    11951217    /* Update SDP media line by media transport */ 
    11961218    status = pjmedia_transport_encode_sdp(call_med->tp, pool, 
     
    12151237 
    12161238 
    1217 /* Modify a video stream from a call, i.e: enable/disable */ 
     1239/* Modify a video stream from a call, i.e: update direction, 
     1240 * remove/disable. 
     1241 */ 
    12181242static pj_status_t call_modify_video(pjsua_call *call, 
    12191243                                     int med_idx, 
    1220                                      pj_bool_t enable) 
     1244                                     pjmedia_dir dir, 
     1245                                     pj_bool_t remove) 
    12211246{ 
    12221247    pjsua_call_media *call_med; 
     
    12411266        return PJ_EINVAL; 
    12421267 
    1243     /* Verify if the stream already enabled/disabled */ 
    1244     if (( enable && call_med->dir != PJMEDIA_DIR_NONE) || 
    1245         (!enable && call_med->dir == PJMEDIA_DIR_NONE)) 
     1268    /* Verify if the stream dir is not changed */ 
     1269    if ((!remove && call_med->dir == dir) || 
     1270        ( remove && (call_med->tp_st == PJSUA_MED_TP_DISABLED || 
     1271                     call_med->tp == NULL))) 
     1272    { 
    12461273        return PJ_SUCCESS; 
     1274    } 
    12471275 
    12481276    /* Get active local SDP */ 
     
    12531281    pj_assert(med_idx < (int)sdp->media_count); 
    12541282 
    1255     if (enable) { 
     1283    if (!remove) { 
    12561284        pjsua_acc_config *acc_cfg = &pjsua_var.acc[call->acc_id].cfg; 
    12571285        pj_pool_t *pool = call->inv->pool_prov; 
    12581286        pjmedia_sdp_media *sdp_m; 
    1259         pjmedia_transport_info tpinfo; 
    12601287 
    12611288        status = pjsua_call_media_init(call_med, PJMEDIA_TYPE_VIDEO, 
     
    12661293 
    12671294        /* Init transport media */ 
    1268         status = pjmedia_transport_media_create(call_med->tp, pool, 0, 
    1269                                                 NULL, call_med->idx); 
    1270         if (status != PJ_SUCCESS) 
    1271             goto on_error; 
    1272  
    1273         /* Get transport address info */ 
    1274         pjmedia_transport_info_init(&tpinfo); 
    1275         pjmedia_transport_get_info(call_med->tp, &tpinfo); 
    1276  
    1277         /* Create SDP media line */ 
    1278         status = pjmedia_endpt_create_video_sdp(pjsua_var.med_endpt, pool, 
    1279                                                 &tpinfo.sock_info, 0, &sdp_m); 
    1280         if (status != PJ_SUCCESS) 
    1281             goto on_error; 
     1295        if (call_med->tp && call_med->tp_st == PJSUA_MED_TP_IDLE) { 
     1296            status = pjmedia_transport_media_create(call_med->tp, pool, 0, 
     1297                                                    NULL, call_med->idx); 
     1298            if (status != PJ_SUCCESS) 
     1299                goto on_error; 
     1300        } 
     1301 
     1302        sdp_m = sdp->media[med_idx]; 
     1303 
     1304        /* Create new SDP media line if the stream is disabled */ 
     1305        if (sdp->media[med_idx]->desc.port == 0) { 
     1306            pjmedia_transport_info tpinfo; 
     1307 
     1308            /* Get transport address info */ 
     1309            pjmedia_transport_info_init(&tpinfo); 
     1310            pjmedia_transport_get_info(call_med->tp, &tpinfo); 
     1311 
     1312            status = pjmedia_endpt_create_video_sdp(pjsua_var.med_endpt, pool, 
     1313                                                    &tpinfo.sock_info, 0, &sdp_m); 
     1314            if (status != PJ_SUCCESS) 
     1315                goto on_error; 
     1316        } 
     1317 
     1318        { 
     1319            pjmedia_sdp_attr *a; 
     1320 
     1321            /* Remove any direction attributes */ 
     1322            pjmedia_sdp_media_remove_all_attr(sdp_m, "sendrecv"); 
     1323            pjmedia_sdp_media_remove_all_attr(sdp_m, "sendonly"); 
     1324            pjmedia_sdp_media_remove_all_attr(sdp_m, "recvonly"); 
     1325            pjmedia_sdp_media_remove_all_attr(sdp_m, "inactive"); 
     1326 
     1327            /* Update media direction */ 
     1328            if (dir == PJMEDIA_DIR_ENCODING_DECODING) 
     1329                a = pjmedia_sdp_attr_create(pool, "sendrecv", NULL); 
     1330            else if (dir == PJMEDIA_DIR_ENCODING) 
     1331                a = pjmedia_sdp_attr_create(pool, "sendonly", NULL); 
     1332            else if (dir == PJMEDIA_DIR_DECODING) 
     1333                a = pjmedia_sdp_attr_create(pool, "recvonly", NULL); 
     1334            else 
     1335                a = pjmedia_sdp_attr_create(pool, "inactive", NULL); 
     1336 
     1337            pjmedia_sdp_media_add_attr(sdp_m, a); 
     1338        } 
    12821339 
    12831340        sdp->media[med_idx] = sdp_m; 
     
    12911348on_error: 
    12921349        if (status != PJ_SUCCESS) { 
    1293             if (call_med->tp) { 
    1294                 pjmedia_transport_close(call_med->tp); 
    1295                 call_med->tp = call_med->tp_orig = NULL; 
    1296             } 
    12971350            return status; 
    12981351        } 
     1352     
    12991353    } else { 
     1354 
     1355        pj_pool_t *pool = call->inv->pool_prov; 
     1356 
    13001357        /* Mark media transport to disabled */ 
    13011358        // Don't close this here, as SDP negotiation has not been 
     
    13031360        call_med->tp_st = PJSUA_MED_TP_DISABLED; 
    13041361 
    1305         /* Disable the stream in SDP by setting port to 0 */ 
    1306         sdp->media[med_idx]->desc.port = 0; 
     1362        /* Deactivate the stream */ 
     1363        pjmedia_sdp_media_deactivate(pool, sdp->media[med_idx]); 
     1364 
    13071365    } 
    13081366 
     
    14451503 
    14461504 
    1447 /* Start transmitting video stream in a call */ 
    1448 static pj_status_t call_start_tx_video(pjsua_call *call, 
    1449                                        int med_idx, 
    1450                                        pjmedia_vid_dev_index cap_dev) 
     1505/* Start/stop transmitting video stream in a call */ 
     1506static pj_status_t call_set_tx_video(pjsua_call *call, 
     1507                                     int med_idx, 
     1508                                     pj_bool_t enable) 
    14511509{ 
    14521510    pjsua_call_media *call_med; 
     
    14681526    /* Verify if the stream is transmitting video */ 
    14691527    if (call_med->type != PJMEDIA_TYPE_VIDEO ||  
    1470         (call_med->dir & PJMEDIA_DIR_ENCODING) == 0) 
     1528        (enable && (call_med->dir & PJMEDIA_DIR_ENCODING) == 0)) 
    14711529    { 
    14721530        return PJ_EINVAL; 
    14731531    } 
    14741532 
    1475     /* Apply the capture device, it may be changed! */ 
    1476     status = call_change_cap_dev(call, med_idx, cap_dev); 
    1477     if (status != PJ_SUCCESS) 
    1478         return status; 
    1479  
    1480     /* Start stream in encoding direction */ 
    1481     status = pjmedia_vid_stream_resume(call_med->strm.v.stream, 
    1482                                        PJMEDIA_DIR_ENCODING); 
    1483     if (status != PJ_SUCCESS) 
    1484         return status; 
    1485  
    1486     return PJ_SUCCESS; 
    1487 } 
    1488  
    1489  
    1490 /* Stop transmitting video stream in a call */ 
    1491 static pj_status_t call_stop_tx_video(pjsua_call *call, 
    1492                                       int med_idx) 
    1493 { 
    1494     pjsua_call_media *call_med; 
    1495     pj_status_t status; 
    1496  
    1497     /* Verify and normalize media index */ 
    1498     if (med_idx == -1) { 
    1499         int first_active; 
    1500          
    1501         call_get_vid_strm_info(call, &first_active, NULL, NULL, NULL); 
    1502         if (first_active == -1) 
    1503             return PJ_ENOTFOUND; 
    1504  
    1505         med_idx = first_active; 
    1506     } 
    1507  
    1508     call_med = &call->media[med_idx]; 
    1509  
    1510     /* Verify if the stream is transmitting video */ 
    1511     if (call_med->type != PJMEDIA_TYPE_VIDEO ||  
    1512         (call_med->dir & PJMEDIA_DIR_ENCODING) == 0) 
    1513     { 
    1514         return PJ_EINVAL; 
    1515     } 
    1516  
    1517     /* Pause stream in encoding direction */ 
    1518     status = pjmedia_vid_stream_pause( call_med->strm.v.stream, 
    1519                                        PJMEDIA_DIR_ENCODING); 
    1520     if (status != PJ_SUCCESS) 
    1521         return status; 
    1522  
    1523     return PJ_SUCCESS; 
     1533    if (enable) { 
     1534        /* Start stream in encoding direction */ 
     1535        status = pjmedia_vid_stream_resume(call_med->strm.v.stream, 
     1536                                           PJMEDIA_DIR_ENCODING); 
     1537    } else { 
     1538        /* Pause stream in encoding direction */ 
     1539        status = pjmedia_vid_stream_pause( call_med->strm.v.stream, 
     1540                                           PJMEDIA_DIR_ENCODING); 
     1541    } 
     1542 
     1543    return status; 
    15241544} 
    15251545 
     
    15491569        param_.med_idx = -1; 
    15501570        param_.cap_dev = PJMEDIA_VID_DEFAULT_CAPTURE_DEV; 
     1571        param_.dir = PJMEDIA_DIR_ENCODING_DECODING; 
    15511572    } 
    15521573 
     
    15721593    switch (op) { 
    15731594    case PJSUA_CALL_VID_STRM_ADD: 
    1574         status = call_add_video(call, param_.cap_dev); 
     1595        status = call_add_video(call, param_.cap_dev, param_.dir); 
    15751596        break; 
    1576     case PJSUA_CALL_VID_STRM_ENABLE: 
    1577         status = call_modify_video(call, param_.med_idx, PJ_TRUE); 
     1597    case PJSUA_CALL_VID_STRM_REMOVE: 
     1598        status = call_modify_video(call, param_.med_idx, PJMEDIA_DIR_NONE, 
     1599                                   PJ_TRUE); 
    15781600        break; 
    1579     case PJSUA_CALL_VID_STRM_DISABLE: 
    1580         status = call_modify_video(call, param_.med_idx, PJ_FALSE); 
     1601    case PJSUA_CALL_VID_STRM_CHANGE_DIR: 
     1602        status = call_modify_video(call, param_.med_idx, param_.dir, PJ_FALSE); 
    15811603        break; 
    15821604    case PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV: 
     
    15841606        break; 
    15851607    case PJSUA_CALL_VID_STRM_START_TRANSMIT: 
    1586         status = call_start_tx_video(call, param_.med_idx, param_.cap_dev); 
     1608        status = call_set_tx_video(call, param_.med_idx, PJ_TRUE); 
    15871609        break; 
    15881610    case PJSUA_CALL_VID_STRM_STOP_TRANSMIT: 
    1589         status = call_stop_tx_video(call, param_.med_idx); 
     1611        status = call_set_tx_video(call, param_.med_idx, PJ_FALSE); 
    15901612        break; 
    15911613    default: 
Note: See TracChangeset for help on using the changeset viewer.