[vlc-devel] [PATCH] picture: export: Allow source picture to be cropped

Steve Lhomme robux4 at ycbcr.xyz
Wed Jun 19 07:23:23 CEST 2019


LGTM. Although I'm not sure the case where crop is false is very useful. 
  Not knowing the source aspect ratio it will produce odd pictures in 
the general case. Maybe we can just modify the case when both values are 
positive.

On 2019-06-18 17:56, Hugo Beauzée-Luyssen wrote:
> ---
>   include/vlc_picture.h                     |  7 +++--
>   lib/picture.c                             |  2 +-
>   modules/misc/medialibrary/Thumbnailer.cpp |  2 +-
>   src/misc/picture.c                        | 36 +++++++++++++++++++----
>   src/video_output/video_output.c           |  2 +-
>   5 files changed, 39 insertions(+), 10 deletions(-)
> 
> diff --git a/include/vlc_picture.h b/include/vlc_picture.h
> index 58aba49445..c314c9c207 100644
> --- a/include/vlc_picture.h
> +++ b/include/vlc_picture.h
> @@ -260,10 +260,13 @@ VLC_API picture_t *picture_Clone(picture_t *pic);
>    *  - if strictly lower than 0, the original dimension will be used.
>    *  - if equal to 0, it will be deduced from the other dimension which must be
>    *  different to 0.
> - *  - if strictly higher than 0, it will override the dimension.
> + *  - if strictly higher than 0, it will either override the dimension if b_crop
> + *  is false, or crop the picture to the provided size if b_crop is true.
>    * If at most one of them is > 0 then the picture aspect ratio will be kept.
>    */
> -VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height );
> +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt,
> +                            picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width,
> +                            int i_override_height, bool b_crop );
>   
>   /**
>    * This function will setup all fields of a picture_t without allocating any
> diff --git a/lib/picture.c b/lib/picture.c
> index 0a4541baf7..5a7d9cb6e6 100644
> --- a/lib/picture.c
> +++ b/lib/picture.c
> @@ -69,7 +69,7 @@ libvlc_picture_t* libvlc_picture_new( vlc_object_t* p_obj, picture_t* input,
>               vlc_assert_unreachable();
>       }
>       if ( picture_Export( p_obj, &pic->converted, &pic->fmt,
> -                         input, format, width, height ) != VLC_SUCCESS )
> +                         input, format, width, height, false ) != VLC_SUCCESS )
>       {
>           free( pic );
>           return NULL;
> diff --git a/modules/misc/medialibrary/Thumbnailer.cpp b/modules/misc/medialibrary/Thumbnailer.cpp
> index 013077f54a..5bc5b4f029 100644
> --- a/modules/misc/medialibrary/Thumbnailer.cpp
> +++ b/modules/misc/medialibrary/Thumbnailer.cpp
> @@ -93,7 +93,7 @@ bool Thumbnailer::generate( const std::string& mrl, uint32_t desiredWidth,
>   
>       block_t* block;
>       if ( picture_Export( VLC_OBJECT( m_ml ), &block, nullptr, ctx.thumbnail,
> -                         VLC_CODEC_JPEG, desiredWidth, desiredHeight ) != VLC_SUCCESS )
> +                         VLC_CODEC_JPEG, desiredWidth, desiredHeight, true ) != VLC_SUCCESS )
>           return false;
>       auto blockPtr = vlc::wrap_cptr( block, &block_Release );
>   
> diff --git a/src/misc/picture.c b/src/misc/picture.c
> index cd463d4034..cdde6f9951 100644
> --- a/src/misc/picture.c
> +++ b/src/misc/picture.c
> @@ -438,7 +438,8 @@ int picture_Export( vlc_object_t *p_obj,
>                       video_format_t *p_fmt,
>                       picture_t *p_picture,
>                       vlc_fourcc_t i_format,
> -                    int i_override_width, int i_override_height )
> +                    int i_override_width, int i_override_height,
> +                    bool b_crop )
>   {
>       /* */
>       video_format_t fmt_in = p_picture->format;
> @@ -479,10 +480,35 @@ int picture_Export( vlc_object_t *p_obj,
>       }
>   
>       /* */
> -    fmt_out.i_width  = ( i_override_width < 0 ) ?
> -                       i_original_width : (unsigned)i_override_width;
> -    fmt_out.i_height = ( i_override_height < 0 ) ?
> -                       i_original_height : (unsigned)i_override_height;
> +    if( b_crop && i_override_width > 0 && i_override_height > 0 )
> +    {
> +        float f_ar_dest = (float)i_override_width / i_override_height;
> +        float f_ar_src = (float)i_width / i_height;
> +        unsigned int i_crop_width, i_crop_height;
> +        if ( f_ar_dest > f_ar_src )
> +        {
> +            i_crop_width = i_width;
> +            i_crop_height = (float)i_crop_width / f_ar_dest;
> +        }
> +        else
> +        {
> +            i_crop_height = i_height;
> +            i_crop_width = (float)i_crop_height * f_ar_dest;
> +        }
> +        fmt_out.i_width = i_override_width;
> +        fmt_out.i_height = i_override_height;
> +        fmt_in.i_visible_width = i_crop_width;
> +        fmt_in.i_visible_height = i_crop_height;
> +        fmt_in.i_x_offset += (i_width - i_crop_width) / 2;
> +        fmt_in.i_y_offset += (i_height - i_crop_height) / 2;
> +    }
> +    else
> +    {
> +        fmt_out.i_width  = ( i_override_width < 0 ) ?
> +                           i_original_width : (unsigned)i_override_width;
> +        fmt_out.i_height = ( i_override_height < 0 ) ?
> +                           i_original_height : (unsigned)i_override_height;
> +    }
>   
>       /* scale if only one direction is provided */
>       if( fmt_out.i_height == 0 && fmt_out.i_width > 0 )
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 14333044dc..2a5865af3f 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -373,7 +373,7 @@ int vout_GetSnapshot(vout_thread_t *vout,
>           const int override_height = var_InheritInteger(vout, "snapshot-height");
>   
>           if (picture_Export(VLC_OBJECT(vout), image_dst, fmt,
> -                           picture, codec, override_width, override_height)) {
> +                           picture, codec, override_width, override_height, false)) {
>               msg_Err(vout, "Failed to convert image for snapshot");
>               picture_Release(picture);
>               return VLC_EGENERIC;
> -- 
> 2.20.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list