[FFmpeg-devel] [PATCH 05/13] src_buffer: move format change check in a separate function.

Nicolas George nicolas.george at normalesup.org
Sat Apr 28 16:31:47 CEST 2012


This will make merging the check with the audio part easier.

Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 libavfilter/src_buffer.c |   55 +++++++++++++++++++++++++++++++--------------
 1 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/libavfilter/src_buffer.c b/libavfilter/src_buffer.c
index 85d03b0..8e5e1fe 100644
--- a/libavfilter/src_buffer.c
+++ b/libavfilter/src_buffer.c
@@ -69,27 +69,12 @@ typedef struct {
         return AVERROR(EINVAL);\
     }
 
-int av_buffersrc_add_ref(AVFilterContext *buffer_filter,
-                         AVFilterBufferRef *picref, int flags)
+static int check_format_change_video(AVFilterContext *buffer_filter,
+                                     AVFilterBufferRef *picref)
 {
     BufferSourceContext *c = buffer_filter->priv;
-    AVFilterLink *outlink = buffer_filter->outputs[0];
-    AVFilterBufferRef *buf;
     int ret;
 
-    if (!picref) {
-        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;
-
-    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) {
         AVFilterContext *scale = buffer_filter->outputs[0]->dst;
         AVFilterLink *link;
@@ -134,8 +119,44 @@ int av_buffersrc_add_ref(AVFilterContext *buffer_filter,
         if ((ret =  link->srcpad->config_props(link)) < 0)
             return ret;
     }
+    return 0;
+}
+
+static int check_format_change(AVFilterContext *buffer_filter,
+                               AVFilterBufferRef *picref)
+{
+    switch (buffer_filter->outputs[0]->type) {
+    case AVMEDIA_TYPE_VIDEO:
+        return check_format_change_video(buffer_filter, picref);
+    default:
+        return AVERROR(ENOSYS);
     }
+}
+
+int av_buffersrc_add_ref(AVFilterContext *buffer_filter,
+                         AVFilterBufferRef *picref, int flags)
+{
+    BufferSourceContext *c = buffer_filter->priv;
+    AVFilterLink *outlink = buffer_filter->outputs[0];
+    AVFilterBufferRef *buf;
+    int ret;
 
+    if (!picref) {
+        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;
+
+    if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) {
+        ret = check_format_change(buffer_filter, picref);
+        if (ret < 0)
+            return ret;
+    }
     if (flags & AV_BUFFERSRC_FLAG_NO_COPY) {
         buf = picref;
     } else {
-- 
1.7.2.5



More information about the ffmpeg-devel mailing list