Changeset 4854


Ignore:
Timestamp:
Jun 4, 2014 3:48:28 AM (6 years ago)
Author:
nanang
Message:

Fix #1769: Fixed maximum size/resolution calculation of H264 video in decoding direction.

File:
1 edited

Legend:

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

    r4815 r4854  
    601601                                    const pjmedia_ratio *fps, 
    602602                                    const pjmedia_ratio *ratio, 
    603                                     pjmedia_rect_size *size) 
     603                                    pjmedia_rect_size *size, 
     604                                    pj_bool_t is_decoding) 
    604605{ 
    605606    pjmedia_ratio def_ratio = { DEFAULT_H264_RATIO_NUM, 
     
    647648    size->w = asp_ratio.num   * scale * 16; 
    648649    size->h = asp_ratio.denum * scale * 16; 
     650 
     651    /* #1769: for decoding, size is usually used for allocating buffer, 
     652     * so we need to make sure that frame size is not less than max_fs. 
     653     */ 
     654    if (is_decoding && ((size->w * size->h) >> 8) < max_fs) { 
     655        /* Size is less than max_fs, recalculate using ratio 1:1 and 
     656         * round up the scale. 
     657         */ 
     658        scale = pj_isqrt(max_fs) + 1; 
     659        size->w = size->h = scale * 16; 
     660    } 
    649661 
    650662    return PJ_SUCCESS; 
     
    687699                r.num = vfd->size.w; 
    688700                r.denum = vfd->size.h; 
    689                 find_highest_res(&fmtp, &vfd->fps, &r, &vfd->size); 
     701                find_highest_res(&fmtp, &vfd->fps, &r, &vfd->size, PJ_FALSE); 
    690702            } 
    691703        } else { 
     
    694706            r.num = vfd->size.w; 
    695707            r.denum = vfd->size.h; 
    696             find_highest_res(&fmtp, &vfd->fps, &r, &vfd->size); 
     708            find_highest_res(&fmtp, &vfd->fps, &r, &vfd->size, PJ_FALSE); 
    697709        } 
    698710 
     
    733745        r.num = vfd->size.w; 
    734746        r.denum = vfd->size.h; 
    735         find_highest_res(&fmtp, &vfd->fps, &r, &highest_size); 
     747        find_highest_res(&fmtp, &vfd->fps, &r, &highest_size, PJ_TRUE); 
    736748        if (vfd->size.w * vfd->size.h < highest_size.w * highest_size.h) 
    737749            vfd->size = highest_size; 
Note: See TracChangeset for help on using the changeset viewer.