You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavf/qsv: clone the frame which may be managed by framework
For filters based on framesync, the input frame was managed
by framesync, so we should not directly keep and destroy it,
instead we make a clone of it here, or else double-free will occur.
But for other filters not based on framesync, we still need to
free the input frame inside filter_frame.
Signed-off-by: Ruiling Song <ruiling.song@intel.com>
(cherry picked from commit d865783b6c)
			
			
This commit is contained in:
		
				
					committed by
					
						 Mark Thompson
						Mark Thompson
					
				
			
			
				
	
			
			
			
						parent
						
							58569162c2
						
					
				
				
					commit
					a768c0a3e1
				
			| @@ -296,7 +296,7 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p | ||||
|             av_log(ctx, AV_LOG_ERROR, "QSVVPP gets a wrong frame.\n"); | ||||
|             return NULL; | ||||
|         } | ||||
|         qsv_frame->frame   = picref; | ||||
|         qsv_frame->frame   = av_frame_clone(picref); | ||||
|         qsv_frame->surface = (mfxFrameSurface1 *)qsv_frame->frame->data[3]; | ||||
|     } else { | ||||
|         /* make a copy if the input is not padded as libmfx requires */ | ||||
| @@ -318,7 +318,7 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p | ||||
|             av_frame_copy_props(qsv_frame->frame, picref); | ||||
|             av_frame_free(&picref); | ||||
|         } else | ||||
|             qsv_frame->frame = picref; | ||||
|             qsv_frame->frame = av_frame_clone(picref); | ||||
|  | ||||
|         if (map_frame_to_surface(qsv_frame->frame, | ||||
|                                 &qsv_frame->surface_internal) < 0) { | ||||
|   | ||||
| @@ -341,9 +341,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref) | ||||
|     VPPContext       *vpp = inlink->dst->priv; | ||||
|     AVFilterLink     *outlink = ctx->outputs[0]; | ||||
|  | ||||
|     if (vpp->qsv) | ||||
|     if (vpp->qsv) { | ||||
|         ret = ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref); | ||||
|     else { | ||||
|         av_frame_free(&picref); | ||||
|     } else { | ||||
|         if (picref->pts != AV_NOPTS_VALUE) | ||||
|             picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base); | ||||
|         ret = ff_filter_frame(outlink, picref); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user