This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 987ca0c68268709df583f9f058e464453674fea2
Author: SPRESENSE <[email protected]>
AuthorDate: Fri Jan 20 17:31:28 2023 +0900

    boards: cxd56_imageproc: Fix some bugs in imageproc driver
    
    - Fix resize scaling factor setting mistakes
    - Fix input vertical size check is not worked
    - Fix comment mistakes and style in header file
---
 boards/arm/cxd56xx/common/src/cxd56_imageproc.c    |  81 ++++-----------
 .../cxd56xx/spresense/include/cxd56_imageproc.h    | 115 +++++++++++----------
 2 files changed, 79 insertions(+), 117 deletions(-)

diff --git a/boards/arm/cxd56xx/common/src/cxd56_imageproc.c 
b/boards/arm/cxd56xx/common/src/cxd56_imageproc.c
index 41eff6c9ad..2622406611 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_imageproc.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_imageproc.c
@@ -83,7 +83,6 @@
 #define ISE_SRC_VSIZE_MAX   (2160)
 #define ISE_DST_HSIZE_MAX   (768)
 #define ISE_DST_VSIZE_MAX   (1024)
-#define MAX_RATIO           (64)
 
 /* Command code */
 
@@ -228,53 +227,31 @@ static int intr_handler_rot(int irq, void *context, void 
*arg)
   return 0;
 }
 
