mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +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:
parent
77c0b361b0
commit
3985ec0ee6
@ -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,7 +69,7 @@ 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;
|
||||||
@ -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,7 +146,10 @@ 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) {
|
||||||
|
if (buf != picref)
|
||||||
avfilter_unref_buffer(buf);
|
avfilter_unref_buffer(buf);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user