mirror of
				https://git.ffmpeg.org/ffmpeg.git
				synced 2025-11-04 09:40:56 +00: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.
This commit is contained in:
		
							parent
							
								
									e1c5d56b18
								
							
						
					
					
						commit
						c5714b51aa
					
				
					 5 changed files with 26 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -13,6 +13,10 @@ libavutil:     2017-03-23
 | 
			
		|||
 | 
			
		||||
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
 | 
			
		||||
  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.
 | 
			
		||||
        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);
 | 
			
		||||
| 
						 | 
				
			
			@ -464,7 +469,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);
 | 
			
		||||
| 
						 | 
				
			
			@ -816,6 +822,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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -564,7 +564,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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,7 +55,7 @@
 | 
			
		|||
 | 
			
		||||
#define LIBAVUTIL_VERSION_MAJOR 56
 | 
			
		||||
#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, \
 | 
			
		||||
                                               LIBAVUTIL_VERSION_MINOR, \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue