Problems when scaling a YUV image using libyuv library

前端 未结 5 922
滥情空心
滥情空心 2021-01-07 17:12

I\'m developing a camera app based on Camera API 2 and I have found several problems using the libyuv. I want to convert YUV_420_888 images retriev

5条回答
  •  滥情空心
    2021-01-07 17:50

    The green images was caused by one of the planes being full of 0's. This means that one of the planes was empty. This was caused because I was converting from YUV NV21 instead of YUV I420. The images from the framework of camera in android comes as I420 YUVs.

    We need to convert them to YUV I420 to work properly with Libyuv. After that we can start using the multiple operations that the library offer you. Like rotate, scale etc.

    Here is the snipped about how the scaling method looks:

    JNIEXPORT jint JNICALL
    Java_com_aa_project_images_yuv_myJNIcl_scaleI420(JNIEnv *env, jclass type,
                                                     jobject srcBufferY,
                                                     jobject srcBufferU,
                                                     jobject srcBufferV,
                                                     jint srcWidth, jint srcHeight,
                                                     jobject dstBufferY,
                                                     jobject dstBufferU,
                                                     jobject dstBufferV,
                                                     jint dstWidth, jint dstHeight,
                                                     jint filterMode) {
    
        const uint8_t *srcY = static_cast(env->GetDirectBufferAddress(srcBufferY));
        const uint8_t *srcU = static_cast(env->GetDirectBufferAddress(srcBufferU));
        const uint8_t *srcV = static_cast(env->GetDirectBufferAddress(srcBufferV));
        uint8_t *dstY = static_cast(env->GetDirectBufferAddress(dstBufferY));
        uint8_t *dstU = static_cast(env->GetDirectBufferAddress(dstBufferU));
        uint8_t *dstV = static_cast(env->GetDirectBufferAddress(dstBufferV));
    
        return libyuv::I420Scale(srcY, srcWidth,
                                 srcU, srcWidth / 2,
                                 srcV, srcWidth / 2,
                                 srcWidth, srcHeight,
                                 dstY, dstWidth,
                                 dstU, dstWidth / 2,
                                 dstV, dstWidth / 2,
                                 dstWidth, dstHeight,
                                 static_cast(filterMode));
    }
    

提交回复
热议问题