Ignore:
Timestamp:
Nov 22, 2019 6:18:55 AM (4 years ago)
Author:
ming
Message:

Fixed #2253: Support for VP8 and VP9 video codec

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/vid_codec_util.c

    r5678 r6110  
    763763 
    764764 
     765/* VPX fmtp parser */ 
     766PJ_DEF(pj_status_t) pjmedia_vid_codec_vpx_parse_fmtp( 
     767                                    const pjmedia_codec_fmtp *fmtp, 
     768                                    pjmedia_vid_codec_vpx_fmtp *vpx_fmtp) 
     769{ 
     770    const pj_str_t PROFILE_ID   = {"profile-id", 10}; 
     771    const pj_str_t MAX_FR       = {"max-fr", 6}; 
     772    const pj_str_t MAX_FS       = {"max-fs", 6}; 
     773 
     774    unsigned i; 
     775 
     776    pj_bzero(vpx_fmtp, sizeof(*vpx_fmtp)); 
     777 
     778    for (i = 0; i < fmtp->cnt; ++i) { 
     779        unsigned tmp; 
     780 
     781        if (pj_stricmp(&fmtp->param[i].name, &MAX_FS) == 0) { 
     782            tmp = pj_strtoul(&fmtp->param[i].val); 
     783            vpx_fmtp->max_fs = PJ_MAX(tmp, vpx_fmtp->max_fs); 
     784        } else if (pj_stricmp(&fmtp->param[i].name, &MAX_FR) == 0) { 
     785            tmp = pj_strtoul(&fmtp->param[i].val); 
     786            vpx_fmtp->max_fr = PJ_MAX(tmp, vpx_fmtp->max_fr); 
     787        } else if (pj_stricmp(&fmtp->param[i].name, &PROFILE_ID) == 0) { 
     788            tmp = pj_strtoul(&fmtp->param[i].val); 
     789            vpx_fmtp->profile_id = PJ_MAX(tmp, vpx_fmtp->profile_id); 
     790        } 
     791    } 
     792 
     793    return PJ_SUCCESS; 
     794} 
     795 
     796 
     797PJ_DEF(pj_status_t) pjmedia_vid_codec_vpx_apply_fmtp( 
     798                                pjmedia_vid_codec_param *param) 
     799{ 
     800    if (param->dir & PJMEDIA_DIR_ENCODING) { 
     801        pjmedia_vid_codec_vpx_fmtp fmtp; 
     802        pjmedia_video_format_detail *vfd; 
     803        pj_status_t status; 
     804 
     805        /* Get remote param */ 
     806        status = pjmedia_vid_codec_vpx_parse_fmtp(&param->enc_fmtp, 
     807                                                  &fmtp); 
     808        if (status != PJ_SUCCESS) 
     809            return status; 
     810 
     811        /* Adjust fps and size to conform to the parameter 
     812         * specified by remote SDP fmtp. 
     813         */ 
     814        vfd = pjmedia_format_get_video_format_detail(&param->enc_fmt, 
     815                                                     PJ_TRUE); 
     816 
     817        if (fmtp.max_fr > 0) { 
     818            vfd->fps.num   = fmtp.max_fr; 
     819            vfd->fps.denum = 1; 
     820        } 
     821         
     822        if (fmtp.max_fs > 0) { 
     823            unsigned max_res = ((int)pj_isqrt(fmtp.max_fs * 8)) * 16; 
     824             
     825            /* Do we need to maintain the aspect ratio or scale down 
     826             * to some predetermined resolution instead (for example, 
     827             * if the requested resolution is 640x480 and max_res is 
     828             * 600, should we scale down to 480xx360)? 
     829             */ 
     830            if (vfd->size.w > max_res) 
     831                vfd->size.w = max_res; 
     832            if (vfd->size.h > max_res) 
     833                vfd->size.h = max_res; 
     834        } 
     835    } 
     836 
     837    return PJ_SUCCESS; 
     838} 
     839 
     840 
    765841#endif /* PJMEDIA_HAS_VIDEO */ 
Note: See TracChangeset for help on using the changeset viewer.