lavfi: make copy_buffer_ref common.
authorNicolas George <nicolas.george@normalesup.org>
Thu, 19 Jul 2012 09:14:04 +0000 (11:14 +0200)
committerNicolas George <nicolas.george@normalesup.org>
Fri, 20 Jul 2012 11:16:23 +0000 (13:16 +0200)
libavfilter/buffer.c
libavfilter/buffersrc.c
libavfilter/internal.h

index 816e23c..30663b5 100644 (file)
 
 #include "libavutil/audioconvert.h"
 #include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
 #include "libavcodec/avcodec.h"
 
 #include "avfilter.h"
 #include "internal.h"
+#include "audio.h"
 #include "avcodec.h"
 
 void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
@@ -175,3 +177,40 @@ void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *s
     default: break;
     }
 }
+
+AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink,
+                                      AVFilterBufferRef *ref)
+{
+    AVFilterBufferRef *buf;
+    int channels;
+
+    switch (outlink->type) {
+
+    case AVMEDIA_TYPE_VIDEO:
+        buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
+                                  ref->video->w, ref->video->h);
+        if(!buf)
+            return NULL;
+        av_image_copy(buf->data, buf->linesize,
+                      (void*)ref->data, ref->linesize,
+                      ref->format, ref->video->w, ref->video->h);
+        break;
+
+    case AVMEDIA_TYPE_AUDIO:
+        buf = ff_get_audio_buffer(outlink, AV_PERM_WRITE,
+                                        ref->audio->nb_samples);
+        if(!buf)
+            return NULL;
+        channels = av_get_channel_layout_nb_channels(ref->audio->channel_layout);
+        av_samples_copy(buf->extended_data, ref->buf->extended_data,
+                        0, 0, ref->audio->nb_samples,
+                        channels,
+                        ref->format);
+        break;
+
+    default:
+        return NULL;
+    }
+    avfilter_copy_buffer_ref_props(buf, ref);
+    return buf;
+}
index 72ee268..befefb8 100644 (file)
@@ -74,44 +74,6 @@ typedef struct {
         return AVERROR(EINVAL);\
     }
 
-static AVFilterBufferRef *copy_buffer_ref(AVFilterContext *ctx,
-                                          AVFilterBufferRef *ref)
-{
-    AVFilterLink *outlink = ctx->outputs[0];
-    AVFilterBufferRef *buf;
-    int channels;
-
-    switch (outlink->type) {
-
-    case AVMEDIA_TYPE_VIDEO:
-        buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
-                                        ref->video->w, ref->video->h);
-        if(!buf)
-            return NULL;
-        av_image_copy(buf->data, buf->linesize,
-                      (void*)ref->data, ref->linesize,
-                      ref->format, ref->video->w, ref->video->h);
-        break;
-
-    case AVMEDIA_TYPE_AUDIO:
-        buf = ff_get_audio_buffer(outlink, AV_PERM_WRITE,
-                                        ref->audio->nb_samples);
-        if(!buf)
-            return NULL;
-        channels = av_get_channel_layout_nb_channels(ref->audio->channel_layout);
-        av_samples_copy(buf->extended_data, ref->buf->extended_data,
-                        0, 0, ref->audio->nb_samples,
-                        channels,
-                        ref->format);
-        break;
-
-    default:
-        return NULL;
-    }
-    avfilter_copy_buffer_ref_props(buf, ref);
-    return buf;
-}
-
 int av_buffersrc_add_frame(AVFilterContext *buffer_src,
                            const AVFrame *frame, int flags)
 {
@@ -175,7 +137,7 @@ int av_buffersrc_add_ref(AVFilterContext *s, AVFilterBufferRef *buf, int flags)
         }
     }
     if (!(flags & AV_BUFFERSRC_FLAG_NO_COPY))
-        to_free = buf = copy_buffer_ref(s, buf);
+        to_free = buf = ff_copy_buffer_ref(s->outputs[0], buf);
     if(!buf)
         return -1;
 
index d1bcb03..b80a6fe 100644 (file)
@@ -347,4 +347,7 @@ int ff_request_frame(AVFilterLink *link);
         .category   = AV_CLASS_CATEGORY_FILTER, \
     }
 
+AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink,
+                                      AVFilterBufferRef *ref);
+
 #endif /* AVFILTER_INTERNAL_H */