Skip to content
Snippets Groups Projects
Commit d59c6a3a authored by Mark Thompson's avatar Mark Thompson
Browse files

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 c5714b51)
parent a97fb144
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,10 @@ libavutil: 2015-08-28 ...@@ -15,6 +15,10 @@ libavutil: 2015-08-28
API changes, most recent first: 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 2017-06-14 - xxxxxxx - lavc 57.99.100 - avcodec.h
Add AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH. Add AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH.
......
...@@ -458,6 +458,11 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags) ...@@ -458,6 +458,11 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
// and map the frame immediately. // and map the frame immediately.
AVFrame *src_frame; 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(); src_frame = av_frame_alloc();
if (!src_frame) if (!src_frame)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
...@@ -467,7 +472,8 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags) ...@@ -467,7 +472,8 @@ int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
if (ret < 0) if (ret < 0)
return ret; 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) { if (ret) {
av_log(ctx, AV_LOG_ERROR, "Failed to map frame into derived " av_log(ctx, AV_LOG_ERROR, "Failed to map frame into derived "
"frame context: %d.\n", ret); "frame context: %d.\n", ret);
...@@ -819,6 +825,12 @@ int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, ...@@ -819,6 +825,12 @@ int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx,
goto fail; 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); ret = AVERROR(ENOSYS);
if (src->internal->hw_type->frames_derive_from) if (src->internal->hw_type->frames_derive_from)
ret = src->internal->hw_type->frames_derive_from(dst, src, flags); ret = src->internal->hw_type->frames_derive_from(dst, src, flags);
......
...@@ -566,7 +566,9 @@ int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); ...@@ -566,7 +566,9 @@ int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags);
* AVHWFramesContext on. * AVHWFramesContext on.
* @param source_frame_ctx A reference to an existing AVHWFramesContext * @param source_frame_ctx A reference to an existing AVHWFramesContext
* which will be mapped to the derived context. * 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. * @return Zero on success, negative AVERROR code on failure.
*/ */
int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx,
......
...@@ -121,6 +121,11 @@ struct AVHWFramesInternal { ...@@ -121,6 +121,11 @@ struct AVHWFramesInternal {
* context it was derived from. * context it was derived from.
*/ */
AVBufferRef *source_frames; 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 { typedef struct HWMapDescriptor {
......
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
#define LIBAVUTIL_VERSION_MAJOR 55 #define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 65 #define LIBAVUTIL_VERSION_MINOR 66
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment