Quoting Mark Thompson (2017-03-05 00:57:29)
> Adds functions to convert to/from strings and a function to iterate
> over all supported device types.  Also adds a new invalid type
> AV_HWDEVICE_TYPE_NONE, which acts as a sentinel value.
> ---
>  libavutil/hwcontext.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  libavutil/hwcontext.h | 28 ++++++++++++++++++++++++++++
>  2 files changed, 74 insertions(+)
> 
> diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
> index 252dd32e3..8195a7245 100644
> --- a/libavutil/hwcontext.c
> +++ b/libavutil/hwcontext.c
> @@ -47,6 +47,52 @@ static const HWContextType * const hw_table[] = {
>      NULL,
>  };
>  
> +static const struct {
> +    enum AVHWDeviceType type;
> +    const char *name;
> +} hw_type_map[] = {
> +    { AV_HWDEVICE_TYPE_CUDA,   "cuda"   },
> +    { AV_HWDEVICE_TYPE_DXVA2,  "dxva2"  },
> +    { AV_HWDEVICE_TYPE_QSV,    "qsv"    },
> +    { AV_HWDEVICE_TYPE_VAAPI,  "vaapi"  },
> +    { AV_HWDEVICE_TYPE_VDPAU,  "vdpau"  },
> +};
> +
> +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
> +{
> +    int i;
> +    for (i = 0; i < FF_ARRAY_ELEMS(hw_type_map); i++) {
> +        if (!strcmp(hw_type_map[i].name, name))
> +            return hw_type_map[i].type;
> +    }
> +    return AV_HWDEVICE_TYPE_NONE;
> +}
> +
> +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type)
> +{
> +    int i;
> +    for (i = 0; i < FF_ARRAY_ELEMS(hw_type_map); i++) {
> +        if (hw_type_map[i].type == type)
> +            return hw_type_map[i].name;
> +    }
> +    return NULL;
> +}
> +
> +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev)
> +{
> +    enum AVHWDeviceType next;
> +    int i, set = 0;
> +    for (i = 0; hw_table[i]; i++) {
> +        if (prev != AV_HWDEVICE_TYPE_NONE && hw_table[i]->type <= prev)
> +            continue;
> +        if (!set || hw_table[i]->type < next) {
> +            next = hw_table[i]->type;
> +            set = 1;
> +        }
> +    }
> +    return set ? next : AV_HWDEVICE_TYPE_NONE;
> +}
> +
>  static const AVClass hwdevice_ctx_class = {
>      .class_name = "AVHWDeviceContext",
>      .item_name  = av_default_item_name,
> diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h
> index 49c7a21c1..cce7cdc7e 100644
> --- a/libavutil/hwcontext.h
> +++ b/libavutil/hwcontext.h
> @@ -30,6 +30,8 @@ enum AVHWDeviceType {
>      AV_HWDEVICE_TYPE_VAAPI,
>      AV_HWDEVICE_TYPE_DXVA2,
>      AV_HWDEVICE_TYPE_QSV,
> +
> +    AV_HWDEVICE_TYPE_NONE
>  };
>  
>  typedef struct AVHWDeviceInternal AVHWDeviceInternal;
> @@ -223,6 +225,32 @@ typedef struct AVHWFramesContext {
>  } AVHWFramesContext;
>  
>  /**
> + * Look up an AVHWDeviceType by name.
> + *
> + * @param name String name of the device type (case-insensitive).
> + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if
> + *         not found.
> + */
> +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name);
> +
> +/** Get the string name of an AVHWDeviceType.
> + *
> + * @param type Type from enum AVHWDeviceType.
> + * @return Pointer to a static string containing the name, or NULL if the 
> type
> + *         is not valid.
> + */
> +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type);
> +
> +/**
> + * Iterate over supported device types.
> + *
> + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type
> + *             returned by this function in subsequent iterations.
> + * @return The next usable device type from enum AVHWDeviceType.
> + */

Better mention explicitly that TYPE_NONE is returned at the end.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to