Ignore:
Timestamp:
Sep 20, 2011 10:07:55 AM (13 years ago)
Author:
bennylp
Message:

Related to preview (re #1340): handle problems with starting or stopping preview during a call

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_vid.c

    r3756 r3758  
    324324 */ 
    325325 
    326 /* 
    327  * Get the preview window handle associated with the capture device, if any. 
    328  */ 
    329 PJ_DEF(pjsua_vid_win_id) pjsua_vid_preview_get_win(pjmedia_vid_dev_index id) 
     326static pjsua_vid_win_id vid_preview_get_win(pjmedia_vid_dev_index id, 
     327                                            pj_bool_t running_only) 
    330328{ 
    331329    pjsua_vid_win_id wid = PJSUA_INVALID_ID; 
     
    348346        } 
    349347    } 
     348 
     349    if (wid != PJSUA_INVALID_ID && running_only) { 
     350        pjsua_vid_win *w = &pjsua_var.win[wid]; 
     351        wid = w->preview_running ? wid : PJSUA_INVALID_ID; 
     352    } 
     353 
    350354    PJSUA_UNLOCK(); 
    351355 
    352356    return wid; 
     357} 
     358 
     359/* 
     360 * NOTE: internal function don't use this!!! Use vid_preview_get_win() 
     361 *       instead. This is because this function will only return window ID 
     362 *       if preview is currently running. 
     363 */ 
     364PJ_DEF(pjsua_vid_win_id) pjsua_vid_preview_get_win(pjmedia_vid_dev_index id) 
     365{ 
     366    return vid_preview_get_win(id, PJ_TRUE); 
    353367} 
    354368 
     
    394408    /* If type is preview, check if it exists already */ 
    395409    if (type == PJSUA_WND_TYPE_PREVIEW) { 
    396         wid = pjsua_vid_preview_get_win(cap_id); 
     410        wid = vid_preview_get_win(cap_id, PJ_FALSE); 
    397411        if (wid != PJSUA_INVALID_ID) { 
    398412            /* Yes, it exists */ 
     
    421435            /* Done */ 
    422436            *id = wid; 
    423             PJ_LOG(4,(THIS_FILE, "Window already exist: %d", wid)); 
    424437            pj_log_pop_indent(); 
    425             return PJ_SUCCESS; 
     438 
     439            return status; 
    426440        } 
    427441    } 
     
    826840            } 
    827841 
    828             wid = pjsua_vid_preview_get_win(call_med->strm.v.cap_dev); 
     842            /* Note: calling pjsua_vid_preview_get_win() even though 
     843             * create_vid_win() will automatically create the window 
     844             * if it doesn't exist, because create_vid_win() will modify 
     845             * existing window SHOW/HIDE value. 
     846             */ 
     847            wid = vid_preview_get_win(call_med->strm.v.cap_dev, PJ_FALSE); 
    829848            if (wid == PJSUA_INVALID_ID) { 
    830849                /* Create preview video window */ 
     
    10431062 
    10441063    w = &pjsua_var.win[wid]; 
     1064    if (w->preview_running) { 
     1065        PJSUA_UNLOCK(); 
     1066        pj_log_pop_indent(); 
     1067        return PJ_SUCCESS; 
     1068    } 
    10451069 
    10461070    /* Start renderer, unless it's native preview */ 
    1047     if (!w->is_native) { 
     1071    if (w->is_native && !pjmedia_vid_port_is_running(w->vp_cap)) { 
     1072        pjmedia_vid_dev_stream *cap_dev; 
     1073        pj_bool_t enabled = PJ_TRUE; 
     1074 
     1075        cap_dev = pjmedia_vid_port_get_stream(w->vp_cap); 
     1076        status = pjmedia_vid_dev_stream_set_cap( 
     1077                        cap_dev, PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW, 
     1078                        &enabled); 
     1079        if (status != PJ_SUCCESS) { 
     1080            PJ_PERROR(1,(THIS_FILE, status, 
     1081                         "Error activating native preview, falling back " 
     1082                         "to software preview..")); 
     1083            w->is_native = PJ_FALSE; 
     1084        } 
     1085    } 
     1086 
     1087    if (!w->is_native && !pjmedia_vid_port_is_running(w->vp_rend)) { 
    10481088        status = pjmedia_vid_port_start(w->vp_rend); 
    10491089        if (status != PJ_SUCCESS) { 
     
    10551095 
    10561096    /* Start capturer */ 
    1057     status = pjmedia_vid_port_start(w->vp_cap); 
    1058     if (status != PJ_SUCCESS) { 
    1059         PJSUA_UNLOCK(); 
    1060         pj_log_pop_indent(); 
    1061         return status; 
     1097    if (!pjmedia_vid_port_is_running(w->vp_cap)) { 
     1098        status = pjmedia_vid_port_start(w->vp_cap); 
     1099        if (status != PJ_SUCCESS) { 
     1100            PJSUA_UNLOCK(); 
     1101            pj_log_pop_indent(); 
     1102            return status; 
     1103        } 
    10621104    } 
    10631105 
    10641106    inc_vid_win(wid); 
     1107    w->preview_running = PJ_TRUE; 
    10651108 
    10661109    PJSUA_UNLOCK(); 
     
    10751118{ 
    10761119    pjsua_vid_win_id wid = PJSUA_INVALID_ID; 
    1077  
    1078     PJ_LOG(4,(THIS_FILE, "Stopping preview for cap_dev=%d", id)); 
    1079     pj_log_push_indent(); 
     1120    pjsua_vid_win *w; 
     1121    pj_status_t status; 
    10801122 
    10811123    PJSUA_LOCK(); 
     
    10871129    } 
    10881130 
    1089     dec_vid_win(wid); 
     1131    PJ_LOG(4,(THIS_FILE, "Stopping preview for cap_dev=%d", id)); 
     1132    pj_log_push_indent(); 
     1133 
     1134    w = &pjsua_var.win[wid]; 
     1135    if (w->preview_running) { 
     1136        if (w->is_native) { 
     1137            pjmedia_vid_dev_stream *cap_dev; 
     1138            pj_bool_t enabled = PJ_FALSE; 
     1139 
     1140            cap_dev = pjmedia_vid_port_get_stream(w->vp_cap); 
     1141            status = pjmedia_vid_dev_stream_set_cap( 
     1142                            cap_dev, PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW, 
     1143                            &enabled); 
     1144        } else { 
     1145            status = pjmedia_vid_port_stop(w->vp_rend); 
     1146        } 
     1147 
     1148        if (status != PJ_SUCCESS) { 
     1149            PJ_PERROR(1,(THIS_FILE, status, "Error stopping %spreview", 
     1150                         (w->is_native ? "native " : ""))); 
     1151            PJSUA_UNLOCK(); 
     1152            pj_log_pop_indent(); 
     1153            return status; 
     1154        } 
     1155 
     1156        dec_vid_win(wid); 
     1157        w->preview_running = PJ_FALSE; 
     1158    } 
    10901159 
    10911160    PJSUA_UNLOCK(); 
     
    16741743    /* = Attach stream port to the new capture device = */ 
    16751744 
    1676     new_wid = pjsua_vid_preview_get_win(cap_dev); 
     1745    /* Note: calling pjsua_vid_preview_get_win() even though 
     1746     * create_vid_win() will automatically create the window 
     1747     * if it doesn't exist, because create_vid_win() will modify 
     1748     * existing window SHOW/HIDE value. 
     1749     */ 
     1750    new_wid = vid_preview_get_win(cap_dev, PJ_FALSE); 
    16771751    if (new_wid == PJSUA_INVALID_ID) { 
    16781752        /* Create preview video window */ 
Note: See TracChangeset for help on using the changeset viewer.