You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	vsrc_buffer: allow using a NULL buffer to signal EOF.
This commit is contained in:
		| @@ -32,6 +32,7 @@ | |||||||
|  * |  * | ||||||
|  * @param buf buffer containing frame data to be passed down the filtergraph. |  * @param buf buffer containing frame data to be passed down the filtergraph. | ||||||
|  * This function will take ownership of buf, the user must not free it. |  * This function will take ownership of buf, the user must not free it. | ||||||
|  |  * A NULL buf signals EOF -- i.e. no more frames will be sent to this filter. | ||||||
|  */ |  */ | ||||||
| int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf); | int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ typedef struct { | |||||||
|     enum PixelFormat  pix_fmt; |     enum PixelFormat  pix_fmt; | ||||||
|     AVRational        time_base;     ///< time_base to set in the output link |     AVRational        time_base;     ///< time_base to set in the output link | ||||||
|     AVRational        pixel_aspect; |     AVRational        pixel_aspect; | ||||||
|  |     int eof; | ||||||
| } BufferSourceContext; | } BufferSourceContext; | ||||||
|  |  | ||||||
| #define CHECK_PARAM_CHANGE(s, c, width, height, format)\ | #define CHECK_PARAM_CHANGE(s, c, width, height, format)\ | ||||||
| @@ -50,6 +51,12 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, | |||||||
|     AVFilterBufferRef *buf; |     AVFilterBufferRef *buf; | ||||||
|     int ret; |     int ret; | ||||||
|  |  | ||||||
|  |     if (!buf) { | ||||||
|  |         c->eof = 1; | ||||||
|  |         return 0; | ||||||
|  |     } else if (c->eof) | ||||||
|  |         return AVERROR(EINVAL); | ||||||
|  |  | ||||||
|     if (!av_fifo_space(c->fifo) && |     if (!av_fifo_space(c->fifo) && | ||||||
|         (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + |         (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + | ||||||
|                                          sizeof(buf))) < 0) |                                          sizeof(buf))) < 0) | ||||||
| @@ -79,6 +86,12 @@ int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) | |||||||
|     BufferSourceContext *c = s->priv; |     BufferSourceContext *c = s->priv; | ||||||
|     int ret; |     int ret; | ||||||
|  |  | ||||||
|  |     if (!buf) { | ||||||
|  |         c->eof = 1; | ||||||
|  |         return 0; | ||||||
|  |     } else if (c->eof) | ||||||
|  |         return AVERROR(EINVAL); | ||||||
|  |  | ||||||
|     if (!av_fifo_space(c->fifo) && |     if (!av_fifo_space(c->fifo) && | ||||||
|         (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + |         (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + | ||||||
|                                          sizeof(buf))) < 0) |                                          sizeof(buf))) < 0) | ||||||
| @@ -160,6 +173,8 @@ static int request_frame(AVFilterLink *link) | |||||||
|     AVFilterBufferRef *buf; |     AVFilterBufferRef *buf; | ||||||
|  |  | ||||||
|     if (!av_fifo_size(c->fifo)) { |     if (!av_fifo_size(c->fifo)) { | ||||||
|  |         if (c->eof) | ||||||
|  |             return AVERROR_EOF; | ||||||
|         av_log(link->src, AV_LOG_ERROR, |         av_log(link->src, AV_LOG_ERROR, | ||||||
|                "request_frame() called with no available frame!\n"); |                "request_frame() called with no available frame!\n"); | ||||||
|         return AVERROR(EINVAL); |         return AVERROR(EINVAL); | ||||||
| @@ -177,7 +192,10 @@ static int request_frame(AVFilterLink *link) | |||||||
| static int poll_frame(AVFilterLink *link) | static int poll_frame(AVFilterLink *link) | ||||||
| { | { | ||||||
|     BufferSourceContext *c = link->src->priv; |     BufferSourceContext *c = link->src->priv; | ||||||
|     return !!av_fifo_size(c->fifo); |     int size = av_fifo_size(c->fifo); | ||||||
|  |     if (!size && c->eof) | ||||||
|  |         return AVERROR_EOF; | ||||||
|  |     return size/sizeof(AVFilterBufferRef*); | ||||||
| } | } | ||||||
|  |  | ||||||
| AVFilter avfilter_vsrc_buffer = { | AVFilter avfilter_vsrc_buffer = { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user