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; } }
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; }