It's the same as av_vsrc_buffer_add_frame(), except it doesn't take pts
or pixel_aspect parameters. Those are read from AVFrame.

Deprecate av_vsrc_buffer_add_frame().
---
 avconv.c                |    3 +--
 libavfilter/buffersrc.c |   20 ++++++++++++++++++--
 libavfilter/buffersrc.h |   11 +++++++++++
 libavfilter/version.h   |    3 +++
 4 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/avconv.c b/avconv.c
index 1aed704..0f6f604 100644
--- a/avconv.c
+++ b/avconv.c
@@ -2357,8 +2357,7 @@ static int transcode_video(InputStream *ist, AVPacket 
*pkt, int *got_output, int
             buf->refcount++;
             av_buffersrc_buffer(ist->filters[i]->filter, fb);
         } else
-            av_vsrc_buffer_add_frame(ist->filters[i]->filter, decoded_frame,
-                                     decoded_frame->pts, 
decoded_frame->sample_aspect_ratio);
+            av_buffersrc_write_frame(ist->filters[i]->filter, decoded_frame);
     }
 
     av_free(buffer_to_free);
diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index c7284c1..58fc642 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -44,9 +44,27 @@ typedef struct {
         return AVERROR(EINVAL);\
     }
 
+#if FF_API_VSRC_BUFFER_ADD_FRAME
 int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame,
                              int64_t pts, AVRational pixel_aspect)
 {
+    int64_t orig_pts = frame->pts;
+    AVRational orig_sar = frame->sample_aspect_ratio;
+    int ret;
+
+    frame->pts = pts;
+    frame->sample_aspect_ratio = pixel_aspect;
+    if ((ret = av_buffersrc_write_frame(buffer_filter, frame)) < 0)
+        return ret;
+    frame->pts = orig_pts;
+    frame->sample_aspect_ratio = orig_sar;
+
+    return 0;
+}
+#endif
+
+int av_buffersrc_write_frame(AVFilterContext *buffer_filter, AVFrame *frame)
+{
     BufferSourceContext *c = buffer_filter->priv;
     AVFilterBufferRef *buf;
     int ret;
@@ -70,8 +88,6 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, 
AVFrame *frame,
                   c->pix_fmt, c->w, c->h);
 
     avfilter_copy_frame_props(buf, frame);
-    buf->pts                    = pts;
-    buf->video->pixel_aspect    = pixel_aspect;
 
     if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) {
         avfilter_unref_buffer(buf);
diff --git a/libavfilter/buffersrc.h b/libavfilter/buffersrc.h
index 918a54f..ca82a75 100644
--- a/libavfilter/buffersrc.h
+++ b/libavfilter/buffersrc.h
@@ -36,4 +36,15 @@
  */
 int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf);
 
+/**
+ * Add a frame to the buffer source.
+ *
+ * @param s an instance of the buffersrc filter.
+ * @param frame frame to be added.
+ *
+ * @warning frame data will be memcpy()ed, which may be a big performance
+ *          hit. Use av_buffersrc_buffer() to avoid copying the data.
+ */
+int av_buffersrc_write_frame(AVFilterContext *s, AVFrame *frame);
+
 #endif /* AVFILTER_BUFFERSRC_H */
diff --git a/libavfilter/version.h b/libavfilter/version.h
index ae172be..4a45d36 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -50,5 +50,8 @@
 #ifndef FF_API_SAMPLERATE64
 #define FF_API_SAMPLERATE64                 (LIBAVFILTER_VERSION_MAJOR < 3)
 #endif
+#ifndef FF_API_VSRC_BUFFER_ADD_FRAME
+#define FF_API_VSRC_BUFFER_ADD_FRAME        (LIBAVFILTER_VERSION_MAJOR < 3)
+#endif
 
 #endif // AVFILTER_VERSION_H
-- 
1.7.9.5

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to