[FFmpeg-devel] [PATCH] lavfi/unsharp: fix opencl crushed on 64bit linux

Wei Gao highgod0401 at gmail.com
Sat May 4 02:09:48 CEST 2013


2013/5/4 Stefano Sabatini <stefasab at gmail.com>

> On date Friday 2013-05-03 15:50:59 +0800, Wei Gao encoded:
> >
>
> Replace "crushed" with "crash" in the patch subject line.
>
> > From 767ac68cb1734b9320b615b2a8e112ebe7add102 Mon Sep 17 00:00:00 2001
> > From: highgod0401 <highgod0401 at gmail.com>
> > Date: Fri, 3 May 2013 15:46:57 +0800
> > Subject: [PATCH] lavfi/unsharp: fix opencl crushed on 64bit linux
> >
> > ---
> >  libavfilter/unsharp_opencl.c | 35 ++++++++++++++++++++---------------
> >  1 file changed, 20 insertions(+), 15 deletions(-)
> >
> > diff --git a/libavfilter/unsharp_opencl.c b/libavfilter/unsharp_opencl.c
> > index e9a4c93..3de878e 100644
> > --- a/libavfilter/unsharp_opencl.c
> > +++ b/libavfilter/unsharp_opencl.c
> > @@ -51,7 +51,7 @@ static int compute_mask(int step, uint32_t *mask)
> >          ret = AVERROR(ENOMEM);
> >          goto end;
> >      }
> > -    counter = av_mallocz(counter_size);
> > +    counter = av_mallocz(sizeof(uint32_t *) * (2 * step + 1));
> >      if (!counter) {
> >          ret = AVERROR(ENOMEM);
> >          goto end;
>
> This hunk seems correct (uh embarassing bug I overlooked).
>
> > @@ -88,13 +88,15 @@ static int compute_mask_matrix(cl_mem
> cl_mask_matrix, int step_x, int step_y)
> >  {
> >      int i, j, ret = 0;
> >      uint32_t *mask_matrix, *mask_x, *mask_y;
> > -    size_t size_matrix = sizeof(uint32_t) * (2 * step_x + 1) * (2 *
> step_y + 1);
> > -    mask_x = av_mallocz(sizeof(uint32_t) * (2 * step_x + 1));
> > +    size_t size_x = sizeof(uint32_t) * (2 * step_x + 1);
> > +    size_t size_y = sizeof(uint32_t) * (2 * step_y + 1);
> > +    size_t size_matrix = size_x * size_y;
> > +    mask_x = av_mallocz(size_x);
> >      if (!mask_x) {
> >          ret = AVERROR(ENOMEM);
> >          goto end;
> >      }
> > -    mask_y = av_mallocz(sizeof(uint32_t) * (2 * step_y + 1));
> > +    mask_y = av_mallocz(size_y);
> >      if (!mask_y) {
> >          ret = AVERROR(ENOMEM);
> >          goto end;
> > @@ -200,21 +202,24 @@ int ff_opencl_apply_unsharp(AVFilterContext *ctx,
> AVFrame *in, AVFrame *out)
> >
> >  int ff_opencl_unsharp_init(AVFilterContext *ctx)
> >  {
> > -    int ret = 0;
> > +    int ret = 0, i;
> >      UnsharpContext *unsharp = ctx->priv;
> > +    size_t size_x[2], size_y[2];
> > +    cl_mem *mask_matrix[2];
> > +    mask_matrix[0] = &unsharp->opencl_ctx.cl_luma_mask;
> > +    mask_matrix[1] = &unsharp->opencl_ctx.cl_chroma_mask;
> > +    size_x[0] = sizeof(uint32_t) * (2 * unsharp->luma.steps_x + 1);
> > +    size_x[1] = sizeof(uint32_t) * (2 * unsharp->chroma.steps_x + 1);
> > +    size_y[0] = sizeof(uint32_t) * (2 * unsharp->luma.steps_y + 1);
> > +    size_y[1] = sizeof(uint32_t) * (2 * unsharp->chroma.steps_y + 1);
> >      ret = av_opencl_init(NULL);
> >      if (ret < 0)
> >          return ret;
> > -    ret = av_opencl_buffer_create(&unsharp->opencl_ctx.cl_luma_mask,
> > -                                  sizeof(uint32_t) * (2 *
> unsharp->luma.steps_x + 1) * (2 * unsharp->luma.steps_y + 1),
> > -                                  CL_MEM_READ_ONLY, NULL);
> > -    if (ret < 0)
> > -        return ret;
> > -    ret = av_opencl_buffer_create(&unsharp->opencl_ctx.cl_chroma_mask,
> > -                                  sizeof(uint32_t) * (2 *
> unsharp->chroma.steps_x + 1) * (2 * unsharp->chroma.steps_y + 1),
> > -                                  CL_MEM_READ_ONLY, NULL);
> > -    if (ret < 0)
> > -        return ret;
> > +    for(i = 0; i < 2; i++) {
>
> Nit++: for_(
>
> Also this looks like unrelated refactoring, right? In this case it
> would be better to put it in a separate patch.
>
Hi, thanks for your reviewing.There is still something I don't understand.
if the size is   "sizeof(uint32_t) * (2 * unsharp->chroma.steps_x + 1) * (2
* unsharp->chroma.steps_y + 1)", the program will crush too, so I tried to
"sizeof(uint32_t) *  sizeof(uint32_t) * (2 * unsharp->chroma.steps_x + 1) *
(2 * unsharp->chroma.steps_y + 1)", then the program is correct, so I use
size_x * size_y as a matrix size.

>
> > +        ret = av_opencl_buffer_create(mask_matrix[i], size_x[i] *
> size_y[i], CL_MEM_READ_ONLY, NULL);
> > +        if (ret < 0)
> > +            return ret;
> > +    }
> >      ret = generate_mask(ctx);
> >      if (ret < 0)
> >          return ret;
> [...]
> --
> FFmpeg = Forgiving Fostering Mean Proud Emblematic Game
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list