On Wed, Aug 24, 2016 at 11:24:01AM +0200, Anton Khirnov wrote:
> --- /dev/null
> +++ b/libavutil/x86/imgutils_init.c
> @@ -0,0 +1,49 @@
> +
> +void ff_image_copy_plane_uc_from_sse4(uint8_t *dst, ptrdiff_t dst_linesize,
> + const uint8_t *src, ptrdiff_t
> src_linesize,
> + ptrdiff_t bytewidth, int height);
> +
> +int ff_image_copy_plane_uc_from_x86(uint8_t *dst, ptrdiff_t
> dst_linesize,
> + const uint8_t *src, ptrdiff_t
> src_linesize,
> + ptrdiff_t bytewidth, int height)
> +{
> + int cpu_flags = av_get_cpu_flags();
> + ptrdiff_t bw_aligned = FFALIGN(bytewidth, 64);
> +
> + if (EXTERNAL_SSE4(cpu_flags) &&
> + bw_aligned <= dst_linesize && bw_aligned <= src_linesize)
> + ff_image_copy_plane_uc_from_sse4(dst, dst_linesize, src,
> src_linesize,
> + bw_aligned, height);
> + else
> + return AVERROR(ENOSYS);
> +
> + return 0;
> +}
> --- a/libavutil/imgutils.c
> +++ b/libavutil/imgutils.c
> @@ -265,9 +266,33 @@ void av_image_copy_plane(uint8_t *dst, int
> dst_linesize,
> +static void image_copy_plane_uc_from(uint8_t *dst, ptrdiff_t
> dst_linesize,
> + const uint8_t *src, ptrdiff_t
> src_linesize,
> + ptrdiff_t bytewidth, int height)
> +{
> + int ret = -1;
> +
> +#if ARCH_X86
> + ret = ff_image_copy_plane_uc_from_x86(dst, dst_linesize, src,
> src_linesize,
> + bytewidth, height);
> +#endif
> +
> + if (ret < 0)
> + image_copy_plane(dst, dst_linesize, src, src_linesize, bytewidth,
> height);
> +}
This feels awkward. Why not make it into some dsp-like structure with
overloading function pointers?
> @@ -265,9 +266,33 @@ void av_image_copy_plane(uint8_t *dst, int
> dst_linesize,
>
> -void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
> - const uint8_t *src_data[4], const int src_linesizes[4],
> - enum AVPixelFormat pix_fmt, int width, int height)
> @@ -289,17 +314,41 @@ void av_image_copy(uint8_t *dst_data[4], int
> dst_linesizes[4],
>
> +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
> + const uint8_t *src_data[4], const int src_linesizes[4],
> + enum AVPixelFormat pix_fmt, int width, int height)
> +{
> + ptrdiff_t dst_linesizes1[4], src_linesizes1[4];
> + int i;
> +
> + for (i = 0; i < 4; i++) {
> + dst_linesizes1[i] = dst_linesizes[i];
> + src_linesizes1[i] = src_linesizes[i];
> + }
> +
> + image_copy(dst_data, dst_linesizes1, src_data, src_linesizes1, pix_fmt,
> + width, height, image_copy_plane);
> +}
I think it's time to deprecate the int types for the line sizes and use
ptrdiff_t everywhere instead.
Diego
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel