@ -393,28 +393,50 @@ int avpicture_get_size(enum PixelFormat pix_fmt, int width, int height)
return avpicture_fill ( & dummy_pict , NULL , pix_fmt , width , height ) ;
}
static int get_pix_fmt_depth ( int * min , int * max , enum PixelFormat pix_fmt )
{
const AVPixFmtDescriptor * desc = & av_pix_fmt_descriptors [ pix_fmt ] ;
int i ;
if ( ! desc - > nb_components ) {
* min = * max = 0 ;
return AVERROR ( EINVAL ) ;
}
* min = INT_MAX , * max = - INT_MAX ;
for ( i = 0 ; i < desc - > nb_components ; i + + ) {
* min = FFMIN ( desc - > comp [ i ] . depth_minus1 + 1 , * min ) ;
* max = FFMAX ( desc - > comp [ i ] . depth_minus1 + 1 , * max ) ;
}
return 0 ;
}
int avcodec_get_pix_fmt_loss ( enum PixelFormat dst_pix_fmt , enum PixelFormat src_pix_fmt ,
int has_alpha )
{
const PixFmtInfo * pf , * ps ;
const AVPixFmtDescriptor * src_desc = & av_pix_fmt_descriptors [ src_pix_fmt ] ;
const AVPixFmtDescriptor * dst_desc = & av_pix_fmt_descriptors [ dst_pix_fmt ] ;
int loss ;
int src_min_depth , src_max_depth , dst_min_depth , dst_max_depth ;
int ret , loss ;
ps = & pix_fmt_info [ src_pix_fmt ] ;
/* compute loss */
loss = 0 ;
pf = & pix_fmt_info [ dst_pix_fmt ] ;
if ( pf - > depth < ps - > depth | |
( ( dst_pix_fmt = = PIX_FMT_RGB555BE | | dst_pix_fmt = = PIX_FMT_RGB555LE | |
dst_pix_fmt = = PIX_FMT_BGR555BE | | dst_pix_fmt = = PIX_FMT_BGR555LE ) & &
( src_pix_fmt = = PIX_FMT_RGB565BE | | src_pix_fmt = = PIX_FMT_RGB565LE | |
src_pix_fmt = = PIX_FMT_BGR565BE | | src_pix_fmt = = PIX_FMT_BGR565LE ) ) )
if ( ( ret = get_pix_fmt_depth ( & src_min_depth , & src_max_depth , src_pix_fmt ) ) < 0 )
return ret ;
if ( ( ret = get_pix_fmt_depth ( & dst_min_depth , & dst_max_depth , dst_pix_fmt ) ) < 0 )
return ret ;
if ( dst_min_depth < src_min_depth | |
dst_max_depth < src_max_depth )
loss | = FF_LOSS_DEPTH ;
if ( dst_desc - > log2_chroma_w > src_desc - > log2_chroma_w | |
dst_desc - > log2_chroma_h > src_desc - > log2_chroma_h )
loss | = FF_LOSS_RESOLUTION ;
pf = & pix_fmt_info [ dst_pix_fmt ] ;
switch ( pf - > color_type ) {
case FF_COLOR_RGB :
if ( ps - > color_type ! = FF_COLOR_RGB & &