You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavfi/qsvvpp: switch to new FIFO API
This commit is contained in:
		
				
					committed by
					
						 Andreas Rheinhardt
						Andreas Rheinhardt
					
				
			
			
				
	
			
			
			
						parent
						
							90eef1c3de
						
					
				
				
					commit
					85c938fa28
				
			| @@ -40,6 +40,11 @@ | ||||
|  | ||||
| static const AVRational default_tb = { 1, 90000 }; | ||||
|  | ||||
| typedef struct QSVAsyncFrame { | ||||
|     mfxSyncPoint  sync; | ||||
|     QSVFrame     *frame; | ||||
| } QSVAsyncFrame; | ||||
|  | ||||
| static const struct { | ||||
|     int mfx_iopattern; | ||||
|     const char *desc; | ||||
| @@ -642,16 +647,6 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static unsigned int qsv_fifo_item_size(void) | ||||
| { | ||||
|     return sizeof(mfxSyncPoint) + sizeof(QSVFrame*); | ||||
| } | ||||
|  | ||||
| static unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) | ||||
| { | ||||
|     return  av_fifo_size(fifo)/qsv_fifo_item_size(); | ||||
| } | ||||
|  | ||||
| int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param) | ||||
| { | ||||
|     int i; | ||||
| @@ -727,7 +722,7 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p | ||||
|     s->got_frame = 0; | ||||
|  | ||||
|     /** keep fifo size at least 1. Even when async_depth is 0, fifo is used. */ | ||||
|     s->async_fifo  = av_fifo_alloc((param->async_depth + 1) * qsv_fifo_item_size()); | ||||
|     s->async_fifo  = av_fifo_alloc2(param->async_depth + 1, sizeof(QSVAsyncFrame), 0); | ||||
|     s->async_depth = param->async_depth; | ||||
|     if (!s->async_fifo) { | ||||
|         ret = AVERROR(ENOMEM); | ||||
| @@ -789,7 +784,7 @@ int ff_qsvvpp_free(QSVVPPContext **vpp) | ||||
|     av_freep(&s->surface_ptrs_out); | ||||
|     av_freep(&s->ext_buffers); | ||||
|     av_freep(&s->frame_infos); | ||||
|     av_fifo_free(s->async_fifo); | ||||
|     av_fifo_freep2(&s->async_fifo); | ||||
|     av_freep(vpp); | ||||
|  | ||||
|     return 0; | ||||
| @@ -799,24 +794,23 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr | ||||
| { | ||||
|     AVFilterContext  *ctx     = inlink->dst; | ||||
|     AVFilterLink     *outlink = ctx->outputs[0]; | ||||
|     QSVAsyncFrame     aframe; | ||||
|     mfxSyncPoint      sync; | ||||
|     QSVFrame         *in_frame, *out_frame, *tmp; | ||||
|     int               ret, filter_ret; | ||||
|  | ||||
|     while (s->eof && qsv_fifo_size(s->async_fifo)) { | ||||
|         av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); | ||||
|         av_fifo_generic_read(s->async_fifo, &sync, sizeof(sync), NULL); | ||||
|         if (MFXVideoCORE_SyncOperation(s->session, sync, 1000) < 0) | ||||
|     while (s->eof && av_fifo_read(s->async_fifo, &aframe, 1) >= 0) { | ||||
|         if (MFXVideoCORE_SyncOperation(s->session, aframe.sync, 1000) < 0) | ||||
|             av_log(ctx, AV_LOG_WARNING, "Sync failed.\n"); | ||||
|  | ||||
|         filter_ret = s->filter_frame(outlink, tmp->frame); | ||||
|         filter_ret = s->filter_frame(outlink, aframe.frame->frame); | ||||
|         if (filter_ret < 0) { | ||||
|             av_frame_free(&tmp->frame); | ||||
|             av_frame_free(&aframe.frame->frame); | ||||
|             return filter_ret; | ||||
|         } | ||||
|         tmp->queued--; | ||||
|         aframe.frame->queued--; | ||||
|         s->got_frame = 1; | ||||
|         tmp->frame = NULL; | ||||
|         aframe.frame->frame = NULL; | ||||
|     }; | ||||
|  | ||||
|     if (!picref) | ||||
| @@ -853,16 +847,14 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr | ||||
|                                              default_tb, outlink->time_base); | ||||
|  | ||||
|         out_frame->queued++; | ||||
|         av_fifo_generic_write(s->async_fifo, &out_frame, sizeof(out_frame), NULL); | ||||
|         av_fifo_generic_write(s->async_fifo, &sync, sizeof(sync), NULL); | ||||
|         aframe = (QSVAsyncFrame){ sync, out_frame }; | ||||
|         av_fifo_write(s->async_fifo, &aframe, 1); | ||||
|  | ||||
|  | ||||
|         if (qsv_fifo_size(s->async_fifo) > s->async_depth) { | ||||
|             av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); | ||||
|             av_fifo_generic_read(s->async_fifo, &sync, sizeof(sync), NULL); | ||||
|         if (av_fifo_can_read(s->async_fifo) > s->async_depth) { | ||||
|             av_fifo_read(s->async_fifo, &aframe, 1); | ||||
|  | ||||
|             do { | ||||
|                 ret = MFXVideoCORE_SyncOperation(s->session, sync, 1000); | ||||
|                 ret = MFXVideoCORE_SyncOperation(s->session, aframe.sync, 1000); | ||||
|             } while (ret == MFX_WRN_IN_EXECUTION); | ||||
|  | ||||
|             filter_ret = s->filter_frame(outlink, tmp->frame); | ||||
|   | ||||
| @@ -73,7 +73,7 @@ typedef struct QSVVPPContext { | ||||
|     int async_depth; | ||||
|     int eof; | ||||
|     /** order with frame_out, sync */ | ||||
|     AVFifoBuffer *async_fifo; | ||||
|     AVFifo *async_fifo; | ||||
| } QSVVPPContext; | ||||
|  | ||||
| typedef struct QSVVPPCrop { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user