diff mbox series

[FFmpeg-devel] swscale/swscale_unscaled: Fix undefined NULL + 0

Message ID GV1P250MB073772C3FE33BF652121EB0A8F549@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM
State New
Headers show
Series [FFmpeg-devel] swscale/swscale_unscaled: Fix undefined NULL + 0 | expand

Commit Message

Andreas Rheinhardt Sept. 28, 2022, 6:39 p.m. UTC
Affected the fitsdec-gbrp16 FATE-test.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libswscale/swscale_unscaled.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Michael Niedermayer Sept. 28, 2022, 7:39 p.m. UTC | #1
On Wed, Sep 28, 2022 at 08:39:09PM +0200, Andreas Rheinhardt wrote:
> Affected the fitsdec-gbrp16 FATE-test.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
>  libswscale/swscale_unscaled.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> index 8838cc8b53..0b97377934 100644
> --- a/libswscale/swscale_unscaled.c
> +++ b/libswscale/swscale_unscaled.c
> @@ -695,7 +695,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
>              }
>          }
>          for (i = 0; i < 4; i++)
> -            dst[i] += dstStride[i] >> 1;
> +            dst[i] = FF_PTR_ADD(dst[i], dstStride[i] >> 1);
>      }
>  }
>  
> @@ -729,8 +729,8 @@ static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
>      }
>  
>      for(i=0; i<4; i++) {
> -        dst2013[i] += stride2013[i] * srcSliceY / 2;
> -        dst1023[i] += stride1023[i] * srcSliceY / 2;
> +        dst2013[i] = FF_PTR_ADD(dst2013[i], stride2013[i] * srcSliceY / 2);
> +        dst1023[i] = FF_PTR_ADD(dst1023[i], stride1023[i] * srcSliceY / 2);
>      }

is there a reason not to check the pointer in the loop ?
as in
for (i = 0; i < 4 && dst[i]; i++)

thx

[...]
Andreas Rheinhardt Sept. 28, 2022, 7:43 p.m. UTC | #2
Michael Niedermayer:
> On Wed, Sep 28, 2022 at 08:39:09PM +0200, Andreas Rheinhardt wrote:
>> Affected the fitsdec-gbrp16 FATE-test.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
>> ---
>>  libswscale/swscale_unscaled.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
>> index 8838cc8b53..0b97377934 100644
>> --- a/libswscale/swscale_unscaled.c
>> +++ b/libswscale/swscale_unscaled.c
>> @@ -695,7 +695,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
>>              }
>>          }
>>          for (i = 0; i < 4; i++)
>> -            dst[i] += dstStride[i] >> 1;
>> +            dst[i] = FF_PTR_ADD(dst[i], dstStride[i] >> 1);
>>      }
>>  }
>>  
>> @@ -729,8 +729,8 @@ static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
>>      }
>>  
>>      for(i=0; i<4; i++) {
>> -        dst2013[i] += stride2013[i] * srcSliceY / 2;
>> -        dst1023[i] += stride1023[i] * srcSliceY / 2;
>> +        dst2013[i] = FF_PTR_ADD(dst2013[i], stride2013[i] * srcSliceY / 2);
>> +        dst1023[i] = FF_PTR_ADD(dst1023[i], stride1023[i] * srcSliceY / 2);
>>      }
> 
> is there a reason not to check the pointer in the loop ?
> as in
> for (i = 0; i < 4 && dst[i]; i++)
> 

I consider NULL + 0 to be sane and would be happy to see it being
defined in a future version of the spec. So I don't like adding checks
to workaround the insanities of the spec. Notice that FF_PTR_ADD() is
designed to allow the compiler to optimize the check away.

- Andreas
Michael Niedermayer Sept. 28, 2022, 8:03 p.m. UTC | #3
On Wed, Sep 28, 2022 at 09:43:56PM +0200, Andreas Rheinhardt wrote:
> Michael Niedermayer:
> > On Wed, Sep 28, 2022 at 08:39:09PM +0200, Andreas Rheinhardt wrote:
> >> Affected the fitsdec-gbrp16 FATE-test.
> >>
> >> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> >> ---
> >>  libswscale/swscale_unscaled.c | 6 +++---
> >>  1 file changed, 3 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> >> index 8838cc8b53..0b97377934 100644
> >> --- a/libswscale/swscale_unscaled.c
> >> +++ b/libswscale/swscale_unscaled.c
> >> @@ -695,7 +695,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
> >>              }
> >>          }
> >>          for (i = 0; i < 4; i++)
> >> -            dst[i] += dstStride[i] >> 1;
> >> +            dst[i] = FF_PTR_ADD(dst[i], dstStride[i] >> 1);
> >>      }
> >>  }
> >>  
> >> @@ -729,8 +729,8 @@ static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
> >>      }
> >>  
> >>      for(i=0; i<4; i++) {
> >> -        dst2013[i] += stride2013[i] * srcSliceY / 2;
> >> -        dst1023[i] += stride1023[i] * srcSliceY / 2;
> >> +        dst2013[i] = FF_PTR_ADD(dst2013[i], stride2013[i] * srcSliceY / 2);
> >> +        dst1023[i] = FF_PTR_ADD(dst1023[i], stride1023[i] * srcSliceY / 2);
> >>      }
> > 
> > is there a reason not to check the pointer in the loop ?
> > as in
> > for (i = 0; i < 4 && dst[i]; i++)
> > 
> 
> I consider NULL + 0 to be sane and would be happy to see it being
> defined in a future version of the spec. 

i agree but that will not help our code for a long time


> So I don't like adding checks
> to workaround the insanities of the spec. 

Ive seen this less as a workaround and more as a "only work on
the active/used pointers"
a dst[i] check is more used elsewhere in sws too
but i really dont have much of an oppinon

libswscale/slice.c:    for (i = 0; i < 4 && src[i] != NULL; ++i) {
libswscale/swscale.c:            for (i = 0; i < 4 && src2[i]; i++) {
libswscale/swscale.c:            for (i = 0; i < 4 && dst2[i]; i++) {
libswscale/swscale_unscaled.c:    for (plane = 0; plane < 4 && dst[plane] != NULL; plane++) {
libswscale/tests/swscale.c:    for (i = 0; i < 4 && dstStride[i]; i++)
libswscale/swscale.c:        for (int i = 0; i < FF_ARRAY_ELEMS(dst) && parent->frame_dst->data[i]; i++) {

[...]
diff mbox series

Patch

diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 8838cc8b53..0b97377934 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -695,7 +695,7 @@  static void packed16togbra16(const uint8_t *src, int srcStride,
             }
         }
         for (i = 0; i < 4; i++)
-            dst[i] += dstStride[i] >> 1;
+            dst[i] = FF_PTR_ADD(dst[i], dstStride[i] >> 1);
     }
 }
 
@@ -729,8 +729,8 @@  static int Rgb16ToPlanarRgb16Wrapper(SwsContext *c, const uint8_t *src[],
     }
 
     for(i=0; i<4; i++) {
-        dst2013[i] += stride2013[i] * srcSliceY / 2;
-        dst1023[i] += stride1023[i] * srcSliceY / 2;
+        dst2013[i] = FF_PTR_ADD(dst2013[i], stride2013[i] * srcSliceY / 2);
+        dst1023[i] = FF_PTR_ADD(dst1023[i], stride1023[i] * srcSliceY / 2);
     }
 
     switch (c->srcFormat) {