From dc923bc23b3efd949d0bf67ff1abdb95059e5843 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 11 Oct 2015 22:02:26 +0200 Subject: qsvenc: add an API for allocating opaque surfaces --- libavcodec/qsv.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'libavcodec/qsv.h') diff --git a/libavcodec/qsv.h b/libavcodec/qsv.h index 922b8582a4..1d1f8b47a7 100644 --- a/libavcodec/qsv.h +++ b/libavcodec/qsv.h @@ -23,6 +23,8 @@ #include +#include "libavutil/buffer.h" + /** * This struct is used for communicating QSV parameters between libavcodec and * the caller. It is managed by the caller and must be assigned to @@ -48,6 +50,51 @@ typedef struct AVQSVContext { */ mfxExtBuffer **ext_buffers; int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; } AVQSVContext; /** -- cgit v1.2.3