]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/avfilter.c
Add const to silence warnings
[ffmpeg] / libavfilter / avfilter.c
index d185b19ba8c266e0691285b31fc7ef5fa5d73f76..f53803d975c10941375a2dbb9521e6345220b246 100644 (file)
@@ -96,43 +96,69 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
     return 0;
 }
 
-int avfilter_config_link(AVFilterLink *link)
+int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
+                           unsigned in, unsigned out)
 {
-    int *fmts[2], i, j;
-    int (*config_link)(AVFilterLink *);
-    int *(*query_formats)(AVFilterLink *link);
-
-    if(!link)
-        return 0;
+    AVFilterFormats *formats;
 
-    /* find a format both filters support - TODO: auto-insert conversion filter */
-    link->format = -1;
-    if(!(query_formats = link_spad(link).query_formats))
-        query_formats = avfilter_default_query_output_formats;
-    fmts[0] = query_formats(link);
-    fmts[1] = link_dpad(link).query_formats(link);
-    for(i = 0; fmts[0][i] != -1; i ++)
-        for(j = 0; fmts[1][j] != -1; j ++)
-            if(fmts[0][i] == fmts[1][j]) {
-                link->format = fmts[0][i];
-                goto format_done;
-            }
+    av_log(NULL, AV_LOG_INFO, "auto-inserting filter '%s'\n",
+            filt->filter->name);
 
-format_done:
-    av_free(fmts[0]);
-    av_free(fmts[1]);
-    if(link->format == -1)
+    link->dst->inputs[link->dstpad] = NULL;
+    if(avfilter_link(filt, out, link->dst, link->dstpad)) {
+        /* failed to link output filter to new filter */
+        link->dst->inputs[link->dstpad] = link;
         return -1;
+    }
 
-    if(!(config_link = link_spad(link).config_props))
-        config_link  = avfilter_default_config_output_link;
-    if(config_link(link))
-            return -1;
+    /* re-hookup the link to the new destination filter we inserted */
+    link->dst = filt;
+    link->dstpad = in;
+    filt->inputs[in] = link;
+
+    /* if any information on supported colorspaces already exists on the
+     * link, we need to preserve that */
+    if((formats = link->out_formats))
+        avfilter_formats_changeref(&link->out_formats,
+                                   &filt->outputs[out]->out_formats);
+
+    return 0;
+}
+
+int avfilter_config_links(AVFilterContext *filter)
+{
+    int (*config_link)(AVFilterLink *);
+    unsigned i;
+
+    for(i = 0; i < filter->input_count; i ++) {
+        AVFilterLink *link;
+
+        if(!(link = filter->inputs[i])) continue;
 
-    if(!(config_link = link_dpad(link).config_props))
-        config_link  = avfilter_default_config_input_link;
-    if(config_link(link))
+        switch(link->init_state) {
+        case AVLINK_INIT:
+            continue;
+        case AVLINK_STARTINIT:
+            av_log(filter, AV_LOG_ERROR, "circular filter chain detected\n");
             return -1;
+        case AVLINK_UNINIT:
+            link->init_state = AVLINK_STARTINIT;
+
+            if(avfilter_config_links(link->src))
+                return -1;
+
+            if(!(config_link = link_spad(link).config_props))
+                config_link  = avfilter_default_config_output_link;
+            if(config_link(link))
+                return -1;
+
+            if((config_link = link_dpad(link).config_props))
+            if(config_link(link))
+                return -1;
+
+            link->init_state = AVLINK_INIT;
+        }
+    }
 
     return 0;
 }
@@ -159,6 +185,22 @@ int avfilter_request_frame(AVFilterLink *link)
     else return -1;
 }
 
+int avfilter_poll_frame(AVFilterLink *link)
+{
+    int i, min=INT_MAX;
+
+    if(link_spad(link).poll_frame)
+        return link_spad(link).poll_frame(link);
+    else
+        for (i=0; i<link->src->input_count; i++) {
+            if(!link->src->inputs[i])
+                return -1;
+            min = FFMIN(min, avfilter_poll_frame(link->src->inputs[i]));
+        }
+
+    return min;
+}
+
 /* XXX: should we do the duplicating of the picture ref here, instead of
  * forcing the source filter to do it? */
 void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