-static int ratio_check(uint16_t src, uint16_t dest)
-{
-  uint16_t ratio = 1;
-
-  if (src > dest)
-    {
-      ratio = src / dest;
-    }
-  else if (src < dest)
-    {
-      ratio = dest / src;
-    }
-
-  if (ratio > MAX_RATIO)
-    {
-      return -1;
-    }
-
-  return 0;
-}
-
 static uint16_t calc_ratio(uint16_t src, uint16_t dest)
 {
   uint16_t r;
 
-  if (src > dest)
-    {
-      r = src / dest;
-      if (r == 2 || r == 4 || r == 8 || r == 16 || r == 32 || r == 64)
-        {
-          return 256 * r;
-        }
-    }
-  else if (src < dest)
+  /* Calculate scale factor for the ratio
+   *
+   * ratio = 256 / scalefactor
+   *
+   * scalefactor is from 16383 (=x1/64) to 4 (=x64).
+   * Actually, scalefactor of x1/64 is 16384, but hardware
+   * can take 14 bits (0x3fff), so we need set 16383 for x1/64.
+   */
+
+  r = (uint32_t)src * 256 / dest;
+  if (r == 16384)
     {
-      r = dest / src;
-      if (r == 2 || r == 4 || r == 8 || r == 16 || r == 32 || r == 64)
-        {
-          return 256 / r;
-        }
+      r = 16383;
     }
-  else
+
+  if (r < 4 || r > 16383)
     {
-      return 256;
+      return 0;
     }
 
-  return 0;
+  return r;
 }
 
 static void *set_rop_cmd(void *cmdbuf,
@@ -356,8 +333,8 @@ static void *set_rop_cmd(void *cmdbuf,
 
       sc->desth = destwidth - 1;
       sc->destv = destheight - 1;
-      sc->ratiov = rv - 1;
-      sc->ratioh = rh - 1;
+      sc->ratiov = rv;
+      sc->ratioh = rh;
       sc->hphaseinit = 1;
       sc->vphaseinit = 1;
       sc->intpmode = 0;         /* XXX: HV Linear interpolation */
@@ -629,19 +606,13 @@ int imageproc_resize(uint8_t * ibuf,
     }
 
   if ((ihsize > ISE_SRC_HSIZE_MAX || ihsize < HSIZE_MIN) ||
-      (ivsize > ISE_SRC_VSIZE_MAX || ihsize < VSIZE_MIN) ||
+      (ivsize > ISE_SRC_VSIZE_MAX || ivsize < VSIZE_MIN) ||
       (ohsize > ISE_DST_HSIZE_MAX || ohsize < HSIZE_MIN) ||
       (ovsize > ISE_DST_VSIZE_MAX || ovsize < VSIZE_MIN))
     {
       return -EINVAL;
     }
 
-  if ((ratio_check(ihsize, ohsize) != 0) ||
-      (ratio_check(ivsize, ovsize) != 0))
-    {
-      return -EINVAL;
-    }
-
   ret = nxmutex_lock(&g_gelock);
   if (ret)
     {
@@ -714,7 +685,7 @@ int imageproc_clip_and_resize(uint8_t * ibuf,
     }
 
   if ((ihsize > ISE_SRC_HSIZE_MAX || ihsize < HSIZE_MIN) ||
-      (ivsize > ISE_SRC_VSIZE_MAX || ihsize < VSIZE_MIN) ||
+      (ivsize > ISE_SRC_VSIZE_MAX || ivsize < VSIZE_MIN) ||
       (ohsize > ISE_DST_HSIZE_MAX || ohsize < HSIZE_MIN) ||
       (ovsize > ISE_DST_VSIZE_MAX || ovsize < VSIZE_MIN))
     {
@@ -737,24 +708,12 @@ int imageproc_clip_and_resize(uint8_t * ibuf,
       clip_width = clip_rect->x2 - clip_rect->x1 + 1;
       clip_height = clip_rect->y2 - clip_rect->y1 + 1;
 
-      if ((ratio_check(clip_width, ohsize) != 0) ||
-          (ratio_check(clip_height, ovsize) != 0))
-        {
-          return -EINVAL;
-        }
-
       pix_bytes = bpp >> 3;
       ibuf = ibuf + (clip_rect->x1 * pix_bytes +
                      clip_rect->y1 * ihsize * pix_bytes);
     }
   else
     {
-      if ((ratio_check(ihsize, ohsize) != 0) ||
-          (ratio_check(ivsize, ovsize) != 0))
-        {
-          return -EINVAL;
-        }
-
       clip_width = ihsize;
       clip_height = ivsize;
     }
diff --git a/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h 
b/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h
index a0671849c2..25299388b1 100644
--- a/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h
+++ b/boards/arm/cxd56xx/spresense/include/cxd56_imageproc.h
@@ -40,51 +40,51 @@ extern "C"
  * right bottom point.
  */
 
-  struct imageproc_rect_s
-    {
-      uint16_t x1;               /* X coordinate of left top point */
-      uint16_t y1;               /* Y coordinate of left top point */
-      uint16_t x2;               /* X coordinate of rignt bottom point */
-      uint16_t y2;               /* Y coordinate of rignt bottom point */
-    };
-  typedef struct imageproc_rect_s imageproc_rect_t;
+struct imageproc_rect_s
+{
+  uint16_t x1;               /* X coordinate of left top point */
+  uint16_t y1;               /* Y coordinate of left top point */
+  uint16_t x2;               /* X coordinate of rignt bottom point */
+  uint16_t y2;               /* Y coordinate of rignt bottom point */
+};
+typedef struct imageproc_rect_s imageproc_rect_t;
 
 /* Enumeration of image type */
 
-  enum imageproc_imginfo_e
-    {
-      IMAGEPROC_IMGTYPE_SINGLE = 0, /* All pixels have the same value */
-      IMAGEPROC_IMGTYPE_BINARY = 1, /* Each pixels have 0 or specific non-zero 
value */
-      IMAGEPROC_IMGTYPE_8BPP   = 2, /* Each pixels have 8bit value */
-      IMAGEPROC_IMGTYPE_16BPP  = 3, /* Each pixels have 16bit value */
-    };
+enum imageproc_imginfo_e
+{
+  IMAGEPROC_IMGTYPE_SINGLE = 0, /* All pixels have the same value */
+  IMAGEPROC_IMGTYPE_BINARY = 1, /* Each pixels have 0 or specific non-zero 
value */
+  IMAGEPROC_IMGTYPE_8BPP   = 2, /* Each pixels have 8bit value */
+  IMAGEPROC_IMGTYPE_16BPP  = 3, /* Each pixels have 16bit value */
+};
 
 /* Structure of binary image */
 
-  struct imageproc_binary_img_s
-    {
-      uint8_t *p_u8;      /* 1bpp image */
-      int     multiplier; /* specific non-zero value */
-    };
-  typedef struct imageproc_binary_img_s imageproc_binary_img_t;
+struct imageproc_binary_img_s
+{
+  uint8_t *p_u8;      /* 1bpp image */
+  int     multiplier; /* specific non-zero value */
+};
+typedef struct imageproc_binary_img_s imageproc_binary_img_t;
 
 /* Structure of image information. */
 
-  struct imageproc_imginfo_s
-    {
-      enum imageproc_imginfo_e type;     /* Type of image data    */
-      int  w;                            /* width  of total image */
-      int  h;                            /* height of total image */
-      imageproc_rect_t *rect;            /* clipped rectangle     */
-      union
-        {
-          int                    single; /* type = IMAGEPROC_IMGTYPE_SINGLE */
-          imageproc_binary_img_t binary; /* type = IMAGEPROC_IMGTYPE_BINARY */
-          uint8_t                *p_u8;  /* type = IMAGEPROC_IMGTYPE_8BPP   */
-          uint16_t               *p_u16; /* type = IMAGEPROC_IMGTYPE_16BPP  */
-        } img;
-    };
-  typedef struct imageproc_imginfo_s imageproc_imginfo_t;
+struct imageproc_imginfo_s
+{
+  enum imageproc_imginfo_e type;     /* Type of image data    */
+  int  w;                            /* width  of total image */
+  int  h;                            /* height of total image */
+  imageproc_rect_t *rect;            /* clipped rectangle     */
+  union
+  {
+    int                    single; /* type = IMAGEPROC_IMGTYPE_SINGLE */
+    imageproc_binary_img_t binary; /* type = IMAGEPROC_IMGTYPE_BINARY */
+    uint8_t                *p_u8;  /* type = IMAGEPROC_IMGTYPE_8BPP   */
+    uint16_t               *p_u16; /* type = IMAGEPROC_IMGTYPE_16BPP  */
+  } img;
+};
+typedef struct imageproc_imginfo_s imageproc_imginfo_t;
 
 /****************************************************************************
  * Public Functions Prototypes
@@ -93,12 +93,12 @@ extern "C"
 /* Initialize imageproc library
  */
 
-  void imageproc_initialize(void);
+void imageproc_initialize(void);
 
 /* Finalize imageproc library
  */
 
-  void imageproc_finalize(void);
+void imageproc_finalize(void);
 
 /* Convert color format (YUV to RGB)
  *
@@ -111,8 +111,8 @@ extern "C"
  * return 0 on success, otherwise error code.
  */
 
-  int imageproc_convert_yuv2rgb(uint8_t * ibuf, uint32_t hsize,
-                                uint32_t vsize);
+int imageproc_convert_yuv2rgb(uint8_t * ibuf, uint32_t hsize,
+                              uint32_t vsize);
 
 /* Convert color format (RGB to YUV)
  *
@@ -123,8 +123,8 @@ extern "C"
  * return 0 on success, otherwise error code.
  */
 
-  int imageproc_convert_rgb2yuv(uint8_t * ibuf, uint32_t hsize,
-                                uint32_t vsize);
+int imageproc_convert_rgb2yuv(uint8_t * ibuf, uint32_t hsize,
+                              uint32_t vsize);
 
 /* Convert color format (YUV to grayscale)
  *
@@ -136,8 +136,8 @@ extern "C"
  *  [in] vsize: Vertical size
  */
 
-  void imageproc_convert_yuv2gray(uint8_t * ibuf, uint8_t * obuf,
-                                  size_t hsize, size_t vsize);
+void imageproc_convert_yuv2gray(uint8_t * ibuf, uint8_t * obuf,
+                                size_t hsize, size_t vsize);
 
 /* Resize image
  *
@@ -145,10 +145,10 @@ extern "C"
  * image will be stored to obuf.
  *
  * For ohsize and ovsize, specify output size calculated by multiply
- * in range 1/2^n to 2^n (n=0..5) against ihsize and ivsize.
+ * in range from x1/64 to x64 against ihsize and ivsize.
  *
  * This function can be processing for YUV422 color format.
- *  So all of specified sizes must be multiple of 2.
+ * So all of specified horizontal size must be multiple of 2.
  *
  * And there is limitation about output size below.
  *
@@ -168,11 +168,14 @@ extern "C"
  *  [in] bpp: Bits per pixel (16 or 8)
  *
  * return 0 on success, otherwise error code.
+ *
+ * CAUTION: In enlarge by higher scaling ratio, it may not be output
+ * all of the pixels.
  */
 
-  int imageproc_resize(uint8_t * ibuf, uint16_t ihsize, uint16_t ivsize,
-                       uint8_t * obuf, uint16_t ohsize, uint16_t ovsize,
-                       int bpp);
+int imageproc_resize(uint8_t * ibuf, uint16_t ihsize, uint16_t ivsize,
+                     uint8_t * obuf, uint16_t ohsize, uint16_t ovsize,
+                     int bpp);
 
 /* Clip and Resize image
  *
@@ -188,10 +191,10 @@ extern "C"
  * return 0 on success, otherwise error code.
  */
 
-  int imageproc_clip_and_resize(uint8_t * ibuf, uint16_t ihsize,
-                                uint16_t ivsize, uint8_t * obuf,
-                                uint16_t ohsize, uint16_t ovsize, int bpp,
-                                imageproc_rect_t * clip_rect);
+int imageproc_clip_and_resize(uint8_t * ibuf, uint16_t ihsize,
+                              uint16_t ivsize, uint8_t * obuf,
+                              uint16_t ohsize, uint16_t ovsize, int bpp,
+                              imageproc_rect_t * clip_rect);
 
 /* Execute alpha blending
  *
@@ -217,9 +220,9 @@ extern "C"
  * return 0 on success, otherwise error code.
  */
 
-  int imageproc_alpha_blend(imageproc_imginfo_t *dst, int pos_x, int pos_y,
-                            imageproc_imginfo_t *src,
-                            imageproc_imginfo_t *alpha);
+int imageproc_alpha_blend(imageproc_imginfo_t *dst, int pos_x, int pos_y,
+                          imageproc_imginfo_t *src,
+                          imageproc_imginfo_t *alpha);
 
 #ifdef __cplusplus
 }

Reply via email to