diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-04-28 15:01:41 +0200 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-05-04 23:26:40 +0200 |
commit | 7bac2a78c2241df4bcc1665703bb71afd9a3e692 (patch) | |
tree | f025d8ab1792cac598cefd504910c4c2a4d108e1 /libavfilter | |
parent | a96cd73ff25795ab4162252d2df87a8b46c782da (diff) | |
download | ffmpeg-7bac2a78c2241df4bcc1665703bb71afd9a3e692.tar.gz |
src_buffer: implement av_buffersrc_add_frame.
It supersedes av_vsrc_buffer_add_frame and handles
both audio and video.
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/avcodec.h | 12 | ||||
-rw-r--r-- | libavfilter/src_buffer.c | 32 |
2 files changed, 33 insertions, 11 deletions
diff --git a/libavfilter/avcodec.h b/libavfilter/avcodec.h index 1aa8b9c654..cec847146f 100644 --- a/libavfilter/avcodec.h +++ b/libavfilter/avcodec.h @@ -92,6 +92,18 @@ int avfilter_fill_frame_from_buffer_ref(AVFrame *frame, /** * Add frame data to buffer_src. * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, 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_frame(AVFilterContext *buffer_src, + const AVFrame *frame, int flags); + +/** + * Add frame data to buffer_src. + * * @param buffer_src pointer to a buffer source context * @param flags a combination of AV_VSRC_BUF_FLAG_* flags * @return >= 0 in case of success, a negative AVERROR code in case of diff --git a/libavfilter/src_buffer.c b/libavfilter/src_buffer.c index 9a4d249507..15c30d6505 100644 --- a/libavfilter/src_buffer.c +++ b/libavfilter/src_buffer.c @@ -303,28 +303,38 @@ int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) #if CONFIG_AVCODEC #include "avcodec.h" -int av_vsrc_buffer_add_frame(AVFilterContext *buffer_src, - const AVFrame *frame, int flags) +int av_buffersrc_add_frame(AVFilterContext *buffer_src, + const AVFrame *frame, int flags) { - BufferSourceContext *c = buffer_src->priv; AVFilterBufferRef *picref; int ret; - if (!frame) { - c->eof = 1; - return 0; - } else if (c->eof) - return AVERROR(EINVAL); + if (!frame) /* NULL for EOF */ + return av_buffersrc_add_ref(buffer_src, NULL, flags); - picref = avfilter_get_video_buffer_ref_from_frame(frame, AV_PERM_WRITE); + switch (buffer_src->outputs[0]->type) { + case AVMEDIA_TYPE_VIDEO: + picref = avfilter_get_video_buffer_ref_from_frame(frame, AV_PERM_WRITE); + break; + case AVMEDIA_TYPE_AUDIO: + picref = avfilter_get_audio_buffer_ref_from_frame(frame, AV_PERM_WRITE); + break; + default: + return AVERROR(ENOSYS); + } if (!picref) return AVERROR(ENOMEM); - ret = av_vsrc_buffer_add_video_buffer_ref(buffer_src, picref, flags); + ret = av_buffersrc_add_ref(buffer_src, picref, flags); picref->buf->data[0] = NULL; avfilter_unref_buffer(picref); - return ret; } + +int av_vsrc_buffer_add_frame(AVFilterContext *buffer_src, + const AVFrame *frame, int flags) +{ + return av_buffersrc_add_frame(buffer_src, frame, 0); +} #endif unsigned av_vsrc_buffer_get_nb_failed_requests(AVFilterContext *buffer_src) |