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

Stefano Sabatini stefasab at gmail.com
Fri May 3 20:14:58 CEST 2013


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.

> +        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


More information about the ffmpeg-devel mailing list