[FFmpeg-cvslog] src_buffer: implement av_buffersrc_add_frame.

Nicolas George git at videolan.org
Fri May 4 23:46:07 CEST 2012


ffmpeg | branch: master | Nicolas George <nicolas.george at normalesup.org> | Sat Apr 28 15:01:41 2012 +0200| [7bac2a78c2241df4bcc1665703bb71afd9a3e692] | committer: Nicolas George

src_buffer: implement av_buffersrc_add_frame.

It supersedes av_vsrc_buffer_add_frame and handles
both audio and video.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7bac2a78c2241df4bcc1665703bb71afd9a3e692
---

 libavfilter/avcodec.h    |   12 ++++++++++++
 libavfilter/src_buffer.c |   32 +++++++++++++++++++++-----------
 2 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/libavfilter/avcodec.h b/libavfilter/avcodec.h
index 1aa8b9c..cec8471 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 9a4d249..15c30d6 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)



More information about the ffmpeg-cvslog mailing list