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" | #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. |  * Add a buffer to the filtergraph s. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -69,8 +69,8 @@ typedef struct { | |||||||
|         return AVERROR(EINVAL);\ |         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) |                          AVFilterBufferRef *picref, int flags) | ||||||
| { | { | ||||||
|     BufferSourceContext *c = buffer_filter->priv; |     BufferSourceContext *c = buffer_filter->priv; | ||||||
|     AVFilterLink *outlink = buffer_filter->outputs[0]; |     AVFilterLink *outlink = buffer_filter->outputs[0]; | ||||||
| @@ -88,6 +88,8 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | |||||||
|                                          sizeof(buf))) < 0) |                                          sizeof(buf))) < 0) | ||||||
|         return ret; |         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) { |     if (picref->video->w != c->w || picref->video->h != c->h || picref->format != c->pix_fmt) { | ||||||
|         AVFilterContext *scale = buffer_filter->outputs[0]->dst; |         AVFilterContext *scale = buffer_filter->outputs[0]->dst; | ||||||
|         AVFilterLink *link; |         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) |         if ((ret =  link->srcpad->config_props(link)) < 0) | ||||||
|             return ret; |             return ret; | ||||||
|     } |     } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (flags & AV_BUFFERSRC_FLAG_NO_COPY) { | ||||||
|  |         buf = picref; | ||||||
|  |     } else { | ||||||
|     buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, |     buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, | ||||||
|                                     picref->video->w, picref->video->h); |                                     picref->video->w, picref->video->h); | ||||||
|     av_image_copy(buf->data, buf->linesize, |     av_image_copy(buf->data, buf->linesize, | ||||||
| @@ -140,8 +146,11 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | |||||||
|                   picref->format, picref->video->w, picref->video->h); |                   picref->format, picref->video->w, picref->video->h); | ||||||
|     avfilter_copy_buffer_ref_props(buf, picref); |     avfilter_copy_buffer_ref_props(buf, picref); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) { |     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) { | ||||||
|         avfilter_unref_buffer(buf); |         if (buf != picref) | ||||||
|  |             avfilter_unref_buffer(buf); | ||||||
|         return ret; |         return ret; | ||||||
|     } |     } | ||||||
|     c->nb_failed_requests = 0; |     c->nb_failed_requests = 0; | ||||||
| @@ -149,29 +158,16 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, | |||||||
|     return 0; |     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) | int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) | ||||||
| { | { | ||||||
|     BufferSourceContext *c = s->priv; |     return av_buffersrc_add_ref(s, buf, AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT | | ||||||
|     int ret; |                                         AV_BUFFERSRC_FLAG_NO_COPY); | ||||||
|  |  | ||||||
|     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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #if CONFIG_AVCODEC | #if CONFIG_AVCODEC | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user