From: "Németh Márton" <nm127@freemail.hu>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: V4L Mailing List <linux-media@vger.kernel.org>
Subject: Re: [PATCH] soc_camera: match signedness of soc_camera_limit_side()
Date: Wed, 27 Jan 2010 22:42:02 +0100 [thread overview]
Message-ID: <4B60B32A.5090806@freemail.hu> (raw)
In-Reply-To: <Pine.LNX.4.64.1001272109470.5073@axis700.grange>
[-- Attachment #1: Type: text/plain, Size: 1810 bytes --]
Guennadi Liakhovetski wrote:
> You didn't reply to my most important objection:
>
> On Wed, 27 Jan 2010, Németh Márton wrote:
>
>> diff -r 31eaa9423f98 linux/include/media/soc_camera.h
>> --- a/linux/include/media/soc_camera.h Mon Jan 25 15:04:15 2010 -0200
>> +++ b/linux/include/media/soc_camera.h Wed Jan 27 20:49:57 2010 +0100
>> @@ -264,9 +264,8 @@
>> common_flags;
>> }
>>
>> -static inline void soc_camera_limit_side(unsigned int *start,
>> - unsigned int *length, unsigned int start_min,
>> - unsigned int length_min, unsigned int length_max)
>> +static inline void soc_camera_limit_side(int *start, int *length,
>> + int start_min, int length_min, int length_max)
>> {
>> if (*length < length_min)
>> *length = length_min;
>
> I still do not believe this function will work equally well with signed
> parameters, as it works with unsigned ones.
I implemented some test cases to find out whether the
soc_camera_limit_side() works correctly or not. My biggest problem is that I'm
not sure what is the expected working of the soc_camera_limit_side() function.
Nevertheless I tried expect some values, you can probably verify whether my
expectations are correct or not (see the test attached).
The signed and unsigned version of the function works differently because
the unsigned version cannot accept negative values. These values will be
implicitly casted to an unsigned value which means that they will be interpreted
as a big positive value.
Here are the test results:
Test Case 1: PASSED
Test Case 2: PASSED
Test Case 3: FAILED: start=50, length=8, start_unsigned=0, length_unsigned=1600
Test Case 4: PASSED
Test Case 5: PASSED
Test Case 6: PASSED
Test Case 7: PASSED
Test Case 8: PASSED
There is a difference in case 3, but which is the correct one?
Regard,
Márton Németh
[-- Attachment #2: test.c --]
[-- Type: text/x-csrc, Size: 4920 bytes --]
#include <stdio.h>
static inline void soc_camera_limit_side_UNSIGNED(unsigned int *start, unsigned int *length,
unsigned int start_min, unsigned int length_min, unsigned int length_max)
{
if (*length < length_min)
*length = length_min;
else if (*length > length_max)
*length = length_max;
if (*start < start_min)
*start = start_min;
else if (*start > start_min + length_max - *length)
*start = start_min + length_max - *length;
}
static inline void soc_camera_limit_side(int *start, int *length,
int start_min, int length_min, int length_max)
{
if (*length < length_min)
*length = length_min;
else if (*length > length_max)
*length = length_max;
if (*start < start_min)
*start = start_min;
else if (*start > start_min + length_max - *length)
*start = start_min + length_max - *length;
}
int main() {
int start, length;
unsigned int start_unsigned, length_unsigned;
printf("Test Case 1: ");
start = 0;
length = 8;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 0, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 0, 8, 1600);
if (start == 0 && length == 8 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 2: ");
start = -5;
length = 1600;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 0, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 0, 8, 1600);
if (start == 0 && length == 1600 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 3: ");
start = 50;
length = -15;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 0, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 0, 8, 1600);
if (start == 50 && length == 8 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 4: ");
start = 500;
length = 2000;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 0, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 0, 8, 1600);
if (start == 0 && length == 1600 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 5: ");
start = -20;
length = 1600;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 100, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 100, 8, 1600);
if (start == 100 && length == 1600 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 6: ");
start = 1600;
length = 1600;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 100, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 100, 8, 1600);
if (start == 100 && length == 1600 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 7: ");
start = 5;
length = 300;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 100, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 100, 8, 1600);
if (start == 100 && length == 300 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
printf("Test Case 8: ");
start = 200;
length = 4;
start_unsigned = start;
length_unsigned = length;
soc_camera_limit_side(&start, &length, 100, 8, 1600);
soc_camera_limit_side_UNSIGNED(&start_unsigned, &length_unsigned, 100, 8, 1600);
if (start == 200 && length == 8 && start_unsigned == start && length_unsigned == length) {
printf("PASSED\n");
} else {
printf("FAILED: start=%i, length=%i, start_unsigned=%i, length_unsigned=%i\n", start, length, start_unsigned, length_unsigned);
}
return 0;
}
next prev parent reply other threads:[~2010-01-27 21:42 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-23 13:43 [PATCH] soc_camera: match signedness of soc_camera_limit_side() Németh Márton
2010-01-27 16:05 ` Guennadi Liakhovetski
2010-01-27 18:11 ` Németh Márton
2010-01-27 18:22 ` Guennadi Liakhovetski
2010-01-27 19:58 ` Németh Márton
2010-01-27 20:12 ` Guennadi Liakhovetski
2010-01-27 21:42 ` Németh Márton [this message]
2010-01-28 20:52 ` Guennadi Liakhovetski
2010-01-28 21:30 ` Németh Márton
2010-02-09 9:05 ` Guennadi Liakhovetski
2010-02-12 9:32 ` Guennadi Liakhovetski
2010-02-24 6:32 ` Németh Márton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B60B32A.5090806@freemail.hu \
--to=nm127@freemail.hu \
--cc=g.liakhovetski@gmx.de \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox