On Sun, May 10, 2015 at 2:46 AM, Luca Barbato <[email protected]> wrote:
> From: Stefano Pigozzi <[email protected]>
>
> Signed-off-by: Luca Barbato <[email protected]>
> ---
>
> Will be pushed tomorrow if nobody is against it.
>
>  doc/APIchanges        |  3 +++
>  libavcodec/vda.c      | 27 ++++++++++++++++++++++++++-
>  libavcodec/vda.h      | 18 ++++++++++++++++++
>  libavcodec/vda_h264.c |  5 ++++-
>  libavcodec/version.h  |  4 ++--
>  5 files changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 5934f45..5d39ec6 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -13,6 +13,9 @@ libavutil:     2014-08-09
>
>  API changes, most recent first:
>
> +2015-xx-xx - xxxxxxx - lavc 56.23.0
> +  Add av_vda_default_init2.
> +
>  2015-xx-xx - xxxxxxx - lavu 54.12.0
>    Add AV_LOG_TRACE for extremely verbose debugging.
>
> diff --git a/libavcodec/vda.c b/libavcodec/vda.c
> index f71fb16..a1a14de 100644
> --- a/libavcodec/vda.c
> +++ b/libavcodec/vda.c
> @@ -19,14 +19,34 @@
>  #include "config.h"
>
>  #include "libavutil/mem.h"
> +#include "libavutil/opt.h"
>
>  #include "vda.h"
>  #include "vda_internal.h"
>
> +#define OFFSET(x) offsetof(AVVDAContext, x)
> +#define DEC AV_OPT_FLAG_DECODING_PARAM
> +static const AVOption options[] = {
> +    { "cv_pix_fmt_type", "CVPixelBuffer Format Type of the decoded frames",
> +          OFFSET(cv_pix_fmt_type), AV_OPT_TYPE_INT64,
> +          {.i64 = (uint64_t) kCVPixelFormatType_422YpCbCr8},
> +          INT64_MIN, INT64_MAX, DEC },
> +    { NULL },
> +};
> +
> +static const AVClass vda_context_class = {
> +    .class_name = "VDA context",
> +    .item_name  = av_default_item_name,
> +    .option     = options,
> +    .version    = LIBAVUTIL_VERSION_INT,
> +};
> +
>  #if CONFIG_H264_VDA_HWACCEL
>  AVVDAContext *av_vda_alloc_context(void)
>  {
>      AVVDAContext *ret = av_mallocz(sizeof(*ret));
> +    ret->class = &vda_context_class;
> +    av_opt_set_defaults(ret);
>
>      if (ret)
>          ret->output_callback = ff_vda_output_callback;
> @@ -36,7 +56,12 @@ AVVDAContext *av_vda_alloc_context(void)
>
>  int av_vda_default_init(AVCodecContext *avctx)
>  {
> -    avctx->hwaccel_context = av_vda_alloc_context();
> +    return av_vda_default_init2(avctx, NULL);
> +}
> +
> +int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx)
> +{
> +    avctx->hwaccel_context = vdactx ?: av_vda_alloc_context();
>      if (!avctx->hwaccel_context)
>          return AVERROR(ENOMEM);
>      return ff_vda_default_init(avctx);
> diff --git a/libavcodec/vda.h b/libavcodec/vda.h
> index 9aa5d29..82f45dd 100644
> --- a/libavcodec/vda.h
> +++ b/libavcodec/vda.h
> @@ -143,6 +143,13 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
>   * av_vda_alloc_context() and freed with av_free().
>   */
>  typedef struct AVVDAContext {
> +    // Class for private options
> +    const AVClass *class;
> +
> +    // CVPixelBuffer Format Type that VDA will use for decoded frames; set by
> +    // a private option
> +    OSType cv_pix_fmt_type;
> +
>      /**
>       * VDA decoder object. Created and freed by the caller.
>       */
> @@ -181,6 +188,17 @@ AVVDAContext *av_vda_alloc_context(void);
>  int av_vda_default_init(AVCodecContext *avctx);
>
>  /**
> + * This is a convenience function that sets up the VDA context using an
> + * internal implementation.
> + *
> + * @param avctx the corresponding codec context
> + * @param vdactx the VDA context to use
> + *
> + * @return >= 0 on success, a negative AVERROR code on failure
> + */
> +int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx);
> +
> +/**
>   * This function must be called to free the VDA context initialized with
>   * av_vda_default_init().
>   *
> diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
> index 3c0775b..fb7a9255 100644
> --- a/libavcodec/vda_h264.c
> +++ b/libavcodec/vda_h264.c
> @@ -24,6 +24,7 @@
>  #include <CoreFoundation/CFData.h>
>  #include <CoreFoundation/CFString.h>
>
> +#include "libavutil/opt.h"
>  #include "libavutil/avutil.h"
>  #include "h264.h"
>  #include "internal.h"
> @@ -380,7 +381,9 @@ int ff_vda_default_init(AVCodecContext *avctx)
>      CFMutableDictionaryRef buffer_attributes;
>      CFMutableDictionaryRef io_surface_properties;
>      CFNumberRef cv_pix_fmt;
> -    int32_t fmt = 'avc1', pix_fmt = kCVPixelFormatType_422YpCbCr8;
> +    int32_t fmt = 'avc1';
> +    int64_t pix_fmt;
> +    av_opt_get_int(vda_ctx, "cv_pix_fmt_type", 0, &pix_fmt);
>
>      // kCVPixelFormatType_420YpCbCr8Planar;
>
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 50c2b48..c478ca3 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,8 +29,8 @@
>  #include "libavutil/version.h"
>
>  #define LIBAVCODEC_VERSION_MAJOR 56
> -#define LIBAVCODEC_VERSION_MINOR 23
> -#define LIBAVCODEC_VERSION_MICRO  2
> +#define LIBAVCODEC_VERSION_MINOR 24
> +#define LIBAVCODEC_VERSION_MICRO  0
>
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>                                                 LIBAVCODEC_VERSION_MINOR, \
> --
> 1.9.0
>


You are adding stuff at the beginning of a public struct, thats going
to break ABI. A minor bump isn't going to cut it.

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

Reply via email to