Async depth will allow qsv filter cache few frames, and avoid force switch and end filter task frame by frame. This change will improve performance for some multi-task case, for example 1:N transcode( decode + vpp + encode) with all QSV plugins. Performance data test on my Coffee Lake Desktop(i7-8700K) by using the following 1:8 transcode test case improvement: 1. Fps improved from 55 to 130. 2. Render/Video usage improved from ~61%/~38% to ~100%/~70%.(Data get from intel_gpu_top) test CMD: ffmpeg -v verbose -init_hw_device qsv=hw:/dev/dri/renderD128 -filter_hw_device \ hw -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i 1920x1080.264 \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - \ -vf 'vpp_qsv=w=1280:h=720:async_depth=4' -c:v h264_qsv -r:v 30 -preset 7 -g 33 -refs 2 -bf 3 -q 24 -f null - Signed-off-by: Fei Wang <fei.w.wang@intel.com> Reviewed-by: Linjie Fu <linjie.justin.fu@gmail.com> Signed-off-by: Zhong Li <zhongli_dev@126.com>
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * This file is part of FFmpeg.
 | |
|  *
 | |
|  * FFmpeg is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2.1 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * FFmpeg is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with FFmpeg; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @file
 | |
|  * Intel Quick Sync Video VPP base function
 | |
|  */
 | |
| 
 | |
| #ifndef AVFILTER_QSVVPP_H
 | |
| #define AVFILTER_QSVVPP_H
 | |
| 
 | |
| #include <mfx/mfxvideo.h>
 | |
| 
 | |
| #include "avfilter.h"
 | |
| #include "libavutil/fifo.h"
 | |
| 
 | |
| #define FF_INLINK_IDX(link)  ((int)((link)->dstpad - (link)->dst->input_pads))
 | |
| #define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads))
 | |
| 
 | |
| #define QSV_VERSION_ATLEAST(MAJOR, MINOR)   \
 | |
|     (MFX_VERSION_MAJOR > (MAJOR) ||         \
 | |
|      MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
 | |
| 
 | |
| #define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
 | |
|     ((MFX_VERSION.Major > (MAJOR)) ||                           \
 | |
|     (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
 | |
| 
 | |
| typedef struct QSVFrame {
 | |
|     AVFrame          *frame;
 | |
|     mfxFrameSurface1 surface;
 | |
|     struct QSVFrame  *next;
 | |
|     int queued;
 | |
| } QSVFrame;
 | |
| 
 | |
| typedef struct QSVVPPContext {
 | |
|     mfxSession          session;
 | |
|     int (*filter_frame) (AVFilterLink *outlink, AVFrame *frame); /**< callback */
 | |
|     enum AVPixelFormat  out_sw_format;   /**< Real output format */
 | |
|     mfxVideoParam       vpp_param;
 | |
|     mfxFrameInfo       *frame_infos;     /**< frame info for each input */
 | |
| 
 | |
|     /** members related to the input/output surface */
 | |
|     int                 in_mem_mode;
 | |
|     int                 out_mem_mode;
 | |
|     QSVFrame           *in_frame_list;
 | |
|     QSVFrame           *out_frame_list;
 | |
|     int                 nb_surface_ptrs_in;
 | |
|     int                 nb_surface_ptrs_out;
 | |
|     mfxFrameSurface1  **surface_ptrs_in;
 | |
|     mfxFrameSurface1  **surface_ptrs_out;
 | |
| 
 | |
|     /** MFXVPP extern parameters */
 | |
|     mfxExtOpaqueSurfaceAlloc opaque_alloc;
 | |
|     mfxExtBuffer      **ext_buffers;
 | |
|     int                 nb_ext_buffers;
 | |
| 
 | |
|     int got_frame;
 | |
|     int async_depth;
 | |
|     int eof;
 | |
|     /** order with frame_out, sync */
 | |
|     AVFifoBuffer *async_fifo;
 | |
| } QSVVPPContext;
 | |
| 
 | |
| typedef struct QSVVPPCrop {
 | |
|     int in_idx;        ///< Input index
 | |
|     int x, y, w, h;    ///< Crop rectangle
 | |
| } QSVVPPCrop;
 | |
| 
 | |
| typedef struct QSVVPPParam {
 | |
|     /* default is ff_filter_frame */
 | |
|     int (*filter_frame)(AVFilterLink *outlink, AVFrame *frame);
 | |
| 
 | |
|     /* To fill with MFX enhanced filter configurations */
 | |
|     int num_ext_buf;
 | |
|     mfxExtBuffer **ext_buf;
 | |
| 
 | |
|     /* Real output format */
 | |
|     enum AVPixelFormat out_sw_format;
 | |
| 
 | |
|     /* Crop information for each input, if needed */
 | |
|     int num_crop;
 | |
|     QSVVPPCrop *crop;
 | |
| 
 | |
|    int async_depth;
 | |
| } QSVVPPParam;
 | |
| 
 | |
| /* create and initialize the QSV session */
 | |
| int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param);
 | |
| 
 | |
| /* release the resources (eg.surfaces) */
 | |
| int ff_qsvvpp_free(QSVVPPContext **vpp);
 | |
| 
 | |
| /* vpp filter frame and call the cb if needed */
 | |
| int ff_qsvvpp_filter_frame(QSVVPPContext *vpp, AVFilterLink *inlink, AVFrame *frame);
 | |
| 
 | |
| int ff_qsvvpp_print_iopattern(void *log_ctx, int mfx_iopattern,
 | |
|                               const char *extra_string);
 | |
| 
 | |
| int ff_qsvvpp_print_error(void *log_ctx, mfxStatus err,
 | |
|                           const char *error_string);
 | |
| 
 | |
| int ff_qsvvpp_print_warning(void *log_ctx, mfxStatus err,
 | |
|                             const char *warning_string);
 | |
| 
 | |
| #endif /* AVFILTER_QSVVPP_H */
 |