Quoting Mark Thompson (2017-03-07 23:02:26)
> On 07/03/17 20:42, Anton Khirnov wrote:
> > Quoting Mark Thompson (2017-03-05 00:57:47)
> >> ---
> >>  configure                      |    5 +-
> >>  doc/APIchanges                 |    4 +
> >>  libavutil/Makefile             |    2 +
> >>  libavutil/hwcontext.c          |    4 +
> >>  libavutil/hwcontext.h          |    1 +
> >>  libavutil/hwcontext_internal.h |    1 +
> >>  libavutil/hwcontext_opencl.c   | 1182 
> >> ++++++++++++++++++++++++++++++++++++++++
> >>  libavutil/hwcontext_opencl.h   |  117 ++++
> >>  libavutil/version.h            |    2 +-
> >>  9 files changed, 1316 insertions(+), 2 deletions(-)
> >>  create mode 100644 libavutil/hwcontext_opencl.c
> >>  create mode 100644 libavutil/hwcontext_opencl.h
> >>
> >> +static int opencl_device_create_internal(AVHWDeviceContext *ctx,
> >> +                                         const char *device,
> >> +                                         AVDictionary *opts, int flags,
> >> +                                         cl_context_properties *props)
> >> +{
> >> +    cl_uint      nb_platforms;
> >> +    cl_platform_id *platforms = NULL;
> >> +    cl_uint      nb_devices;
> >> +    cl_device_id   *devices = NULL;
> >> +    cl_device_type  device_type;
> >> +    AVOpenCLDeviceContext *hwctx = ctx->hwctx;
> >> +    cl_int cle;
> >> +    const AVDictionaryEntry *param;
> >> +    cl_context_properties default_props[3];
> >> +    char *str;
> >> +    int p_index = -1, d_index = -1;
> >> +    int ret, found, p, d, i;
> >> +
> >> +    if (device && device[0]) {
> >> +        // Match one or both indices for platform and device.
> >> +        if (device[0] == '.')
> >> +            ret = sscanf(device, ".%d", &d_index);
> >> +        else
> >> +            ret = sscanf(device, "%d.%d", &p_index, &d_index);
> >> +        if (ret < 1) {
> >> +            av_log(ctx, AV_LOG_ERROR, "Invalid OpenCL platform/device "
> >> +                   "index specification \"%s\".\n", device);
> >> +            return AVERROR(EINVAL);
> >> +        }
> >> +    }
> >> +
> >> +    cle = clGetPlatformIDs(0, NULL, &nb_platforms);
> >> +    if (cle != CL_SUCCESS) {
> >> +        av_log(ctx, AV_LOG_ERROR, "Failed to get number of "
> >> +               "OpenCL platforms: %d.\n", cle);
> >> +        ret = AVERROR(ENOSYS);
> >> +        goto fail;
> >> +    }
> >> +    av_log(ctx, AV_LOG_DEBUG, "%d OpenCL platforms found.\n",
> >> +           nb_platforms);
> >> +
> >> +    platforms = av_malloc_array(nb_platforms, sizeof(*platforms));
> >> +    if (!platforms) {
> >> +        ret = AVERROR(ENOMEM);
> >> +        goto fail;
> >> +    }
> >> +
> >> +    cle = clGetPlatformIDs(nb_platforms, platforms, NULL);
> >> +    if (cle != CL_SUCCESS) {
> >> +        av_log(ctx, AV_LOG_ERROR, "Failed to get list of OpenCL "
> >> +               "platforms: %d.\n", cle);
> >> +        ret = AVERROR(ENOSYS);
> >> +        goto fail;
> >> +    }
> >> +
> >> +    param = av_dict_get(opts, "device_type", NULL, 0);
> >> +    if (param) {
> >> +        device_type = 0;
> >> +        for (i = 0; i < FF_ARRAY_ELEMS(opencl_device_types); i++) {
> >> +            if (!strcmp(opencl_device_types[i].key, param->value)) {
> >> +                device_type = opencl_device_types[i].type;
> >> +                break;
> >> +            }
> >> +        }
> >> +        if (!device_type) {
> >> +            av_log(ctx, AV_LOG_ERROR, "Unknown device type %s.\n",
> >> +                   param->value);
> >> +            ret = AVERROR(EINVAL);
> >> +            goto fail;
> >> +        }
> >> +    } else {
> >> +        device_type = CL_DEVICE_TYPE_DEFAULT;
> >> +    }
> >> +
> >> +    found = 0;
> >> +    for (p = 0; p < nb_platforms; p++) {
> > 
> > nit: i think moving the contents of the loop into a separate function
> > would make this easier to read
> 
> Yeah, it's a bit horrible - I'll see if I can split it up more nicely.
> 
> >> +/**
> >> + * OpenCL frame descriptor for pool allocation.
> >> + *
> >> + * In user-allocated pools, AVHWFramesContext.pool must return 
> >> AVBufferRefs
> >> + * with the data pointer pointing at an object of this type describing the
> >> + * planes of the frame.
> >> + */
> >> +typedef struct AVOpenCLFrameDescriptor {
> >> +    /**
> >> +     * OpenCL image2d objects for each plane of the frame.  Unused fields
> >> +     * must be set to NULL.
> >> +     */
> >> +    cl_mem image[AV_NUM_DATA_POINTERS];
> >> +    /**
> >> +     * Some combination of AV_OPENCL_FRAME_* flags.
> >> +     */
> >> +    int    flags;
> >> +    /**
> >> +     * If AV_OPENCL_FRAME_IMAGE2D_FROM_BUFFER is set in flags, this 
> >> contains
> >> +     * the OpenCL buffer object from which all of the plane images were
> >> +     * created.
> >> +     */
> >> +    cl_mem source_buffer;
> >> +} AVOpenCLFrameDescriptor;
> >> +
> >> +/**
> >> + * OpenCL device details.
> >> + *
> >> + * Allocated as AVHWDeviceContext.hwctx
> >> + */
> >> +typedef struct AVOpenCLDeviceContext {
> >> +    /**
> >> +     * The platform ID of the device.
> >> +     */
> >> +    cl_platform_id   platform_id;
> > 
> > Can't you query this from the device?
> 
> Yes, but it seemed nicer for the user to have both parts directly accessible 
> here?

What would the user actually use it for? Also, wouldn't it then make
more sense to always have it set by lavu? If I'm reading correctly, it's
currently set by the caller.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to