]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/avfilter.c
Document h263_get_picture_format().
[ffmpeg] / libavfilter / avfilter.c
index 77c7571388301d3dea92cd7c3725075ff2202a5e..41fd0827bcbb898bbe544271946c6bbee5724d06 100644 (file)
@@ -28,12 +28,16 @@ unsigned avfilter_version(void) {
     return LIBAVFILTER_VERSION_INT;
 }
 
-/** list of registered filters */
-static struct FilterList
+const char *avfilter_configuration(void)
 {
-    AVFilter *filter;
-    struct FilterList *next;
-} *filters = NULL;
+    return FFMPEG_CONFIGURATION;
+}
+
+const char *avfilter_license(void)
+{
+#define LICENSE_PREFIX "libavfilter license: "
+    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+}
 
 /** helper macros to get the in/out pad on the dst/src filter */
 #define link_dpad(link)     link->dst-> input_pads[link->dstpad]
@@ -176,8 +180,9 @@ static void dprintf_picref(void *ctx, AVFilterPicRef *picref, int end)
 static void dprintf_link(void *ctx, AVFilterLink *link, int end)
 {
     dprintf(ctx,
-            "link[%p s:%dx%d %-16s->%-16s]%s",
+            "link[%p s:%dx%d fmt:%-16s %-16s->%-16s]%s",
             link, link->w, link->h,
+            avcodec_get_pix_fmt_name(link->format),
             link->src ? link->src->filter->name : "",
             link->dst ? link->dst->filter->name : "",
             end ? "\n" : "");
@@ -194,9 +199,6 @@ AVFilterPicRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w,
     if(link_dpad(link).get_video_buffer)
         ret = link_dpad(link).get_video_buffer(link, perms, w, h);
 
-    if(!ret && link->dst->output_count)
-        ret = avfilter_get_video_buffer(link->dst->outputs[0], perms, w, h);
-
     if(!ret)
         ret = avfilter_default_get_video_buffer(link, perms, w, h);
 
@@ -224,9 +226,11 @@ int avfilter_poll_frame(AVFilterLink *link)
         return link_spad(link).poll_frame(link);
 
     for (i=0; i<link->src->input_count; i++) {
+        int val;
         if(!link->src->inputs[i])
             return -1;
-        min = FFMIN(min, avfilter_poll_frame(link->src->inputs[i]));
+        val = avfilter_poll_frame(link->src->inputs[i]);
+        min = FFMIN(min, val);
     }
 
     return min;
@@ -283,13 +287,13 @@ void avfilter_end_frame(AVFilterLink *link)
 
 }
 
-void avfilter_draw_slice(AVFilterLink *link, int y, int h)
+void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
 {
     uint8_t *src[4], *dst[4];
     int i, j, hsub, vsub;
-    void (*draw_slice)(AVFilterLink *, int, int);
+    void (*draw_slice)(AVFilterLink *, int, int, int);
 
-    DPRINTF_START(NULL, draw_slice); dprintf_link(NULL, link, 0); dprintf(NULL, " y:%d h:%d\n", y, h);
+    DPRINTF_START(NULL, draw_slice); dprintf_link(NULL, link, 0); dprintf(NULL, " y:%d h:%d dir:%d\n", y, h, slice_dir);
 
     /* copy the slice if needed for permission reasons */
     if(link->srcpic) {
@@ -321,37 +325,44 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h)
 
     if(!(draw_slice = link_dpad(link).draw_slice))
         draw_slice = avfilter_default_draw_slice;
-    draw_slice(link, y, h);
+    draw_slice(link, y, h, slice_dir);
 }
 
+#define MAX_REGISTERED_AVFILTERS_NB 64
+
+static AVFilter *registered_avfilters[MAX_REGISTERED_AVFILTERS_NB + 1];
+
+static int next_registered_avfilter_idx = 0;
+
 AVFilter *avfilter_get_by_name(const char *name)
 {
-    struct FilterList *filt;
+    int i;
 
-    for(filt = filters; filt; filt = filt->next)
-        if(!strcmp(filt->filter->name, name))
-            return filt->filter;
+    for (i = 0; registered_avfilters[i]; i++)
+        if (!strcmp(registered_avfilters[i]->name, name))
+            return registered_avfilters[i];
 
     return NULL;
 }
 
-void avfilter_register(AVFilter *filter)
+int avfilter_register(AVFilter *filter)
 {
-    struct FilterList *newfilt = av_malloc(sizeof(struct FilterList));
+    if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB)
+        return -1;
 
-    newfilt->filter = filter;
-    newfilt->next   = filters;
-    filters         = newfilt;
+    registered_avfilters[next_registered_avfilter_idx++] = filter;
+    return 0;
 }
 
-void avfilter_uninit(void)
+AVFilter **av_filter_next(AVFilter **filter)
 {
-    struct FilterList *tmp;
+    return filter ? ++filter : &registered_avfilters[0];
+}
 
-    for(; filters; filters = tmp) {
-        tmp = filters->next;
-        av_free(filters);
-    }
+void avfilter_uninit(void)
+{
+    memset(registered_avfilters, 0, sizeof(registered_avfilters));
+    next_registered_avfilter_idx = 0;
 }
 
 static int pad_count(const AVFilterPad *pads)