Changeset 5810


Ignore:
Timestamp:
Jun 22, 2018 8:22:01 AM (6 years ago)
Author:
nanang
Message:

Fixed #2122: Reorder supported format list in Android camera to have I420 before YV12 & NV21.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/android_dev.c

    r5544 r5810  
    566566            jsize cnt, j; 
    567567            pj_bool_t has_i420 = PJ_FALSE; 
     568            int k; 
    568569 
    569570            cnt = (*jni_env)->GetArrayLength(jni_env, jiarray); 
    570571            fmts = (*jni_env)->GetIntArrayElements(jni_env, jiarray, 0); 
    571572            for (j = 0; j < cnt; j++) { 
    572                 int k; 
    573573                pjmedia_format_id fmt = and_fmt_to_pj((pj_uint32_t)fmts[j]); 
    574                  
    575                 /* Check for any duplicate */ 
    576                 for (k = 0; k < vdi->fmt_cnt; k++) { 
    577                     if (fmt == 0 || fmt == vdi->fmt[k].id) { 
    578                         fmt = 0; 
    579                         break; 
    580                     } 
    581                 } 
    582574 
    583575                /* Make sure we recognize this format */ 
     
    589581                else if (fmt == PJMEDIA_FORMAT_YV12) adi->has_yv12 = PJ_TRUE; 
    590582                else if (fmt == PJMEDIA_FORMAT_NV21) adi->has_nv21 = PJ_TRUE; 
    591  
     583            } 
     584            (*jni_env)->ReleaseIntArrayElements(jni_env, jiarray, fmts, 
     585                                                JNI_ABORT); 
     586            (*jni_env)->DeleteLocalRef(jni_env, jtmp); 
     587 
     588            /* Always put I420/IYUV and in the first place, for better 
     589             * compatibility. 
     590             */ 
     591            adi->forced_i420 = !has_i420; 
     592            for (k = 0; k < adi->sup_size_cnt && 
     593                        vdi->fmt_cnt < max_fmt_cnt-1; k++) 
     594            { 
     595                /* Landscape video */ 
     596                pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
     597                                          PJMEDIA_FORMAT_I420, 
     598                                          adi->sup_size[k].w, 
     599                                          adi->sup_size[k].h, 
     600                                          DEFAULT_FPS, 1); 
     601                /* Portrait video */ 
     602                pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
     603                                          PJMEDIA_FORMAT_I420, 
     604                                          adi->sup_size[k].h, 
     605                                          adi->sup_size[k].w, 
     606                                          DEFAULT_FPS, 1); 
     607            } 
     608 
     609            /* YV12 */ 
     610            if (adi->has_yv12) { 
    592611                for (k = 0; k < adi->sup_size_cnt && 
    593612                            vdi->fmt_cnt < max_fmt_cnt-1; k++) 
     
    595614                    /* Landscape video */ 
    596615                    pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
    597                                               fmt, 
     616                                              PJMEDIA_FORMAT_YV12, 
    598617                                              adi->sup_size[k].w, 
    599618                                              adi->sup_size[k].h, 
     
    601620                    /* Portrait video */ 
    602621                    pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
    603                                               fmt, 
     622                                              PJMEDIA_FORMAT_YV12, 
    604623                                              adi->sup_size[k].h, 
    605624                                              adi->sup_size[k].w, 
     
    607626                } 
    608627            } 
    609             (*jni_env)->ReleaseIntArrayElements(jni_env, jiarray, fmts, 
    610                                                 JNI_ABORT); 
    611             (*jni_env)->DeleteLocalRef(jni_env, jtmp); 
    612  
    613             /* Pretend to support I420/IYUV, only if we support YV12/NV21 */ 
    614             if (!has_i420 && (adi->has_yv12 || adi->has_nv21) && 
    615                 vdi->fmt_cnt < PJ_ARRAY_SIZE(vdi->fmt)) 
    616             { 
    617                 int k; 
    618                 adi->forced_i420 = PJ_TRUE; 
     628             
     629            /* NV21 */ 
     630            if (adi->has_nv21) { 
    619631                for (k = 0; k < adi->sup_size_cnt && 
    620632                            vdi->fmt_cnt < max_fmt_cnt-1; k++) 
    621633                { 
     634                    /* Landscape video */ 
    622635                    pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
    623                                               PJMEDIA_FORMAT_I420, 
     636                                              PJMEDIA_FORMAT_NV21, 
    624637                                              adi->sup_size[k].w, 
    625638                                              adi->sup_size[k].h, 
    626639                                              DEFAULT_FPS, 1); 
     640                    /* Portrait video */ 
    627641                    pjmedia_format_init_video(&vdi->fmt[vdi->fmt_cnt++], 
    628                                               PJMEDIA_FORMAT_I420, 
     642                                              PJMEDIA_FORMAT_NV21, 
    629643                                              adi->sup_size[k].h, 
    630644                                              adi->sup_size[k].w, 
     
    632646                } 
    633647            } 
     648             
    634649        } else { 
    635650            goto on_skip_dev; 
Note: See TracChangeset for help on using the changeset viewer.