@@ -171,10 +213,12 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
     /* prepare to copy the picture if it has insufficient permissions */
     if((link_dpad(link).min_perms & picref->perms) != link_dpad(link).min_perms ||
         link_dpad(link).rej_perms & picref->perms) {
+        /*
         av_log(link->dst, AV_LOG_INFO,
                 "frame copy needed (have perms %x, need %x, reject %x)\n",
                 picref->perms,
                 link_dpad(link).min_perms, link_dpad(link).rej_perms);
+        */
 
         link->cur_pic = avfilter_default_get_video_buffer(link, link_dpad(link).min_perms);
         link->srcpic = picref;
@@ -189,6 +233,11 @@ void avfilter_end_frame(AVFilterLink *link)
 {
     void (*end_frame)(AVFilterLink *);
 
+    if(!(end_frame = link_dpad(link).end_frame))
+        end_frame = avfilter_default_end_frame;
+
+    end_frame(link);
+
     /* unreference the source picture if we're feeding the destination filter
      * a copied version dues to permission issues */
     if(link->srcpic) {
@@ -196,10 +245,6 @@ void avfilter_end_frame(AVFilterLink *link)
         link->srcpic = NULL;
     }
 
-    if(!(end_frame = link_dpad(link).end_frame))
-        end_frame = avfilter_default_end_frame;
-
-    end_frame(link);
 }
 
 void avfilter_draw_slice(AVFilterLink *link, int y, int h)
@@ -211,6 +256,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h)
     if(link->srcpic) {
         avcodec_get_chroma_sub_sample(link->format, &hsub, &vsub);
 
+        link->cur_pic->pts = link->srcpic->pts;
         src[0] = link->srcpic-> data[0] + y * link->srcpic-> linesize[0];
         dst[0] = link->cur_pic->data[0] + y * link->cur_pic->linesize[0];
         for(i = 1; i < 4; i ++) {
@@ -242,7 +288,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h)
     link_dpad(link).draw_slice(link, y, h);
 }
 
-AVFilter *avfilter_get_by_name(char *name)
+AVFilter *avfilter_get_by_name(const char *name)
 {
     struct FilterList *filt;
 
@@ -253,7 +299,6 @@ AVFilter *avfilter_get_by_name(char *name)
     return NULL;
 }
 
-/* FIXME: insert in order, rather than insert at end + resort */
 void avfilter_register(AVFilter *filter)
 {
     struct FilterList *newfilt = av_malloc(sizeof(struct FilterList));
@@ -265,20 +310,27 @@ void avfilter_register(AVFilter *filter)
 
 void avfilter_init(void)
 {
-    avfilter_register(&vsrc_dummy);
-    avfilter_register(&vsrc_ppm);
-    avfilter_register(&vf_buffer);
-    avfilter_register(&vf_crop);
-    avfilter_register(&vf_fps);
-    avfilter_register(&vf_graph);
-    avfilter_register(&vf_graphdesc);
-    avfilter_register(&vf_graphfile);
-    avfilter_register(&vf_overlay);
-    avfilter_register(&vf_passthrough);
-    avfilter_register(&vf_rgb2bgr);
-    avfilter_register(&vf_slicify);
-    avfilter_register(&vf_split);
-    avfilter_register(&vf_vflip);
+    avfilter_register(&avfilter_vf_crop);
+    avfilter_register(&avfilter_vf_fifo);
+    avfilter_register(&avfilter_vf_format);
+    avfilter_register(&avfilter_vf_fps);
+    avfilter_register(&avfilter_vf_graph);
+    avfilter_register(&avfilter_vf_graphdesc);
+    avfilter_register(&avfilter_vf_graphfile);
+    avfilter_register(&avfilter_vf_hflip);
+    avfilter_register(&avfilter_vf_negate);
+    avfilter_register(&avfilter_vf_noformat);
+    avfilter_register(&avfilter_vf_overlay);
+    avfilter_register(&avfilter_vf_rotate);
+    avfilter_register(&avfilter_vf_scale);
+    avfilter_register(&avfilter_vf_setpts);
+    avfilter_register(&avfilter_vf_slicify);
+    avfilter_register(&avfilter_vf_split);
+    avfilter_register(&avfilter_vf_transpose);
+    avfilter_register(&avfilter_vf_vflip);
+#ifdef CONFIG_AVFILTER_LAVF
+    avfilter_register(&avfilter_vsrc_movie);
+#endif //CONFIG_AVFILTER_LAVF
 }
 
 void avfilter_uninit(void)
@@ -293,10 +345,9 @@ void avfilter_uninit(void)
 
 static int pad_count(const AVFilterPad *pads)
 {
-    AVFilterPad *p = (AVFilterPad *) pads;
     int count;
 
-    for(count = 0; p->name; count ++) p ++;
+    for(count = 0; pads->name; count ++) pads ++;
     return count;
 }
 
@@ -306,9 +357,14 @@ static const char *filter_name(void *p)
     return filter->filter->name;
 }
 
-AVFilterContext *avfilter_open(AVFilter *filter, char *inst_name)
+AVFilterContext *avfilter_open(AVFilter *filter, const char *inst_name)
 {
-    AVFilterContext *ret = av_malloc(sizeof(AVFilterContext));
+    AVFilterContext *ret;
+
+    if (!filter)
+        return 0;
+
+    ret = av_malloc(sizeof(AVFilterContext));
 
     ret->av_class = av_mallocz(sizeof(AVClass));
     ret->av_class->item_name = filter_name;
@@ -366,18 +422,3 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque
     return 0;
 }
 
-int *avfilter_make_format_list(int len, ...)
-{
-    int *ret, i;
-    va_list vl;
-
-    ret = av_malloc(sizeof(int) * (len + 1));
-    va_start(vl, len);
-    for(i = 0; i < len; i ++)
-        ret[i] = va_arg(vl, int);
-    va_end(vl);
-    ret[len] = -1;
-
-    return ret;
-}
-