mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
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)
This commit is contained in:
parent
a97fb14418
commit
d59c6a3aeb
@ -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)
|
|||||||
// 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)
|
|||||||
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,
|
|||||||
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);
|
|||||||
* 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 {
|
||||||
|
@ -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, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user