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.tags/n4.0
@@ -13,6 +13,10 @@ libavutil: 2017-03-23 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2017-04-30 - xxxxxxx - lavu 56.1.1 - hwcontext.h | |||||
av_hwframe_ctx_create_derived() now takes some AV_HWFRAME_MAP_* combination | |||||
as its flags argument (which was previously unused). | |||||
2017-04-xx - xxxxxxx - lavu 56.1.0 - spherical.h | 2017-04-xx - xxxxxxx - lavu 56.1.0 - spherical.h | ||||
Add av_spherical_projection_name() and av_spherical_from_name(). | Add av_spherical_projection_name() and av_spherical_from_name(). | ||||
@@ -455,6 +455,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); | ||||
@@ -464,7 +469,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); | ||||
@@ -816,6 +822,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); | ||||
@@ -564,7 +564,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 { | |||||
* 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 { | ||||
@@ -55,7 +55,7 @@ | |||||
#define LIBAVUTIL_VERSION_MAJOR 56 | #define LIBAVUTIL_VERSION_MAJOR 56 | ||||
#define LIBAVUTIL_VERSION_MINOR 1 | #define LIBAVUTIL_VERSION_MINOR 1 | ||||
#define LIBAVUTIL_VERSION_MICRO 0 | |||||
#define LIBAVUTIL_VERSION_MICRO 1 | |||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||
LIBAVUTIL_VERSION_MINOR, \ | LIBAVUTIL_VERSION_MINOR, \ | ||||