On Wed, Aug 24, 2016 at 6:06 AM, Diego Biurrun <[email protected]> wrote:
> 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?

+1

>> @@ -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.

+1

also, does it have to be a separate function? If so, what does the old
function do that the new one does not?
-- 
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to