Changeset 5125


Ignore:
Timestamp:
Jul 3, 2015 6:21:30 AM (5 years ago)
Author:
ming
Message:

Re #1861: Changed pjsua API for setting the orientation using a more generic API, pjsua_vid_dev_set_setting() instead

Location:
pjproject/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia-videodev/config.h

    r5027 r5125  
    5454 
    5555#if defined(PJMEDIA_HAS_VIDEO) && (PJMEDIA_HAS_VIDEO != 0) 
     56 
     57/** 
     58 * This setting controls the maximum number of supported video device drivers. 
     59 * 
     60 * Default: 8 
     61 */ 
     62#ifndef PJMEDIA_VID_DEV_MAX_DRIVERS 
     63#   define PJMEDIA_VID_DEV_MAX_DRIVERS 8 
     64#endif 
     65 
     66/** 
     67 * This setting controls the maximum number of supported video devices. 
     68 * 
     69 * Default: 16 
     70 */ 
     71#ifndef PJMEDIA_VID_DEV_MAX_DEVS 
     72#   define PJMEDIA_VID_DEV_MAX_DEVS 16 
     73#endif 
     74 
    5675 
    5776/** 
  • pjproject/trunk/pjmedia/include/pjmedia-videodev/videodev.h

    r4994 r5125  
    241241 
    242242    /** 
    243      * Support for changing video orientation in renderer and querying 
    244      * video orientation info in capture. Changing video orientation in 
    245      * a renderer will potentially affect the size of render window, 
    246      * i.e: width and height swap. When a capture device supports this 
    247      * capability, it will generate event PJMEDIA_EVENT_ORIENT_CHANGED 
    248      * (see #pjmedia_event) everytime the capture orientation is changed. 
     243     * Support for changing video orientation. For a renderer device, 
     244     * changing video orientation in will potentially affect the size of 
     245     * render window, i.e: width and height swap. For a capture device, 
     246     * the video will be rotated but the size of the video frame 
     247     * will stay the same, so the video may be resized or stretched. 
    249248     * 
    250249     * The value of this capability is pjmedia_orient. 
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/videodev.c

    r4998 r5125  
    106106#endif 
    107107 
    108 #define MAX_DRIVERS     16 
    109 #define MAX_DEVS        64 
     108#define MAX_DRIVERS     PJMEDIA_VID_DEV_MAX_DRIVERS 
     109#define MAX_DEVS        PJMEDIA_VID_DEV_MAX_DEVS 
    110110 
    111111 
  • pjproject/trunk/pjsip-apps/src/pjsua/ios/ipjsua/ipjsuaAppDelegate.m

    r5118 r5125  
    182182    UIDeviceOrientation dev_ori = [[UIDevice currentDevice] orientation]; 
    183183     
    184     if (dev_ori == prev_ori && !note) return; 
     184    if (dev_ori == prev_ori) return; 
    185185     
    186186    NSLog(@"Device orientation changed: %d", (prev_ori = dev_ori)); 
     
    193193        } 
    194194         
    195         pjsua_vid_dev_set_orient(PJMEDIA_VID_DEFAULT_CAPTURE_DEV, 
    196                                  pj_ori[dev_ori-1]); 
     195        pjsua_vid_dev_set_setting(PJMEDIA_VID_DEFAULT_CAPTURE_DEV, 
     196                                  PJMEDIA_VID_DEV_CAP_ORIENTATION, 
     197                                  &pj_ori[dev_ori-1], PJ_TRUE); 
    197198    } 
    198199#endif 
     
    273274    last = (wid == PJSUA_INVALID_ID) ? PJSUA_MAX_VID_WINS : wid+1; 
    274275 
    275     [app orientationChanged:NULL]; 
    276      
    277276    for (;i < last; ++i) { 
    278277        pjsua_vid_win_info wi; 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r5118 r5125  
    66126612 
    66136613/** 
    6614  * Set the orientation of the video device. The function only works 
    6615  * for video capture device and if the device is currently active (i.e. 
    6616  * a video preview has been started or there is a video call using the device). 
    6617  * Application can check if a video device is active by calling 
    6618  * #pjsua_vid_dev_is_active(). 
     6614 * Configure the capability of a video capture device. If the device is  
     6615 * currently active (i.e. if there is a video call using the device or 
     6616 * a video preview has been started), the function will forward the setting 
     6617 * to the video device instance to be applied immediately, if it supports it. 
     6618 * 
     6619 * The setting will be saved for future opening of the video device, if the  
     6620 * "keep" argument is set to non-zero. If the video device is currently 
     6621 * inactive, and the "keep" argument is false, this function will return 
     6622 * error. 
     6623 * 
     6624 * Note: This function will only works for video capture devices. To 
     6625 * configure the setting of video renderer device instances, use 
     6626 * pjsua_vid_win API instead. 
     6627 * 
     6628 * Warning: If application refreshes the video device list, it needs to 
     6629 * manually update the settings to reflect the newly updated video device 
     6630 * indexes. See #pjmedia_vid_dev_refresh() for more information. 
     6631 * 
     6632 * See also #pjmedia_vid_stream_set_cap() for more information about setting 
     6633 * a video device capability. 
    66196634 * 
    66206635 * @param id            The video device index. 
    6621  * @param orient        Video device orientation. 
    6622  * 
    6623  * @return              PJ_SUCCESS on success, or the appropriate error code. 
    6624  */ 
    6625 PJ_DECL(pj_status_t) pjsua_vid_dev_set_orient(pjmedia_vid_dev_index id, 
    6626                                               pjmedia_orient orient); 
     6636 * @param cap           The video device capability to change. 
     6637 * @param pval          Pointer to value. Please see #pjmedia_vid_dev_cap 
     6638 *                      documentation about the type of value to be  
     6639 *                      supplied for each setting. 
     6640 * 
     6641 * @return              PJ_SUCCESS on success or the appropriate error code. 
     6642 */ 
     6643PJ_DECL(pj_status_t) pjsua_vid_dev_set_setting(pjmedia_vid_dev_index id, 
     6644                                               pjmedia_vid_dev_cap cap, 
     6645                                               const void *pval, 
     6646                                               pj_bool_t keep); 
     6647 
     6648/** 
     6649 * Retrieve the value of a video capture device setting. If the device is 
     6650 * currently active (i.e. if there is a video call using the device or 
     6651 * a video preview has been started), the function will forward the request 
     6652 * to the video device. If video device is currently inactive, and if 
     6653 * application had previously set the setting and mark the setting as kept, 
     6654 * then that setting will be returned. Otherwise, this function will return 
     6655 * error. 
     6656 * The function only works for video capture device. 
     6657 * 
     6658 * @param id            The video device index. 
     6659 * @param cap           The video device capability to retrieve. 
     6660 * @param pval          Pointer to receive the value.  
     6661 *                      Please see #pjmedia_vid_dev_cap documentation about 
     6662 *                      the type of value to be supplied for each setting. 
     6663 * 
     6664 * @return              PJ_SUCCESS on success or the appropriate error code. 
     6665 */ 
     6666PJ_DECL(pj_status_t) pjsua_vid_dev_get_setting(pjmedia_vid_dev_index id, 
     6667                                               pjmedia_vid_dev_cap cap, 
     6668                                               void *pval); 
    66276669 
    66286670/** 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r4986 r5125  
    483483    pjmedia_vid_dev_index vcap_dev;  /**< Capture device ID.            */ 
    484484    pjmedia_vid_dev_index vrdr_dev;  /**< Playback device ID.           */ 
     485    /* For keeping video device settings */ 
     486    pj_uint32_t           vid_caps[PJMEDIA_VID_DEV_MAX_DEVS]; 
     487    pjmedia_vid_dev_param vid_param[PJMEDIA_VID_DEV_MAX_DEVS]; 
    485488 
    486489    /* File players: */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_vid.c

    r5118 r5125  
    227227 
    228228/* 
    229  * Set the orientation of the video device. 
    230  */ 
    231 PJ_DEF(pj_status_t) pjsua_vid_dev_set_orient( pjmedia_vid_dev_index id, 
    232                                               pjmedia_orient orient) 
    233 { 
    234     pjsua_vid_win *w; 
    235     pjmedia_vid_dev_stream *cap_dev; 
     229 * Set the capability of the video device. 
     230 */ 
     231PJ_DEF(pj_status_t) pjsua_vid_dev_set_setting( pjmedia_vid_dev_index id, 
     232                                               pjmedia_vid_dev_cap cap, 
     233                                               const void *pval, 
     234                                               pj_bool_t keep) 
     235{ 
     236    pj_status_t status = PJ_SUCCESS; 
    236237    pjsua_vid_win_id wid = vid_preview_get_win(id, PJ_FALSE); 
    237238     
    238     if (wid == PJSUA_INVALID_ID) { 
    239         PJ_LOG(3, (THIS_FILE, "Unable to set orientation for video dev %d: " 
    240                               "device not active", id)); 
    241         return PJ_ENOTFOUND; 
    242     } 
    243  
    244     w = &pjsua_var.win[wid]; 
     239    if (wid != PJSUA_INVALID_ID) { 
     240        pjsua_vid_win *w; 
     241        pjmedia_vid_dev_stream *cap_dev; 
     242 
     243        w = &pjsua_var.win[wid]; 
     244        cap_dev = pjmedia_vid_port_get_stream(w->vp_cap); 
     245 
     246        status = pjmedia_vid_dev_stream_set_cap(cap_dev, cap, pval); 
     247        if (status != PJ_SUCCESS) 
     248            return status; 
     249    } else { 
     250        status = PJ_ENOTFOUND; 
     251    } 
     252 
     253    if (keep) { 
     254        pjmedia_vid_dev_info info; 
     255             
     256        status = pjmedia_vid_dev_get_info(id, &info); 
     257        if (status != PJ_SUCCESS || (info.dir & PJMEDIA_DIR_CAPTURE) == 0) 
     258            return status; 
    245259         
    246     cap_dev = pjmedia_vid_port_get_stream(w->vp_cap); 
    247  
    248     return pjmedia_vid_dev_stream_set_cap(cap_dev, 
    249                                           PJMEDIA_VID_DEV_CAP_ORIENTATION, 
    250                                           &orient); 
     260        /* Get real capture ID, if set to PJMEDIA_VID_DEFAULT_CAPTURE_DEV */ 
     261        id = info.id; 
     262        status = pjmedia_vid_dev_param_set_cap(&pjsua_var.vid_param[id], 
     263                                               cap, pval); 
     264        if (status == PJ_SUCCESS) { 
     265            pjsua_var.vid_caps[id] |= cap; 
     266        } 
     267    } 
     268     
     269    return status; 
     270} 
     271 
     272/* 
     273 * Get the value of the video device capability. 
     274 */ 
     275PJ_DEF(pj_status_t) pjsua_vid_dev_get_setting( pjmedia_vid_dev_index id, 
     276                                               pjmedia_vid_dev_cap cap, 
     277                                               void *pval) 
     278{ 
     279    pj_status_t status = PJ_SUCCESS; 
     280    pjsua_vid_win_id wid = vid_preview_get_win(id, PJ_FALSE); 
     281     
     282    if (wid != PJSUA_INVALID_ID) { 
     283        pjsua_vid_win *w; 
     284        pjmedia_vid_dev_stream *cap_dev; 
     285 
     286        w = &pjsua_var.win[wid]; 
     287        cap_dev = pjmedia_vid_port_get_stream(w->vp_cap); 
     288 
     289        status = pjmedia_vid_dev_stream_get_cap(cap_dev, cap, pval); 
     290    } else { 
     291        pjmedia_vid_dev_info info; 
     292             
     293        status = pjmedia_vid_dev_get_info(id, &info); 
     294        if (status != PJ_SUCCESS) 
     295            return status; 
     296         
     297        /* Get real device ID, if set to default device */ 
     298        id = info.id; 
     299     
     300        if ((pjsua_var.vid_caps[id] & cap) != 0) { 
     301            status = pjmedia_vid_dev_param_get_cap(&pjsua_var.vid_param[id], 
     302                                                   cap, pval); 
     303        } else { 
     304            status = PJ_ENOTFOUND; 
     305        } 
     306    } 
     307 
     308    return status; 
    251309} 
    252310 
     
    614672        vp_param.active = PJ_TRUE; 
    615673        vp_param.vidparam.dir = PJMEDIA_DIR_CAPTURE; 
    616         if (fmt) 
     674 
     675        /* Update the video setting with user preference */ 
     676#define update_param(cap, field)    \ 
     677            if ((pjsua_var.vid_caps[cap_id] & cap) && (vdi.caps & cap)) { \ 
     678                vp_param.vidparam.flags |= cap; \ 
     679                pj_memcpy(&vp_param.vidparam.field, \ 
     680                          &pjsua_var.vid_param[cap_id].field, \ 
     681                          sizeof(vp_param.vidparam.field)); \ 
     682            } 
     683 
     684        if (fmt) { 
    617685            vp_param.vidparam.fmt = *fmt; 
     686        } else { 
     687            update_param(PJMEDIA_VID_DEV_CAP_FORMAT, fmt); 
     688        } 
     689         
     690        update_param(PJMEDIA_VID_DEV_CAP_ORIENTATION, orient); 
     691 
     692#undef update_param 
    618693 
    619694        status = pjmedia_vid_port_create(w->pool, &vp_param, &w->vp_cap); 
Note: See TracChangeset for help on using the changeset viewer.