diff options
author | Mark Thompson <sw@jkqxz.net> | 2017-03-04 23:57:40 +0000 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2017-06-14 22:27:32 +0100 |
commit | d59c6a3aebc20cc64cb7a46401cb55f02f4cbe09 (patch) | |
tree | 93d7c8e3cb688736da2b691f14546d86530ac4d4 | |
parent | a97fb14418fd621defec1ea5cd387953407b180d (diff) | |
download | ffmpeg-d59c6a3aebc20cc64cb7a46401cb55f02f4cbe09.tar.gz |
hwcontext: Improve allocation in derived contexts
Use the flags argument of av_hwframe_ctx_create_derived() to pass the
mapping flags which will be used on allocation. Also, set the format
and hardware context on the allocated frame automatically - the user
should not be required to do this themselves.
(cherry picked from commit c5714b51aad41fef56dddac1d542e7fc6b984627)
-rw-r--r-- | doc/APIchanges | 4 | ||||
-rw-r--r-- | libavutil/hwcontext.c | 14 | ||||
-rw-r--r-- | libavutil/hwcontext.h | 4 | ||||
-rw-r--r-- | libavutil/hwcontext_internal.h | 5 | ||||
-rw-r--r-- | libavutil/version.h | 2 |
5 files changed, 26 insertions, 3 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index cedffbf428..5dca6b3e51 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2015-08-28 API changes, most recent first: +2017-06-14 - xxxxxxx - lavu 55.66.100 - hwcontext.h + av_hwframe_ctx_create_derived() now takes some AV_HWFRAME_MAP_* combination + as its flags argument (which was previously unused). + 2017-06-14 - xxxxxxx - lavc 57.99.100 - avcodec.h Add AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH. diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c index ed09c49f2d..5a22194716 100644 --- a/libavutil/hwcontext.c +++ b/libavutil/hwcontext.c @@ -458,6 +458,11 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags) // and map the frame immediately. AVFrame *src_frame; + frame->format = ctx->format; + frame->hw_frames_ctx = av_buffer_ref(hwframe_ref); + if (!frame->hw_frames_ctx) + return AVERROR(ENOMEM); + src_frame = av_frame_alloc(); if (!src_frame) return AVERROR(ENOMEM); @@ -467,7 +472,8 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags) if (ret < 0) return ret; - ret = av_hwframe_map(frame, src_frame, 0); + ret = av_hwframe_map(frame, src_frame, + ctx->internal->source_allocation_map_flags); if (ret) { av_log(ctx, AV_LOG_ERROR, "Failed to map frame into derived " "frame context: %d.\n", ret); @@ -819,6 +825,12 @@ int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, goto fail; } + dst->internal->source_allocation_map_flags = + flags & (AV_HWFRAME_MAP_READ | + AV_HWFRAME_MAP_WRITE | + AV_HWFRAME_MAP_OVERWRITE | + AV_HWFRAME_MAP_DIRECT); + ret = AVERROR(ENOSYS); if (src->internal->hw_type->frames_derive_from) ret = src->internal->hw_type->frames_derive_from(dst, src, flags); diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h index 37e8831f6b..edf12cc631 100644 --- a/libavutil/hwcontext.h +++ b/libavutil/hwcontext.h @@ -566,7 +566,9 @@ int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); * AVHWFramesContext on. * @param source_frame_ctx A reference to an existing AVHWFramesContext * which will be mapped to the derived context. - * @param flags Currently unused; should be set to zero. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. * @return Zero on success, negative AVERROR code on failure. */ int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h index 0a0c4e86ce..68f78c0a1f 100644 --- a/libavutil/hwcontext_internal.h +++ b/libavutil/hwcontext_internal.h @@ -121,6 +121,11 @@ struct AVHWFramesInternal { * context it was derived from. */ AVBufferRef *source_frames; + /** + * Flags to apply to the mapping from the source to the derived + * frame context when trying to allocate in the derived context. + */ + int source_allocation_map_flags; }; typedef struct HWMapDescriptor { diff --git a/libavutil/version.h b/libavutil/version.h index 322b683cf4..308d16f95b 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -80,7 +80,7 @@ #define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 65 +#define LIBAVUTIL_VERSION_MINOR 66 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ |