You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	src_buffer: introduce av_buffersrc_add_ref().
This function merges the features of av_vsrc_buffer_add_video_buffer_ref() and av_buffersrc_buffer().
This commit is contained in:
		| @@ -27,6 +27,32 @@ | ||||
|  | ||||
| #include "avfilter.h" | ||||
|  | ||||
| enum { | ||||
|  | ||||
|     /** | ||||
|      * Do not check for format changes. | ||||
|      */ | ||||
|     AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, | ||||
|  | ||||
|     /** | ||||
|      * Do not copy buffer data. | ||||
|      */ | ||||
|     AV_BUFFERSRC_FLAG_NO_COPY = 2, | ||||
|  | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Add video buffer data in picref to buffer_src. | ||||
|  * | ||||
|  * @param buffer_src  pointer to a buffer source context | ||||
|  * @param picref      a buffer reference, or NULL to mark EOF | ||||
|  * @param flags       a combination of AV_BUFFERSRC_FLAG_* | ||||
|  * @return            >= 0 in case of success, a negative AVERROR code | ||||
|  *                    in case of failure | ||||
|  */ | ||||
| int av_buffersrc_add_ref(AVFilterContext *buffer_src, | ||||
|                          AVFilterBufferRef *picref, int flags); | ||||
|  | ||||
| /** | ||||
|  * Add a buffer to the filtergraph s. | ||||
|  * | ||||
|   | ||||
| @@ -69,7 +69,7 @@ typedef struct { | ||||
|         return AVERROR(EINVAL);\ | ||||
|     } | ||||
|  | ||||
| int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
| int av_buffersrc_add_ref(AVFilterContext *buffer_filter, | ||||
|                          AVFilterBufferRef *picref, int flags) | ||||
| { | ||||
|     BufferSourceContext *c = buffer_filter->priv; | ||||
| @@ -88,6 +88,8 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
|                                          sizeof(buf))) < 0) | ||||
|         return ret; | ||||
|  | ||||
|     if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) { | ||||
|         /* TODO reindent */ | ||||
|     if (picref->video->w != c->w || picref->video->h != c->h || picref->format != c->pix_fmt) { | ||||
|         AVFilterContext *scale = buffer_filter->outputs[0]->dst; | ||||
|         AVFilterLink *link; | ||||
| @@ -132,7 +134,11 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
|         if ((ret =  link->srcpad->config_props(link)) < 0) | ||||
|             return ret; | ||||
|     } | ||||
|     } | ||||
|  | ||||
|     if (flags & AV_BUFFERSRC_FLAG_NO_COPY) { | ||||
|         buf = picref; | ||||
|     } else { | ||||
|     buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, | ||||
|                                     picref->video->w, picref->video->h); | ||||
|     av_image_copy(buf->data, buf->linesize, | ||||
| @@ -140,7 +146,10 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
|                   picref->format, picref->video->w, picref->video->h); | ||||
|     avfilter_copy_buffer_ref_props(buf, picref); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) { | ||||
|         if (buf != picref) | ||||
|             avfilter_unref_buffer(buf); | ||||
|         return ret; | ||||
|     } | ||||
| @@ -149,29 +158,16 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | ||||
|                                         AVFilterBufferRef *picref, int flags) | ||||
| { | ||||
|     return av_buffersrc_add_ref(buffer_filter, picref, 0); | ||||
| } | ||||
|  | ||||
| int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) | ||||
| { | ||||
|     BufferSourceContext *c = s->priv; | ||||
|     int ret; | ||||
|  | ||||
|     if (!buf) { | ||||
|         c->eof = 1; | ||||
|         return 0; | ||||
|     } else if (c->eof) | ||||
|         return AVERROR(EINVAL); | ||||
|  | ||||
|     if (!av_fifo_space(c->fifo) && | ||||
|         (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + | ||||
|                                          sizeof(buf))) < 0) | ||||
|         return ret; | ||||
|  | ||||
| //     CHECK_PARAM_CHANGE(s, c, buf->video->w, buf->video->h, buf->format); | ||||
|  | ||||
|     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) | ||||
|         return ret; | ||||
|     c->nb_failed_requests = 0; | ||||
|  | ||||
|     return 0; | ||||
|     return av_buffersrc_add_ref(s, buf, AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT | | ||||
|                                         AV_BUFFERSRC_FLAG_NO_COPY); | ||||
| } | ||||
|  | ||||
| #if CONFIG_AVCODEC | ||||
|   | ||||
		Reference in New Issue
	
	Block a user