[FFmpeg-soc] [soc]: r1429 - in libavfilter: avfiltergraphdesc.c avfiltergraphfile.c

vitor subversion at mplayerhq.hu
Tue Nov 6 20:28:05 CET 2007


Author: vitor
Date: Tue Nov  6 20:28:04 2007
New Revision: 1429

Log:
Rename avfiltergraphdesc.c to more descriptif name avfiltergraphfile.c

Added:
   libavfilter/avfiltergraphfile.c
Removed:
   libavfilter/avfiltergraphdesc.c

Added: libavfilter/avfiltergraphfile.c
==============================================================================
--- (empty file)
+++ libavfilter/avfiltergraphfile.c	Tue Nov  6 20:28:04 2007
@@ -0,0 +1,251 @@
+/*
+ * Filter graph descriptions for file serialization
+ * copyright (c) 2007 Bobby Bingham
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "avfilter.h"
+#include "avfiltergraph.h"
+
+#define LINESIZE    240             ///< maximum length of an input line
+
+typedef enum
+{
+    SEC_NONE,
+    SEC_FILTERS,
+    SEC_LINKS,
+    SEC_INPUTS,
+    SEC_OUTPUTS
+} Section;
+
+/** a comment is a line which is empty, or starts with whitespace, ';' or '#' */
+static inline int is_line_comment(char *line)
+{
+    return line[0] == 0     ||
+           isspace(line[0]) ||
+           line[0] == ';'   ||
+           line[0] == '#';
+}
+
+static Section parse_section_name(char *line)
+{
+    struct {
+        char *str;
+        int section;
+    } *sec, sections[] = { { "[filters]", SEC_FILTERS },
+                           { "[links]",   SEC_LINKS   },
+                           { "[inputs]",  SEC_INPUTS  },
+                           { "[outputs]", SEC_OUTPUTS },
+                           { NULL, 0 } };
+
+    for(sec = sections; sec->str; sec ++)
+        if(!strncmp(line, sec->str, strlen(sec->str)))
+            return sec->section;
+
+    av_log(NULL, AV_LOG_ERROR, "unknown section name in graph description\n");
+    return SEC_NONE;
+}
+
+static AVFilterGraphDescFilter *parse_filter(char *line)
+{
+    AVFilterGraphDescFilter *ret = av_mallocz(sizeof(AVFilterGraphDescFilter));
+    char *tok;
+
+    if(!(tok = strchr(line, '='))) {
+        av_log(NULL, AV_LOG_ERROR, "filter line missing type of filter");
+        goto fail;
+    }
+    *tok = '\0';
+    ret->name = av_strdup(line);
+    line = tok+1;
+
+    if((tok = strchr(line, '='))) {
+        *tok ++ = '\0';
+        ret->args = av_strdup(tok);
+    }
+    ret->filter = av_strdup(line);
+
+    return ret;
+
+fail:
+    av_free(ret->name);
+    av_free(ret->filter);
+    av_free(ret->args);
+    av_free(ret);
+    return NULL;
+}
+
+/* TODO: allow referencing pad names, not just indices */
+static AVFilterGraphDescLink *parse_link(char *line)
+{
+    AVFilterGraphDescLink *ret = av_mallocz(sizeof(AVFilterGraphDescLink));
+    ret->src = av_malloc(32);
+    ret->dst = av_malloc(32);
+
+    if(sscanf(line, "%31[a-zA-Z0-9]:%u=%31[a-zA-Z0-9]:%u",
+              ret->src, &ret->srcpad, ret->dst, &ret->dstpad) < 4) {
+        av_free(ret->src);
+        av_free(ret->dst);
+        av_free(ret);
+        return NULL;
+    }
+
+    return ret;
+}
+
+/* TODO: allow referencing pad names, not just indices */
+static AVFilterGraphDescExport *parse_export(char *line)
+{
+    AVFilterGraphDescExport *ret = av_mallocz(sizeof(AVFilterGraphDescLink));
+    ret->name   = av_malloc(32);
+    ret->filter = av_malloc(32);
+
+    if(sscanf(line, "%31[a-zA-Z0-9]=%31[a-zA-Z0-9]:%u",
+              ret->name, ret->filter, &ret->pad) < 3) {
+        av_free(ret->name);
+        av_free(ret->filter);
+        av_free(ret);
+        return NULL;
+    }
+
+    return ret;
+}
+
+AVFilterGraphDesc *avfilter_graph_load_desc(const char *filename)
+{
+    AVFilterGraphDesc       *ret    = NULL;
+    AVFilterGraphDescFilter **filterp = NULL;
+    AVFilterGraphDescLink   **linkp   = NULL;
+    AVFilterGraphDescExport **inputp  = NULL;
+    AVFilterGraphDescExport **outputp = NULL;
+
+    Section section;
+    char line[LINESIZE];
+    void *next;
+    FILE *in;
+
+    /* TODO: maybe allow searching in a predefined set of directories to
+     * allow users to build up libraries of useful graphs? */
+    if(!(in = fopen(filename, "r")))
+        goto fail;
+
+    if(!(ret = av_mallocz(sizeof(AVFilterGraphDesc))))
+        goto fail;
+
+    filterp = &ret->filters;
+    linkp   = &ret->links;
+    inputp  = &ret->inputs;
+    outputp = &ret->outputs;
+
+    /* loop through the input file */
+    while(fgets(line, LINESIZE, in)) {
+        int len;
+
+        /* ignore comments */
+        if(is_line_comment(line)) continue;
+
+        /* check if a new section is starting */
+        if(line[0] == '[') {
+            if((section = parse_section_name(line)) == SEC_NONE)
+                goto fail;
+            continue;
+        }
+
+        /* remove any trailing newline characters */
+        for(len = strlen(line); len && (line[len-1]=='\n'||line[len-1]=='\r');)
+            line[--len] = '\0';
+
+        /* parse lines depending on the section */
+        switch(section) {
+        case SEC_FILTERS:
+            if(!(next = parse_filter(line)))
+                goto fail;
+            *filterp = next;
+            filterp  = &(*filterp)->next;
+            break;
+        case SEC_LINKS:
+            if(!(next = parse_link(line)))
+                goto fail;
+            *linkp = next;
+            linkp  = &(*linkp)->next;
+            break;
+        case SEC_INPUTS:
+            if(!(next = parse_export(line)))
+                goto fail;
+            *inputp = next;
+            inputp  = &(*inputp)->next;
+            break;
+        case SEC_OUTPUTS:
+            if(!(next = parse_export(line)))
+                goto fail;
+            *outputp = next;
+            outputp  = &(*outputp)->next;
+            break;
+        }
+    }
+
+    fclose(in);
+    return ret;
+
+fail:
+    av_free(ret);
+    if(in) fclose(in);
+
+    return NULL;
+}
+
+void avfilter_graph_free_desc(AVFilterGraphDesc *desc)
+{
+    void *next;
+
+    while(desc->filters) {
+        next = desc->filters->next;
+        av_free(desc->filters->name);
+        av_free(desc->filters->filter);
+        av_free(desc->filters->args);
+        av_free(desc->filters);
+        desc->filters = next;
+    }
+
+    while(desc->links) {
+        next = desc->links->next;
+        av_free(desc->links->src);
+        av_free(desc->links->dst);
+        av_free(desc->links);
+        desc->links = next;
+    }
+
+    while(desc->inputs) {
+        next = desc->inputs->next;
+        av_free(desc->inputs->filter);
+        av_free(desc->inputs);
+        desc->inputs = next;
+    }
+
+    while(desc->outputs) {
+        next = desc->outputs->next;
+        av_free(desc->outputs->filter);
+        av_free(desc->outputs);
+        desc->outputs = next;
+    }
+}
+



More information about the FFmpeg-soc mailing list