Hi Kieran,

Thank you for the patch.

On Thursday, 14 December 2017 01:10:12 EET Kieran Bingham wrote:
> From: Kieran Bingham <kieran.bing...@ideasonboard.com>
> 
> Provide a means to compare two identically sized framebuffers.
> 
> This basic implementation expects the two buffers to have the same
> formats and sizes, and will return zero for identical frames, or a
> positive float representing and average difference otherwise.
> 
> Signed-off-by: Kieran Bingham <kieran.bing...@ideasonboard.com>
> ---
>  kms++util/inc/kms++util/kms++util.h |  1 +-
>  kms++util/src/verification.cpp      | 31 ++++++++++++++++++++++++++++++-
>  py/pykms/pykmsutil.cpp              |  2 ++-
>  3 files changed, 34 insertions(+)
> 
> diff --git a/kms++util/inc/kms++util/kms++util.h
> b/kms++util/inc/kms++util/kms++util.h index 431de0bb159a..753cee189451
> 100644
> --- a/kms++util/inc/kms++util/kms++util.h
> +++ b/kms++util/inc/kms++util/kms++util.h
> @@ -29,6 +29,7 @@ void draw_color_bar(IFramebuffer& buf, int old_xpos, int
> xpos, int width); void draw_test_pattern(IFramebuffer &fb, YUVType yuvt =
> YUVType::BT601_Lim);
> 
>  void save_raw_frame(IFramebuffer& fb, const char *filename);
> +float compare_framebuffers(IFramebuffer& a, IFramebuffer& b);
>  }
> 
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
> diff --git a/kms++util/src/verification.cpp b/kms++util/src/verification.cpp
> index 3210bb144d2b..a46d6f924095 100644
> --- a/kms++util/src/verification.cpp
> +++ b/kms++util/src/verification.cpp
> @@ -18,4 +18,35 @@ void save_raw_frame(IFramebuffer& fb, const char
> *filename) os->write((char*)fb.map(i), fb.size(i));
>  }
> 
> +float compare_framebuffers(IFramebuffer& a, IFramebuffer& b)
> +{
> +     unsigned int i;
> +     unsigned int pixels = a.width() * a.height();
> +     uint8_t *pa = a.map(0);
> +     uint8_t *pb = b.map(0);
> +
> +     float diff = 0;
> +
> +     if (a.format() != b.format())
> +             throw std::invalid_argument("Pixel formats differ...");
> +
> +     if ((a.width() != b.width() ||
> +         (a.height() != b.height())))
> +             throw std::invalid_argument("Frame sizes differ...");
> +
> +     // Formats are identical, so num_planes are already identical
> +     for (i = 0; i < a.num_planes(); i++) {
> +             if ((a.offset(i) != b.offset(i)) ||
> +                 (a.stride(i) != b.stride(i)))
> +                     throw std::invalid_argument("Planes differ...");
> +     }

Is this required ? Why can't we compare two image of identical size stored in 
frame buffers with different strides ?

> +     // Simple byte comparisons to start.
> +     // This expects a frame to be identical, including non-visible data.

Do we need to compare the non-visible data ?

> +     for (i = 0; i < a.size(0) && i < b.size(0); i++)
> +             diff += abs(pa[i] - pb[i]);
> +
> +     return diff / pixels;
> +}
> +
>  }
> diff --git a/py/pykms/pykmsutil.cpp b/py/pykms/pykmsutil.cpp
> index 2d741751ba75..b86690a3d306 100644
> --- a/py/pykms/pykmsutil.cpp
> +++ b/py/pykms/pykmsutil.cpp
> @@ -64,4 +64,6 @@ void init_pykmstest(py::module &m)
>       m.def("save_raw_frame", [](Framebuffer& fb, const char * filename) {
>               save_raw_frame(fb, filename);
>       });
> +     m.def("compare_framebuffers", [](Framebuffer& a, Framebuffer& b) {
> +             return compare_framebuffers(a, b); } );
>  }

-- 
Regards,

Laurent Pinchart

Reply via email to