Esempio n. 1
0
static int pick_closest_supported_csp( int csp )
{
    int pix_fmt = convert_csp_to_pix_fmt( csp );
    switch( pix_fmt )
    {
        case PIX_FMT_YUV422P:
        case PIX_FMT_YUV422P16LE:
        case PIX_FMT_YUV422P16BE:
        case PIX_FMT_YUYV422:
        case PIX_FMT_UYVY422:
            return X264_CSP_I422;
        case PIX_FMT_YUV444P:
        case PIX_FMT_YUV444P16LE:
        case PIX_FMT_YUV444P16BE:
            return X264_CSP_I444;
        case PIX_FMT_RGB24:    // convert rgb to bgr
        case PIX_FMT_RGB48BE:
        case PIX_FMT_RGB48LE:
        case PIX_FMT_RGB565BE:
        case PIX_FMT_RGB565LE:
        case PIX_FMT_RGB555BE:
        case PIX_FMT_RGB555LE:
        case PIX_FMT_BGR24:
        case PIX_FMT_BGR565BE:
        case PIX_FMT_BGR565LE:
        case PIX_FMT_BGR555BE:
        case PIX_FMT_BGR555LE:
            return X264_CSP_BGR;
        case PIX_FMT_ARGB:
        case PIX_FMT_RGBA:
        case PIX_FMT_ABGR:
        case PIX_FMT_BGRA:
            return X264_CSP_BGRA;
        case PIX_FMT_NV12:
        case PIX_FMT_NV21:
             return X264_CSP_NV12;
        default:
            return X264_CSP_I420;
    }
}
Esempio n. 2
0
static int pick_closest_supported_csp( int csp )
{
    int pix_fmt = convert_csp_to_pix_fmt( csp );
    // first determine the base csp
    int ret = X264_CSP_NONE;
    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_descriptors+pix_fmt;
    if( (unsigned)pix_fmt >= PIX_FMT_NB || !pix_desc->name )
        return ret;

    const char *pix_fmt_name = pix_desc->name;
    int is_rgb = pix_desc->flags & (PIX_FMT_RGB | PIX_FMT_PAL);
    int is_bgr = !!strstr( pix_fmt_name, "bgr" );
    if( is_bgr || is_rgb )
    {
        if( pix_desc->nb_components == 4 ) // has alpha
            ret = X264_CSP_BGRA;
        else if( is_bgr )
            ret = X264_CSP_BGR;
        else
            ret = X264_CSP_RGB;
    }
    else
    {
        // yuv-based
        if( pix_desc->nb_components == 1 || pix_desc->nb_components == 2 ) // no chroma
            ret = X264_CSP_I420;
        else if( pix_desc->log2_chroma_w && pix_desc->log2_chroma_h ) // reduced chroma width & height
            ret = (pix_number_of_planes( pix_desc ) == 2) ? X264_CSP_NV12 : X264_CSP_I420;
        else if( pix_desc->log2_chroma_w ) // reduced chroma width only
            ret = X264_CSP_I422; // X264_CSP_NV16 is not supported by swscale so don't use it
        else
            ret = X264_CSP_I444;
    }
    // now determine high depth
    for( int i = 0; i < pix_desc->nb_components; i++ )
        if( pix_desc->comp[i].depth_minus1 >= 8 )
            ret |= X264_CSP_HIGH_DEPTH;
    return ret;
}